MZ@PEdcp\"  AD0`|fz8H.datadf@.textr#$h `.relocz|@B~=dAD~eAD+, (ADeAD+HlAD.t şADşADܟAD(nAD~tnAD*L,pADxAD AD+^ADADAD0ADh]ADXAD^AD^AD^ADзADзAD }0@ADpsAD mADADADؠADPޜAD^ADଡ଼AD(AD@VAD8vADAD'ADAD@AD ֜ADAD8ADADXAD?ADEADCAD`ADADADpADADhADADADADAD@HADADAD AD^ADY ADP1腟ADP1ADP1ADP1襟ADP1ADP1薟ADQ18ADQ1ADQ1豟ADQ18ADQ1ADQ18ADR1ADR1`ADR18ADR1ADR1@ADR1ADS1؆ADS1ADS1ADS1ئADS1ADS1ؗADT1(ADT1ADT1زADT1(ADT1ADT1ADGh袟ADhAD1 }AD1~AD1AD10xAD1~AD1ADyhyAD h{AD9hHAD hxADh`AD.BhAD.Bh詟AD.Bh8AD.BhADyʙADxADxؤADh`ADhwADs1@ADs1{ADs1XyADs1ADs1ADs1zADs1HADs1xADs1xADs1菞ADs1|ADs1ADhPADhyAD.h{AD.hjADxADxADh0AD!hВAD%hXAD*hADy`yAD0 hAD1@AD18AD1؏AD1XAD1AD1@AD1賟AD1AD18AD1蔟AD1AD1蒟AD1AD1(AD1AD1@AD1AD1AD18AD1@AD1AD18AD1`AD1ADIhAD1AD1AD18AD1AD1PAD1AD1HAD1PAD1AD1HAD1pAD1HAD1AD1荞AD1AD1AD1AD1AD1AD1AD1觟AD1AD1AD1ؓAD1xAD1AD1AD10AD1AD1AD1(AD10AD1xAD1(AD1PAD12ADmyADmyAD 'yAD 'y8AD1؎AD1xAD1AD1AD1AD1AD1AD1AD1بAD1AD1AD1AD1(AD1ȐAD1HAD1AD10AD10AD1شAD1AD1(AD1ؕAD1AD18yAD; hAD8hADhADhADhADq xHADq xADّuhXAD*hADFhADҡ hȎAD!hAD#uhAD hhAD|xAD|xpADQh⚞ADx蘞ADxADh8ADhADxBADx(AD hpADh8ADh}AD1~AD1yAD1yAD1(AD1xAD1{AD1@|AD1AD1AD1AD1PwAD1 AD_hHADhAD21苞AD21XAD21PAD218zAD21zAD$1AD$1wAD$1zAD$1ADhhADhADx@ADxAD10|AD1`AD1AD1AD1AD1|AD1AD1AD1HAD1(AD8hPAD1|AD1AD1HAD1AD1pAD6hAD1 }AD1PAD1AD1蟟AD1PADhhADKhADuhȷADgxADgxxADvh₞ADIhADhAD1p}AD1AD1諟AD18AD1@AD1}AD1AD18AD1AD1AD1~AD1@AD1AD1ؠAD1p~AD71ADL1ADL1ADL1ADL1zADL1AD1`~AD1AD1جAD1(AD1@ADM18ADM1ADM1ADM1zADM10ADN1(ADN1ADN1ADN1x{ADN1аAD hADO1،ADO1HADO1@ADO1({ADO1ADMx(ADMxAD6.Bh裟AD5h(ADhADzxADzx赟ADhAD_hADhxADt7hADhADӬhAD?hPADhADehADhh ADyЉADy0AD hAD[hjAD0yAD0y`ADhADh衟ADhPADhADh8ADJhAD hXAD hAD! hADMhADhȗAD|h@ADlh8ADhBAD xAD xAD3x¸AD3xضADuhADhAD^h蘟ADhAD5 hADhADsIhADhADh@ADh`ADhADhADn1`ADnh)AD AD)ADmADmADaADaADZADZADZADNADZADZADZADZADZADZADZADZAD[AD[AD[AD[AD [AD([AD0[AD8[AD@[ADH[ADP[ADɚAD@kADrAD!AD9mAD)ADnADnADiAD9mADrADqADmADrADADvADhrAD^AD@kADADoAD9mADnADqAD`ZADhӷADӷADyoADqADrADhrAD@kADAD^ADvADrADhrADNADOADOADNADOADPADPADPADPAD PAD(PAD0PADADADADPAD PAD(PAD0PAD(AD0AD8ADvAD^AD@kADADhrAD^ADvADADAD@kADrADADADhrADrADvAD^AD@kADpADADADpADADpADADoADADoADpADAD=ADR7AD@ADJAD`>AD`ADADNADNADNADNADNADOADOADOADOAD OAD(OAD0OAD8OAD@OADHOADPOAD9mADAD(# `nADAD0ADAD>AD>ADADAD0ADpAD>AD tADNADNADNADNADWADXADXADXADXAD XAD(XAD0XAD8XAD@XADHXADPXADXXAD`XADhXADpXADxXADXADXADXADXADXADXADXADXADXADIAD # `nADADADJkAD?ADADHAD#`nADAD0ADpADx?AD`?ADМADAD$s`nADADޜAD;AD01AD?AD@AD1ytAD@kAD#`nADADAD*|AD@AD0 AD|ADADpADxADADOADNADNADNADvADtOADNADNADNAD#`nADADAD*ΜADBADBADADADADADADAD(c `nADADADqADBAD\AD,AD-ADP-AD-ADBADtAD^ADc`nADADADqADBADBADADQADQADQADQADQAD#`nADADADADBAD0ADhAD c !`nADADADkqADCADOADX AD AD AD ADX ADuAD@kAD@WADWADNADNADNAD WAD(WAD0WAD8WAD  ȣADADADӣAD8CADADADxADCADNAD#`nADADADqADpCADPCADADADSADSADSADSADSAD#`nADADHADpADHCADSADXADPPAD c `nADADADqADCADCAD0ƜADpƜADƜAD@kAD#`nADADADqADCADCADxADSADSADSADSADSADSADSADTADNADNADNADNAD`PADhPADpPADxPADPADPAD!AD"tNADQADQADNADQADQAD@kADc `nADADPADSqADCADAD`ADrAD(# `nADAD0ADqADEADWAD,AD-ADP-AD-ADEAD(uAD#`nADADADpADEAD0ADADNADs`nADADPADADEADHADHADlPuADAD@kADqnADmADPAD PAD(PAD0PADYADYADYADNADOADOADNADOADPADPADPADADADADADADPADPADNADNADNADNAD`PADhPADpPADxPADVADXOADNADNADNADVADVADVADVAD$s`nADADADAD>AD>AD>ADp>AD9AD9AD8AD8AD8AD8AD8AD8ADNADNADNADNADNAD鞝ADmAD9AD 9AD(9AD09ADNADNADNADNADWADWAD CADNAD`CAD0CADNAD@9ADH9ADP9ADX9ADXAD9AD@GADOADh9ADNADNADNADNADp9ADx9AD9AD9AD9AD9ADOADPADNADNADNADNADPADpPAD9ADPADPAD9ADNADNADNADpRADPRAD@RAD9AD9AD9AD9AD9AD9AD:AD`wADPwAD:AD :ADppADp:ADnAD:AD:AD:AD:AD:AD:AD`VAD;AD;AD;AD;AD ;AD(;AD:AD:ADYAD:AD@YAD0YAD:AD:ADh:ADx:AD:AD:AD:AD:AD^AD:AD0:AD8:AD@:ADH:ADP:ADX:AD`:ADqADNADNADNADNAD@wAD:AD:AD(:ADXOADNADNADNADx;AD8;ADH;AD;ADX;AD;AD;ADh;AD~AD;ADP}AD@}AD;AD{AD;AD;AD`zADADAD`AD@AD AD;AD;AD;AD ADADNADNADNADNADЂADADADADADAD@AD0ADADЃAD ADADADADADADADoADiADoADADX>ADh>ADx>AD>ADXOADNADNADNAD>AD(>AD8>ADH>ADAD0ADADADpAD0ADAD AD௶AD`ADPADAD`ADADADXOADNADNADNAD>AD>AD>AD>AD>ADXOADNADNADNAD>AD?AD?AD(?AD8?ADADADADADжADADXOADNADNADNADP?AD`?ADp?AD?AD?ADADADADAD0ADADADK!9 C I Q Y c m w                 ! ' 1 ; E O U _ i s }                 # - 7 A G Q [ e o y                  % / 9 C M W a k u                  # - 7 A K U _ i s }              % 7 I S ] g w              1 C G W g w            / ? O _ o             ' 1 ; E O Y c m w h`ADx`AD`AD`AD`AD`AD`AD`AD`AD`ADaADaAD(aAD8aADHaADXaADhaADxaADaADaADaADaADaADaADaADaADbADbAD(bAD8bADHbADXbADhbADxbADbADbADbADbADbADbADbADbADcADcAD(cAD8cADHcADXcADhcADxcADcADcADcADcADcADcADcADcADdADdAD(dAD8dADHdADXdADhdADxdADdADdADdADdADdADdADdADdADeADeAD(eAD8eADHeADXeADheADxeADeADeADeADeADeADeADeADeADfADfAD(fAD8fADHfADXfADhfADxfADfADfADfADfADfADfADfADfADgADgAD(gAD8gADHgADXgADhgADxgADgADgADgADgADgADgADgADgADhADhAD(hAD8hADHhADXhADhhADxhADhADhADhADhADhADhADhADhADiADiAD(iAD8iADHiADXiADhiADxiADiADiADiADiADiADiADiADiADjADjAD(jAD8jADHjADXjADhjADxjADjADjADjADjADjADjADjADjADkADkAD(kAD8kADHkADXkADhkADxkADkADkADkADkADkADkADkADkADlADlAD(lAD8lADHlADXlADhlADxlADlADlADlADlADlADlADlADlADmADmAD(mAD8mADHmADXmADhmADxmADmADmADmADmADmADmADmADmADnADnAD(nAD8nADHnADXnADhnADxnADnADnADnADnADnADnADnADnADoADoAD(oAD8oADHoADXoADhoADxoADoADoADoADoADoADoADoADoADpADpAD(pAD8pADHpADXpADhpADxpADpADpADpADpADpADpADpADpADqADqAD(qAD8qADHqADXqADhqADxqADqADqADqADqADqADqADqADqADrADrAD(rAD8rADHrADXrADhrADxrADrADrADrADrADrADrADrADrADsADsAD(sAD8sADHsADXsADhsADxsADsADsADsADsADsADsADsADsADtADtAD(tAD8tADHtADXtADhtADxtADtADtADtADtADtADtADtADtADuADuAD(uAD8uADHuADXuADhuADxuADuADuADuADuADuADuADuADuADvADvAD(vAD8vADHvADXvADhvADxvADvADvADvADvADvADvADvADvADwADwAD(wAD8wADHwADXwADhwADxwADwADwADwADwADwADwADwADwADxADxAD(xAD8xADHxADXxADhxADxxADxADxADxADxADxADxADxADxADyADyAD(yAD8yADHyADXyADhyADxyADyADyADyADyADyADyADyADyADzADzAD(zAD8zADHzADXzADhzADxzADzADzADzADzADzADzADzADzAD{AD{AD({AD8{ADH{ADX{ADh{ADx{AD{AD{AD{AD{AD{AD{AD{AD{AD|AD|AD(|AD8|ADH|ADX|ADh|ADx|AD|AD|AD|AD|AD|AD|AD|AD|AD}AD}AD(}AD8}ADH}ADX}ADh}ADx}AD}AD}AD}AD}AD}AD}AD}AD}AD~AD~AD(~AD8~ADH~ADX~ADh~ADx~AD~AD~AD~AD~AD~AD~AD~AD~ADADADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeADeAD_99999999999999%9=9C9[9s99999?9E9K9Q9W9]9c9i9o9u9{99999999999999W9o99?9959M9e9c9999 9]99)9A9Y9q99999k9q999U9m9y999)9}9999G9Y99999/95999c9{99=9999k9999-9E9]9u99993999Q9i999999/9C::::_:::A::::::::::: ::::!:':-:}::::::::::::::::o:::m : :U :[ :y : : : :) :/ :5 :S :Y :_ : : : : : :K : ::::'::::1:S:: :O:k:/#:Q#:s#:#:':':':':(:(:ys9s9s9s9/t9Ct9Ut9_t9t9t9t9#u9u9u9 v9/v9v9v9w9w9w9w9w9_x9ix9x9x9x9y9|9|9|9}9U}9o}9}9}9-~9O~9~99G9999a9k9999a99c999Ƀ99]9s9999999#97999͆9999?9999Q9y9999ʼn9ω9ى99 99i9s99'99999ˋ999Y9999;9y999ݍ9-9_9999͎9ߎ999K9999+9?99Ր999999?99G9999/9G9o999Ӕ9}99'99-99999%9?9s99ݘ99U9_9ߙ9Y999999Ӝ9!9=9[9ӝ9ߝ99#9E9g999͞999)99Y9͠999)9C9[9s9?999'9999 99ת9999]9c99]9999g9999-99999#9399999~AD9/9=ADAD99+959=AD39G99_9 99AD9I99ADhRADHADM9QAD(AD98ADJADAD޷ADAD)AD]9999(AD99Q9}9XtADhuAD99;AD6ADH9AD9rADhrAD9ADxAD:: :g : :Q : : :'::c::=:a:':::3:g::::::::5:a:::::::#:;:S:o::::+:C:[:s::::::;:g:::::=:U:::u::::: :):G:k:::::::;:g::::+:G:_:w:::::I:u::::::):K:w::::::!:5:E::::: :' :? :k : : : : :!:'!:?!:W!:o!:!:!:!:!:":9":Y":y":":":":":#:#:#:#:$:$:5$:M$:e$:$:$:$:$:$:%:?%:a%:y%:%:%:%:%:%:&:'&:?&:k&:&:&:&:':=':i': (:%(:Q(:m(:(:(: ):9):U):q):):):):):):):*:3*:U*:w*:*:*:*:*: +:7+:I+:c+:{+:+:+:+:.:/:/:1:1:2:!2:+2:52:M2:e2:u2:2:2:2:2:AD9999999999 99G9Y9999939AD`AD赟ADADضAD999AD-9?9999g9y999AD98ADAD9w999999ȎAD99999y9999ADAD;9g9E9W9C9999 9/9AD99959K9I:`AD:-:7:::y::::::: :]:A:u:: :s :a : : : : :) :`ADAD : :o :Y:::3:::::;::::::K::+: ,:!,:7,:M,:c,:q,:,:,:,:,:,:,:-:-:9-:I-:c-:y-:-:-:-:-: .:!.:C.:Y.:{.:.:.:.:.: /:/:)/:O/:]/:/:/:/:/:/:0:0:10:A0:Y0:q0:0:0:0:0:0:1:1:51:M1:e1:}1:1:1:1:1:1:qr9r9r9r9r9+s9Uu9-w93w99w9?w9Ew9Kw9yw9w9w9w9x9x9x9x9y9y9y9cy9iy9oy9uy9{y9y9y9y9y9y9y9y9y9y9y9y9y9z9z9 z9z9z9z9%z9+z91z97z9=z9Cz9Iz9Oz9Uz9[z9az9gz9mz9sz9yz9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9z9{9 {9{9{9{9!{9'{9-{93{99{9?{9E{9K{9Q{9W{9]{9c{9i{9o{9u{9{{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9{9|9 |9|9|9|9#|9)|9/|95|9;|9A|9G|9M|9S|9Y|9_|9e|9k|9q|9w|9}|9|9|9|9|9|9|9|9|9|9|9|9|9]}9c}9i}9y}9Y~9s~9y~9~9~9~9~9~9~9~9~9~9~9~9A9Q9W9999999999999 9999)9?9E9K9Q9W9]9c9i9o9u9{9999999A9q9{99999999˂9;9A9O9U99999Ã999'99 9U9[9a9g9m9s9y999999999ɇ9χ9Շ9ۇ9999%9+91979=9C9m9s99999999)9/959;9A9O9U9[9}999Ŋ9ˊ9ъ9׊9݊99999999 99A9G9M9[99э9׍99599999ُ9ߏ9W9a9k9u999k9u99999999Œ9ϒ9ْ999 999)939=9i9o99[9a979=9C999999m999999'919;9E9O9c9m9w9999999ǚ9њ9ۚ99999 9!9+959?9I9S9]9g9999999 999'9Q9[9e9o9y99999999ɜ939M9͝99999 999)939=9O9s9}9999999à9999-9}999999999Ϧ99 99!9+959?9I9[9e9o9y99999999ɧ9ӧ9٧9ߧ9999999 9999!9I99#9]9c99999e9k9q9999999ͪ9/9A9S9m9w9?9I9S9]9g9q9{99999999ˬ9լ9߬9999999%9/999C9M9W9a9k9u99999999ŭ9ϭ9٭99999 999)939=9G9Q9[9e9o9y99999999ɮ9Ӯ9ݮ9999999#9-979A9K9U9_9i9s9}9999999ï9ͯ9ׯ99999 999'919;9E9O9Y9c9m9w99999999ǰ9Ѱ9۰99999 99!9+959?9I9S9]9g9q9{99999999˱9ձ9߱9999999%9/999C9M9W9a9k9u99999999Ų9ϲ9ٲ99999 999)939=9G9Q9[9e9o9y99999999ɳ9ӳ9ݳ9999999#9-979A9K9U9_9i9s9}9999999ô9ʹ9״99999 999'919;9E9O9Y9c9m9w99999999ǵ9ѵ9۵99999 99!9+959?9I9S9]9g9q9{99999999˶9ն9߶9999999%9/999C9M9W9a9k9u99999999ŷ9Ϸ9ٷ99999 999)939=9G9Q9[9e9o9y99999999ɸ9Ӹ9ݸ9999999#9-979A9K9U9_9i9s9}9999999ù9͹9׹99999 999'919;9E9O9Y9c9m9w99999999Ǻ9Ѻ9ۺ99999 99!9+959?9I9S9]9g9q9{99999999˻9ջ9߻9999999%9/999C9M9W9a9k9u99999999ż9ϼ9ټ99999 999)939=9G9Q9[9e9o9y99999999ɽ9ӽ9ݽ9999999#9-979A9K9U9_9i9s9}9999999þ9;9׾99999 999'919;9E9O9Y9c9m9w99999999ǿ9ѿ9ۿ99999 99!9+959?9I9S9]9g9q9{99999999999999999%9/999C9M9W9a9k9u999999999999999 999)939=9G9Q9[9e9o9y99999999999999999#9-979A9K9U9_9i9s9}99999999999999 999'919;9E9O9Y9c9m9w999999999999999 99!9+959?9I9S9]9g9q9{99999999999999999%9/999C9M9W9a9k9u999999999999999 999)939=9G9Q9[9e9o9y99999999999999999#9-979A9K9U9_9i9s9}99999999999999 999'919;9E9O9Y9c9m9w999999999999999 99!9+959?9I9S9]9g9q9{99999999999999999%9/999C9M9W9a9k9u999999999999999 999)939=9G9Q9u999999999999 999)939=9G9Q9[9e9o9y99999999999999 99!9+959?9I9S9]9g9q9{99999999999999999%9/999C9M9W9a9k9u999999999-979I9S9o9999 99!9+959?9I9S9]999999=ADHADADADADADADADhADADhADADhADշADp>P HhADyXY= 6d!nhADADhADADhADhADhADhADhADADhADAD홧o1[AD; HAQ홧o1[(ADP8_ADH@ADȺ ADADADADADm+˂z\ñN| Nt9Yn+ج;0:a8ADADкHs[6 :afADPjADHADs[6 :afPADPHkADHADج;0:aAD ADHs[6 :afhADPpADHHADج;0:aADADиH(ADADpADhH@('1?eL:ADtAD(H8 Nt9Yn+홧o1[AD(|ADH8 Nt9Yn+bˬ&G4sS50 ADPADHAD ADhADH8 Nt9Yn+bˬ&G4sS508ADP`ADHADomJ^S2 AD8ADH(Nz?86AIMhAD20  `0`8ADADADH@홧o1[(ADADh ADADХAD Nt9Yn+홧o1[ADP8ADH@f5|hH_N9TnGW?\3Rs[6 :afs[6 :afADADpAD 0ADHAD`ADADADHAD0HTnGW?\3RAD ADAD ЪAD語ADADbˬ&G4sS50ADPADPHADAD诜ADH8 Nt9Yn+bˬ&G4sS50s[6 :afAD-(  `(:ADaATnGW?\3RPADP@ADHAD(ADAD!ADPH@('1?eL:AD0AD!ADظHbˬ&G4sS50TnGW?\3RAD#ADHج;0:aAD`ADʜADHs[6 :afNz?86AIMxADP(ΜADHH(xADx.ADHXef=TCOTnGW?\3RADADȻH8 Nt9Yn+ADADADxHs[6 :af(ADPADh4ADH@('1?eL:ADAD9ADHbˬ&G4sS50لorPyk O-0=AD&0  `0>ADYIU:XtAD@ADAD`HTnGW?\3RNz?86AIMADAD AD@HTnGW?\3R(ADADMADȺH@('1?eL:RADp$ ``BADAA Nt9Yn+ADAD "ADXHTnGW?\3RNz?86AIM(ADADUAD0H@('1?eL:@AD$ADH(Nz?86AIM^AD%  H иADиADѸAD%ѸAD1ѸAD=ѸADMѸADѸADѸADѸADѸADҸADҸAD)ҸADPnADP,x  HC@(AD иADиAD[ҸADqҸAD~ҸADҸADҸADҸADҸADҸADҸADҸADPXqAD0,p  HC@(0ADsAD(,(  H PDvAD- .0 ! `0(VADиADոADոAD ָADADxAD /7 H8ADAD0? HAQADPS HX`AD7PS HpAADADADAD6hS! H A@AD6S  H@ ADP6S ! `gAD`ADS Hh ADS HXADp5S HpApAD(5T! H AAD5T! H A.AD8 ADADS HX@ADJAD AD8AD3S HpAxAD3S( !E `(hAD AD.AD` ADADR HX@ADJADPAD 2S HpA ADxpAD1S( !E `(hAD@ ADAD1RHHQAD0R !E `8iADPADhAD/R !D`iADCAD`/R HADADADADAD AD(AD.ADPADQ HXAD0ADAD8-8R HpA@ADJADPxAD,Q! H A0ADh8AD+8Q !D `iAD8AD$ADAD6иADиAD[ҸADqҸAD~ҸAD.AD:ADFADSAD]ADgADsADADADADADPADP'M  HC@(РAD'8R ! `(jAD ADADADADADpADx%O! H AADAD$P ! `jADADADPȣADh#O! H AhADADȤAD@"@O ! `kAD`AD"N HAa XAD ADAD M HAa H!ADxADx M !D `0lADAD!ADADADAD AD!ADADL HADL HAa  #AD#ADhADK HAa PЩADhhK! H Ah$AD@%ADADADJ ! `lAD&ADmADxADHJ! H A&ADyADADJ! H A0'ADADK! H AADAD'AD(ADJ! H AhAD@hK ! `HmAD(AD)ADADADJ ! `mAD*ADpADK0 ! `0nADhAD8K ! `PoADp+ADhشADpJ0 ! `0oAD(,AD="'(ҷADpKHhҷADH ҷADxH hӷADZ iADADȈADPxADӷADZ iAD0ADHAD xADPԷADH ԷADH շADxH pշADH ߝAD8ַAD0fH׷ADH P߷ADXH ADxjiADADADwAD@ADH AD8H (ADii`ADxADADwADADADADADxAD  ` (3ADADh!P<ADADAD0H ADH xADh!P<xAD@#AD `ZAD ӷAD hӷADAD` <ADp;ADADi!P ADpADADi!PADXl!P ADADAD AD ADoADAD( <( ADHܷAD( ADm!P ADhADAD(r!P ADADAD r!P AD  AD ( ADoADADq!P<ADpAD"@$ADAD@$ADpr!P<h&AD^AD `(ADAD`(ADr!P<+AD8AD+ADxt!P<x,ADhrAD<h2ADvAD=8ADAD=;ADAD"@ADrAD@ADu!P @AD0=AD<AAD@kAD<DADAD GADݷADGAD0u!P"IADoADIADu!P @kADQADu!P<QADp ADQADu!P<QADADH!AD X!AD  oADYADw H`ZAD8pw Hh ZADw H0[ADpw HCK [AD8~ H%9\ADh~ H  p\AD@~ H… 0]ADȀH]AD( H]AD@Hx8^ADH HAA@^ADhh H _ADXH `ADhHP`ADpPHx8 `ADH H0aAD H`@xaADH0aADp HABHbADxX H£@H&ADmADmADX&ADmADmADbAD0@  `IADcAD HcAD HcADا HpdAD( HadAD H@HeADp HeAD@0 HfAD HfADȭ HargAD HXgAD H@gAD HxhAD HhAD Hd iADخH``iAD Hc iAD@@ H jAD( H jAD@ HC jAD H%A@kAD` HaBkADh8 HPkAD HHlAD( H#E@lAD`X HabGmADp HD HoAD0 H  oAD8x  ` (TAD.AD.AD(.AD8.AD hrADH H$rAD H$XtAD! H[zhuAD! HF[x(1AD 81AD H1AD X1ADoADvADH HcvADH@wADH`!wADH(wADHX0xAD0h HAxAD8h HƒzADh H zAD HD zADH0P{AD8 H`{ADH8{ADX Hh|AD H|AD HH}AD H}AD H0~AD H0~ADX HADPP!Hx0A`AD8!HP AD!Hx0AAD!H PAD HAaADx H0AD`X H0XADx!Hx0AADP HƒxAD HЃAD!HpAD0!H xAD HAa؄ADX H0 AD!H`qqhADH0ADP!H@ 'AD H0pADp HAaAD8x!Hd AAD HDAD HDAD` H8hAD H0ȈAD H0(AD HC AD!Hp8AD!Hx0AAD!Hx0A(ADx HAD H0x=AD =AD =AD =AD X>AD h>ADoAD>ADoAD>AD iAD qAD 0yAD AD )AD 01AD AAD IAD QAD YAD 0aAD AD AD AD AD AD AD AD AD 0ɗAD їAD 8BAD HBAD XBAD hBAD 0xBAD BAD CAD CAD (CAD 8CAD HCAD XCAD hCAD 0xCAD CAD CAD CAD CADoADCAD CAD CAD CAD DAD DAD (DAD 8DADoAD@@@@@@@@@@@@@@@UUUUUU@Z/ҷADҷADADa4}PZ/ ҷADҷAD@AD/vAD ҷADAD /vAD ҷAD`ADPA  ADADI8 ڝAD01ADADȁk  ADADhF  ADADhX1@ عADAD  ๞ADAD 蹞ADAD¹ ADADù( ADADN*p-hڝAD3ADADPO 0ADAD  8ADAD @ADAD HADAD(@ PADAD2 XADAD<, `ADADF hADAD(L  ADAD~(w  ADAD~LO AD8AD  AD@AD ADHAD ADPAD(@ ADXAD2 AD`AD<, ȦADhADF ЦADpADD-4ADAD}-AD4ADAD -ڝAD5ADTAD-5ADTADp|'E ADAD  ADAD ADAD ADAD( ADAD2, ADAD<, ADADz0vE AD`AD  ADhAD ADpAD ADxAD( ȳADAD2, гADAD<, سADADx  ۝AD5ADAD)e 5ADADUeyK с ADҁ  ADӁ AD ԁ ,AD@yK Ձ ADց  ADׁ AD ؁ ,ADxA,-hADP;ADHAD,-AD(;ADPAD .-AD;ADXAD.-0AD:AD`AD',-0$8?%@&A'B(lC)D*DE+F,G-H.8I/ J0!K19 L2"M3#N4$O5%edPgȹ ɹʹ,˹8˹8ddh O P ADQ AD R,ADXd@dhi _ ` AD a ADb,ADcic,,clc co 0AD8AD @AD HAD0c(p 0AD8AD @AD HADbr 0AD8AD @AD HADbhbpsPb t8bbu4bu 0AD8AD @AD HADaa0@ ¹ùxa y 0AD8AD @AD HAD az55& ' ( ) * + , !-"# .$ % \& /' \() * + , - .P/0@10(21,3245 D63`74t85X9: 6(;!7(<",=# >$8?%@&A'B(lC)D*DE+F,G-H.8I/ J0!K19 L2"M3#N4$O5%a@z 0AD8AD @AD HAD`{ȹ ɹʹ,˹8˹8` | (0)0*0+0,0-0.04/0001 0 2 0 `P} ߭ ,h     l   Dh`CH`p,,,0`-`X`_؇ 0AD8AD @AD HAD_Ћ 0AD8AD @AD HAD8_xN_8 0AD8AD @AD HAD^PP @ ¹ù^  0AD8AD @AD HAD(^V^] 0AD8AD @AD HAD]  0AD8AD @AD HAD@]Pe  , ,\(i\i @ ¹ù\\ k@ ¹ù 0rAD 0\   1d2( pADqF2  ( xAD(2 @(PsADX(`sAD  ( ptAD  (tAD  ( tAD p   uAD ȟ   `uAD 8ІAD|AD AD(pAD) AD*   AD+!0AD,"@AD-#L`AD.$ADXZW AD0x AD0 AD0  AD{0  ADQy0 ( AD0 (AD0 ( ADg0 LAD1K0$LAD+0(LADA 0,L AD/0L ADq/4LAD/ 8 AD/!<0ADv/"@P AD1b/#DP ADB/$HxAD(/%L8 AD! /&P(ADA.'T,0ADA.0Xxi i.HADM. PADYn.  XADiN.  L `AD3.! hAD." pAD-#<xAD)-$TADY-%#4AD-&'AD-'+AD-(/H ADj-)3AD,*7 AD,+;ADy-,?d AD,-C ADM,.G AD)-,/K AD ,0O4 ADu,1S@ADy+2WAD+3[AD,4_\ ADm+5c  ADYM+6gp +0AD pAD`U8ƀ ADP+Ȁ (AD18+ɀ l0ADA+ˀ p y+`ŀ ADǀ ADʀ d AD  P(`AD"(AD(4( AD.(AD /( AD 18AD 2ADT(6 !p HAD)# PADA)$ XAD!) %d`AD)&8( hAD)'X pADV)) xAD16)*` AD) + AD($,@( AD((-( AD(,0( AD(03HAD1v(4p iz(R?N@(AD=(O(AD (P( AD(Q h( ADY'Rp( AD'S ( AD'T ( AD'U ( ADI|'V  ( ADya'W$ X( ADF'X(( AD+'Y,( ADY'Z0x( AD&[4( (AD)&\8(( 0ADi&]<( 8AD&^@( @AD &_D( HADin&`H( PADS&aL( XAD8&bP( `AD&cTX( hAD&dXD(pAD%e\( xAD%f`T( AD)%gd( ADi%hhh( ADy%il|( AD^%jp ( ADC%kt!(ADI(%lx"( ADI %m|#( ADy$n$P( AD$o%( AD$p&d( AD$q'( AD$r(( ADi$s)( ADN$t*( ADI3$u+|( AD$v,(AD#w-<( AD#x.( AD#y/p( AD)#z0( ADY#{1D( (ADt#|2t( 0ADY#}3\( 8AD>#~4l( @AD##5( HADI#6L( PAD"7L( XAD"8l(`AD)"9( hAD)":( pADY"; ( xADd"X( AD"?<( AD)!@( ADY!A( AD!B( AD!C( AD)!L3D( ADiO!E( AD4!FH(AD! G(AD H( AD I(ADY Jl(ADY K(ADY  LT( ADYm $M( ADR (N0( AD7 ,O( AD  0P( (AD9 4Q( 0ADi8R( 8AD<S( @AD @Tt( HAD9DU,( PADyzHV( XAD_LW( `ADDPX4(hAD )TY0( pAD  XZ(xADI \[(ADI `\(ADI d]D( ADI h^( AD l_( AD dp`(AD Ita(AD ,xb(AD |c@(AD d (AD eD(AD f(AD g4(AD ~h(AD ai(AD Dj,(AD 'k@(AD  l(AD m\(AD n(AD o( AD p((AD yq(0AD \r0(8AD ?s( @AD "t(HAD u(( PAD v( XADY w( `AD G:ف$ pAD yځ xAD Yہ AD9 <܁ X AD ݁ ށ  AD   AD  AD AD# AD' AD+(ADK/(ADA+3(AD 7L AD1 ߁  AD D0AD PADL pAD AD(Kd( ADE`& H( ADQIP(ADmJ(AD1QL  ( ADQ6M ( AD!N L(ADa!O ( AD!P ( (AD!Q ( 0AD#R$p #Dh6 6h HAD#e7, PAD &N: XAD'5;   `AD9(<  hADI)= pAD+> xAD,?h AD4@ (AD 7A$ AD)7D( AD9gE, AD;MF0 AD;0G4p <| 4|AD5 AD8 hAD9 h ADB( @ADC p( ADBpZ( AD1>]( ADA>A(AD>% (AD1? x(AD?,(AD?P(AD!@(ADq@ L(AD@$D(ADAh((ADaAM,(ADA20( ADB4((ADQB8(0ADB<(8ADB@ (@ADACD!4(HADCH"(PADCuL#(XAD1DZP$$( `ADD?T%x(hADD$Xp ENx |  pAD} @AD~ADAD AD  AD  H0AD ,@AD `ADpAD( AD&( `#AD1 1 1 1111 1,1 1 1 1 l 10 11 1 1 1 p >H8DO>+ H%/ADL(ADS(ADU! (ADV(ADQV (ADV ( ADVX( AD!W 0(ADXm$0(ADXM((ADY>X~x P( 2AD(2AD@(3AD 8(3AD ( 4AD  T(4AD  |(4AD H(5ADH(`5AD(5AD(8AD(8AD|(@9ADD(`:AD} ׃ ( /  AD C 3/AD7H AD ;$ ADɃ ? AD9 C( ADɆ G AD K` AD) O AD9 SD ADه W( AD [D0 AD _ D 8 ADI c!`(@ ADɉ g"8 H ADɉk# P AD o$( X AD{ s% ` ADy` w& h ADy@ {' p AD  )0 x AD * AD)M + ADI- , ADi -L ADI v@ր JAD߀UADh( cAD( yADv X |ADY<(|ADZt(@}AD[(}AD\ ( }AD]  @~AD^  P~AD_ |p~AD` ~ADa,( ~ADbp x5@v* 7$( ADR@( AD<DP( ADE ( ADF`( ADGT( ADH$( ADI ( AD!BJ ( ADpL$X( AD!SM(p ?t 8( ЁAD9( 0AD:( AD; (0AD< ( AD=  (AD>  ( AD? ( 0ADA(ADB(ADC(@ADK(0ADXtX ADAD (ADÀ(AD 3s, tX(!ADt(!AD  ( !AD  ((!ADh $(0!ADB (8!AD+d( @!ADQ,( H!AD!p( P!AD€% (X!ADqĀ)L(`!ADџ2r   x!AD~xr T@AD\PAD,`AD pAD AD  AD  $ADHrh 3(0AD5 (AD6 (0AD7 4pAD8 AD0q0 !ADɠE1 !AD9%2 !ADI 4  !ADYH0qt ) !ADI  !ADiz  !ADLqX ADAD/8q0 Ѧ1x !AD2  !ADa3  !AD!p`/ ADp0S  ADTh.p U!5V YW "ADpP pADh <@AD\ AD.Xp 9J9( Y8    9$  P"ADip X"ADox pADADtAD AD @AD  $бAD-xo 1l  p"ADLo0 ౲ADh,Xo t  h "AD)   "ADI   "ADY  "AD\ L "AD<nX AD зADAD иAD+xn  "AD "ADyn0̀ AD̀+Pn΀| "ADAπ| "ADЀ ( "ADaр  "ADҀ "AD1Ӏ  #ADAԀ ( #ADՀl #ADh@*mAc  #AD4d 9e0#ADY]f   8#ADygt h  H#AD!j  P#ADk  X#ADql `#ADm" h#ADmn& p#AD!]o* x#ADIp. #AD:q2 #ADr6p( #ADs:T #AD!t>#ADaaki L ֲADk0u ADxh8(kv( !<w )-yz  {  #AD)8k|(pADÁD(ADā( ADŁ(PADh'8k Ɓ ǁ#AD8Ɂt#ADajȁ ADʁ,ADˁ AD́ AD́ AD΁  ADρ  0ADЁPADj  PAD pADADAD 8AD j %j |( $AD,( $AD!p i x%j#   $AD O   ($AD ^t 0$ADy W @8$ADB @$AD%H$AD  P$ADX$AD  `$AD)$$ h$ADy-( p$AD k, x$AD'd 04 $ADI(b!4P $AD)O"8 $AD,9#< $ADY-$@p $AD-%D $ADi/'H P $AD1(L!x $ADi2)P" $AD4*T# $AD5+X$P $AD6o,\%P $ADY9Y-`&d $AD;A.d't $AD <3/h( $AD=80l)T $AD?$1p*( %ADA 2t+(%ADiB-3x, %ADB4|-  %AD9C5.  %ADYDH6/(%ADD{70 0%AD9Ec:3 ( 8%ADIFLfX   AD AD  AD  AD < AD  ` AD  p AD@ ADP AD&2AD810IAD92(`IAD;4(JAD<5t( KAD!pe?  H%ADG8 P%ADYH8 X%ADH  `%ADIKd h%AD9M d p%ADYO  x%ADyQ ( %ADQM  ( %ADQV$ h %ADR=(D( %ADS,, %ADIT0 %ADT4 %AD9U8  %AD9V<%ADVhc<L%ADV= WX(c#{  %ADX! %AD1Z %ADqZ   &ADZ  &ADab  &ADAc( &ADqdp( &ADe} D( (&ADjr$$( 0&ADjm(( 8&AD!k~, @&ADk0 H&ADQm4DP&ADan8` X&ADaq<`&AD}@` h&AD!~Dd p&ADH x&ADLD( &ADP ( &ADT!H( &ADqnX" &AD!T\#T &AD<`$( &AD&d% &AD!h& &ADql'L &ADp( &ADt) &ADx*&AD|+ &ADa,0 &AD1- &ADQ. &AD/ 'AD_X|`AD}`AD~`AD`AD `AD (kAD 0sAD wAD^# 'ADq8('AD8( 'ADQ T( ('ADq ,0'AD  8'AD1 8 @'ADQ  H'ADQ~   P'AD|$ X'ADh(x `'ADS,P h'AD;0 p'AD"4  x'AD 8 'AD< 'AD1@ 'ADaD 'ADH 'AD!L 'ADƒP 'AD!uÃT 'ADAcăX@ 'ADaKŃ\ 'AD1ƃ` 'ADqȃd'AD1UɃh 'AD1ʃl!H'ADa˃p"L 'AD̃t#D 'ADQ̓x$X (AD΃|% (ADsσ&, (ADZЃ' (ADTу( (AD>҃p /@Z`ǃl ADpZh  AD hAD ``AD pADxADZ+  8(ADU H@(AD hH(AD  ( P(AD   X(AD  `(ADy( h(AD  p(ADy ( x(ADiq$l (ADs( (AD X \(AD)X  ADAD ADADAD@xX* nX( (ADmo( (ADTp( (AD 4r  `( (ADt ( (AD9u ( (ADvh( (ADYw((ADx ( (AD y$( (ADnz(p ZWm(PADq ( `ADs ( ADW 8W2 ( )AD@ )ADi>()ADi  , 0)AD  8)AD @)ADq H)AD]P)ADF  X)AD0$H( `)ADI(l( h)AD,( p)AD0p 1U@   AD 4`AD pAD @ADH0ADpUHf ADg !ADq\'AD U/ d  )AD!Le)ADQ>hp)ADUi  )AD 5j )AD k  )AD l )AD m ,)AD! n )ADq o$ )ADq Vp(@ )AD! Hr,\ )AD10p U5(Dy' 74ta%9 ; 7(A DDLpTH//& ' ( ) * + , !-"# .$ % \& /' \() * + , - .P/0@10(21,32463`85X:6(<,= > 8?!@"B#lC$E%F&G'H(8I) J*!K+9 L,"M-#N.$O/%XpS( (*AD4 0*AD5)6 D  4   ,  |  T<h *AD5%P8AD#x$\% &p 97R(`PAD PSAD @R(} DXADp R|8|8 (+AD : Qzz  VAD{{  WADxQ s  UADt(UADu(VADv VADw4VADx  VADy  VAD` xR5(DR74tO9AJ{; 7(YH`A ADDDi@QH//& ' ( ) * + , !-"# .$ % \& /' \() * + , - .P/0@10(21,32463`85X:6(<,= > 8?!@"B#lC$E%F&G'H(8I) J*!K+9 L,"M-#N.$O/%H 8Q#5 p+AD^6x+AD^7 +AD^f8 +AD_F9 +AD_&: +AD!`;  +AD!`< +AD`=  +AD`># +ADaa?' +ADaaf@+,+ADbFA/ +ADb&B3+ADbC7 +ADbD; +ADAcE? +ADAcFC+ADcGG` ,ADcfHK ,ADdFIOl ,ADd&JSd,ADAeKW ,ADAeL[(,ADeM_H 0,ADeNc 8,ADfOg@,ADffPk,H,ADfFQo P,ADf&Rs!X,ADfSw"`,ADfT{#Xh,ADfU$p,ADfV%0x,ADfW&,ADffX',ADfFM&n ,ADfo,ADfp  ,ADfq ,ADIgr4 ,ADIgs ,ADgnt  ,ADgNu ,ADh.v  ,ADhw# ,AD)ix'0 ,AD)iy+\ ,ADiz/4 ,ADi{3-ADjn|7 -ADjN};| -AD)k.~?$ -ADIkCp -ADkG (-AD lK 0-ADlOx 8-ADlS @-ADimnW H-ADmN[d P-AD)n._@ X-ADInc `-ADng h-AD ok p-ADoo x-ADos!p-ADonw"@-ADoN{#-ADo.$l-ADo%-ADo&-ADo'-ADo(-ADo) -ADoC* -ADpN Hރ ( D ̀  (0  *t Qh, yP2Ā 8 5؀ y  7 atG..ك ڃ ۃ ܃ ݃ ߃ ! ؀  , , "  l# Ā      4  Ѐ  $,%, & '܀!)"+ #- $.H %/p &0d '1 (3l )4 *6 +8 ,9 -:.;LGAY, qkZ- 0.ADf[.8.AD\ /,@.AD] 0`H.AD^1dP.AD_2X.AD`3`.ADxa4Xh.ADpb5lp.ADhc6x.AD`d"74.ADXe%8L.ADPf(9.ADHg+:.AD@h.+Ai10Ij4; .ADYk8< .ADl<`1m?I`E>!, 1l"- .ADQ6#..AD`$ /.ADX% 0.ADP&1/ADH'2 /AD@(3/AD8)4 /AD0*5 /AD(+6(/AD ,"7h0/AD-%88/AD.(9l@/AD/++ 0.011: X/AD!25; `/AD39`ɰ4<D | XD }܀} ܀~~ ܀ ܀< < Ā Ā D = `AD> AD? AD@4 ADA0ADB  @ADC  PAD 8DDp PHDgI d /ADJ d /ADK d /ADQ L  ( 0AD%Nt( 0ADOt( 0ADQP( 0ADQ( 0ADR l(0ADѺS$(00ADeT(( 80ADVU,( @0AD>V0$( H0AD(W4L( P0AD!X8( X0ADY<( `0AD!Z@( h0AD[D(( p0ADq\H(x0ADQ]LL(0ADq^P(0ADf_Tx( 0ADI`X ( 0AD!.a\!L( 0ADb`"( 0AD1cd#( 0AD@ E ADF GADHDADM ADd p @e( 0AD@f(0ADg( 0ADh<(0AD;i (0ADAj(0ADak (0ADol ( 1ADW(@PADDADADǂp ?[  1AD  1ADI  1AD   (1AD   01AD|  81ADp @1ADb H1ADL  P1ADA$ X1AD+(`1ADݳ, h1ADI0 p1ADY4 x1AD8( 1ADI< 1AD@( 1ADDH( 1AD9‚H( 1ADuÂL( 1ADY\ĂP( 1ADCłT( 1ADy*ƂX ( 1AD @0=x `>AD>AD>ADP0?AD `?AD  ( @AD<  1ADi  1ADi}< Ȃ ɂ ʂ ˂ ̂ ͂ ΂ςЂTт ҂ HH=ӂ Ԃ EADՂւׂ؂Tp=% ق }ڂ< Qۂ qR܂  9S݂  0 2ADSނ8 qb ߂  2ADb 2ADu$| (2ADv )w"82ADw <  ౵AD AD`ADവAD0<4( H2ADywQ;p(AD0 <<8 D( x2AD x; @PAD `AD ;( 2ADxH( 2ADy0`; H;  Ay8y 9y( 2AD{;  |H{  {J ( 2AD8;  ـ Ѐ р`; ɀpH ;D03ADe`; ;  p;@3ADaժp; P3ADP ab X  (h3ADi* ``<  lЂX;p  LƵAD;) 8<,3AD1K-3AD..3ADу/  3AD1;X*p + ;9p : ;PɵAD;@ 3ADIA 3AD<B3ADQ&C  3ADQD 3ADAŧE t3AD1F t3AD1:>p ? :G H˵AD;I Jp˵AD8;K Lp̵ADH;O4AD)m;Mp N 8;P 4ADQR SX8T 8U <XV   XW l@P;X `4ADYZ [h\ h] <^ _ l؇:(`p a :b4ADч~ch4AD^:(~p  0:4AD64AD 4ADκ  4AD! 4ADe 4ADE 4AD%9  H95AD95AD9 9H 5AD(5AD05ADަ  85AD @5AD88p   ӵAD9  ԵAD9x p  صAD@ٵADpٵADp ڵAD  pPڵAD88WP5ADIX5ADir`5ADV  h5AD: p5ADɇ x5AD 5AD  5AD)ʶ 5ADI$5ADI(5ADIr,5ADiV05ADi645ADi85AD<5AD@5ADɈƵD5ADH5AD L5ADYNP5ADRTp5ADɉ66 ڵAD86 ڵADH6Hp  @۵AD۵ADP5?„ 6ADgÄ 6AD YĄ 6AD Ań   6AD )Ƅ x (6AD DŽ x06ADiٳȄx86ADiɄx@6ADiʄ  H6ADi˄$P6ADɎȲ(X6ADɎÄ́,`6ADɎ)΄0 h6ADɎBτ4p6AD).Є8x6AD)ф<6AD)84Մ\ ai3҄ ADӄ 0ADԄxքDׄ ؄4لڄ  ,ۄ  ܄  |݄  ބ  T߄<h3\ ɒH3 AD ADxD 4  ,   |   T<h20PAD 22 pAD 3 ADH3& 13(p  36AD19h6AD1C3p   AD36ADqȮX3p  3  7AD0  AL! :"  ( 7AD #  ((7AD$0%&<' ( lH3*`7ADٗ-3) @3hijklmn P3PP P TUVW X Y p 2Q8 )RSh3 A՗03  ,     l  D3    4 A1 3 B4B1 C4C1 D4D1 E4<E1 < F4F 1 4vwx y z! D{|X4hijklmn 4PP P TUVW X Y p @4Q8 RS4 < p 5 < p @5hijklmn p5Q8 aNRS@5P P TUVW X Y p X6˹8˹8)ܧ6ȹ ɹʹ,06hijklmn 8p6Q8 ަRS(6P P TUVW X Y p 7˹8˹8ylp7ȹ ɹʹ,7 ( 07X Q h ڥp 170ȹ ɹʹ,7˹8˹8ilP8ԕԕ 2ՕՕ I֕8֕  8ו  < ڤؕ Y¤7Hϕ Еѕ,ҕӕX8  ¤  I;  Q 880lmn X8 hA*ijk Y8Q8 £RSTUjV RW Q:Y p #X78P P X 8H  p 7<QP80ȹ ɹʹ,8˹8˹81:p , !-"/10(32?CEF K 9 8:*& I' ۢ( â ) A * + !\#.I/$%\9&/ա'\)(! )$ I *'  +* ,- q -0 .3Pq 06@ 291,ay4<5?(D6B3`17E4t8H5XJ9K:N6(;Q7(Z8Ik@]PA`y/BclDfD)DGiҞHl8Io ]Jr!]Lu"!EMx#YN{$qO~%@6حح٭٭ۭۭޭ ޭ׭׭  ѝڭ <ڭ <ifܭ pܭpiݭ ݭq5֭ h7p  ,    DH6 z lIb a6 7    < < 6 H7  a y lw  yI6x ߭ ,h  DX7    <  <a6x H7{ | 7 } P7~\q70ȹ ɹʹ,7˹8˹8IB8  #z I!J   ș9{ | 9} ~\9 < p (; ֭ ;׭׭ حح٭٭ڭ<ڭ<ۭۭ ܭ  pܭ pݭ  ݭ ޭ ޭX;  ,     l  D: ) ; ߭ ,h     l  D@: Y/p; < p 0< 6~; ߭ ,h     l  D;    < < ; 0> ֭ >׭׭ حح٭٭ڭ<ڭ<ۭۭ ܭ  pܭ pݭ  ݭ ޭ ޭX>    < < = PX>    < < = >  h>    < < ! 2:؂(  AD AD@  iADADP@W  ADADa  qADAD@  ADAD0. AD0AD  AD. AD0AD (AD.  AD0AD 0ADH}  aAD@ADXX  ADPAD  AD `AD`|  AD pAD  ADAD(i  aADAD~a8 AD1AD AD~T  aADAD@~Ȣ  ADAD}B  qADAD} m  aADAD@}2  qAD AD|}܍٬AD 0AD|b  qAD@ADH|p  aADPAD{0N  AD`AD{X  iADpAD({yJ-ADX1AD ADzؤ1 9ADAD  AADAD IADADX QADAD( YADADpyE ᫝ADAD  ADAD ADAD ѫADAD( ADAD2, !ADAD<, ADAD`w( 1AD AD(wD  qADADvX  AD ADhv1 9AD0AD  AAD8AD IAD@ADX QADHAD( YADPADt  AD `ADt`  aADpADtE ᫝ADAD  ADAD ADAD ѫADAD( ADAD2, !ADAD<, ADADprX1 9ADAD  AADAD IADADX QADAD( YADADp<1@ yAD AD  AD(AD ᬝAD0AD¹ AD8ADù( AD@ADpo"(-AD`3AD PADJ&-AD03AD XADL (-AD3AD `ADsO- AD2AD hADfD-aAD2AD pADn-9ADx2AD xADn-9ADP2AD ADn`E 髝ADAD  ADAD ɫADAD ٫ADAD( ADAD2, )AD AD<, AD(ADm"  ADADlBE ᫝ADAD  ADAD ADAD ѫADAD( ADAD2, !ADAD<, ADADjE ᫝ADAD  ADAD ADAD ѫADAD( ADAD2, !ADAD<, ADADhd1 9ADAD  AADAD IAD ADX QAD(AD( YAD0ADg"D-QAD4AD @ADD-QAD4AD HADD -QADh4AD PADD-QAD@4AD XADD-QAD4AD `ADD-QAD3AD hADD-QAD3AD pAD0fx  aADADfHv1@ yADAD  ADAD ᬝADAD¹ ADADù( ADADdX1E 髝ADAD  ADAD ɫAD AD ٫AD(AD( AD0AD2, )AD8AD<, AD@ADb  qADPAD`b0<-!AD5AD AD0<-!ADh5AD AD 0<-!AD@5AD ADbO ADAD  ADAD ADAD ADAD(@ ADAD2 ɬADAD<, ѬADADF 鬝ADAD_)ւ-AD:AD  ADւ-AD:AD (ADւ -AD`:AD 0ADւ-AD8:AD 8ADւ-AD:AD @ADւ-AD9AD HAD,-۝AD9AD PAD1uc%.-iAD9AD XAD*.-iADp9AD `AD/.-X۝ADH9AD hAD uc6.-iAD9AD pAD;.-iAD8AD xAD@.-iAD8AD ADE.-iAD8AD ADJ1-yADp8AD ADO1-yADH8AD ADT1-yAD 8AD ADY1-yAD7AD AD^1-yAD7AD ADc1-yAD6AD ADh08-AD6AD ADm08-AD6AD ADr08-AD`6AD ADw08-AD86AD AD|08-AD6AD AD08-AD5AD AD\ 1 9ADpAD  AADxAD IADADX QADAD( YADAD([ȫE ᫝ADAD  ADAD ADAD ѫADAD( ADAD2, !ADAD<, ADADY \-ADAD PAD?T(S8_1 9ADAD  AADAD IADADX QADAD( YADADQE ᫝ADAD  ADAD ADAD ѫADAD( ADAD2, !ADAD<, ADADO@,H-ADp?AD ADH-AD8?AD AD H-AD?AD  ADH-AD>AD (ADH-AD>AD 0ADH-AD>AD 8ADH-ADp>AD @AD#H-ADH>AD HAD(H-AD >AD PADNH-qAD@AD ADNy! 0 IADAAD AD 8 ݝADxAAD AD)\N 0, ADPAAD AD0 )AD(AAD AD0 YADAAD AD8 ݝAD@AD ADZMI 1, ޝADxBAD AD1 (ޝADAAD AD%XADٸQ QI)ٲ1ɲѷQAa1Yaٳqqٲy)ѱiyIYa9AII)))9QIiѰ!aQqQQ9ѭ911Ai)ɭ9ii))q9ADAD [WWWXXXX X(X0X8X@XYZYYh[p[x[\YYYYYZXXXXXXQZWWW8QYYZZVVVVVVVVVV V(V0V Y(Y0YxZVVWWPHZPZXZXXYYYY`YhYpYxYYYYYZWWWYYYYYZZZZ Z(ZN8c@cHcPcXcN0c8c@cHcPcXc`chcpcxccccccccZZZZZ[`YhYpYxYYYYYYY@ZbbbbbcLL8c@cHcPcXc`chcpcxcccccccccccccccccdYYYZZZZ Z(Z0Z8Z@Z\\\ \(\0\PK ](]0]8]@]H]P]X]`]h]p]x]Zx[[[[[[[[[[[[[[ZTTTTTTOOOOOORRRSXQ`QhQG_________xGhG@GHG_OOx__(G0G8G@GQQQQQQQ0_8_@_H_P_X_`_h_p_x_________________```` FSSSSTTTT T(T0T8T@THTPTXT`ThTEHUPUXU`U(_0_8_@_H_P_X_`_h_p_x_YYZZZZP_X_`_h_p_x_________________```` `(`0`8`@`H`P`X```h`p`x`````````````````aaaap`x```NNNNNNNNNMMM0`8`@`H`P`X```h`p`x``VW0WXWWWW 5o6P|6JjQ q?oSpc8O)t% G(>!`GSSk8x @ G!h%m -[INTO%;p284@اP';ЩhDxAر8 G@_u@.}`z-7x}z Bhf m+Mz6\)pæZ|8x:~zܵ}]t'o+t>`.U*1}yakNHB^ݲ|`CK_.*`[_to~PtY+1pz2}8@x=0zqiS {:{¥j R,D\^jx7hHOPaaHj88}60BG!X0Xhr~Tx(m H2V'0RipP>}ؘH>}(8z}xvF8:S8>;S 0@VLpHH(~C(}Xd"}hu-Ȑ<7D\\7y>(~P‹8uKpUe0y Т8y p@y y y Xy 8xy ؛y Hy Șy hy (y y i)QvAD(AD ݟADAD|G      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aabccdefghiijklmnnopqrstuuvvwxyz{||}~   ADAD AD 0AD AD AD% "AD ;@AD\pADG0̜AD`zPٷADLpADKq AD^AD `ADAD%|q5ADE0]ADGϜADHXADAD"ADֿЙADGHpAD@SxADɘq%AD@HADcqADi8ADqxZADQAD+j EAD|ADYqPADqhADAѿ)AD%8ADO8ADוOޜADqŜADըhAD2LAD)"pAD5uAD0@AD|pADUHp?AD cq"яADe,5PAAD;ADADADH2AD4qhœAD'ADɝAD0r?ADo[@FADɝqADqAD)@PADHpADYfADyaADK`AD;xADFxAD@pHAD@AD2L@ADx[8GAD/LpAD9jzԜAD XAD]z(ADwADPqADըAD@p;AD;>я(ADyYQADN0ADeÆMAD۝q8@AD8Lp8ADEADAD׿AD7pɜADJq( ADIpMADV\ADqADcq6ADHܷAD[Æ*AD1]AD]`ADYqnAD؅qqַAD0AD[qADhW$hADńqAD}٨QADNHjAD|cz(ADLgADxADȄq!ADW;ADTLp8ADHSAD+qNADq9AD1̜AD.ADqADy RAD^p;AD(ADUzx.ADϿXADD 2AD`/ADҿADÆȜAD=0ADuڜADrqADcLpXAD XADKqଡ଼ADUq۷ADK$MADQ1f1AZ+>Q1f1A+ AjA9>aOc&AA9 ,IAAA,A; k A) "AAA#AA  A)}s AAld9[KAA AiA ,!99d%)vV!q9 KA9,!99rAy}A KIl IA9*b!h= A*B>AL_A AAȗ|AY@l4kAAA@AђX&AAz@ޕRɱ|QAؐAA A A- A AAAA,AA}jAliAAAIAAAA\AAAA\A}]YAmiAlIZAXAA3AAII}54BQ!A:$J1Y,!A AJ=A:"$J AAA Y ,v"{-A,A\AB]BhʵBܖB-*BJ* "B'BB * B * BBnBnBnBhB~B~BJ* "B'B8B:;)>+RzՐ! "%*cyԒx"~BBB6BYIB~B~r Bƕ9xBBBɕ-Bƶ HBl^PhB>"zB" BBaBBBKBKBB8B \jKJQkڥ IBky)z!z`e-e@B1d!y aq"DF#CB~^Bky)z!z`e-e@"!BB9k\9 nBycj*K ByBgBM*t8h#3!r])iia 2A%BK!"  ?n !?{Y9(|W(Bh鑋ByB"2I  B:BcɲBB~Z")8B[ѐmJ3r,MjSB~ B~ B:"<BBcɲ"lBcBJ -)~Q,:١}y[ =B -)~Q,:١}y[ -BJ -)~Q,:١}y[ =B" BB{Bc"m BcBc)A)0)9))* 5J!e%f)g-1LXlr )25:@yz.G"%(8>BF!o!r u ~              dstNQW8FI[[ '72;?CG"K,P,T,Z--`A-dL-jX6[6^66788888 8949S9O"9Z"9_#9k&9q)9|*9*9+9+9+9090939:9=9P9P9P9P9X9n9u9999&9939=9J9u9|99999 ::;;;;;B;;<aCDDDDD E EEEF6GOG!PG$\'\,e1e8e@eGeQeUeZe^fbffhjmumpm|mmmmmmm n nnpppppppp%%%#%$%$%%% 1%2%2%2%2%8%8%8%)8%49%?9%D 9%G 9%J 9%P9%U9%[9%_9%b9%e 9%i"9%o'9%}/9%19%39%59%79%99%=9%?9%`9%d9%h9%k9%p9%x9%y9%{9%9%9%9%9%9%9%"9%%9%-9%79%A9%K9%N9%Q9%V:%Y:%b:%h:%m:%r:%x:%|:%:%:%:%:%!:%#:%$:%&:%(:%7:%<:%c:%l:%m:%u:%v:% w:%}:%:%!:%6:%K:%N:%Q:%T:%Y:%]:%a:%r:%u:%:%:%:%:%:%:%:%:%:%:%:%:%:%:%;%;%;%;%;% ,;%-;%.;%0;%B;%$G;%*H;%5R;%9V;%@X;%G[;%J_;%Ma;%Rc;%We;%\C<%e<%j<%n<%r<%v<%z<%~<%<%<%<%<%<%=%Y=%Z=%_=%j=%=%>%>%AD%5.6.M.N............. .  . .*./.#0./3.<6.B7.F8.O:.TA.^B.lQ.pT.za.~c.n.p.r.t..............)...2.7.=.D.K.O.S.W.\.`.h.n.r.v.|.. . . . . . . . .' .* ., .. .G .H .I .  .  .# .( ., .4 .: .> .B .F .J .N .R .W .[ ._ .c .l .q .x!.}!. !. !. !.!.!.!.!.!.!.!.-!..!. 3!.4!.5!.6!.C!.#R!.;V!.@m!.C!.F".J".Q!".U2".Y".]".a".e".i".m #.p#.sF$.wG$.|T$.X$.]$.$.$.$.%.....7..8..2.2.3.3.3.'3.5.[6.6.7.7.7..>./>. 1>.% {D.E }D.I 00000000000000000000J 0L 0$s 0( 0, 04|0@|08}0J}0D0V0N;Z;^;b2 ;g3 ;l ;s@ ;x{ ;| ;R R R R R R R R6 R RRRRRBRCRDR ERRRRRR"R&[[a[vb[b[b[d[\M \Q \V \k \q \t !\w $\z &\~ '\ )\ *\ +\ ,\ -\ .\ /\ 3\ 4\ 5\ 8\ 9\ @\ O\ S\ W\ X\ Y\ Z\ [\ ]\ ^\ _\# `\5 c\: i\> t\A u\G {\K ~\P \S \V \Z \] \` \c \i \l \x \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \# \' \, \0 \4 \7 \B \I \N \c \n \ \ \ \ \ \ !\ "\ #\ $\ %\ &\ )\ +\ 1\ 2\ 3\ =\ >\ A\ B\ C\ D\ E\ F\ G\ J\ N\# O\) d\1 k\6 v\: \= \@ \C \G \K \O \S \W \[ \_ \d \g \k \q \t \y \~ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ &\ 8\ 9\ ;\ =\ ?\ @\ A\ B\ C\ E\ S\ \\ ]\ ^\! f\' i\+ k\/ m\3 w\7 }\; ~\? \D \H \L \P \X \^ \b \f \j \o \s \x \| \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ $\ %\ &\ '\ (\ )\ *\ +\ ,\ -\ .\6\[\ \\]\^\_\ `\$a\+b\2c\9d\@e\Gf\Ng\U\Y\]\a\e\i\m\q\u\y\}\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\ \/\3\6\9\?\C)\G+\J0\N1\Q2\V3\[4\a5\d6\j7\p8\s:\v<\z?\~G\I\K\N\P\X\a\e\f\g\h\i\j\l\m\n\q\t\u\v\w\x\y\}\\\\\\\\\ \\\\\ \$\(\,\0\7\=\A\E\J \N \S \W \[ \b\k\p\t\x\|"\#\)\ADUAD=AD!\̩v:Sz̨4̛.̗̌%?]&(<=,71w̎_63̒/-F@̐ț̪́0HX$$4VS_VERSION_INFO?DVarFileInfo$TranslationStringFileInfo`000004b0TCommentsSystem.Data.Entity.Design.dllLCompanyNameMicrosoft CorporationdFileDescriptionSystem.Data.Entity.Design.dll6 FileVersion4.8.3761.0\InternalNameSystem.Data.Entity.Design.dll/LegalCopyright Microsoft Corporation. All rights reserved.dOriginalFilenameSystem.Data.Entity.Design.dllTProductNameMicrosoft .NET Framework: ProductVersion4.8.3761.08Assembly Version4.0.0.0Hp ȄNGEsHT(0Xl(p,|AD L" 0@0rGPDdov d~`B&Ucp\@LB R0B[c@Zc##~`B&Ucp\xcI~ѡ##IʹAGn43gPZcSG`0xbRxcI~ѡ##hHV ORSÅ,FXcqtr˰-Y Y # #ASGM-?Tv\xcI~ѡ # #qa+&@T, p\xcI~ѡ # #֠ہC Xap\ xcI~ѡBSJB v4.0.30319l4#~#StringsX#US`#GUIDp$#Blob %3   $-4GS^iuSystem.Data.Entity.DesignmscorlibSystemSystem.Data.EntitySystem.DataSystem.XmlSystem.WebSystem.CoreSystem.TransactionsSystem.Xml.LinqSystem.Data.DataSetExtensions /Ep _O 9"z\V4?_ :0m 8,Ps`?HXG`ؗxHPN 00 ht$d` \l\<lLT(Ȑ̐L pPԐd d`HĐxlTXdPĐTА0ȐĐ8\h@HĐ>d>Ȑ>>>>>̐>>>> >>L>$>Ԑ\>>>>T>T>>>>>>>H>>>l>>H4>\>>>T>><>P>>,>L>X> >>>>>>`x>>>h>X>Xl|0L|h ||dА%9%K%}%%H%%%%%/%10rArPrrrrrCsPsXs`sts skt0ptttttuuu u8u@uRu`uv v||,},,}x},x}},}~,~\~,\~, D*0x"0ȄDЄdφІ݆.0܈@I`PFP,ڍHd 7@kp *0:@W`u %<0fPp˒hВ2@8@ؔ  v<,P*`0`| |MPЙ"0|#|0MMh8@np%0[l`sǨШǫЫEDPİİ8_L`|ųг)0LLotpʺк 00 f<pQT`yppIPžо ip5@opIP ipsXp ip/0y)0IpP9@-0yIP)p0y ip Y`op pY`p  ipEP]`pp_`yppp op ipOP_`p ipppp/0yp p)p0IpPipppppp p)p0IpPipppppp p)p0ypIP zJP  )00K0PZ`D\&&bbMM``-`-`````pP dQd`hp(JDP9l@  > @$ 8  , &0Dt8 SP`00,8:@8@4l\pfp-0ap@@ !0:@Q`i0py0,<fPplPlPl0l0llll`l`l@l@l l  l !l!p!lp!!l!P"lP"""V#`###))8*0@**D*E+lP+++++a,p,,,(-0-i-p-K.K.{.P./<//d////00000 0Q1Q11811124 22H22l233/303334 4y444455]5`5505 66o60p66H6=7`@77`78x8x8x88899@9999:U:`:::7;@;[;`;< <m<p<<8<<P<=d=>?????AAB8 BYB`B%C0CCCDDEEEPEcFlcFFFFFFFFGG GGGGGHH+I0IIJJJ K8K}KLK&Mh0MQQ]T`TTTUU>U@UrUUUUrWrWWPWV\`\C]$P]bcLbcc8ce f4hT@hhhk kkkWn,`nnnno#o0ooopp6q@qq qWr(`r{rrsDstptuuvvVx `x y\  y(y0yy yyz6z @z@{ @{|  || |||:}, @}}, }}D }5~\ @~J~P~a~p~~~p ~~p ~~| ~~~ā Ё! 0T .T 0p    (0, 0 ӆ 8 @y( 8 8 ه8 8 XL `d )8 0|    ʋЋH Pi p  Ɍ Ќ " 0( .D 0d x ' 0y : @4 @JPZ`jpM P~ !80\x"0bpy83@  <6 @L JPٞ )40lTphjp 4<@JP vj pzʱбڱ  D QP`?p?Pnnдд$P$<ܵķ з¸DиX8 /l0 ~~444P@lbpQ` Y` M0PH<PVDV4`4`  L!|!Z!`!J!P )40lTp G0"Pw0"D"\" >t"@"X< "%"0B"PZ`"5"@"# (#BPeh#ph#t#D1#@Q#`S#S,,G,G,%,x H&  h&  x&  &  &      p  ` 8'` j p y 0  P'  p''8G'PE(E~Pp(`(`p,p,ep,pM ,P  , ',' (4 ((`/(d*/p*n-/p- . 0..<0.U0\0`0202202303G61P66p17H81P8;1;w=<2==2> @2@A2A?D,3@DD3D0E30EE3E)G30GG4GJH(4PH-IH40I^It4`ItI4IJ4JJ4K$L40LL5LEM@5PMPX5 P!R50RcT5pTV(6V$Wl60WcW6pW!X60X{Y6Y Z6 ZZ7ZI[$7P[o\H7p\\p7\;]7@]^7^_7_`7````````0`8a8@aaD8aa\8bht8hhhiiiij'jj8jk:kl: l4m;4mmmpmq;qq4qq4qzr4rrl=r)s=0sHs0Pss=st tu=uv>vwL>wyX>yzhz8?AA58B5DӑD2E@'TE0|E˕EЕrE}E/|F0F F}FPFPG G W8`#K0PK4 \R`?R@,SPP0P0$TTTnTn88 V(V9HV@XlV`<V@IWPn@Wp lW WWW5X@XO(XPXXX`XY8DZPZ4ZLZ }hZZZ=Z@Z B[B\(\?X\@Xp\`\Y\`Kh]P]_]`jpz<]@]^y$^D^/x^0^^Q^`9^@_D_D_GX_PYt_`_V_`__ O_P__^_`_```N0`P^ P``  x` c `p  `    7a@Wa`jpzaaaab%Db0:@vXbv88bc2c@0d0|  d    !d !9!d@!l!dp!1"d@""""$d$ %4e%y%Pe%%le%b&|ep&W'eW''#''e'z( f((4f()Tf)M*|fP*E+fE+++++,g ,-g-R-R---t.g..g..g......////Tf/|3g|33h33l333Q4h`44h46h68\i88i8;i;?j ??k?Ak AnBlpBHCTfPCCXlCpEtlpE9Fl@FXF`FFmFG8mHIhmIImIImIImIQJm`JJmJ6Km@KKmKLm LLmLLmM MnMM MMMnPMO,nOfO\pOOnOOnPPn P2Pn@PTPo`PPoPQ8oQQRho`RRoRNSoPSSoTHToPTVT`TToTTpUUpUV8pVVTpVVVVVVVV0VWppWWpWXpXXpXpYppYHZTfPZ[p [D\qD\\\\\ ]q]1^q1^^^^^_ r__g__g_____` `(`0`aTfad0rddhddleeeNesPee$segis@ihiipilt l otookoptuq5ru@rsTf ssXls@uu@u;vPv@vXv`vvmvxv xyv yyvyymyymz=zw@zzmz{m {{m{{m|f|mp||m||n||}-}n0}~,w~@\@Rn`wnnoSw`jpȀwȀ%0JxPw*x0w xhwhŃЃxHwHʄxЄ(w(xwepxwEPjxpLJ0xLJ$0o|xpȈwȈ%0JxPw*x0x/|x0JxPjxpxxʋxЋx x*x0JxPjxpwʌЌ(w(xwepxwEPjxpȏwȏ%0JxPxO|xPw*x00x/|x00x/|x00x/|x00x/|x0x/|x0x/|x0x/|x0JxPjxpxxʙxЙx x*x0JxP'y0$yLy ;\y@pyyߢyߢ$,$i,p}zn{n{{X4|Xr|}s,}sI|}Pij}гM,~P~~-~0÷~зڷø@и۹ ٺ4XHP6@߽܀$tH"h0JJIPEdEԂ 4P@Pblpx0 5`@Q#`t d8pLl CP]`mp}  7@g0"pAPs8`3@MP]`mp} G0"POpP'܆0_`x` ,$0ZD`X U`ԇ *0:@I0PY0`00 0  p <P | 8\ X tX  h     0 0 b 8p  H  hPP$4̓ ] `<9\@ 00̔$X$"," #P #U#P`#$̔$`&H`&&p,&/'0''('''S(`())7-Ș7--D--D-#.D#.s.Ds..D./D//D/0T 01p1"2\022 22824d4:5@55566J7P7;؛;<8<W<8`<f<p<U>L`>>>>>)?0?[?`???@@@,@A<AABB B*B0BABPBBdCDDOD8PDvDDDDDD0E0EEEE4EElEEHFDFHPFF`FF`FxϏЏ"ĥ0ܥ ĥ߱|hU`ĩڴةPPTD`XGPZ`qԪ8+800ƹй۹7H7t8,# `8989}8NPV`kp &0[`z,LX, |g& 0npv$S$`<?T@~"l0x  *0MPmpvaЯ NPV` GPZ`g0'0:@gD D ^`fpHH?\@JPZ`jpH>@FP`D`pDpDDD ̰ 5@~ LP LP )0IP LP<@ep EPu4H.06@s`t00PPi pt00I Pt) 0t  %h#0?e@Uh#`̱.̱0^̱` (0ipIPwh#eh#,0;@ṉp̱̱̱'0W`)0W` 7@PPZ`fp!0F4Ph#D )0npvDX9L9ZL`$|$U\`mp},0?g@FPxR8`fpxOPdmp8pV`8`  ,cp 4@W`t"\е`a,,@0IhP8CP;ж@MPxx &06@HP_ `fpxkp< K`Pp: @   y   (8 )00X(80 Xp.8090@-p0~80$0}p80t'Ը0R` 7X@|7X@|7X@|.06@MP̹^`fp}Я  00R`fpxD` IPȺpp!0!a"hp"N#P#+$0$u(((d()x))D)))* *&*0*[*x`**D*+`+ --y-Ⱥ-0.0.s....J00P0!1h01222257@7W7d`7T8`8i8p88D88ؼ80909|999 9;4;<p<<<<<!=0=U=Ƚ`==ؽ===>>l> p>>>>0>>H>>0>>n>?\??8?@ @BBCB,PBCX C&C0C[Cx`CCDCD|DEEMFPFFF3G@GFGPGH4HI`IdJpJ1K@KOOOdOOPPPP PdPpPPPPPQ Q2R,@RIRPRnR`pRRtR7S@STTTTUU V8 V_V8`VVdVWxWW8W^6^ .^&^^^AD^^ ^^^(ޒ^2֒^<Β^F0|AD辒^~AD讒^@AD螒^薒^ 莒^膒^~^(v^2n^<8AD^^V^ N^F^>^(6^2.^<&^FAD^AD^^ ^^^(ޑ^2֑^<ADƑ^辑^ 趑^讑^覑^(螑^2薑^<HAD膑^~^ v^n^f^(ADV^N^F^ >^6^.^&^HAD^AD^AD^^ ^ސ^֐^(ΐ^2Ɛ^<PAD趐^讐^ 覐^螐^薐^(AD膐^~^ v^n^f^(^^2V^<ADF^AD6^.^ &^^^(^2^<AD^^^ `AD֏^Ώ^AD辏^趏^ 讏^規^螏^(薏^2莏^<膏^FADv^n^f^ ^^V^N^F^>^%6^*.^/&^6^;^@ ^E ^J ^O ^T ^Y^^ގ^c֎^hΎ^mƎ^r辎^w趎^|讎^AD螎^薎^莎^膎^ ADv^n^f^^^ ADN^F^>^ 6^AD&^^ ^^^(襟AD^^ ^ލ^֍^(΍^2ƍ^<AD趍^讍^覍^ 融^詟AD莍^膍^ ~^v^n^(f^2^^<V^FADF^HAD6^.^ &^^^(^2^<AD^^ ^ތ^֌^(苞ADƌ^辌^ 趌^讌^覌^(螌^2薌^<AD膌^~^v^ n^f^^^V^ADF^@AD6^菞AD&^^ ^^^(XAD^^ ^ދ^֋^(ADƋ^辋^ 趋^讋^見^(螋^2薋^<HAD膋^~^v^ n^f^^^V^N^#F^(AD6^.^&^ ^^^AD^^ ^^ފ^(֊^2Ί^<Ɗ^F`AD越^ AD覊^螊^薊^ 莊^膊^~^hADn^ f^ ^^V^N^F^>^6^.^&^ ^ AD^^^ ^ ^ ^ މ^$ ։^+Ή^0Ɖ^5辉^<趉^C讉^H覉^M螉^T薉^YAD膉^xADv^n^f^^^V^N^ F^ >^(AD.^&^^^ țAD^^^^ HADވ^ȜADΈ^ƈ^辈^趈^ AD覈^螈^薈^莈^膈^~^v^n^pAD^^V^N^F^НAD6^.^&^^ HAD^^^^^^ އ^ ȞAD·^XAD辇^AD讇^AD螇^؟AD莇^AD~^0ADn^f^XADV^N^F^>^6^.^ &^ AD^^^^ AD^^ކ^ֆ^ ADƆ^ 辆^ 趆^讆^覆^螆^薆^莆^膆^~^ v^ ADf^^^V^N^F^>^6^AD&^^^^^^ ^ ^袞ADޅ^AD΅^ƅ^辅^超^讅^覅^ 螅^ AD莅^@AD~^v^n^f^ hADV^N^F^>^6^褞AD&^^^^^^^^0ADބ^ք^΄^Ƅ^AD趄^讄^覄^螄^薄^莄^ 膄^ ADv^n^f^^^V^N^F^>^AD.^AD^^^^ (AD^5^4^3ރ^2փ^1΃^0ƃ^/较^.趃^-讃^ ,覃^ +螃^ *薃^ )莃^ (膃^'~^&v^%n^$f^#^^"V^!N^ F^>^6^.^&^^^^^^^ ^!^"ނ^#ւ^$΂^%Ƃ^&辂^'趂^( 讂^) 覂^* 螂^+ 薂^, 莂^-膂^.~^/v^0n^1f^2^^3V^4N^5AD>^xAD.^&^^^^AD^AD^^ށ^ց^ ADƁ^AD趁^讁^要^螁^AD莁^8AD~^v^n^f^^^V^N^`AD>^AD.^૞AD^^^^ AD^^^ހ^ AD΀^ƀ^辀^趀^ AD覀^AD薀^莀^AD~^譞ADn^AD^^@ADN^F^>^6^ hAD&^讞AD^^^^^AD^^^^ XAD^5^4^3^2^1^0^/^.~^-v^ ,n^ +f^ *^^ )V^ (N^'F^&>^%6^$.^#&^"^!^ ^^~^~^~^~^~^~^~^~^~^ ~^!~^"~^#~^$~^%~^&~^'~~^( v~^) n~^* f~^+ ^~^, V~^-N~^.F~^/>~^06~^1.~^2&~^3~^4~^5دAD~^}^}^}^ AD}^}^}^}^}^(AD}^ }^ }^}^}^}^~}^v}^n}^f}^ ^}^ pADN}^ F}^ >}^ 6}^ .}^ &}^}^}^}^}^ |^ |^ |^ |^ 貞AD|^xAD|^|^|^|^|^|^|^AD|^ADv|^n|^(AD^|^XADN|^F|^>|^6|^ AD&|^|^|^|^ AD{^AD{^{^{^{^ AD{^{^{^{^{^0AD{^{^{^~{^ ADn{^ AD^{^V{^PADF{^>{^6{^.{^ AD{^{^{^{^ ADz^z^z^z^z^z^ z^ ADz^ADz^z^z^z^z^8ADvz^nz^AD^z^Vz^Nz^Fz^>z^عAD.z^&z^z^XADz^z^y^y^ y^y^y^y^y^ y^$ y^( y^, y^0 y^4y^8y^<y^@y^D~y^Hvy^Lny^Pfy^TPADVy^Ny^Fy^>y^ 6y^.y^&y^y^y^y^#y^'x^+x^/x^3 x^7 x^; x^? x^C x^Gx^Kx^Ox^Sx^Wx^[x^_x^cx^g0ADvx^nx^fx^^x^ žADNx^ Fx^ >x^ 6x^ .x^ &x^x^x^x^ x^$w^(w^,w^0w^4`ĞADw^?w^>w^=w^ w^L,6w^P+.w^T*&w^X)w^\(w^`'w^d&w^h%v^l$v^p#v^t"v^x!v^| v^v^v^v^v^v^v^v^v^v^v^~v^vv^nv^fv^^v^Vv^Nv^Fv^ >v^ 6v^ .v^ &v^ v^v^v^v^u^u^u^u^u^8ƞADu^3u^2u^1u^ 0u^/u^.u^-u^,u^ +u^$*~u^()vu^,(nu^0'fu^4&^u^8%Vu^<$Nu^@#Fu^D">u^H!6u^L .u^P&u^Tu^Xu^\u^`u^dt^ht^lt^pt^tt^xt^|t^t^t^t^t^t^t^ t^ t^ t^ ~t^ vt^nt^ft^^t^Vt^Nt^Ft^>t^6t^XΞAD&t^t^ t^ t^ t^ s^ s^s^s^s^#s^'s^+s^/s^3s^7ԞADs^ s^s^s^ s^~s^vs^ns^fs^ ^s^$מADNs^ Fs^ >s^ 6s^ .s^ &s^s^s^s^ s^$r^(r^,r^0r^4؞ADr^r^r^r^ r^r^r^r^r^ r^$ r^( ~r^, vr^0 nr^4 fr^8^r^<Vr^@Nr^DFr^H>r^L6r^P.r^T&r^X@۞ADr^ߞADr^ q^ q^q^ q^q^q^q^q^ q^$q^(ADq^q^q^ q^ q^ ~q^ vq^ nq^fq^ ^q^$Vq^(Nq^,Fq^0>q^46q^8.q^<ADq^$q^#q^"q^ !p^ p^p^p^p^p^#p^'p^+p^/p^3p^7p^;p^?p^Cp^Gp^K~p^Ovp^Snp^Wfp^[ ^p^_ Vp^c Np^g Fp^k >p^o6p^s.p^w&p^{p^p^p^p^o^pADo^ o^ o^o^ o^o^o^o^o^ o^$o^(PADo^ o^ ~o^ vo^ no^ fo^^o^Vo^No^Fo^!>o^%6o^)AD&o^o^ADo^o^n^n^ ADn^n^n^n^n^ ADn^n^n^n^ hADn^n^~n^hADnn^fn^^n^Vn^ Nn^ Fn^ >n^0AD.n^&n^xADn^n^n^m^m^ m^m^ADm^m^HADm^m^m^m^ m^m^m^m^ADvm^nm^fm^^m^ Vm^ Nm^ Fm^ >m^ 6m^.m^"&m^&m^*m^.m^2m^6l^:l^>ADl^l^l^l^ l^ ADl^l^l^ADl^l^l^PADvl^#nl^"fl^!^l^ Vl^Nl^Fl^>l^6l^ .l^$&l^(l^,l^0l^4l^8k^<k^@k^Dk^Hk^Lk^Pk^Tk^X k^\ k^` k^d k^h k^lk^pk^tk^x~k^|vk^nk^fk^^k^ADNk^Fk^>k^ 6k^ .k^ &k^ k^ k^k^ k^$j^(j^,j^0j^4j^8j^<hADj^j^ADj^#j^"j^!j^ j^j^~j^vj^nj^ fj^$^j^(Vj^,Nj^0Fj^4>j^86j^<.j^@&j^Dj^Hj^Lj^Pj^Ti^X i^\ i^` i^d i^h i^li^pi^ti^xi^|i^i^i^i^ADi^#~i^"vi^!ni^ fi^^i^Vi^Ni^Fi^ >i^$6i^(.i^,&i^0i^4i^8i^<i^@h^Dh^Hh^Lh^Ph^Th^X h^\ h^` h^d h^h h^lh^ph^th^xh^|h^~h^vh^nh^ AD^h^ Vh^ Nh^Fh^ >h^6h^.h^&h^h^ h^$h^(XADg^ADg^ g^ g^g^ g^g^g^g^g^ g^$g^(ADg^PAD~g^ vg^ ng^ fg^ ^g^Vg^Ng^Fg^>g^ 6g^$.g^(&g^,g^0ADg^ g^ f^ f^ f^f^f^f^f^ f^$f^(f^,ADf^f^f^f^ f^ ~f^ADnf^ff^^f^Vf^ Nf^ Ff^ >f^6f^.f^&f^f^f^ f^ f^ e^ e^ e^e^e^e^e^e^#e^$e^%e^&ADe^e^e^e^ADve^ne^AD^e^Ve^Ne^Fe^ >e^ 6e^AD&e^#e^"e^!e^ e^d^d^d^d^d^#d^'d^+d^/d^3d^7d^;d^?d^Cd^Gd^Kd^O~d^Svd^W nd^[ fd^_ ^d^c Vd^g Nd^kFd^o>d^s6d^w.d^{&d^d^d^d^H!ADc^&c^%c^$c^ #c^"c^!c^ c^c^c^#c^'c^+c^/c^3c^7c^;~c^?vc^Cnc^Gfc^K^c^OVc^SNc^WFc^[>c^_6c^c .c^g &c^k c^o c^s c^wc^{b^b^b^b^b^b^b^%ADb^b^b^b^ b^ b^b^b^~b^*ADnb^fb^^b^Vb^ Nb^ Fb^>b^6b^ .b^ &b^ b^ b^" b^%b^(a^+a^.a^1a^4a^8a^<a^?h-ADa^a^a^a^ a^ a^a^ a^ ~a^ va^ na^ fa^"^a^%Va^(Na^+Fa^.>a^16a^5.a^9&a^</ADa^ a^a^`^`^`^`^`^`^`^ 1AD`^2AD`^`^`^`^ `^`^~`^v`^n`^ f`^$^`^(V`^,N`^0 F`^4 >`^8 6`^< .`^@ &`^D`^H`^L`^P`^T_^X_^\_^`_^d3AD_^6AD_^_^_^_^ _^_^_^ 7AD_^~_^v_^n_^ f_^^_^V_^N_^F_^ >_^$ 6_^( ._^, &_^0 _^4 _^8_^<_^@^^D^^H^^L^^P^^T^^Xx8AD^^^^;AD^^ ^^ ^^^^ ^^ ^^~^^v^^n^^f^^^^^"(=ADN^^>AD>^^6^^.^^&^^^^H?AD^^^^?AD]^]^]^]^x@AD]^]^]^]^@AD]^]^]^pAAD]^~]^v]^AADf]^0BADV]^BADF]^>]^6]^.]^ &]^ ]^]^]^]^CAD\^\^\^\^ @DAD\^\^\^\^ \^\^\^PEAD\^(GAD~\^v\^n\^f\^^\^ V\^ N\^ F\^GAD6\^.\^&\^\^\^ \^ \^[^@HAD[^[^ IAD[^[^[^[^ [^[^[^IAD[^JAD[^KADv[^n[^f[^^[^ V[^KADF[^>[^6[^.[^ &[^[^[^[^[^ Z^$ Z^( Z^, Z^0 Z^4Z^8Z^<Z^@Z^DZ^HZ^LZ^PZ^T8MADZ^Z^~Z^ vZ^ nZ^ fZ^ ^Z^ VZ^NZ^ FZ^$>Z^(6Z^,.Z^0&Z^4Z^8Z^<PADZ^Y^RADY^Y^TADY^`UADY^UADY^Y^`VADY^WADY^ Y^~Y^vY^ nY^ fY^^Y^VY^NY^FY^pWAD6Y^hXAD&Y^Y^Y^YADY^YADX^ X^X^X^X^X^X^X^X^X^ [ADX^X^X^x\AD~X^vX^nX^]AD^X^VX^h^ADFX^>X^6X^8_AD&X^X^_ADX^X^W^x`ADW^ADW^W^aADW^W^W^W^W^W^ W^ W^XaAD~W^vW^nW^fW^ PbADVW^NW^FW^>W^ cAD.W^&W^W^W^W^W^ V^V^cADV^dADV^V^8eADV^*V^)V^(V^ 'V^ &V^%V^$V^#~V^"vV^!nV^ fV^!^V^$VV^'NV^*FV^->V^06V^3.V^6&V^9V^<V^?V^BV^EU^HU^KU^NU^QU^TU^W U^Z U^] U^` U^c U^fU^iU^lU^oU^rU^u~U^xvU^{nU^~eAD^U^VU^NU^ FU^ >U^ 6U^ .U^ &U^U^U^ U^ U^ T^T^T^T^jADT^T^T^kADT^ T^T^T^T^T^T^~T^vT^nT^ lAD^T^VT^NT^FT^ lAD6T^ .T^&T^T^T^T^T^S^S^S^ mADS^nADS^S^nADS^S^S^S^ 8oADS^S^~S^ vS^ nS^ fS^ ^S^ VS^NS^FS^ >S^ 6S^ .S^ &S^ S^S^pADS^qADR^rADR^sADR^ R^R^R^R^R^R^R^R^R^ sAD~R^vR^nR^ fR^ ^R^ VR^ NR^ FR^>R^6R^ .R^ &R^ R^ R^ R^R^tADQ^ Q^Q^Q^Q^Q^Q^Q^Q^Q^ 0uADQ^ Q^Q^Q^~Q^vQ^nQ^fQ^^Q^VQ^ uADFQ^ >Q^6Q^.Q^&Q^Q^Q^Q^Q^P^ vAD:>BFLPTX\`cimqu{ɹ޹ &<\co̺,pӻ׻ۻ߻'+9EQlyؼ߼\վ޾#/3DKRY]jqҿLPTX\`dhlp%j "&*Tbsy} 4K^b$.2FXs}#0FJPTX6[lx'<CGPbk$OVu)3<@IMY]aenr)a+CNRVfjsw#15 Z^bt3Mj :>_clpy}'J[_cgkos"&*.;B\by}-?J 3<BHj9amy}8<T^d|!3I[s~~þ̾ tn{'fAN__(5(5]']](5]]y]']yn{1>1>f5]yyer{1>reeee'{eeef']ffv5'55 - - - - -B -BBB -B -B+8+8n{n,ABABABABABABABABABABABABABABAB|AB tAB lAB dAB \AB TABLABDABB>B>B>B>B>B >B >B>B>B>B>B>B>B >B >B |>B t>B l>Bd>B\>BT>BL>BD>B<>B4>B,>B$>B >B >B >B >B =B=B=B=B=B=B=B=B=B=B=B=B=B=B=B=B|=Bt=B l=B d=B \=B T=B L=BD=B<=B4=B,=B$=B=B=B =B=B(*{*{*{*"}*{*{*{*{*{*"}*{*{*{*F(4 (*(4 r5p( +&r5p( +&(*{*{*2{o*6s}*{*"}*J~4}(*fr06p(}(*jr6p(+&(&(*jr6p(+&(&(*(4 - r8p(z} } } } }*2(=*{ *{ *{ *{ *{*b(4 rS-p(}"*"(E*{"*Jr p(}"*0  s *&s *Nr06p((i*.s *{:*{;*{@*"}@*0s ~4(*fr<p(,+&~4(*r<p(,+&r06p((*6~1(*{B*Jr p(}B*{C*{k*"}k*(4 *(t * *:(u (*( *"(0 *{-}(1 ( (2 (1 *"(3 *( * *.({w**R( **0% ( ,oy Toz T*% TT*2{o*{*j{y- s~ }y{y*R{s o *j{o s o *Z{s o *04 {|({{|o s o *>s%}*^( ,*rqp(J *2{|o *6(&((*0 {oo,**j{}- s}}{}*{~*{z*2(+,**6{o*6{o*&(*2( uQ*{*:(4 }*0o u@ (;*F~rqp(J *.r{p*Zu`,t`*o *( -o %( ,*(Q(O*-*o ( -r+po (M(P*6rKp(P*&(*j(]o*o?(*0( - (_o1 *2(Wo *2(ud*:(4 (^*6(as *6(as *0s s *{*"}*2{o*2{o**Rrp}(*0(f uk o ,** 3 `.  0***2( u<*j(]o*o6(*0( - (_o2 *2({o *2(ut*{*"}*{*"}*{*"}*{*"}*Frprp(*Frprp(*Frpr p(*Fr pr! p(*Fr/ pr7 p(*FrG prO p(*Fr/ pr p(*FrG pr! p(*Frpr_ p(*Fr prs p(*Fr/ pr_ p(*FrG prs p(*Fr/ pr p(*FrG pr p(*Frpr7 p(*Fr prO p(*Frpr p(*Fr pr p(*0--(2*( /*r p(< o# *(% *"5**0 +o, o- % -*6(o( *:(*{*"}*j{- s; }{*>(X}*{*0,6 P ( (, ( (, *2r p(*2r p(*2r p(*2r p(* . 0.  `3**** . 0. P.+r/ p*rO p*rs p*r p*>((*zr/ p( - rs p( ,**(X}-~W +}*2(]o*oK - oL +"(]oM ( o***(*"(*r(o` oh rqp(J *2(uu*0(( *2(ue*2(o *R(]o*o>*0.I.( (_os .(e s *Fr pr p(J *Fr pr p(J *{-(\(s }{*{-(\(s }{*2((A*2((B**ok * *(*F(o` o *B(}*:oo*2(u8*&(*N(]o*o9*J(]( o*2(u5*(of -*(](of o%*B}(*j(]o*o8(*2( uk*{*,o -}o o &*, o o &*6{o *0 s *&(*N{s o *:(D(*:(E(*:(F(*:(G(*:r!p('*:r{p('*z{rqp(J s o *6{o *6rIp(%*2~(*2~(*2rp("*ro -o - o **"(<*~(b rpo ,rp*(?*6(C(< *F(A~(< *"~*2rp(< *2rp(< *2r#p(< *2rWp(< *r(-T*tqo T*2rp(< *0'I (L-*(c ,*o5 (c *.rUp( *.rp( *.rp( *.rp( *.rKp( *.r3p( *.rIp( *.r p( *.r p( *.r!p( *.r!p( *.r!p( *.rQ%p( *.r%p( *.r&p( *.rc&p( *.ro'p( *.r'p( *.r'p( *.r(p( *.rW(p( *.r(p( *.r(p( *.r )p( *.rE)p( *.r)p( *.r)p( *.r*p( *.rG*p( *.ry*p( *.r*p( *.r*p( *.r5+p( *.ry+p( *.r+p( *.r+p( *s *s *s *s *Js }(4 *{*Jo s *Jo s *V(4 }}*V(4 }}*{-{s }{*{**{*( {,{, {o *( **s *0&m{{{{s o*>{-(z*bo o[ o o *0>o ( ,( o ( ,( o (7*0 (; o *&C(:*&C(<*0)(Q,Q*o QP(U*(RPo - Po 1**0-Q{" ,. +s@ Q+sA Q(S**o Q*>sP%}5*>sX%};*.r;ps *( -( s o **(*2~5(++*>{:-(z*B3rU=p*rc=p*0oo,( ( **0ao= o -s ( sD o$  om oE o - {L o & or*{A*"}A*:(4 (*^(-*(o*^(-*(o*(,#o . (o*(o**0'(} ,3 ( Q*(x,**{ *"} *{ *"} *v(4 s ( s ( *0D( o o +( o ( ( -o *#5J( o ,**J( o ,**0 o , ( o **0 o , ( o **( o ( o - ( o *( *"( *6o ( *6o ( *6o ( *6o ( *0- o Xo; QXo *J( -( **o ( -o o , rWyp( ,**(,o: 1{ao o ,**ryp(o -o: Yo" ryp(< **rQ(, o Q**(4 }n|m(}l*2{lo *2{lo *{n*{m*N{l{m(*2{lo *{l*v~2( ,s*s*v( {xo {yo *0( -.*.*b( rp( (1*>( (2*{*{*{*{*{*{*{*{*{*{*{*{*2( o *s!*s5*.>( *f( ( t=}*{*N{o#( *N{o$( *N{o%( *N{o&( *N{o'( *N{o(( *N{o)( *N{o*( *N{o,( *N{o-( *J{o#( *J{o$( *J{o%( *J{o&( *J{o'( *J{o(( *J{o)( *J{o*( *J{o+( *J{o,( *b( rp( (j*>( (k*{*{*{*{*{*{*{*{*{*{*{*{*{*sY*sn*.@( *f( ( t?}*{*N{o[( *N{o\( *N{o]( *N{o^( *N{o`( *J{o[( *J{o\( *J{o`( *J{oa( *J{ob( *J{oc( *J{od( *J{oe( *J{of( *F.-(z*b( +&o: -(z*B,3*(z0(ds *0(es *0(_s *0(as *0 Gs *0 s *0 s *0 sn *0 s *:(P(*.(N(*.(O(*2(ls *2(ms *6(is *s *"s *b(B+&(w-(z*rp}(4 }}}}*0 ss  (*V( ( ,(z*Vrp( ,rp**o5 ( (c ,oI ( o *oI *r{, o (*o *0!( o_ 3o *(*o_ . *of ,o {(X -*6 (K **oL *0 s *0'o  +oO o ,*X 2*"(*0&-,! +o (9 -*X o: 2*0/-,*o: (  +o (9 -*X 2*NrJp~W (*6( (> **o_ **o_ *.o_ *. o_ *0%Euq -*~0( , o **.o_ *r>p{o@ rNprZpo *(4 -(b +(G si }sj }}*:{ok *&(*:{on *>of {*Jo {( *f(4 }( }*f}|o *{*s z(*.s*(@*V(4 } } *.s+*6ttsu*6tdsS*6t<sc*6tQs/**(1*0[ob -1o}o ,o)}*o}*o (3 }}*0!o% (3 }}*z3 (5+ 3 (6*.(2*0М( o *0}( o *{*{*.s:*-{s o *{s o *.s?#*ro -o , o" ***o *o **o *N{,{+(*2{-s *{.*.sN/*:o ~%*f(4 }1( }3*{2*(V*f(4 }7( }9*{8*(^*.sa>**o *0s }*:{So &*6{So *0N{Io5 {Ho_ *n{Po {Qo *2{Po *0{Qo *:{To *:{To *&(r*Reeo *.(t*{\*{]*{^*{_*r{\-{]- {^**.s`*o=*oE*o[ *o9 *o *J{ho o *^ov{jo ( *b{o{ko t*R{n{ko *b{m{ko t*R{m{ko *R{p{ko *.sq*~W ( -(  oI (J *oI *6{x(*.sy*jo: Yo" rvp(< *jo: Yo" rCp(< *jo: Yo" r2p(< *jo: Yo" r<p(< *jo: Yo" rFp(< *jo: Yo" rNp(< *jo: Yo" rwp(< *jo: Yo" r7yp(< *2rwp(< *2rwp(< *jo: Yo" ryp(< *2rwp(< *jo: Yo" rTp(< *jo: Yo" rZp(< *jo: Yo" rdp(< *jo: Yo" rnp(< *jo: Yo" rxp(< *jo: Yo" rp(< *Bo: Yo" *jo: Yo" rwp(< *Bo: Yo" *jo: Yo" rp(< *jo: Yo" rp(< *j{{o: Yo" *R{{o *.s*2~1(x * *2ryp(N+*2r6p(N+*2rp(O+*2rp(N+*2rެp(N+*N(o}{*>((*6o}{* *:{{(P+*:{{(P+*:{{(P+*:{{(Q+*:{{(Q+*:{{(Q+*:{{(Q+*:{{t*:{{( *:{{t*:{{( *>{{ t*>{{ ( *rp* *:{{(P+*:{{(Q+*:{{(Q+*>{{ t*>{{ ( *>{{ t*>{{ ( *rp*{*:(}*s*s*.s*o **o *{*"}*js }(4 }*{*{*( o ( X]o (*0M(Q( on o TTJ.#(on o -on o T*F(,(**.s*.s*Frqprpo *f(4 }( }*f}|o *j}|o *{*('*J{o[ o *(4 rp(5 o6 s7 }w*0 ~v-s v(+&~v*0s( -*{w(o9 ,Q,M +6u ,& o: 1  o; r5p(< X i2(= (> **0( -*{w(o9 *0( -*{w(o? *0G}zs}(4 }{}|}}{s5}~*0    (,. +s@ +sA oB _}z{xos(( ,ݛ()oC , ((-or=psD +c(E sF oG rAp(H   /oI rcp(J (K oL sM sN r=psD sO rmpoP oQ oR (oS ,?oT joU &sV ()o(('~W (X oݑ   (   (m   ([   (I (7,oY ,oZ ,o[ o ,o\ , oY *A fq0 f1 f2 f3 f4 70T{z,*{{o] o+&4&o_ 6oI o] ( o] (* 470{z,*o` oa (b sc od +a(e  o] of ,>o] o] og ,*o] (} o` oh o] (+  o] oi &(j -o *'n0{z,*(b sc ok ol +V(m (,Ft>  o] of ,$  o] (~sn oo (+  o] oi &(p -o * c0*s }{{o+sr (+*0?s }ot su (+(+ ,ow 1(+**0f % TT( uC ,6o{ o| ,(o{ o} oy To{ o} oz T*,oy Toz T*08 {|({o {|o s o *02 {|({{|o s o *0? {o +( o , ( -o ** !-0& o ((o ($ (o*0' o ((o ($ (o*0} o_ 31o o -(o o*(o o)*o (&( , o +o ((o ($ (o*0(3o o (3o o (]oo (`rup(E%(3o %(3o %o %o (2%(1%o %o (2%(1oAo &s *(]o o to o"s *0'VoI (_rpo#([ *0rp(@(:rp(A %rmp% (Co o &rp(A o o &o{o](7*0roo +No o-o# +o% rp%s (A o o &o - ,o * Zg 0J(A %r p%o %r)p%o (Co o &*0r3p(@%o` o %o` o %o (A o o &(=,9o 1/o o o  o (z o*^r\0[{-@rp%rp%( o6 o o oI (A}o {o &*0oo o (-oo o (,xr3p(@(A o,%rip% (Coo -%rp% (Co o &8rp(@(A o o &rp(A %(4( os rGps (Bo o &oo o (-xrWp(A %rp% (Co o &rp(A %rp% (Co o &(F,Ao 18o o o % o]oo (z o(=*%\0rp(@(:rp(A %rmp% (Co o &rp(A o o &oWo](7*0(4os (B*08  ++ uU -s o s o &X i2*0@ +5uU - s o YoI s o &X i2*0S( o (A ( o (A o o &o o &*03( o % (A o o &*0 rp(A o o &*0(I  ,o (-o (M 8o_ . 3&teo ( +rtdoh ( +_o5 rpo ( ,o5 r)po ( , o ,oI ( +( % (O(N*0#  + s o &X i2*02 (= rp%o %(> s o &*0( ,%r p*r pr po   o 2X(,X  +  o Y1(,Y  + o: Y ,YXo; ,((Q i3  o * 8(:~o   o - r p8- o rpo o 8 o rpo o   ( -| o -p o , +^o:  o: (   +5 o   o . - r p+ o; +  X   2( -Xi?o:  +5  o: 2   o   o  X  i2 *0U( r[p%(> s o &(K( rgp%(> s o &*( ,%r p*r pr po % o *Jrups *^~- s ~*b~- s ~*0+o(too s o (_o0 (ts (]o-o,"oo -o oo &+o (_o0o &(too o( (to (H(too o( (j(k(tok ol +K(m (,9t>(mo o &(lo o &(p -o (tok ol  +3 (m   (,! t>  (n o  o & (p - o (to o  ++ ( (e,(oo o & ( - o (too o( s o & *(X=]@806 o ,*o o o ( ,to o *z( (](to(h*0(tok ol +r(m (,bt> o (((i-B(]o o o ((o ((( o(p -o *0 s  `o o rp(too (< s o &o (too s o &(too (too (o (Jo (so &o o &s  `o (_o4rps o o &o o s o &o (too s o &(too (o (Jo (so &o o &s `o (_rpo$rps  o o & o o s o & o (too s o &(too ( o (J o (so &o o &*0r!s {o #( s o  `o o o &(]o)(too rqp{(J  s|o *0^"s (]o*o= Po o (Ao (]o o% (_r5po%o *0 #s (]o*o=(`o o o o o r5p rMp repo rip(J (]o o%(_o%o o (Ao s(]o.o,oo o -o (too (t(zo,Eo 1;o o o ' (](too (z  oo,Eo 1;o o o ' (](too ({  oo (\s (Yn%(\s s I%s U% s s s s o &o (\s s o &o (H*'\Th'\0$s (]o*o=o (`o rmpo (< o s (]o o%o o o (@o o o &#( s o o s rypU%o s %o s s o &o (H*0%s (]o*o=o o (`o (]o+~%-&~ s  %s (f ( ,to o (]o% (_ o+o o (Hs  o s o  o  o  +( (q( -!o o  o  +B(   o - (p  o  +  o& s o  ( -!o s rpI% s o o s s o &* O]05&o&(r o rp(< o o (_%( os o &s s  (_%( oU%o s %(_os s s  (_%( oU%o s %s s o ,rps +(as o n%n%s o & *0N'(r o -(_o+ (_o) o o s o o &*0-(o , %( *o o tq o *^s {Us *0V)(({o+o +"( (](s o( -#o */G0*( ({o o >o @o o rps o &({o od +$(e o o s o &(j -o o rps o &*Y10+(4 ((I 3iY(*iY(iY YE    *(*(*03, -~( +3 ~( , o"*Rrpr5p(*rEprmp((  rp(J *0(-o! 2o: o" o# *0A r p(2*r p( /*r5p( 2 r po# *0< o! /*o: X , Y($ ,o: . ($ ,**0Z P%s!%s!%s!%s!%s!%s!%s!%s!% s!% s!% s! P%s!%s!%s!%s!%s!%s!%s!% s!% s!% s!*0.((& +P('  (o~o( ,(o~o) +s% (o~o* o (+ -%o ( , 3(*(*(*]k0^/  -+85o r p( , X 8r p( ,%Y X<X< 8( :r po :(,,@  (9 ( 89X3: (  , .+j  ( +]  (  (+EX3>rp( ,,o} +r/ p( ,, o} o, o- % :*010(s.   89o: 9o ';(E 2=aiz8X @ (9 ( +vY -o +k, ( (+O+G+?,; ( +.,(o} +,(o} o, o- % :*0f r po! /Q*r p(: X ~o/ / o Q+ Yo; QPr po , Po Q*0N1(o) o0 + o1 o3(o} o - ,o * *,@ 02Qo [3*(o )o =o 3,2(1$o; o  o Xo Q*~o/ 2*  o Xo Q *0f1(o) o0 +8o1 o( ,#o. o 3(o} o - ,o * *DX 0l3(o) o0 +>o1 o( ,)o.o.o. o 3 o - ,o * *J^ 0l3(o) o0 +>o1 o( ,)o.o.o. o 3 o - ,o * *J^ 04Q ~o2 2*( o3 0r p(9x o4 8jo5 E 999 9"84r p( , o6 &8r p(, o4 8r p(, 8r5 p(-rG p(, o4 8rO p(9 o4 8ra p( , o6 &8rG p(,  o4 +lr p(,_ o4 +Tr{ p( - r p( ,: o6 &+/r p( ," o6 &+r p( ,  o6 &*  o7 o +r pr po r po8 /*0H5o! /*o: X , Y($ , o: .o % (.(9 ,**0 ( /*o: X o: / ($ -*X o: 2*~o/ /o: Yo; o QPrepo ,"Pripo: ,PPo: Yo; Q*0V% %:%=%;% %(%(< *0/7 o= r p(Jo> ,o? oI ( *0/8 ` o= (Jo> ,o? oI ( *0Ar/ p( -rO p( -rs p( -+ * P* 0* `*0:9(]o' s@ {(A (B (= (C ( (MoD (K(oE oF &(]o30(`rA p%(H /oI oA +(`rA poA (o o &(G sH (]o!o! +?o (,*(  o  o 1 oI  oJ o - ,o *L- 0vo_  3'u<oo o_ 6oI (*o_ .o_ . o_ 3'uko o_ 6oI (**0B:o5 ~  +) {N oO , {P (]o&*X i2*0,%t( ~,s%sQ %d( ~-s%sQ %<( ~.s%sQ %Q( ~/s%sQ *0T;(oR ( o o &(oR o . (oR ( o o &*0 k<( (s (]o.s ,(`oE(]o*o=+*(]o*(]oo<(`oD(`oF(o (H(o o 9%o r p(< o (o` o (]o,(,M(](o (o` o o ( (o` oh o oo,oo -oo +o o ( %oS ((`o oS _(]o)o (((((]o)o ((((o ;Xo,Eo 1;oT o o ' (](o (|  osU o. sV 9 sW   r poX  oY (](o%o & (_o3(\sV r ps oZ o` oh  oT (Zn% U% s %o s %s s[ s o &8 r ps   oT  s o &8 sU  sW r% poX oY (](o%o &(_o3(\sV r ps oZ o` oh oT  (Zn%U%s %o s % s s[ s o &o,Eo 1;o o o '(](o ({ oo s o &*'\/'\0O=oa od +$(e o` 3o og , (j -o ** 1=0F(](o% ,(_r] po& +o 3(_r} po& *0>o o to *0?sW o . r poX + r poX oY (](o%o &(_o3(\sV r ps oZ o` oh U%s %o s s *01@(( ((( o o *0A( ((s (]o.o(o( -*o(o(o(o o &o(o(*0*Bs (]o*o=((o #( s o  `o o r ps o &o o &s (]o*o=((o #( s o  `o o o &(]o)(rqp(((J  s|o (]o)(rqp(((J  s|o *0C(s\ (]o*o= Po ((,((o] o o &(o o (,J(_ ( o(s\ (]o*o= Po o o &*Z.( os *0Do ,bo 1Ys^ o o ,o 1o_ o` o_ % (](o ({  ooS _ (]o)(((((*4G%\0 8E(o o (9(o (:((\r pU%(sa %(s %(o s %(s s o &( s s o &(s o &*(o o uq ,Hob -( (c ,1(_(r pU%(s s o &*(s o &*0@FoT oS _ (]o)(((((*0G(\((U%sU s o &(\r pU%(s s o &,<o 13o o % (](o (| o(o o (, (8(o o (, (8(o o (,X(o o to o (,(o ((+G(o ((+.(o o (,(sU s o &(\rG pU%(s s o &(\((Us o &*ao%\0 P3( P. ,s|o + s|o  3( . ,s|o + s|o  `3( `. ,s|o + s|o  03) 0.!, s|o * s|o *0HsU -y(o o tq s  o  ob od ,(o s o  ((_(rs po s s o &*(s o &*0}JsU -`((\rs pU%(%%(s s s o &( s s o &*(s o &*00K(o` of uk ,oa (og ,**0LVo o (,(_tq(08(,(_td(](4+o( ,gto o (,%(_o tqo ((1+)(_o tdo ((](2( &o ,(8*(7*0#Moh r poi , oj **0-N(o` ut ,o (o og **0Ook 9o o (H9o -o5 (l o ,*E, 4#+2s *(*(*(*(*(***0@Pt- iU  +2s X i2(_o,sm *07Q/ (_o/U%r p( (n s s *0DR (o (_o-U%(p 5s %( +s *0 gS (_o.U%(q 5s %(_o5U%(r (s 5s s s *02T (_o5U%(s 5s s *(o` oh rqp(o (J *0e;s (o (o (Ho -%oS `o -o (,%oS `o o *0(o o ( ,<(o (,*-&(o (o` o (u(z*-,>, o , ,/o -&(o (o` o (t(z*b((](o*0(( 3Y(( 03G(](o r/ prs p( (o` oh (o o*(( 03X(( 3F(](o rs pr/ p( (o` oh (o o*0SK{, (o` (]o,(K,*(o` of uk ,oa og ,**0BG,7o 1.o o o  (](w oo* \0]U,Yot +(u o s o &(v -1o  (](y o* '1>A\0;G,7ow 1.o ox oy  (](x o* \%oz _o{ %oz ( (`o{ *0Voo (s (]o-(o s o o{ (o| ,%oz `o{ ((o o( o((o o( (o (Hoz _-oo(o o( s o & *0OW(o +o} +"(~ (]{s o( -4o */@0Xo o s o} +(~   (  , o ( -4o o /*s (]o*o=(_(o o (]o+~%-&~;s  %s(o o `o r p(o (< o (o (]o,(,2(]o (o ( (oh o o (o (o (J  Us s o o &s o  8 (  (] (s  o oos o s o o & o(o (L oo o (,Cs  o   os o  (_(r po s +o  os s o & ( : 7o o s o &o o &*A4,G 0Mo ,*(,*( `. ( `3(o` .( P3**0g(4 s s } s s }*s s }(s s }*0s o o &*0&Y( ( , s +s *0-Z( ( s (  o o &*0&( s o (o &*~--( (~*~-Ђ( (~*~-Ќ( (~*~-/( (~*v~-rcp(!~*~-( (~*~-Ѝ( (~*~7( 8( *0![(G s | ~o +; (8,&o o -o d( o X i2~o +j(8,To o ,.o o d( (c ,'o o +o t( o Xi2s o  + (   o  ( - Bo *0\u, t(9*u, t(;*u, t(=*ua, ta(:*tG(>*08\ o ( , (<` o ( , (<` *08\ o ( , (<` o ( , (<` *o -o -, o ***0S]( ,*o: 3o ( ( o *o ( ( o o (< *o: 1#o .3o %.o *%.o *0R^Q~o +%( ( og , ( Q ( -Co **2@0@%rp%rp%rp%r5pr=p(7*frp%%( *Vr!p%( *vrIp%%%( *Vr{p%( *Vrp%( *Vrp%( *vr_p%%%( *frp%%( *frp%%( *r p%%%%( *vrSp%%%( *frp%%( *rp%%%%( *Vr?p%( *vrsp%%%( *Vrp%( *Vrp%( *Vrp%( *r9p%%%%%%( *vrop%%%( *Vrp%( *fr+p%%( *frp%%( *Vrp%( *frp%%( *VrWp%( *Vrp%( *Vrp%( *VrGp%( *frp%%( *rp%%%%( *Vrp%( *vrsp%%%( *Vrp%( *frp%%( *frp%%( *Vrp%( *Vrp%( *Vrp%( *VrEp%( *Vrp%( *Vrp%( *Vr)p%( *Vrip%( *frp%%( *frp%%( *vr p%%%( *Vrp%( *Vrp%( *Vrp%( *frp%%( *Vrp%( *Vrp%( *Vrp%( *fr7p%%( *vrgp%%%( *vrp%%%( *r p%%%%( *frQ p%%( *fr;!p%%( *Vr"p%( *fr3"p%%( *fry"p%%( *Vr"p%( *Vr #p%( *vrI#p%%%( *fr#p%%( *Vr#p%( *fr+$p%%( *fr$p%%( *Vr$p%( *Vr%p%( *Vr%p%( *fr&p%%( *Vr&p%( *Vr3'p%( *Vr+p%( *fr3,p%%( *Vri,p%( *fr,p%%( *0)_{  ( t |( + 3*0)_{  ( t |( + 3*0)`{  ( t |( + 3*0)`{  ( t |( + 3*s}(4 rS-p(}*rq-p(+&r-p(+&(*0arq-p(+&r-p(+&r-p(+&s s s o  o +do -r-p =((zs o )(,o s o + X o - ,o (s(&*(n)EHq *#0[br-p(r!.p(+&r[.p(s s rq.p(  (o o ,(vr}.ps zs o o( +jo' -r!.p=((zrq.p(   o %  (,  (o +Xo - ,o (s   (  , o   (o &**A.>%Ew - &;4(+S#0cs s o o ( (   o , ((o  o o s o ( ~1( , ((zso*!6 09do +( o ,sz( -o *#*Z{, {o*Z{, {o*s }s }s }( *s }s }s }( }}}*s }s }s }( *s }s }s }( }}*0es ( o ,o ~ o o ~{( ,~ +"o o ~{( ,~ o s r.p{o r.p{o r.p{o r.p{o r.po tQr;/po tQr/po tQ~W Qr 0po 9 o 8o to o 8o to r)pog ,ro r0pog ,^o o  +. o t  o r pog ,  o Q  o - uL  , o o :`uL  , o o :uL  , o *4  ;=0Mfs ( o o s o o & (  o , o *1B 0gXr0p}rX1p}r1p}r2p}Xr2p}r2p}r63p}r3p}Xr4p}r^4p}r4p}r 5p}r5p*0H#?. #3~*#?3(*#@3~*~*s s s *0}h(4 r5p(+&r5p( +&r5p( +&o+(+ i. r5p(zo+~$%-&~#@s %$(+(*0ir6p(+&(-oo r6p(z,"r5p((9 (X ,(z,Cr5p((; (X ,(zoo ( ,oo (z}-+(+}}}s}(%*0:jrj6p((&s o ( ( ,o *& / 0:jrj6p((&s o ( ( ,o *& / 0\k{,}}}s= s }(,1{~1( ,( o<{s (${s {ok ol 8(m o_ . .?+\(-to  (-to  += o<+,t> {!  s o  + o_ (z(p :lo o   + (    (# (  - No s (!o  +A o {!o o &o ('o o o  o -  , o o +'o ("-(,o o - ,o {"{{!o o {"{o +( (+o ( -Uo {~1( ,:r6p ( (  s s %o o  }({(:-{"{o! o" +(# o$ {o% (& -Yo {"{o' o( +() o$ {o% (* -\o {"{o +1( o o o$ {o o o% ( -Uo o$ {o% }{"}{}*(,( so<+{**A4JiN 4% ^)*:_*>#(*E0_l{,8r-7prC7p(+ {{{]%](*{{{](*0 ,n{,{,{~2( ,*{~&%-&~#As %&(+ o, 8o- sG },(. 9o {(8 s}+o  Hs/ (+(+o  ~'%-&~#Cs1 %'(+~(%-&~#Ds1 %((+(+(+,o] ( o<8( o$ {o% o4   o$  (5  {  }6  {}7  p%r7p s8 }9  }:  };  s< }=  s< }>  s?   o$  o@ {"{ (+oB o :< ,o *AV! 0*oo (8 o oC o s8 *0psD s r7p(< {(8 ooE o} +(~ ()oF ( -4o {sG oH +(I  oJ (K -eo *9*c03qsL sM {!o oN +&(O o-  oP +  o  o  (Q -ho o oN 8(O o o  +s(  oR oS oT oR oS oT  oU ,8 oU ,.{!oV  {! oV   oP  oP (  -No (Q :Oho *(3Pk#0JroR oW +(X {!oT oU , (Y -ko ** ,80QsoR oW +)(X {!oT oZ , o o  (Y -ko * 6B0t{ok ol +t(m o_ 3ct( o[ o} +0(~ { o\ -{ to o] ( -4o (p -o *<=y05u{, {,* {ok ol +(m o^ o (p -o ( ,r7p {-Fr7po! 1 o; r7p(< (9}+r7p(< (9}{-{.o 1 o; r 8p(< (;}+r 8p(< (;}{r7po! 1o; r 8p(< (;}*$#G0Kvo (( {o o{(8 s_ {"{o` *0w{"{oa ,*sD sb s {o o{(8 oo o} +b(~ o o oc   -(-{  od -% ()  oF  ,  o oe ( -4o {sf {"{og *^o0Cxo (8 o oC sh o (*{"{oi *0[yoh r8poj ,Hs rG8p ( ( oh r8pok oj s o o  }*0zo o {(8 {sl o o {(8 sm s+soon (7  oJ {"{oT oo    sp   oq {"{ or Xo os ?{(3 o  *0{{"{o ot -%o (. {"{o ou o {(8 sm oR oW +1(X (-{"{or oq (Y -ko {"{ov *f>0@|{"{on ow {"{oT oo o sp *0}s o {(8  {~0(x ,(-(1+ {sl  (/oy oz +8({ tS(6{"{o| oJ (} -to (0, o~  (3 *gE0~o o - v*o o  (,-o[ ~)%-&~#Es %)( + ++o[ ~*%-&~#Fs %*(!+ o o -o o +_,o o s *v*0o o -*o o o[ o o` tt (- (2-*o o e e{"{o tSow {"{o tSow +I {"{o o o {"{o[ o o X2 s *0;o o -*o o o[ o o` tt (2*07oa o tS oa o tS (4(4*0xo o to tt s (5{o o(8 o s o` tQo o o  oJ *0Ho ooa od +(e o o(j -o *!90To o to tt {"{o o (8 o s o *0sb %.o  + (<oe X i2r p +o rqp(J Xo Y2o Yo (< *0Qo  +( -_X i2s ( -o ( -( (< *0r8pr09pr9pr9pr:pr@:prr:pr:pr:pr:pr:pr ;p .!*0OsI }-r ;p("+&{-rD;p( Js (M ,o *+C 0*r ;p("+&(T (K(#+($+*0RsK }.r ;p("+&{.rZ;p(+&r06p((LLs (M*0Lo (  ( ,((zo o (  ( ,((z*0(r ;p("+&(T (O(#+($+*0r06p((Lr ;p("+&(So%+o +~o o o o +J(  o ,o ,,tJo +o] (s 7s o ( -o o :w ,o (P*OW4 03~0%-&~/Os %0(&+ ('+($+*0Es o o ( QP~3(x ,~3P( s o *0o o s~ ~s@ oE oF &o%+o 8 o (V,#o] (q 's o 8o oo o oo o ( s  ~o (  oI ( o (<  ~rqp (J s  ~s   s   o  o &o  o & (c(b `o s o (W( ~s s s ~s s s ~s s s ~s s s ~s o =s s o o &o o &o o &o o &o o &o o &(Y oI o &o : ,o oI o 1(XoT *A9X 0Jo ok ol +(m o o , (p -o **'80Ks o +!( ( (a( oL ( -~o * .;0)sO rmpoP oQ oR oS *0s ~o Г( G%( %( o s o =( s rt;ps o o &o ~s o &o (s o &o ~ s o & 0o o o & o o o s o 8(  =s s ns o o &( (a( (Z o  o & o s Us s  o  o &X ( :[~o o O( s Us s o &*0Us r;p( ( (< o  Po Г( G%( %( o s o o ~s o &o (s o &o ~ s o &o: ~#1ao o: ([(`o* + o) o o & o - , o (^r;pUs +s o U%s %s o s o &*" 0Iн( r;ps н( U%=s s o o &*nr;pU%s s *o: ~#1(\((+(]*%(]*0$]o oo ~! ( o (J *0Xs  `o o ~s o &o (s o &o ~ s o &*0is  o{ o ~o o ~s o &o (s o &o ~ s o &*r #P$ (%*0 ~( ,#@o *~( ,#@o *~( ,#?o *(( ,#?o *o ( ( o *0Qr06p((f P~?%-&~>bs %?()+-o ( P(h&*0r;p(*+&r;p(+&r<p(+&r06p(o ( (x , r;p(z(k P~@%-&~>cs %@()+-o ( P(h&*0er<p( YE +(r +(p +(o + r@<p(z$( o6 o *0$s (q( (to { *0$s (q( (uo { *0Co 3o 3 #?*#?*o 3 #@*#@*0$s (q( (vo { *~.. +(v*(t*(u*~0( ,r2p*~1( ,r3p*r 5p*~0( ,r1p*~1( ,r63p*r4p*~0( ,rX1p*~1( ,r2p*r^4p*0No -o .o , o 3o -o rT<p( , o (y*Q*0Ir0p( -r2p( -r4p( -+~0Q*~1Q*~2Q*Q*0V~0~1~2~13~24%~0%~1%~25*0O~W }9(4 r^<p(rp( +&r5p(}<}8s}7*0 {:,}:};}=}>}?sd {7o{7o {7o( (  o }9 {9o }G {9o {9s }N(({<rqp~W o r<p(< s ojo +9o {No% ( {H o  o o - ,o ({Eo  +* (  {N o%  (  o  ( - o o$ {No% ({?~2( ,{7o~2( ,(({Oo  + ( {No%  ( - o oe(-1}:{N};{M}={Ls }>E(,*('% ss oq+ {7ooes *A|F- M7#22d9E2k 0:jrj6p((s o ( ( ,o *& / 0 blr6p(+&(r<pr<p(+ (}{<{={>{8{9{?]%](*0qr^<p( +&rp( +&r06p(( (n(z( o - (j(zo ( s *# ,0   ~2( ,~ ~ ~ +~ ~ ~ s o o o o5 o (o s    oe % o  s   ( o ( ( o (o s    oe % o  s  (o o o5 o ~ (o s  oe  % s  (o (9&(, (k(z,o ,o ,o *AL>4r>4uE>Q0"o-+ o ok o o &*o ,(-(k(( (z*05o, +o+ o 3 o - ,o ** ' 0qo sm oy oz +5({ tS oh  o ol sp oq (} -to o$ *B[0|ol (w  (xo (X ,(x o s_ r<prK=p(y((  s o o  o$ *0~{7{Go es  +6o (u,(}-(o  oo  o-o  , ( ,o *as 0o o   s o ,ho  (  ,r7p s8 8  -o o (X+o o ([ us o 8o9{?~2( ,* on,4{L o -% o4   o$ r7p (5 s8 +f  ,D{M o ,3 o {M o &{L o ,{L o & e(U s o ss 8o oo-o(,yo-= ro=po-o o o(^ |s o op(<os8 o +d ro=po-o -o o=(Y+o o=(\ us o Xo  / o9o f(<{Fo, p%+p{<o } o (X -+o } os< } os< } os< } os< }= }9 o }: s?   o$  or,{O o *{L o &*0~W s {7{Goo  +>o! t> oK(X ,( -(o"   o# o - ,o ( -(*#Jm 0o$ (-*~a%-&~`s% %a(-''%oI(] s oq*s {?~0( , (+ (-+oM, (-+~b%-&~`s% %b(, ( {FoIo  {<sl   oJ   oJ s     ( (~:( (,  s o   9{E~d%-&~`s& %d(.+o( 8o)  o ~e%-&~`s* %e(/+o( +Uo) o` o` o ,7o ,,  o o` (r s o  o - ,o  -o :E ,o  ,{E o+ +*{L o &{Io, &{I o, & o$   or*bP p 0vo6 o#o- o$o- o%o- (so'o- o(o- o)o- (sok ok_ *0[o o o. .*o/ + (0 o o1 og - (2 -o **-I0To/ +.(0 o oEo3 , o ,  (2 -o * *;B0To/ +.(0 o oEo3 , o -  (2 -o * *;B05o o o s o {Io4 *05o. e o. e {Io5 {Io5 8o o$ o=o3 -Co o o rqpo$ o=(J (c ws o * o o$ oEo3 -Co o o rqpo$ oE(J (c ws o *Xo. ?s o~ *0o o o[ o o` tt   o[ o} +)(~ o o _ o o ` ( -4o  _,3o[ (o (o o (pQ*r pQ*56k{7{Gos6 (*{7{Gos6 (*{7{Gos6 (*0es7 sb o  +c o! t@o(u,#o8 ,o9 o: o;  o< o, ovoe o - , o o8 , o9 *o 0s }ho= o -s  {ho> -go? s of|h(,!e(Q rs o  +e(S }s o  ({h-   + {h (0+((+{h9:{i%-&s % }i (1+o(  8s   o) }j{? {jo o (-hs  sA (2+(3+  o ov oz(R s o (K o :Y  , o 9{h,-i{ho> /{h(+(4+}h + }h +]3'o= o(g s o +%o= o(f s o Xi2{Fo= oto{<{hsf o$ ,. +$oi+'oi{KoC &+{Lo &or* 0sE sb QoF 8`oG o-ozoo-zo-8-ozoov(V+ozoov(Z+ovo(W us o PovoH 8 oI ~f%-&~`sJ %f~g%-&~`sK %g(5+ry=pry=poM oN ox (O oP o @Cr=poQ 9 o:oN oR :ooN oS   (T 2+ (U -)ooN oV   (T 0+ (U ,x(yo r=po=oN oS oN oV ov e(b vs o PovoH 8EoW oN oҌ2(O oP r=poQ 9o:}oN oR :looN oS   (T 2+ (U -)ooN oV   (T 0+ (U ,x(yo r=po=oN oS oN oV ov e(b vs o PovoH 8&oW oN oҌ2(O oP 8w o . o  . o @$r=p oQ 9Do:9 oN oR :(o~ oN oS   (T 2+ (U -)o~ oN oV   (T 0+ (U ,x(yo r=po~= oN oS  oN oV ov e(b vs o PovoH 8 oW  oN o~Ҍ2(O oP 83 o  . o :r=poQ 9 o:oN oR :o|oN oS   (T 2+ (U -)o|oN oV   (T 0+ (U ,x(yor=po|=oN oS oN oV ove(b vs o PovoH 8oW oN o|=(O oP o-,o,$~X W(O oW oY +2o-*o,"~X W(O oW oY ov oZ ([ sh o o : ,o *Ar 0q +Jo= ox-8o= ozoo, {?(,o= ovoe X o? 2o 1Q+QP*0{Ko\ >( -*{Ko] +x(^ {Ho_ ols (w,r<pr=p(w(  o r<pr)p(x(  o o   ((` :|o **0s s  (~oo (,*oo {No sa (b oo ,o joU & (c sd oe o{Nsf o ,o , o *(Pa + Hn 0(g o (h o oa o si o oa od +1(e teo oj (k sl om (j -o (n (o sp {7ooq ( or os ot ou *:>xs}C(4 rS-p(}B*0Kr06p(r-p(v r!.p(+&r[.p(v r06p(s(*0N( ~r%-&~qs %r(&+(6+,*((#+($+*r-p(v r[.p(v r06p(s(*0M( ~s%-&~qs %s(&+(6+,*((#+($+*0wrq-p(+&r-p(+&r06p((-s %(o *sx rq.poy (s( ,o *E&k 0M( ~t%-&~qs %t(&+(6+,*((#+($+*0rq-p(+&r-p(+&r-p(+&r06p((-s %(o *sx rq.poy (sb o +4o (z rq.p(< ( oe oL o - ,o s ( ,o *sA R 0N( ~u%-&~qs %u(&+(6+,*((#+($+*0h({ - s %( s o *(| (-s %(o ( ,o */-\ 0;Q(| ( $,o s % (o *  10_s (- (o *P~1( ,~1QP~3(x ,~3P( s o *0s ~0( ,( s o  r(h- `(m( ,( C{B( oo{Cooo oo ,Js }xo(7+s (8+o oo , ݷoo ,o ݒ (o | (o f (o P   (o :   (o $  (,  (o +* *A  0 %1 ;2 Q3 g4 }$EF( s *0{Bs o  o, (E (z (K -(9++o o,8 ~v%-&~qs %v()+-o( o ,,({ ,( *s0( o ,o *  0o  o -+ o ( ,o 37o 3. +*( r=p%o %o (>  , o o o s * s *09I~F(c ,!s@ r=pr?>p( F(:+&~F( *09I~G(c ,!s@ r>pr?p( G(:+&~G( *09I~D(c ,!sA ra?pr?p( D(:+&~D( *09I~E(c ,!sA r @prk@p( E(:+&~E( *0q ( o sV o ,o , o s r@po o o o %-( o6 o %( o6 o %d( o6 o %3( o6 o %e( o6 o %Ш( o6 o %f( o6 o o %o o o ,>o (7+~W ~w%-&~qs %w(;+(zo o * , 0%r@p%r@p%rAp%rAp%rAp%r%Ap%r/Ap}^K%r7Ap%rCAp%rUAp%rcAp%roAp%rAp%rAp%rAp%rAp% rAp% rAp% rAp% rBp% r Bp%rBp%r-Bp%r=Bp%rSBp%reBp%rwBp%rBp%rBp%rBp%rBp%rBp%rBp%rBp%rBp%rCp%rCp%r%Cp%r3Cp% rCCp%!rOCp%"raCp%#rkCp%$ruCp%%rCp%&rCp%'rCp%(rCp%)rCp%*rCp%+rCp%,rCp%-rCp%.rCp%/rDp%0r Dp%1rDp%2r%Dp%3rDp%4rDp%5rDp%6rDp%7rDp%8rDp%9rDp%:rDp%;rDp%rEp%?r)Ep%@r;Ep%ArOEp%Br_Ep%CriEp%DrsEp%ErEp%FrEp%GrEp%HrEp%IrEp%JrEp}_s %rEprEpoL %rEprEpoL %rEprEpoL %rEprFpoL %rFprFpoL %rFprFpoL %rFprFpoL }`sb %r!Fpoe %r%Fpoe %r+Fpoe %r3Fpoe %r9Fpoe %rAFpoe %rKFpoe %rQFpoe %rWFpoe %r]Fpoe %reFpoe %rmFpoe %rwFpoe %rFpoe %rFpoe %rFpoe %rFpoe %rFpoe %rFpoe %rFpoe %rFpoe %rGpoe %r Gpoe %rGpoe %rGpoe %r)Gpoe %r1Gpoe %r;Gpoe %rGGpoe %rQGpoe %r_Gpoe %riGpoe %rsGpoe %rGpoe %rGpoe %rGpoe %rGpoe %rGpoe %rGpoe %rGpoe %rGpoe %rGpoe %rGpoe %rGpoe %r Hpoe %rHpoe %r/Hpoe %rEHpoe %rOHpoe %rYHpoe %riHpoe %rwHpoe %rHpoe %rHpoe %rHpoe %rHpoe %rHpoe %rHpoe %rHpoe %rHpoe %rHpoe %rHpoe %rIpoe %rIpoe %r+Ipoe %r5Ipoe %rGIpoe }as %rSIprcIpoL %ruIprIpoL %rIprIpoL %rIprIpoL %rIprIpoL %rIprIpoL %rJprJpoL %r+Jpr9JpoL %rGJprWJpoL %rkJprqJpoL %r{JprJpoL %rJprJpoL %rJprJpoL %rJprJpoL %rKprKpoL %rKpr#KpoL %r/Kpr7KpoL %rCKprMKpoL %rWKpraKpoL %rmKpr{KpoL %rKprKpoL %rKprKpoL %rKprKpoL %rKprKpoL %rKprLpoL %rLprLpoL %r#Lpr1LpoL %rALprOLpoL %r_LpryLpoL %rLprLpoL %rLprLpoL %rLprLpoL %rLprLpoL %rMprMpoL %rMpr1MpoL %rCMprOMpoL %r[MproMpoL %rMprMpoL %rMprMpoL %rMprMpoL %rMprMpoL %rMprNpoL %rNprNpoL %r)Npr5NpoL %rCNprONpoL %r]NpriNpoL %ryNprNpoL %rNprNpoL %rNprNpoL %rNprNpoL }bs %rNprNpoL %rOprOpoL %rOpr-OpoL %rAOprMOpoL %r]OpriOpoL %ryOprOpoL %rOprOpoL %rOprOpoL %rOprOpoL %r PprPpoL %r1PprCPpoL %rSPpriPpoL %r}PprPpoL %rPprPpoL %rPprPpoL %rPprQpoL %rQprQpoL %r'Qpr9QpoL %rIQpr]QpoL %roQprQpoL %rQprQpoL %rQprQpoL %rQprQpoL %rRprRpoL %rRpr%RpoL %r/RprARpoL %rQRpraRpoL %roRprRpoL %rRprRpoL }cs %rRprRpoL %rRprRpoL %rSpr+SpoL %rASprYSpoL %rsSprSpoL %rSprSpoL %rSprSpoL %rSprSpoL %rSprTpoL %rTpr#TpoL %r7TprGTpoL %rYTpreTpoL %rsTprTpoL %rTprTpoL %rTprTpoL %rTprTpoL %rTprTpoL %rTprTpoL %rUprUpoL %r-Upr=UpoL %rOUpr[UpoL %riUprwUpoL %rUprUpoL %rUprUpoL }ds %rUprUpoL %rUprUpoL %rVprVpoL %rVpr/VpoL %rEVprQVpoL %raVproVpoL %rVprVpoL %rVprVpoL %rVprVpoL %rVprVpoL %r WprWpoL %r%Wpr3WpoL %rEWprWWpoL %rmWpryWpoL %rWprWpoL %rWprWpoL %rWprWpoL %rWprWpoL %r XprXpoL %r)Xpr5XpoL %rEXprQXpoL %raXprmXpoL %r}XprXpoL %rXprXpoL %rXprXpoL %rXprXpoL %rXprYpoL %r#Ypr3YpoL %rEYprSYpoL %rcYprqYpoL %rYprYpoL %rYprYpoL %rYprYpoL %rYprYpoL %rZprZpoL %rZpr)ZpoL %r9ZprGZpoL %rWZpriZpoL %r}ZprZpoL %rZprZpoL %rZprZpoL %rZprZpoL %rZpr[poL %r[pr'[poL %rt;pr9[poL %rI[prY[poL %rm[prw[poL %r[pr[poL %r[pr[poL %r[pr[poL %r[pr[poL %r \pr\poL %r!\pr5\poL %rI\prU\poL %ra\prm\poL %ry\pr\poL %r\pr\poL %r\pr\poL %r\pr\poL %r\pr]poL %r%]pr5]poL %rC]prS]poL %ra]prw]poL %r]pr]poL %r]pr]poL %r]pr]poL %r]pr]poL %r^pr^poL %r%^pr;^poL %rO^pre^poL %rQRpraRpoL %ry^pr^poL %r^pr^poL %r^pr^poL %r^pr^poL %r_pr_poL %r_pr3_poL %rE_prW_poL %rg_pry_poL %r_pr_poL %r_pr_poL %r_pr_poL %r_pr_poL %r_pr`poL %r'`pr5`poL %rA`prM`poL %rW`pre`poL %rq`pr`poL %r`pr`poL %r`pr`poL %r`pr`poL %r`pr`poL %raprapoL %rapr1apoL %rCaprSapoL %raaproapoL %r{aprapoL %raprapoL %raprapoL %raprapoL %raprapoL %raprapoL %raprapoL %r bpr bpoL %rbprbpoL %r%bpr%bpoL %r3bpr3bpoL %rAbprAbpoL %rObpr]bpoL %rmbprybpoL %rbprbpoL %rbprbpoL %rbprbpoL %rbprbpoL %rbpr cpoL }esb %rAFpoe %rmFpoe %rGpoe %rFpoe %rFpoe %rFpoe %rEpoe }fs %r)Npr5NpoL %rNprNpoL %rcpr-cpoL %rEcprWcpoL %rkcpr}cpoL %rcprcpoL %rcprcpoL %rcprcpoL %rcprdpoL %rGIprdpoL %r#dpr/dpoL %r=dprIdpoL %rWdprcdpoL %rKprKpoL %rqdprdpoL %rdprdpoL %rdprdpoL %rdprepoL %repr'epoL %r;eprKepoL %r]eprmepoL %reprepoL %reprepoL %reprepoL %reprepoL %repr fpoL %rfpr'fpoL %r7fprCfpoL %rQfpr]fpoL %rkfprwfpoL %rfprfpoL %rfprfpoL %rfprfpoL %rfprfpoL %rfprfpoL %rfpr gpoL %rgpr3gpoL %rSgprogpoL %rgprgpoL %rgprgpoL %rgprhpoL %r/hprGhpoL %rahpryhpoL %rhprhpoL %rhprhpoL %rhpripoL %r)iprAipoL %r[iprsipoL %ripripoL %ripripoL %riprjpoL %rjpr1jpoL %rIjpr_jpoL %rwjprjpoL %rjprjpoL %rjprjpoL %rkprkpoL %r/kprEkpoL %r]kprskpoL %rkprkpoL %rkprkpoL %rkprkpoL %rlpr+lpoL %rClprYlpoL %rqlprlpoL %rlprlpoL %rlprlpoL %rlprmpoL %rmpr1mpoL %rGmpr[mpoL %rqmprmpoL %rmprmpoL %rmprmpoL %rmprnpoL %rnpr-npoL %rCnprWnpoL %rmnprnpoL %rnprnpoL %rnprnpoL %rnprnpoL %ropr)opoL %r?oprSopoL %riopr}opoL %ropropoL %ropropoL %ropropoL %rppr%ppoL %r;pprOppoL %reppryppoL %rpprppoL %rpprppoL %rpprppoL }gs %rLprLpoL %rJprJpoL %rMprMpoL %r qpr)qpoL %rIqpriqpoL %rqprqpoL %rqprqpoL %rrprrpoL %r9rprhpoL %rUrprqrpoL %rrprrpoL %rrprrpoL %rrprspoL %r-sprGspoL %raspryspoL %rsprspoL %rsprspoL %rsprtpoL %rtpr3tpoL %rItpr_tpoL %rutprtpoL %rtprtpoL %r[MproMpoL %rtprtpoL %rtprupoL %rupr-upoL %rAuprUupoL %riupr}upoL %ruprupoL %ruprupoL }hs %ruprupoL %r vprvpoL }is %r-vpr;vpoL %rMvpr[vpoL %rmvprwvpoL %rvprvpoL %rvprvpoL }j(rvps (s }R{bs}S{cs}T{ds}U{es}V{gs}X{hs}Y{is}Z{js}[{`s}W{bo {co (<+{do (<+{eo (<+{`o (<+{bo (<+{go (<+{ho (<+{io (<+{jo (<+{_(<+{f(+s }\{bo {co (<+{do (<+{eo (<+{`o (<+{bo (<+{go (<+{ho (<+{io (<+{jo (<+{_(<+s }]*0crvp( +&{Ro ,*{Ro ,*(-{](o o ,*oo ,**0lrvp( +&{Ro ,*{Ro ,*(-{\(o o ,*(-oo ,**rvp( +&s  (*0X{Ro , {Ro *(,*( (,(< *(,(< *{]o o - o,(< *{So ,{So (< *sb %rvpoe ~z%-&~ys  %z((,(< *sb %rvpoe %rvpoe ~{%-&~ys  %{((,(< *sb %rvpoe ~|%-&~ys  %|((,(< *sb %rfpoe ~}%-&~ys  %}((,(< *sb %r wpoe ~~%-&~ys  %~((,(< *sb %rwpoe ~%-&~ys  %((,(< *sb %rwpoe %r%wpoe %r-wpoe ~%-&~ys  %((,(< *{To ,{To (< *{Vo ,{Vo (< *sb %r5wpoe ~%-&~ys  %((,(< *sb %r?wpoe %rGwpoe ~%-&~ys  %((,(< *{[o ,{[o (< *sb %rOwpoe %rUwpoe %r[wpoe ~%-&~ys  %((,(< *sb %rawpoe %riwpoe %rqwpoe %rywpoe %rwpoe s  ((,(< *sb %rwpoe %rwpoe %rwpoe ~%-&~ys  %((,(< *sb %rwpoe %rwpoe %rwpoe %rwpoe %rwpoe ~%-&~ys  %((,(< *rwp(o ,o: Yo" rwp(J *{Uo ,{Uo (< *sb %rwpoe %rwpoe %rwpoe %rwpoe %rwpoe ~%-&~ys  %((,(< *rwp(o -rwp(o , rwp(J *rwp(o , rwp(J *rwp(J *rvp( +&s  (*09s {Ro , {Ro *(,*(}{(, {(< *{(, {(< *{\{o o , {(< *{W{o ,{W{o (< *{S{o ,{S{o (< *{Y{o ,{Y{o (< *{X{o ,{X{o (< *{Z{o ,{Z{o (< *{sb %rxpoe ~%-&~ys  %((,(< *{sb %r xpoe %rxpoe ~%-&~ys  %((,(< *{sb %rxpoe ~%-&~ys  %((,(< *{sb %r)xpoe ~%-&~ys  %((,(< *{sb %r5xpoe ~%-&~ys  %((,(< *{sb %r?xpoe ~%-&~ys  %((,(< *{sb %rGxpoe %rQxpoe %r[xpoe ~%-&~ys  %((,(< *{T{o ,{T{o (< *{V{o ,{V{o (< *{sb %rexpoe ~%-&~ys  %((,(< *{sb %rsxpoe %r}xpoe ~%-&~ys  %((,(< *{[{o ,{[{o (< *{sb %rxpoe %rxpoe %rxpoe %rxpoe %rxpoe ~%-&~ys  %((,(< *{sb %rxpoe %rxpoe %rxpoe ~%-&~ys  %((,(< *{sb %rxpoe %rxpoe %rxpoe %rxpoe %rypoe ~%-&~ys  %((,(< *{rwp(o ,%{{o: Yo" rwp(J *{U{o ,{U{o (< *{sb %rypoe %rypoe %rypoe %r'ypoe %r/ypoe s  ((,(< *{sb %r7ypoe ~%-&~ys  %((,(< *{sb %r7ypoe %r?ypoe %rGypoe ~%-&~ys  %((,(< *{rOyp(o , {{o: Yo" (< *{r[wp(o , {(< *{rwp(o , {{o: Yo" (< *{(< *0Qo (,>o: -*o: s o ( o &o o &oI **0_rvp( +&{^((-;(o o -royp(o -{_o (=+,**0nrwyp( +&ryp( +&{Ro ,ryp(ryps z{Ro ,rwyp(rwyps z{Ro *ryp(>+&o rvp( ,s*o (s z0's }}s (?+*0~5~%-&~s %(@+~%-&~s %(A+o +#o QP( 2 (-o - ,o ~1QP(**\k ES/ 0 BsY ~p~%-&~s %%~o(*0 BsY ~r~%-&~s %%~q(*0 BsY ~t~%-&~s %%~s(*0 Js! ~w~%-&~s %%~u%~v(*0w{ls ( o o o  +o &o o &o -( o ,o ,o *"?a Rk 0o o o o -%( -(  (J o +o *s  8! s s o +7(   oB_,# oC- (+  (( -o o ,Mo ,$(  o &rypo &(  o &rypo &o &rypo &o ,Mo ,$(  o &rypo &(  o &rypo &o &rypo &X i?s o ,,(  o &rypo &(  o &o &( -(  o &o &oI o *qD0s rypo?(rypo@(oA o?-o@- oA+ ,rzp r)p(o , rzpo &rypo &o &rypo &*09o , rzpo &o &rqpo &o &r)zpo &r9zpo o ( ( (< o &s o o o o &*0[r=zporAzpprpqrprr%psr-ptrtpurpvrpw*0 L}z{zo~}s %~|(}y{yo }x*0E{xo ,-{{-o }{{x{{o &+}{*0Q o,T*o rߪp( -rp( -rp( - +T*T*T*T*fo o o ss*Vrp|rp}*0rp( s }( {o r0p( s }( {o rBp( s }( {o rRp( s }( {o rdp( s }( {o rxp( s }( {o rp( s }( {o rp( s }( {o rp=( s }( {o rp( s }( {o rެp( s }( {o rp ( s }( {o *0 ( rpo }( r0po }( rBpo }( rRpo }( rdpo }( rxpo }( rpo }( rpo }( rpo }( rpo }( rެpo }( rpo }*0>{o#(- t # {o#o {o (z*#0>{o$(- t # {o$o {o (z*#0>{o%(- t # {o%o {o (z*#0>{o&(- t # {o&o {o (z*#0>{o'(- t # {o'o {o (z*#0>{o((- t # {o(o {o (z*#0>{o)(- t # {o)o {o (z*#0>{o*(- t # {o*o {o (z*#0>{o+(- = # {o+o {o (z*#b{o+=( *0>{o,(- t # {o,o {o (z*#0>{o-(- t # {o-o {o (z*#0>{o.(-  # {o.o {o (z*#b{o. ( *0wryp( s }( {o ryp( s }( {o r6p( s }( {o rJp( s }( {o rp=( s }( {o rp ( s }( {o r`p( s }( {o rrp=( s }( {o r=p=( s }( {o rp=( s }( {o r=p=( s }( {o rp ( s }( {o rȭp ( s }( {o rp ( s }( {o *05( rypo }( rypo }( r6po }( rJpo }( rpo }( rpo }( r`po }( rrpo }( r=po }( rpo }( r=po }( rpo }( rȭpo }( rpo }*0>{o[(- t # {o[o {o (z*#0>{o\(- t # {o\o {o (z*#0>{o](- t # {o]o {o (z*#0>{o^(- t # {o^o {o (z*#0>{o_(-  # {o_o {o (z*#b{o_ ( *0>{o`(- t # {o`o {o (z*#0>{oa(- = # {oao {o (z*#b{oa=( *0>{oc(- = # {oco {o (z*#b{oc=( *0>{ob(- = # {obo {o (z*#b{ob=( *0>{od(- = # {odo {o (z*#b{od=( *0>{oe(-  # {oeo {o (z*#b{oe ( *0>{of(-  # {ofo {o (z*#b{of ( *0>{og(-  # {ogo {o (z*#b{og ( *0k ~W (-(p (-&~W (X , rqp(< (r(< ~W (X , rqp(< (t(< *{o[(- {o\(- {o](- ss*0Jo  o +3X ~W  o (  (J o (< o -*F6(`(*F6(h(*0Po  s oo~oo+o  +o  oo - ,o o+o  + o o ( ,o o - , o o >( s s o o o ( o  so  + (   o ( - o o (  o o *(>X n+ #0N o oI +rp~W o rpo -+rp~W o rpo -*0z(o_ 0 .$.:+R. .!$.6+Att(*tQ(*tj(*td(*t(*o_ (z0{o -r5 p+r po {r)po o  o ,so o o o_  ,o to (  -(! ,4o ( ,r>p ryp(J {r7p o  {:{rVpo" (o {rjpo# (o {rzpo$ (o {rpo (o {rpo% x(o +,o ,$o ,{rp (o o& ,{rpo& o o' ,{rpo' o o( ,{r=po( o o  o  +( (( -!o o 9:o o o o_ 3jo o o to o t{r7po {rpo ({o {o  {o *0|{rpo {r)po o {rK=po o (o {-!{r<po (o {o *0{rFpo {r)po o of ,{r^pof (o oC+od +(e ((j -o {o *Vr0{rppo {r)po o oy oz +({ ((} -to o o) +(*  ((+ -o {o *2Nh0R{rpo oE o} +(~ (( -4o {o *80J{rpo rįpo o (rدpo o[ ({o *0v-{o {rpo o  +;{rpo {r)po, o o {o X o- 2{o *0 {rpo {rpo o o o to ( {rK=po {rpo (o o ,r0po ({o *{o {rBpoI o {o *E+rPp*rTp*rXp*~W *0|{rbpo {r)po o of ,{r^pof (o o| ,{rxprpo o o 9o o o` 3m{rpo  +@{rpo {r)po o o o {o X o o 2{o o +o} +(~ (( -4o o. o +( o` 3(( -#o {o * :(b0k{o ,Zs (o/ &o +(  oI o/ &( -o {oI o *)"K0{rpo {r)po o {r°po0 oh o {rܰpo1 o o {rpoR o o {o *0{rO po {r)po o {rK=po (o o ({,Ho= rG8po2 ,6{r8p(rC7po= rG8po3 o? (o4 {o *07( ( oh o5 8(6  (, oN +Do7 +#o8 o9 oW ( ,o - ,o  (:{,^o_ 3Ttqo  . o -8 oW r=p( ,& (: ,{ oW (rpo +#{ oW ( oj (o (; :o *A4G0w  (-*oR ,*oj -*o< -oj o= o ,**0v{,IoW rp( -5oW rFp( -#oW r8p( -oW rfp( **oW r8p( -oW rfp( **0*@( rzp$(> o? t*0{{-+(s {r=po@ {rpo {ṟprرpo {,,{~2( ,{rprC7prpo4 {-2( -{rpo ( -{r,po   ++] {rXp(A (B oC X i2*0?{rdpo {r)poo o {,Ho= r6po2 ,6{rp(rC7po= r6po3 o? (o4 ok ol +@(m o_ . 3t>(+t(+ o_ (z(p -o o ~%-&~s %(+o, + o- ( o - , o {o *M ) 0{rpo {r)po o {rppo (o oR oW +(X ((Y -ko {o *Nj0M{rpo {rpoD o {rȲpoT o o {o *0{rȲpo {r)po o {rbpo (o (o= rܲpo> ,6o? ,.{rܲpo {oE oF {o +ro= r=po> ,$o? ,{oG o? oI o o= rpo> ,$o? ,{oG o? oI o {o *0wo= ~%-&~sH %(D+oI +0oJ oG (,{ o? oI o4 o - ,o *0 *0pr$p(E+&uy,~M *u -o5 oI ((z( oN u -r4po5 oI ((z*0,s r po &(r po &oI *0-* sb o" +-o -+rPp% (oe o -uL,o , (G oP oQ +(R -o &o & (S -o *9Lw,0a( ,r p*rXpr\po rhprlpo rvprzpo rprpo rprpo *0A-:o 2 o: X0QQ*o; QXo: YYo; Q*0YIoT ~(U ,C~(U ,6~(U ,)~(U ,~(U ,~oO **0X(  s  o, +'o+ %X , (  o & oI o &o - ,o oI *3G 0+o + o o o - ,o * 0[|( }( ~( ( Ѐ( 2( *0N(4 rp(F+&rp(+&rֳp(+&}}}(s}*r6p(+&((o *0rp{o@ r"p{oo o rPp{oo o {{oV oW +#(X {{oo ((Y -o {{oZ o[ +((\ {{o] ((^ -o {{o +( (( -Uo {{o_ +&(`   oa   ob    ((c -o o *4S05;3n0rvp{o@ rpoh o rpo o (. 9o o o t o o td rp{o@ rp{o@ r$poh o oE o} +((~ {{o (( -4o o o o *50o o od :r6p{o@ r)po o o r$po o oh o rbpo o o  +.o{{oe (X o os 2o *0o od :r6p{o@ r)po o r$po oh o ( rbpoT o o oR oW +%(X {{ oe  ((Y -ko ( o[ o} +(~ o , (( -4o o *q2(rp{o@ rJpo o rprpo o *0( oR o o of *0: o o o) + (*  (+ -o **0rp{o@ r)poD o oT o o od +0(e te {{o (  ((j -o o *8=u0Xog ( oD o o ( ,2 + o o 3 o[ o *X o o 2*rp{o@ r)po o (o *rܵp{o@ r$po oh o (o *0rp{o@ rbpo o o o o} +6(~ {{oh ,{{o (( -4o o *3Cvr p{o@ r)po o rJpo o o *0Q(4 -(b +(G si }sj }~%-&~s  %}*0` {o +"X {o ( ( (< {ol -{ok , {om *0J(o ( op oq + or oq 3,o ,o *5 8? 00 (s rbpo ,o rhprqpo *0(u (o sV (-rlpsv z -rζpsv z-r*psv z(u ~~W o rq.p(< (rxp(< (rp(< (( (( ,o * 0op ( ,o *  0  ow ox o rp( , s +s  (u (o (c ( s (y oz (  o o - oT  oI s{ o|  , o ,o ,^o 1Uo, ++o+ o} o~ o sv o - ,o z(u (*(L> AS 8 s ( ,~0*s ( ,~1*~2*0-{ .3 (*0{ { , .d ݏ}{|ot o }}+>|( u-*{{ o oG+}} 2}|( -(| (*07{3{( 3 } +s {}*0Ks }s}s}s } sM }!s}"(4 *o ,3o" -+o  ~%%-&~#Bs %%(H+**0 {1 E_*}1}68{6~$Z~$X{4o: /4{4{6~$Z~$o; }2}1*}1+-{4{6~$Zo }2}1*}1{6 X}6{6{4o: ~$[>T*07{13{3( 3 }1 +sP {5}4*0{7 ,.F*}7{:}<}=+={<{= (^(_}8}7*}7{=X}={={<i2}<*07{73{9( 3 }7 +sX {;}:*0s }E~%-&~s  %s}Fs }Hs }Is }Js }Ks }Ls}Ms }Os }Ps }Qs }Rs }Ss }T(4 }V*0_{Po ,*(g,*{Ro -3'%e(T ts (q{Ro &*0XR{N(prqp(J oI+ ,1{V~2o /Po . Po 3RQ**0S{U-D{NoJ+o +o (,o }Uo - ,o {U*)B 0Ro ,I-~{Mo ,{Mo o *u -s {Mo *0i,( -oI }\+}\,( -oI }]+}],( -oI }^+}^}_*0Rue-*e {\{\(X ,*{]{](X ,*{^{^(X ,**0F- {\,{\o a {],{]o a {^,{^o a *0y ~W (v, (v(< (w,&~W (X , rqp(< (w(< (x,&~W (X , rqp(< (x(< *o ~c%-&~`s* %c(/+*0(4 }k{ko5 t rpGo }lrp( Go }mrηp( Go }nrp( Go }orp+( Go }p*0n{l{ko? t M o -+o s o o o (o ( o &~W *M0I-#~4( , (s*(s*~4( , (s*(s*0n~%-&~s %(K+~%-&~s %(L+~%-&~s %(M+*0n~%-&~s %(K+~%-&~s %(L+~%-&~s %(M+*0n~%-&~s %(K+~%-&~s %(L+~%-&~s %(M+*0n~%-&~s %(K+~%-&~s %(L+~%-&~s %(M+*Z{{o ts*Z{{o ts*0js }s }s }s }s }s }s }s }s }(4 *0R o o o oR oS on o 3  +  , oR oS *oR oS *0L {os .*((-*(-*(-*(,**0% s) }o[ *s (!+*0? o[ o} +(~ o - ( -4o ** !-02 s ((o {o o o *0<o[ o} +(~ o o ( -4o * !-0Qo o o to {o 3(o o o to {o **{o o o o Q{o o o o Q*00-{ Y63..(#("*!(0{ { , .p ݺ}{Mo o }}+i|(  o }}+(|( }} Q}|( -(#||( -("| ( *07{3{( 3 } +s {}*BSJB v4.0.30319l#Strings#~#USe#GUIDfv#Blob<>9__31_10<>9__0_0<>9__11_0<>9__31_0<>9__41_0<>9__1_0<>9__12_0<>9__22_0<>9__13_0<>9__53_0<>9__14_0<>9__4_0<>9__15_0<>9__55_0<>9__5_0<>9__16_0<>9__6_0<>9__37_0<>9__7_0<>9__18_0<>9__38_0<>9__29_0<>9__39_0<>9__9_0<>9__0constraint0<>9__31_11<>9__29_11get_UnableToGenerateForeignKeyPropertiesForV1<>9__31_1<>9__12_1<>9__13_1<>9__53_1<>9__14_1<>9__4_1<>9__15_1<>9__55_1<>9__38_1<>9__29_1<>9__39_1Version1<>9__29_12<>9__31_2<>9__12_2<>9__13_2<>9__14_2<>9__15_2<>9__29_2<>9__39_2Version2<>9__31_13<>9__29_13<>9__31_3<>9__12_3<>9__13_3<>9__14_3<>9__15_3<>9__38_3<>9__29_3<>9__39_3ConceptualSchemaDefinitionVersion3<>9__31_14<>9__31_4<>9__38_4<>9__29_4<>9__39_4<>9__31_5<>9__29_5<>9__31_6<>9__29_6<>9__31_7<>9__29_7<>9__31_8<>9__29_8<>9<>9__31_9<>9__29_9DoFixUpsForVBvalue__get_FKSchemaset_FKSchemaget_PKSchemaset_PKSchemaget_Schemaset_SchemaWriteStoreSchemaInternalWriteModelSchemaDoGenerateStoreMetadataInternalGenerateMetadataTemplateCodeGenerators.VBCodeGenTemplateV5.0.vbTemplateCodeGenerators.VBCodeGenTemplate.vbget_IsNiladicCSMarkPropertyGetAsPublicCSMarkPropertySetAsPublicCSMarkClassAsStaticget_RelationshipIdset_RelationshipIdAddCSMarkOverrideMethodAsSealedCannotCreateEntityWithNoPrimaryKeyDefinedCodeGenNamespaceCannotBeDeterminedadd_OnTypeGeneratedremove_OnTypeGeneratedget_IsServerGeneratedset_IsServerGeneratedadd_OnPropertyGeneratedremove_OnPropertyGeneratedCSMarkPropertyGetAsProtectedCSMarkPropertySetAsProtectedIsLanguageSupportedTargetVersionNotSupportedClientAutoGenNotAllowedParameterDirectionNotValidSourceSchemaIsInvalidCodeGenAdditionalEdmSchemaIsInvalidCodeGenSourceFilePathIsInvalidExcludedColumnWasAKeyColumnEntityIsInvalidget_GuidPropertyInfoFieldEmitFieldGetStoreAssociationSetEndTryGetPrimitiveTypeKindExistsInSecondInvalidKeyTypeFoundOneToOneAssociationFoundEdmSchemaFileNotFoundDirectoryNotFoundget_MethodEndMethodIntializeMethodBeginMethodEmitFactoryMethodAddWordsuffixWordkeywordGetSchemaXsdAdoFrameworkNamespaceAdoFrameworkMetadataEdmNamespaceAdoFrameworkDataClassesNamespaceTryGetObjectNamespaceAdoEntityClientNamespaceCreateServiceget_PluralizationServiceset_PluralizationService_wordsEndingWithInxAnxYnxPluralizationServiceGetLeastPossibleQualifiedTypeReferenceGetFullyQualifiedTypeReferenceget_TypeSourceget_PropertySourceGenerateVBCodeInternalGenerateCodeGetHashCodeGenerateCSharpCodeerrorCodeget_ProcParameterModeTryGetParameterModeExcludeColumnFacetValueOutOfRangeEndInvokeBeginInvokeget_Scaleset_Scaleget_FKTableset_FKTableget_PKTableset_PKTableget_TableMissingTvfReturnTableGetAssociationSetEndForForeignKeyTableget_Nullableget_NonNullableget_IsNullableset_IsNullableget_IsComposableget_PropertyFQNameget_NameTryGetReservedNameget_BackingFieldNameReportPropertyChangedMethodNameGetValidValueMethodNameSetValidValueMethodNameReportPropertyChangingMethodNameget_SourceEdmNamespaceNameget_SourceObjectNamespaceNameget_TableNameset_TableNameGetMostQualifiedTableNameFQMetaDataWorkspaceTypeNameget_ProcedureNameGetFullyQualifiedCodeGenerationAttributeNameFQAdoFrameworkNameVerifyComplexObjectIsNotNullNameFQAdoFrameworkMetadataEdmNameget_ColumnNameset_ColumnNameget_RelationshipNameset_RelationshipNameComplexPropertyInitializedNameFromPropNameFieldNameFromPropNameDoesTypeReserveMemberNameget_ParameterNameUnableToGenerateFunctionImportParameterNameFixParameterNameFQAdoFrameworkDataClassesNameDuplicateClassNameSplitNameget_ProviderInvariantNameFQAdoEntityClientNameget_PropertyNameget_EntityPropertyNameget_DateTimeNoneget_Typeget_DataTypeset_DataTypeUnsupportedTypeget_BaseTypeset_BaseTypeAdoFrameworkTypeAdoFrameworkMetadataEdmTypeedmTypeget_ReturnTypeset_ReturnTypeAddTvfReturnTypeTryGetTvfReturnTypeget_ParameterTypeInvalidInterfaceSuppliedForTypeInvalidAttributeSuppliedForTypeInvalidMemberSuppliedForTypeComputeNullableForTypeVerifyLanguageCaseSensitiveCompatibilityForTypeAdoFrameworkDataClassesTypeget_ObjectTypeAdoEntityClientTypeget_PropertyTypeget_CulturecultureCamelCaseCloseSystem.IDisposable.DisposeParseAndValidateCreateget_IsIsAggregateCSMarkPropertyGetAsPrivateCSMarkPropertySetAsPrivateget_RelationshipIsCascadeDeleteset_RelationshipIsCascadeDeleteAddBrowsableAttributeEmitSimpleAttributeEmitSchemaTypeAttributeAddDataMemberAttributeBaseValueRemoveInternalPluralizeInternalSingularizeCreateEdmStructuralObjectRefget_IsTvfInternalWriteStorageMappingICustomPluralizationMappingget_StringComputeFromStringToStringGetString<>3__largeViewStringget_FKCatalogset_FKCatalogget_PKCatalogset_PKCatalogget_Catalogset_CatalogAttachoutputPathget_MaximumLengthset_MaximumLengthMarkAbstractMethodAsPartialNormalget_Ordinalset_OrdinalNoSpecificTypeSentinalCSMarkPropertyGetAsInternalCSMarkPropertySetAsInternalIsPluralCsdlSsdlAllIsFKSchemaNullIsPKSchemaNullIsSchemaNullIsIsServerGeneratedNullget_IsParameterModeNullIsScaleNullIsFKTableNullIsPKTableNullIsRelationshipNameNullget_IsParameterNameNullIsDataTypeNullget_IsParameterTypeNullIsFKCatalogNullIsPKCatalogNullIsCatalogNullIsMaximumLengthNullIsOrdinalNullIsFKColumnNullIsPKColumnNullIsDateTimePrecisionNullIsPrecisionNullIsIsIdentityNullWriteXmlMslget_Itemset_Itemget_IsBuiltInget_TimeSpanOpenSystem.Data.Entity.Designget_FKColumnset_FKColumnget_PKColumnset_PKColumnget_FKSchemaColumnget_PKSchemaColumnget_SchemaColumnget_RelationshipIdColumnget_IsServerGeneratedColumnget_ScaleColumnget_FKTableColumnget_PKTableColumnget_IsNullableColumnget_TableNameColumnget_ColumnNameColumnget_RelationshipNameColumnget_DataTypeColumnget_RelationshipIsCascadeDeleteColumnget_FKCatalogColumnget_PKCatalogColumnget_CatalogColumnget_MaximumLengthColumnpkColumnget_OrdinalColumnget_FKColumnColumnget_PKColumnColumnget_PrecisionColumnget_DateTimePrecisionColumnExcludedColumnWasAKeyColumnAssociationMissingKeyColumnget_IsPrimaryKeyColumnget_IsIdentityColumnget_Precisionset_Precisionget_DateTimePrecisionset_DateTimePrecisionget_StoreSchemaModelVersionSchemaVersionHigherThanTargetVersionget_MeetsRequirementsForCollapsableAssociationEmitPropertyDeclarationget_StoreItemCollectionCreateStoreItemCollectionCreateStorageMappingItemCollectionget_EdmItemCollectionCreateEdmItemCollectionRegisterItemCollectionCreateStoreSchemaConnectionget_InnerConnectionCreateEdmFunctionget_LanguageOptionset_LanguageOptionIncompatibleSettingForCaseSensitiveOptionIOExceptionget_DescriptionUnsupportedForeinKeyPatternUnknownDoCreateMementoget_EdmToObjectNamespaceMapset_EdmToObjectNamespaceMapItemToErrorsMapUnsupportedDbRelationshipRelationshipEndTypeLookupEntityContainerLookupClearIsSingularCreateReaderStorageModelBuildProviderMappingModelBuildProviderEntityModelBuildProviderEntityDesignerBuildProviderOtherTypeGeneratedEventHandlerPropertyGeneratedEventHandlerget_EntityContaineroutputWriterEndPropertyGetterBeginPropertyGetterEndPropertySetterBeginPropertySetterAddErrorPreprocessTemplateCompilationErrorPreprocessTemplateTransformationErrorUnknownErrorSecurityErrorSystem.Collections.IEnumerable.GetEnumeratorEntityStoreSchemaGeneratorEntityModelSchemaGeneratorEntityCodeGeneratorget_TargetEntityFrameworkVersionToNewForEntityClassGeneratorEntityViewGenerator.ctorRelationshipSpansSchemasTemplateCodeGenerators.CSharpCodeGenTemplateV5.0.csTemplateCodeGenerators.CSharpCodeGenTemplate.csMetadataExtensionMethodsget_AdditionalInterfacesget_EdmNamespacesSystem.Data.Entity.Design.PluralizationServicesget_ResourcesSystem.Data.Entity.Design.resourcesGetAllEntitiesReadOnlyEntitiesCollectAllFkPropertiesget_GenerateForeignKeyPropertiesset_GenerateForeignKeyPropertiesUsedTypeNamesUsedGlobalModelTypeNamesUsedEntityContainerItemNamesusedParameterNamesGetFormattedLinesget_TypesInvalidTypesGetSourceTypesGetPrimitiveTypesCreateAssociationTypesEntityStoreSchemaFilterObjectTypesEmitTypeAttributesAddIgnoreAttributesget_AdditionalAttributesEmitNavigationPropertyAttributesEmitPropertyAttributesGetResultFlags<>3__viewStringsTypeGeneratedEventArgsPropertyGeneratedEventArgs<>4__thisEqualsLoadTableDetailsLoadFunctionReturnTableDetailsLoadFunctionDetailsLoadViewDetailsContainsEntityFrameworkVersionsCandidateCollapsedAssociationsMapFunctionsLoadRelationshipsMappingLookupsget_AdditionalMembersFiltersget_ErrorsHasErrorSeverityErrorsget_ClassAdoFrameworkGenericDataClassAdoFrameworkGenericClassEndClassget_IEntityWithRelationshipsTypeBaseClassget_ComplexTypeBaseClassget_EntityTypeBaseClassEmitApiClassBeginClassget_AssociationSetsget_AdditionalGetStatementsget_AdditionalSetStatementsEmitParamCommentsEmitCommentsEmitSummaryCommentsAddAttributeArgumentsAddNamedAttributeArgumentsInternalGenerateViewsprimaryKeysget_EffectEntityStoreSchemaFilterEffectGetObjectGeneratedFactoryMethodNameConflictGeneratedNavigationPropertyNameConflictEntityTypeAndSetAccessibilityConflictGeneratedPropertyAccessibilityConflictSystem.Data.Entity.Design.AspNetget_ModelAssociationSetset_ModelAssociationSetEntityTypeToSetget_EntitySetGetEntitySetget_DateTimeOffsetEmitObjectResultget_Countget_ColumnCountUnsupportedModelGenerationConceptget_RealErrorsExistExistsInFirstget_ObjectContextHasQueryViewAllowFixPrivateMemberPrefixEdmxget_ByteArraySharedForeignKeyPrimaryKeyCannotBeForeignKeyCreateDbObjectKeyGetKeyAddTableWithoutKeyContainsTableWithoutKeyget_IsPrimaryKeyset_IsPrimaryKeyCannotCreateEntityWithoutPrimaryKeySetReadOnlyMetadataItemCollectionFactoryEntityStoreSchemaFilterEntryop_Equalityop_InequalityAddEntityMissingEntityTryGetEntityitemIdentityget_IsIdentityset_IsIdentityget_PropertyEndPropertyget_IsVirtualPropertyBeginPropertyPropertyInfoPropertyInvalidAttributeSuppliedForPropertyInvalidGetStatementSuppliedForPropertyInvalidSetStatementSuppliedForPropertyget_IsKeyPropertyp0T1get_EdmVersion1_1Func`1ISchemaElementLookUpTable`1Nullable`1IEnumerable`1IOrderedEnumerable`1Stack`1ICollection`1ReadOnlyMetadataCollection`1EnumerableRowCollection`1ReadOnlyCollection`1IComparer`1IEqualityComparer`1IEnumerator`1HashSet`1IList`1get_Template_GeneratedCodeCommentLine1get_Item1<>7__wrap1str1constraint1Int32T2Func`2Tuple`2Memoizer`2KeyValuePair`2BidirectionalDictionary`2get_Template_GeneratedCodeCommentLine2get_Item2<>7__wrap2str2Func`3get_Template_GeneratedCodeCommentLine3StoreSchemaMappingVersion3StoreSchemaDefinitionVersion3p3Int64p4Action`5p5get_UTF8GCget_EOFget_NamespaceURISystem.IOT_columnFKSchema_columnPKSchemaget_Template_UnsupportedSchema_sourceSchemasourceEdmSchema_columnSchema_schemaSystem.DataSystem.WebmscorlibrbSystem.Collections.GenericgenericMicrosoft.VisualBasicorderByFuncget_CurrentManagedThreadId_columnRelationshipIdReadLoadEdmFunctionPayloadget_EntityStoreGeneratorSchemaNotLoadedget_EntityModelGeneratorSchemaNotLoadedInterlockedInvalidSchemaEncounteredget_IsRequiredaccumulated_columnIsServerGeneratedget_SingleStoreEntityContainerExpectedSystem.Collections.Specializedfdget_EdmSchemaNotValidappendToFrontIfFirstCharIsInvalidVoidNewGuid_guidk__BackingFieldk__BackingFieldCodeMemberFieldAppendChildstoreEndfkEndpkEndTrimEndfromEndReadToEndtoEndtargetRelationshipEndAddAssociationSetEndstoreAssociationSetEndGetAssociationSetEndassociationSetEndDbCommandCreateCommandEntityCommand_commandstringToAppendDateTimeKindget_PrimitiveTypeKindget_BuiltInTypeKindGetCollectionKindcollectionKindSpecifyKindget_PropertyKindkindTSecondsecondGetAddMethodreferenceMethodGetRemoveMethodCodeMemberMethodGetGetMethodEmitGetMethodGetSetMethodget_Template_RegionFactoryMethod_methodoperationOnWordnewWordprefixWordReplaceget_DataSpacedataSpaceIsNullOrEmptyOrWhiteSpaceIsWhiteSpaceget_NamespaceschemaNamespaceAddNamespaceCodeNamespace_codeNamespaceget_StoreNamespaceedmNamespaceIsSystemNamespacehasNamespaceobjectNamespaceCreateMetadataWorkspacemetadataWorkspaceworkspaceuniqueIdentifierServiceGetServiceserviceget_InstanceCreateInstance_instanceCodeTypeReferenceGetCollectionTypeReference_typeReference_typeSourceCompileAssemblyFromSource_propertySourceXmlSchemaResourceCreateEmbeddedResourcedeleteBehaviorOverrideendMultiplicityOverridemultiplicityOverrideget_ErrorCodedefaultErrorCodeget_ModeFileModestorageSchemaNodeconceptualSchemaNodeSelectSingleNodeWriteNodemappingNodeXmlNodeImportNodemodeDbCommandTreeDbQueryCommandTreeget_TypeUsagestoreTypeUsageCreateStringTypeUsageGetModelTypeUsageGetScalarFunctionTypeUsagetypeUsageget_MessageerrorMessagemessageusageset_Language_languageAddRangeCompareExchangecache_columnScale_columnFKTable_columnPKTableLoadDataTableget_NameTableXmlNameTableget_VariableIsAtLeastOneColumnOfBothDependentRelationshipColumnSetsNonNullable_columnIsNullableAreAnyFkKeyColumnsNullableIEnumerableAsEnumerableFunctionImportMappingComposableIDisposableset_GenerateExecutableDoubleRuntimeFieldHandleRuntimeTypeHandleGetTypeFromHandleSingleget_CodeGenSourceFilePathIsNotAFileAddFileOpenFileCopyFileget_FromRoleget_ToRoleTupleset_BracingStyleset_NameunqualifiedNameget_ComplexPropertyInitializedFieldName_backingFieldNameset_MethodNamemethodNameget_NamespaceNamestoreNamespaceNamecsdlNamespaceNamexmlNamespaceName_namespaceNameGetEdmSchemaXsdResourceNameresourceNamenodeNameget_TwoLetterISOLanguageNamestoreTableNametableNameget_FileNameset_FileNameGetTempFileNameGetFileNameoutputFileNameviewStorageTypeNametypeNamestoreNameattributeNameget_LocalNameget_IsSpecialNameget_FullNameextentFullNameparamNameitemNamegetColumnNamecolumnNameStoreFunctionNameget_MissingDocumentationNoName_columnRelationshipNamepropNamepropertyFqNamefqNamenewModelEntityContainerName_modelEntityContainerNameentityContainerNameset_ParameterNameparameterNameget_PropertyClassNameclassNameGetNameget_FacetNamefacetName_providerInvariantNameelementNamefunctionImportNameget_DisplayNameAssemblyNamegeneratedPropertyNamepropertyName_nameget_LineReadLineAppendLineWriteLineget_NewLineCombinelineClonescopeset_TypeSchemaTypeUnsupportedFunctionParameterDataTypedataTypeDbTypeapplyToSpecificTypeMakeGenericTypeStructuredTypefieldTypeset_CommandTypeGetReferenceTypeget_NodeTypeXmlNodeTypeeventReturnedBaseType_declaringTypeUsesStandardBaseTypeGetBaseType_baseTypecreateTypeattributeTypeget_IsValueTypeGetEdmPrimitiveTypeIsPrimitiveTypeprimitiveTypeOfTypeRefTypeMappingTypeget_DeclaringTypeIsNominalTypeStructuralTypestructuralTypemodelTypeget_EdmTypeGetEdmTypeGetBuiltInTypestoreAssociationTypeStoreAssociationTypeToModelAssociationTypeassociationTypeIsCollectionTypeGetCollectionTypetvfReturnTypepropertyReturnType_returnTypetoTypeget_RelationshipTypeset_RelationshipTypeinnerTypeDetermineParameterTypeget_ClrTypeCodeBinaryOperatorTypedbObjectTypeGetSourceNameFromObjectType_objectTypeGetTypeget_ClrEquivalentTypeget_ElementTypegetElementTypeelementTypenewTypeGetRowTyperowTypeIsComplexTypecomplexTypestoreEntityTypefkEntityTypepkEntityTypeGetEntityTypeentityTypepropertyTypem_typeFileShareWhereSystem.Corestoreget_InvariantCultureget_CurrentCultureCaptureMethodBaseEntityTypeBaseInternalDataCollectionBaseAddEntitySetBaseentitySetBaseget_OrdinalIgnoreCaseTryParseorderByClauseMulticastDelegateget_Template_CurrentlyRunningTemplate<>1__stateEvaluateget_IsPrivate_columnRelationshipIsCascadeDeletenamespaceToWriteMetadataArtifactLoaderCompositeget_IsCompositeCompilerGeneratedAttributeDebuggerNonUserCodeAttributeAttributeUsageAttributeNeutralResourcesLanguageAttributeDebuggableAttributeget_IsComposableAttributeComVisibleAttributeAssemblyKeyFileAttributeAssemblyTitleAttributeget_StoreFunctionNameAttributeIteratorStateMachineAttributeXmlIgnoreAttributeSoapIgnoreAttributeget_AggregateAttributeDebuggerStepThroughAttributeXmlAttributeget_BuiltInAttributeDebuggerHiddenAttributeAssemblyDelaySignAttributeExtensionAttributeAssemblyFileVersionAttributeAssemblyInformationalVersionAttributeSatelliteContractVersionAttributeget_NiladicFunctionAttributeAssemblyDescriptionAttributeBuildProviderAppliesToAttributeDefaultMemberAttributeAssemblyDefaultAliasAttributeget_ParameterTypeSemanticsAttributeSecurityRulesAttributeFlagsAttributeDefaultDllImportSearchPathsAttributeCompilationRelaxationsAttributeAllowPartiallyTrustedCallersAttributeAssemblyProductAttributeAssemblyCopyrightAttributeCLSCompliantAttributeSecurityTransparentAttributeget_CommandTextAttributeDebuggerDisplayAttributeParamArrayAttributeAssemblySignatureKeyAttributeAssemblyCompanyAttributeEDesignResCategoryAttributeRuntimeCompatibilityAttributeattributeReadByteWriteByteget_Valueset_ValueAddValueGetSecondValuesecondValuemetadataArtifactProcessingValuenullValueget_MinValueset_DescriptionValueget_HasValueTryGetValueSetValueIsUnboundedFacetValueget_DefaultValueGetDefaultValueGetFirstValuefirstValueget_MaxValuevalueToAppRelativeget_IsLanguageCaseSensitivecaseSensitiveSuppressFinalizeEntityizeLastIndexOfget_ComplexPropertyInitializedFieldRef_complexPropertyInitializedFieldRefget_ThisReftagSystem.ThreadingOrderByDescendingDbExpressionBindingset_EncodingSystem.Runtime.Versioningget_IsWarningset_IsWarningSystem.Data.MappingStoreSchemaMappingStorageEntityContainerMappingstorageEntityContainerMappingTryGetFunctionImportMappingWriteStringWriteAttributeStringset_ConnectionStringconnectionStringviewStringSubstringSystem.Web.Hosting_columnFKCatalog_columnPKCatalog_columnCatalog_catalogIsMatchGetMappingClosureHashComputeHashPushFlushMathtempSchemaPathsourceEdmSchemaFilePathget_TargetFilePath_targetFilePathDllImportSearchPathget_VirtualPathvirtualPathset_SourceCsdlPathGetTempPathtargetPathget_Length_columnMaximumLengthlengthEndsWithStartsWithfixmlNamespaceUriobjAsyncCallbackusedFallbackcallbackExtensionCheckPeekSeekget_TargetFrameworkcheckForSpecialset_IsPartial_columnOrdinalAddInternalpluralop_GreaterThanOrEqualop_LessThanOrEqualisVirtualtypeDeclpropertyDecl_isModelSystem.Collections.ObjectModelSystem.Data.EntityModel.SchemaObjectModelSystem.ComponentModelmodelset_ConformanceLevelStringUtilEntityUtilSystem.Data.Entity.Design.dllIsDBNullIsNullSystem.XmlescapeForXmlget_FunctionDetailSqlsqlGetManifestResourceStreamFileStreamedmxInputStreamMemoryStreamstreamSystem.Data.Metadata.EdmMetadataItemSerialization_UnknownGlobalItemTryGetItem_itemTypeSystemCreateMetadataHashAlgorithmTrimSystem.CodeDomIsAssignableFromfrom_transformEnumScanBooleanop_GreaterThanop_LessThanget_Template_ReplaceVsItemTemplateTokenGetProviderManifestToken_providerManifestTokenMinSeekOrigin_columnFKColumn_columnPKColumnget_ColumnDataColumnfkColumn_columnDateTimePrecision_columnPrecisionAddExtensionget_FileExtensionget_VersionTryGetSchemaVersion_schemaVersionmaxExpectedVersionruntimeVersionget_MappingVersiontargetFrameworkVersion_targetEntityFrameworkVersionentityFrameworkVersionactualVersion_storeSchemaModelVersionget_EdmVersionedmVersionTryGetEdmxVersionDbExpressionDbNewInstanceExpressionCodeFieldReferenceExpressionCodeMethodReferenceExpressionDbVariableReferenceExpressionCodeVariableReferenceExpressionCodeTypeReferenceExpressionCodeBaseReferenceExpressionCodePropertySetValueReferenceExpressionCodeThisReferenceExpressionCodeArgumentReferenceExpressionCodePropertyReferenceExpressionGetMultiplicityCodeExpressionOnContextCreatedCodeMethodInvokeExpressionCodeObjectCreateExpressionCodeArrayCreateExpressionCodePrimitiveExpressionCodeTypeOfExpressionget_NullExpressionDbScanExpressionCodeParameterDeclarationExpressionCodeDirectionExpressionCodeBinaryOperatorExpressionDbProjectExpressionset_InitExpressionCodeCastExpressionDbPropertyExpressionexpressionsessionget_LocationsourceLocationtargetLocationstoreAssociationmodelAssociationassociationSystem.Web.CompilationGetInformationCodeTypeDeclarationtypeDeclarationCodeAttributeDeclarationset_OmitXmlDeclarationget_MetadataItemErrorsFoundDuringGenerationget_Documentationget_Template_CommentNoDocumentationMissingPropertyDocumentationdocumentationSystem.GlobalizationSystem.Runtime.SerializationSystem.Xml.SerializationdeleteActionOperationActionoperationActionactionSystem.ReflectionCodeNamespaceCollectionCodeTypeReferenceCollectionTempFileCollectionstoreCollectionXmlAttributeCollectionValueCollectionmappingCollectionStringCollectionedmCollection_storeItemCollection_edmItemCollectionitemCollectionDataColumnCollectionCodeExpressionCollectionCodeParameterDeclarationExpressionCollectionCodeTypeDeclarationCollectionCodeAttributeDeclarationCollectionGroupCollectionCodeTypeMemberCollectionDbParameterCollectionEntityParameterCollectionCompilerErrorCollectionCodeStatementCollectionCodeCommentStatementCollectioncommentCollectionCodeAttributeArgumentCollectionDataRowCollectionKeyCollectioncollectionDbConnectionget_StoreConnectionCreateConnectionproviderConnectionget_EntityConnection_connectionFieldDirectionstoreFunctionModelFunctionfunctionStoreSchemaDefinitionGetConceptualSchemaDefinitionDbCommandDefinitionCreateCommandDefinitionget_LinePositionlinePositionm_languageOptionSchemaDataModelOptionMetadataExceptionNotImplementedExceptionNotSupportedExceptionFileNotFoundExceptionDirectoryNotFoundExceptionNullReferenceExceptionArgumentOutOfRangeExceptionIndexOutOfRangeExceptionProviderIncompatibleExceptionStrongTypingExceptionArgumentNullExceptionXmlExceptionTargetInvocationExceptionAccessViolationExceptionInvalidOperationExceptionget_InnerExceptioninnerExceptionUnauthorizedAccessExceptionArgumentExceptionThreadAbortExceptionInvalidCastExceptionStackOverflowExceptionOutOfMemoryExceptionSecurityExceptionexceptionget_LongDescriptionproviderFacetDescriptiondescriptionSystem.Data.CommonStringComparisoncomparisonStoreGeneratedPatternCompareToWriteToBuildProviderAppliesToFieldInfoMethodInfoCultureInfoSerializationInfoserializationInfoMemberInfoEventInfoPropertyInfomementoXmlNamedNodeMapHasQueryViewForSetMapPopMicrosoft.CSharp_errorsLookupGroupSystem.Xml.LinqSystem.LinqSystem.Data.Objects.ELinqCharsingularAddMemberstoreEndMemberget_FromEndMemberset_FromEndMemberget_CorrespondingAssociationEndMemberStoreAssociationEndMemberToModelAssociationEndMemberget_ToEndMemberset_ToEndMemberRelationshipEndMemberendMemberCodeTypeMemberEdmMembermemberget_LineNumberlineNumberget_ErrorNumberDbDataReaderEntityDataReaderExecuteReadersourceEdmSchemaXmlReaderStreamReaderTextReader_readersourceLoaderMetadataArtifactLoaderEntityClient_DoesNotImplementIServiceProviderVBCodeProviderCSharpCodeProviderVirtualPathProviderget_CodeDomProviderGetViewsAndCodeDomProvidercompilerProviderIFormatProvider_providerGetStringBuilderstringBuilderStringHashBuilderSystem.Data.Common.CommandTrees.ExpressionBuilderDbExpressionBuilderDataRowBuilderAssemblyBuilderassemblyBuilderbuildersenderBinderset_VerbatimOrderSchemaManagerBuildManagerXmlNamespaceManagerResourceManagerParameterModifieraddGlobalQualifieradjustedIdentifieridentifierSystem.CodeDom.Compiler_storeContainer_modelContainerget_StorageEntityContainer_storeEntityContainer_modelEntityContainerget_EdmEntityContainer_entityContainercontainerinnerMetadataHelperIsUpperMetadataArtifactLoaderXmlReaderWrapperget_LanguageAppropriateStringComparerDbParametertypeParameterstoreParameterCreateFunctionParameterget_ReturnParameterObjectParameterEntityParameterparametersourceWriterStringWriterstringWriterXmlWriterStreamWriterGetWriterget_IsUserSuppliedTextWriterIndentedTextWriter_ownTextWritertextWriter_writerConverterisGetterIsLetterget_AttributeEmitteremitterToLowerget_TempDirCommandBehaviorget_DeleteBehaviorset_DeleteBehaviordeleteBehaviorget_Majorget_MinorConvertToEdmSchemaErrorEdmErrorCompilerErrorerrorseparatorIEnumerator_generatorActivatorCodeConstructorMetadataMappingHasherVisitorBindAsaliasadditionalEdmSchemasParameterTypeSemanticsSystem.Diagnosticsget_AssociationSetEndsget_Template_RegionPartialMethodsget_Template_RegionAddToMethods_additionalInterfacesget_NamespacesxmlPrefixToNamespacesSystem.Runtime.InteropServicesDbProviderServicesSqlProviderServicesGetProviderServicesproviderServicesSystem.Runtime.CompilerServicesSystem.ResourcesDebuggingModesSelectNodesSystem.Data.Common.CommandTreesget_ReferencedAssembliesDbProviderFactoriesAddStoreSchemaResourceMapEntriesAddMappingSchemaResourceMapEntriesAddEdmSchemaResourceMapEntriesget_Template_RegionEntitiesget_Propertiesget_MetadataPropertiesAddMetadataPropertiesget_Template_RegionSimplePropertiesget_Template_RegionPrimitivePropertiesget_FromPropertiesget_NavigationPropertiesget_Template_RegionNavigationPropertiesget_ToPropertiesget_Template_RegionObjectSetPropertiesget_Template_RegionComplexPropertiespropertiesusedNamesusedEndNamesusedMemberNamesusedEndMemberNamesusedPropertyNamesnamescommentLinesget_SchemaTypesget_BaseTypesget_Template_RegionEnumTypesget_Template_RegionComplexTypesqueryTypesCreateViewEntityTypes_typesfilterAliasesSystem.Data.Objects.DataClassesget_Attributesset_Attributesget_TypeAttributesset_TypeAttributes_additionalAttributesget_CustomAttributesget_AssemblyCustomAttributesMemberAttributesget_ValuesGetValuesget_NullFacetValues_valuessuffixesBindingFlagsBuildProviderResultFlagsXmlWriterSettingsget_BaseConstructorArgseventArgsargslhsrhsadditionalEdmSchemaFilePathsset_ReferenceCsdlPathsGetPathsget_TicksSystem.Data.Common.UtilsGetItemscommentedOutItemsget_ColumnsexcludedColumnscolumnsDataTableExtensionsSystem.Data.DataSetExtensionsDataRowExtensionsSystem.Text.RegularExpressionsSystem.Collections_storeFunctionsCodeTypeReferenceOptionsget_LanguageOptionsset_CompilerOptionsCodeGeneratorOptionsRegexOptionsGetAssociatedFacetDescriptionsget_ClassFixUps_classFixUpsget_Template_RegionRelationships_lookupsget_Groupsfixupsget_Charsget_Membersget_AssociationEndMembersget_RelationshipEndMembers_additionalMembersset_BlankLinesBetweenMembersGetMembersget_KeyMembersGetDeclaredOnlyMembersmemberscloseReadersxmlReadersGetReadersreadersloadersRuntimeHelpersTypeHelpersget_ParametersReturnParametersCompilerParametersparametersfiltersget_ProviderSchemaErrorsschemaErrorsget_HasErrors_errorsget_Template_RegionConstructorsget_UsingStandardBaseClassget_IsClassInitClassFileAccesstypeAccesssetAccessget_SuccessSystem.Data.ObjectsCollapsedEntityAssociationSetsget_BaseEntitySetsget_FacetsAttributeTargetsCompilerResultsresultsget_Statementsget_TrueStatementsget_GetStatements_additionalGetStatementsget_SetStatements_additionalSetStatementsstatementsget_Commentsget_GetViewAtMethodCommentsget_TypeCommentsget_ConstructorCommentssummaryCommentsget_Argumentsget_TypeArgumentsargumentsget_ReferentialConstraintsget_FunctionImportsget_Template_RegionFunctionImportsExistsget_Template_RegionContextsgeneratedViewsGenerateEntitySetViewsget_RowstableDetailsRowsrowsget_KeyspKeysConcatFormatformatCreateMetadataPropertyFromOtherNamespaceXmlArtifactget_Abstract_effectStructuralObjectset_TargetObjectComplexObjectEntityObjectobjectProjectSelectIntersectset_HasGetSecurityRuleSetdefiningSetcollapsedAssociationSetstoreAssociationSetparentModelAssociationSetget_ParentAssociationSetCollapsedEntityAssociationSetassociationSetset_HasSetmultiplicitySet_storeEntitySetentitySetget_DefaultValueFacetStoreGeneratedPatternFacetSkipFacetfacetexcludedForTargettargetSystem.Collections.IEnumerator.Resetget_OffsetoffsetPadLeftleftrightIsLetterOrDigitSplitAddCodeCompileUnitGenerateCodeFromCompileUnitCodeSnippetCompileUnit_compileUnitGetValueOrDefaultFirstOrDefaultIAsyncResultresultToUpperInvariantToLowerInvariantget_IsConstantset_IndentSystem.Data.SqlClientSystem.Data.EntityClientXElementGetSchemaElementWriteEndElementXmlElementxmlElementget_DocumentElementWriteStartElementelementCodeStatementCodeAssignStatementCodeExpressionStatementCodeVariableDeclarationStatementCodeConditionStatementCodeThrowExceptionStatementCodeMethodReturnStatementCodeCommentStatementsegmentdocCommentWriteCommentcommentEnvironmentXmlDocumentCodeAttributeArgumentCheckStringArgumentargumentComponentSystem.Collections.Generic.IEnumerator.CurrentSystem.Collections.Generic.IEnumerator.CurrentSystem.Collections.Generic.IEnumerator.CurrentSystem.Collections.Generic.IEnumerator.CurrentSystem.Collections.IEnumerator.CurrentSystem.Collections.IEnumerator.get_CurrentGenerateHashForAllExtentViewsContentstoreConstraintAddReferentialConstraintGetReferentialConstraintconstraintExceptInsertConverttoSortAddFunctionImportget_IsFunctionImportfunctionImportDbProviderManifestget_EdmProviderManifestget_IsFromProviderManifestGetProviderManifestXmlNodeListToListlistrefconstTFirstfirstset_CommandTimeoutinputMoveNextSystem.Textget_CommandTextset_CommandTextsearchTextReadAllTextget_ErrorTextset_ErrorTextinsertTextviewTextStreamingContextstreamingContextcontextprovValidateFunctionViewGetCqtViewget_EntityCodeGenTargetTooLowget_NowDataRowNewRowrowindexRegexThenByOrderByInitializeArrayToArrayToCharArrayget_KeytableKeyget_IsForeignKeyfunctionKeyContainsKey_columnIsPrimaryKeykeySystem.Security.Cryptographyget_Assemblyget_CompiledAssemblyGetExecutingAssemblyget_IsAssemblyAsReadOnlyIndexOfAnySelectManyget_Summaryget_FirstToSecondDictionaryset_FirstToSecondDictionaryfirstToSecondDictionaryToDictionaryget_SecondToFirstDictionaryset_SecondToFirstDictionarydictionaryget_DefiningQueryset_DefiningQuerycategoryset_GenerateInMemoryDbProviderFactoryget_StoreProviderFactoryGetProviderFactoryGetFactorySqlClientFactoryfactoryentrycapacityget_RelationshipMultiplicityrelationshipMultiplicitymultiplicityDesignerSerializationVisibilitypropertyAccessibilityaccessibilityVirtualPathUtilityget_SeverityEdmSchemaErrorSeverityseveritySystem.SecuritySystem.Data.Entityget_Identity_columnIsIdentityparentIdentityIsNullOrEmptyget_IsEmptyMetadataPropertyStructuredPropertycSpacePropertyreferencePropertystorePropertyhidesBasePropertyStoreEdmPropertyToModelEdmPropertyEmitNavigationPropertynavigationPropertyCodeMemberPropertymemberPropertyget_HidesBaseClassPropertyGetPropertystoreKeyProperty_propertyb__31_10b__29_10d__20<>c__DisplayClass20_0<.ctor>b__0_0<>c__DisplayClass0_0b__11_0<>c__DisplayClass11_0b__31_0<>c__DisplayClass31_0b__41_0b__41_0<>c__DisplayClass51_0b__1_0<.cctor>b__12_0b__12_0b__22_0b__13_0b__13_0b__13_0b__53_0b__14_0b__4_0b__15_0b__15_0<>c__DisplayClass15_0b__55_0<.ctor>b__5_0b__16_0<>c__DisplayClass16_0b__6_0b__37_0b__7_0<.ctor>b__18_0b__38_0<>c__DisplayClass38_0b__29_0b__39_0b__9_0<>c__DisplayClass9_0b__0b__0b__0b__0b__0b__0b__0b__31_11b__29_11EdmxNamespaceUriV1MementoV1FunctionDetailsReaderV1b__31_1<>c__DisplayClass51_1<.cctor>b__12_1b__12_1b__13_1b__53_1b__14_1b__4_1b__15_1b__55_1b__38_1b__29_1b__39_15__1b__1<>m__Finally1b__29_12b__12VBTemplateCodeGenResourceV2CSharpTemplateCodeGenResourceV2_vbCodeGeneratorTypeV2_csharpCodeGeneratorTypeV2EdmxNamespaceUriV2CreateVBCodeGeneratorV2CreateCSharpCodeGeneratorV2b__31_2<.cctor>b__12_2b__12_2b__13_2b__14_2b__15_2b__29_2b__39_2b__2<>m__Finally2b__31_13b__29_13d__3390EEE9F1BE125B634A197AA7BD83E6811BE8B6F3VBTemplateCodeGenResourceV3CSharpTemplateCodeGenResourceV3_vbCodeGeneratorTypeV3_csharpCodeGeneratorTypeV3EdmxNamespaceUriV3MementoV3FunctionDetailsReaderV3CreateVBCodeGeneratorV3CreateCSharpCodeGeneratorV3b__31_3<.cctor>b__12_3b__12_3b__13_3b__14_3b__15_3b__38_3b__29_3b__39_3b__31_14b__31_4b__38_4b__29_4b__39_4b__31_5b__29_5__StaticArrayInitTypeSize=6b__31_6b__29_6b__31_7b__29_7d__28b__31_8b__29_8d__29b__31_9b__29_9FK_SCHEMAPK_SCHEMANormalizeForVBIS_SERVERGENERATEDRELATIONSHIP_IDSCALEIS_NULLABLEFK_TABLEPK_TABLEDEFAULT_NAMESPACE_NAMERELATIONSHIP_NAMEERRORCODE_MAPPINGALLQUERYVIEWATCOMPILETIMEDATA_TYPEFK_CATALOGPK_CATALOGMAXONELINELENGTHMAX_LENGTHIsFkPartiallyContainedInPKORDINALFK_COLUMNPK_COLUMNDATETIMEPRECISIONDoFixUpsForCSPROC_SCHEMA_INDEXPROC_ISNILADIC_INDEXPROC_ISCOMPOSABLE_INDEXPROC_NAME_INDEXPARAM_NAME_INDEXPARAM_TYPE_INDEXPROC_RET_TYPE_INDEXPROC_ISAGGREGATE_INDEXPROC_ISTVF_INDEXPROC_CATALOG_INDEXPROC_ISBUILTIN_INDEXPARAM_DIRECTION_INDEXNAMESPACE_NAME_SUFFIXENTITY_CONTAINER_NAME_SUFFIXCONTAINER_SUFFIXIS_PRIMARYKEYIS_IDENTITYGenerateCodeFor1_1SchemaCheckValidSchemaIsValidSchemaNullAdditionalSchemaTemplate_GenCommentAddToMethodVb<>cVBMarkPropertyGetAsPublicVBMarkPropertySetAsPublicCodeGenerationValueAccessibilityPublicComputeFromStringGeneric<>l__initialThreadIdPrivateMemberPrefixIdreplacedVBMarkOverrideMethodAsSealedLazyLoadingEnabledVBMarkPropertyGetAsProtectedVBMarkPropertySetAsProtectedCodeGenerationValueAccessibilityProtectedIsClassWantedNotImplementedIsCapitalizedGetCodeExpressionFromGuidk__BackingFieldk__BackingFieldk__BackingFieldCreateEntitySetFieldCreateAssociationEndCreateModelAssociationSetEndStoreAssociationSetEndToModelAssociationSetEndGetFromAssociationSetEndCreateFilteredCommandTableReferencedByTvfWasNotFoundTableReferencedByAssociationWasNotFoundset_MethodCreateViewReturnMethodCreateFunctionImportStructuralTypeReaderMethodEntityClient_ReturnedNullOnProviderMethodCreateAndAddGetViewAtMethodFixMethodIncludeFieldInFactoryMethodTryInflectOnSuffixInWordIsNoOpWordGetSuffixWord_CSClassKeyWordIndexOfKeywordGetStoreSchemaNamespaceGetMappingSchemaNamespaceGetEdmSchemaNamespaceGetSchemaNamespaceEdmReservedNamespace_storeNamespaceValidateNamespace_xmlNamespaceEdmAnnotationNamespace_hasAnnotationNamespaceEntityStoreSchemaGeneratorNamespaceAdoAttributeDataClassesNamespaceGetProviderSchemaMetadataWorkspaceget_Serviceset_Service_irregularVerbPluralizationService_wordsEndingWithSePluralizationServiceEnglishPluralizationService_assimilatedClassicalInflectionPluralizationService_classicalInflectionPluralizationService_wordsEndingWithSisPluralizationService_irregularPluralsPluralizationService_wordsEndingWithSusPluralizationService_oSuffixPluralizationServiceUniqueIdentifierServiceget_TypeReferenceAddArtifactReferenceSetupEmbeddedResourceCreateEndMultiplicityOverrideModelBuilderErrorCodeCombineErrorMessageget_LanguageArgumentOutOfRangeDisallowReturnTypeChangeTryAddNameToCacheAddElementNameToCache_columnTableGetViewStringBuilderVariable_nonNullableAreAllFkKeyColumnsNullable_nullableAreTypeAndSetAccessCompatibleProviderIncompatibleSaveXmlReaderToFileCreateValidEcmaNameTryGetAdjustedNameget_FieldNameOnChangedPartialMethodNameOnChangingPartialMethodNameGetViewAtMethodNameDetachFromParentMethodNameCreateValidNamespaceNameCreateValildModelNamespaceNameGetStoreSchemaXsdResourceNameGetMappingSchemaXsdResourceNameVBTemplateCodeGenV3TypeNameCSharpTemplateCodeGenV3TypeNameBaseTypeNameVBTemplateCodeGenTypeNameCSharpTemplateCodeGenTypeNameGetTypeNameGetEntityTypeNameEntityStoreSchemaGeneratorSchemaAttributeNameEntityStoreSchemaGeneratorNameAttributeNameEntityStoreSchemaGeneratorTypeAttributeNameViewGenerationCustomAttributeNameTranslateFacetNameToAttributeNameShouldReserveNameCreateModelNameCreateFullNameGetFullNameGetExtentFullNameTemplate_ConflictingGeneratedNavPropNameIsNameAlreadyAMemberNameStoreEntityContainerNameDuplicateEntityContainerNameEdmEntityContainerNameAncestorClassDefinesNameIEntityWithRelationshipsTypeBaseClassNameEntitySetClassNameObjectResultClassNameNewContextClassNameGetEntitySetNameEdmxRootElementNameTrySplitExtendedMetadataPropertyNameGetFullyQualifiedPropertyNameValuePropertyNameGetNavigationPropertyNameViewCountPropertyNameSearcherGetContextPropertyNameEntityGetContextPropertyName_dateTimeUnsupportedDataType_columnDataTypeUnsupportedFunctionReturnDataTypeNullReferenceTypeModelGeneration_UnGeneratableTypeNonSerializableTypeIsStoreTypeAssignBaseTypeTryGetStorePrimitiveTypeCreateConstructorForViewStoringTypeGetCSDeclTypeGetModelTypeTemplate_DuplicateTopLevelTypeCreateAssociationTypeCreateModelAssociationTypeAccessViolationTypeIsEnumerationTypeIsCatchableExceptionTypeGetReturnTypeCannotChangePropertyReturnTypeUnsupportedDataTypeUnknownTypeFixUpTypeComputeForTypeMissingGenerationPatternForTypeAddErrorsForTypeCreateCodeGeneratorTypeComplexTypeBaseClassTypeEntityTypeBaseClassTypeDbObjectTypeGetVBStatementTypeThreadAbortTypeCreateTvfReturnRowTypeStackOverflowTypeIsValidKeyTypeOutOfMemoryTypeSecurityTypeCreateEntityTypeCreateModelEntityTypeStoreEntityTypeToModelEntityTypeInsertBeforeHashOverMappingClosureset_CulturePropertyEmitterBaseItemExistsWithDifferentCaseEntitySetExistsWithDifferentCasePropertyExistsWithDifferentCaseFunctionOrderByClauseSaveAssociationForCollapsedAssociationCandidateLoadMethodSessionStateToSeparatedStringPrivateVBMarkPropertyGetAsPrivateVBMarkPropertySetAsPrivateCodeGenerationValueAccessibilityPrivateRELATIONSHIP_IsCascadeDelete_GeneratedCodeAttributeEmitGeneratedCodeAttributeGetCodeAccessibilityTypeAttributeEDesignResDescriptionAttributeGetAccessibilityCsdlStringFromMemberAttributeGetCodeAccessibilityMemberAttributeStonglyTypedAccessToNullValueGetEnumValueGetCodeExpressionFromDateTimeDefaultValueGetCodeExpressionFromTimeSpanDefaultValueGetCodeExpressionFromDateTimeOffsetDefaultValueGetTypeAccessibilityValueGetAccessibilityValueIsUninflective_isLanguageCaseSensitiveInitializeCapitalizeget_FieldRef_fieldRef_thisRefUnsupportedQueryViewInEntityContainerMappingStrongTyping_onContextCreatedStringMembersToCommaSeparatedStringGetLocalizedStringGetAttributeValueString_stringTargetVersionSchemaVersionMismatchGetResourceNameForVirtualPathget_SourceCsdlPath_sourceCsdlPathDbProviderServicesInformationLocationPathGetAccessibilityRankVBMarkMethodAsPartialCSMarkMethodAsPartial_columnFieldOrdinalVBMarkPropertyGetAsInternalVBMarkPropertySetAsInternalCodeGenerationValueAccessibilityInternalFactoryParamCommentGeneralFixUpMethodDeclFixUpClassDeclSystem.Data.EntityModelMetadataUtilPluralizationServiceUtilEDesignUtilEntityFrameworkVersionsUtilConvertDBNullEmitExpressionDoesNotEqualNullCannotChangePropertyReturnTypeToNullEmitExpressionEqualsNullCheckArgumentNullFunctionReturnTableDetailSqlRelationshipDetailSqlViewDetailSqlOutputXmlElementToStreamTemplate_CommentFactoryMethodParam_timeSpanGetMessagesFromEntireExceptionChain_columnFieldColumnToPropertyHasNonNullableColumnGetAssociatedFkColumn_edmxFileExtensionIsValidVersionGetMinimumTargetFrameworkVersionGetEntityFrameworkVersionGetEdmVersionConvertToVersionGetEndTypeCodeExpressionGetDefaultValueExpression_nullExpressionEmitEnumMemberExpressionIsAssociationPartOfCandidateCollapsedAssociationAddStoreGeneratedPatternAnnoationForceViewGenerationInvalidOperationMissingComplexTypeDocumentationMissingDocumentationGetDocumentationUpdateMemberFieldsAfterDeserializationCheckValidItemCollectionFixUpCollectionTableDetailsCollectionRelationshipDetailsCollectionNestedStoreObjectCollectionIsCSClassDefinitionCreateErrorForExceptionTerminalErrorExceptionSystem.Data.Entity.Design.CommonGenerateCodeCommonAddComparisonUnsupportedForeignKeyPatternGetElementLocationInfoAddGetterSetterFixUp_edmToObjectNamespaceMap_map_tvfReturnTypeLookupErrorsLookup_reverseEntityLookup_entityLookupCreateAssociationEndMemberInitializeReaderFunctionDetailsReaderEntityStoreSchemaGeneratorDatabaseSchemaLoaderGetLoader_loaderEntityClient_InvalidStoreProviderCreateSizedStringBuilderGetViewStringsAppendToStringBuilderAppendStringToStringBuilderNewRowFromBuilderRegisterUsedIdentifier_identifierToAdjustedIdentifierAdjustIdentifier_pluralizationServiceHandlerEntityDesignPluralizationHandlerInvalidStoreEntityContainerInvalidNonStoreEntityContainerQualificationCharacterCreateFunctionImportParameters_defaultDelimiterGetOrCreateTextWriterReflectionAdapterFixUpGetterLineIsVBBeginSetterGetterEmitPropertyGetterFixUpSetterEmitPropertySetterNamespaceEmitterSchemaTypeEmitterStructuredTypeEmitterAssociationTypeEmitterComplexTypeEmitterEntityTypeEmitterCreateEmitter_attributeEmitterMetadataItemEmitterEntityContainerEmitterCreateElementEmitterCommentEmitterNavigationPropertyEmitterOneToOneMappingSerializerMetadataItemSerializer_fromStringGenericMemoizer_nullableForTypeMemoizer_forTypeMemoizer_fromStringMemoizerCreateSourceEdmSchemaNotValidErrorThrowOnErrorLazyTextWriterCreatorSystem.Collections.Generic.IEnumerable.GetEnumeratorSystem.Collections.Generic.IEnumerable.GetEnumeratorSystem.Collections.Generic.IEnumerable.GetEnumeratorSystem.Collections.Generic.IEnumerable.GetEnumeratorget_Generatorset_GeneratorClientApiGeneratorSystem.Data.Entity.Design.SsdlGenerator.cctorTemplate_GenCommentAddToMethodCsRelationshipDetailFromTableAliasRelationshipDetailToTableAliasFunctionReturnTableDetailAliasFunctionDetailAliasViewDetailAliasGetCollectionTypeReferenceForBagSemanticsGetCollectionTypeReferenceForListSemanticsSetupFieldsEmitPropertyOnChangePartialMethodsCreateContextPartialMethods_VBFixMethods_CSFixMethods_knownPluralWords_knownSingluarWordsEDesignResAddInterfacesv1Namespacesv2Namespacesv3NamespacesUnsupportedLocaleForPluralizationServicesPropertyTypeReferencesExtractConceptualMappingAndStorageNodesTryGetEndEntities_missingEntitiesCreateEdmPropertiesCreateModelNavigationPropertiesGetPropertiesEmitPropertiesTypeValueTablesInitializeTypeReservedNames_typeReservedNamesLoadNameLookupWithUsedMemberNamesAddToPropertyNamesSplitIntoLinesGetDirectSubTypes_invalidTypesCreateTableTypesCreateTvfReturnRowTypesCreateTableEntityTypesFindAllInvalidCollapsedAssociationCandidatesEmitKnownTypeAttributesEmitCustomAttributesWriteExtendedPropertyAttributes_privateMemberPrefixesCheckIfAllErrorsAreWarningsSplitViewStrings_referenceCsdlPathsLeadingBlanks_tableTableDetails_tableRelationshipDetailsBuildProviderUtilsEntityDesignerUtilsAreAllEntityColumnsMappedAsToColumnsInferKeyColumnsValidVersionsGetAppendViewStringsExpressionsIsEntityDependentSideOfBothAssociationsIsAtLeastOneColumnFKInBothAssociationsCreateEdmFunctionsget_FixUps_fixUps_mappingLookupsAddMembersDisposeXmlReaders_knownIdentifiers_CSFieldMarkers_VBNonDeclMarkersRemoveXmlCommentCharacters_VBEndOfClassDelimiters_CSEndOfClassDelimitersAccessibilityFromGettersAndSettersSystem.Data.EntityModel.EmittersThrowOnAnyNonWarningErrorsGetViewsWithErrorsHandleValidationErrorsEmitterCreatorsCreateConstructorsset_Class_usingStandardBaseClass_class_storeAssociationSetsFixupKeylessEntitySetsIsAlphabetsWritePropertyTypeFacetsDesignXmlConstantsEntityViewGenerationConstantsEmitScalarTypePropertySetStatementsEmitComplexTypePropertySetStatementsNamespaceCommentsEmitXmlCommentsEmitOtherDocumentationCommentsIndividualViewCommentsGetConstraintsEntityCreationStatusGenerateAndStoreViewsTypeValueViewsCreateTypeForStoringViewsGetEntitySetViewsHashOverAllExtentViews_tablesWithoutKeysTemplate_FactoryMethodNameConflictTemplate_CaseInsensitiveTypeConflictTemplate_CaseInsensitiveMemberConflictTemplate_CaseInsensitiveEntitySetConflictEFNamespaceSetCreateAssociationSetCreateModelAssociationSetStoreAssociationSetToModelAssociationSet_modelAssociationSetCreateEntitySetCreateModelEntitySetStoreEntitySetToModelEntitySetVerifyLanguageCaseSensitiveCompatibilityForEntitySetIsEntitySetIsSpecialFacetCheckForCompatibleSchemaAndTargetUnsupportedDataTypeForTargetUnsupportedFunctionReturnDataTypeForTargetUnsupportedFunctionParameterDataTypeForTargetValidateActualVersionAgainstTarget_dateTimeOffsetIsLeftMoreAccessableThanRightget_CompileUnitHasDefaultCreateModelComplexTypeForTvfResultFormatInvariantWriteSchemaElementWriteRelationshipEndElementWriteAssociationSetEndElementSummaryEndElementWriteReferentialConstraintRoleElementWriteTypeElementWriteAssociationTypeElementWriteRowTypeElementWriteComplexTypeElementWriteEntityTypeElementWriteEntityTypeMappingElementWriteEntityContainerMappingElementWriteAssociationSetMappingElementWriteEntitySetMappingElementWriteFunctionImportMappingElementWriteOperationActionElementWriteFunctionElementWriteConditionElementWriteEntityContainerElementWriteFunctionParameterElementWriteAssociationSetElementWriteEntitySetElementWriteMappingFragmentElementWriteReferentialConstraintElementWriteMappingStartElementSummaryStartElementWriteEndPropertyElementWritePropertyElementWriteNavigationPropertyElementWriteScalarPropertyElementTemplate_FactoryMethodCommentTemplate_ContextCommonCtorCommentTemplate_ContextDefaultCtorCommentWriteErrorsCommentFactoryMethodSummaryCommentEmptyCtorSummaryCommentInvalidNamespaceNameArgumentInvalidEntityContainerNameArgumentInvalidStringArgumentCheckTargetEntityFrameworkVersionArgumentCreateFunctionArgumentCheckLanguageOptionArgumentSystem.Collections.Generic.IEnumerator.get_CurrentSystem.Collections.Generic.IEnumerator.get_CurrentSystem.Collections.Generic.IEnumerator.get_CurrentSystem.Collections.Generic.IEnumerator.get_Current<>2__currentRaiseTypeGeneratedEventRaisePropertyGeneratedEventCreateReferentialConstraintRequiresModelReferentialConstraintUnmappedFunctionImportGetReturnTypeFromFunctionImportStoreFunctionToFunctionImportShouldEmitFunctionImportLatest_irregularVerbList_uninflectiveWordList_knownConflictingPluralList_pronounList_uninflectiveSuffixListReplaceFirstTransformText_transformText_objectContextGenerateDictionaryForEntitySetNameAndViewDefaultTargetVersionTooLowTableDetailsRowRelationshipDetailsRow_currentRowViewGenerationTypeNamePrefixAnnotationPrefix_complexPropertyInitializedSuffixDoesWordContainSuffix_byteArrayEmitPropertyGetterBodyEmitPropertySetterBodyAreRelationshipColumnsTheTypesEntireKeyInvalidTypeForPrimaryKeyExcludedColumnWasAKeyColumnEntityIsReadOnlyGetCodeExpressionFromBinary_wordsEndingWithSeDictionaryStringBidirectionalDictionary_assimilatedClassicalInflectionDictionary_classicalInflectionDictionaryDuplicateEntryInUserDictionary_userDictionaryAsDictionary_wordsEndingWithSisDictionary_irregularPluralsDictionary_wordsEndingWithSusDictionary_oSuffixDictionary_wordsEndingWithInxAnxYnxDictionaryFixupViewEntitySetDefiningQueryProviderFactoryReturnedNullFactoryAddFilterEntryGetXmlMultiplicityVerifyGetterAndSetterAccessibilityCompatabilityVerifyEntityTypeAndSetAccessibilityCompatabilitySetTypeVisibilityGetEntityTypeAccessibilityGetGetterAccessibilityGetSetterAccessibilityGetFunctionImportAccessibilityGetEntitySetPropertyAccessibilityset_PropertyLineIsVBBeginClassMethodPropertyCreateModelPropertyCreateModelNavigationPropertyVerifyLanguageCaseSensitiveCompatibilityForPropertyCreateEntitySetAddObjectPropertyCreateEntitySetPropertyEmitPropertyW+ %3}*35 = 2QH? a6A aa>_`AIVA:xl:x@:x>PU@P@PGBP|APAP?P?P@+a?>+a?P>P)BP|B aF`A`jI'>I ]@xH jBxHlI\+aW}PBI gnIhI=*NHH(o*<_hI X^Y\ZI)Z)$^) BQY\ ZY\ gY\4,IWVIU)V:x*U))IhI-hIVIYhI'hI=(o*]\hI a '0ICWI= a3Ir_f/(o*V3f?_o:hI ORI#YhI *NI MIwwhI OI OI xYIXYhI WyIUI ufIhI SIaPhIWP cNI Ff;hI!yhI NI LI ,I ?.I]hI9hI eI _I oI |LI]hI9hI MI(I4o/hIsVIUL* hItL*9hI)I'I]TI)DWa:LWa1WaA_WhI T_Y\ hY\ jY\ RY\UP))I|S]2L*c->oY0W]>oJL*WPwtP[L* >_VIUL*\UIhI^)hZI(I[vOvOWvOr@vOZevOUHR+zDEIZI Z7X yZ* fY\)9I).1)i)^<)J)e]I(o*d3lXc'NHxNH mRI%JI3I7P wxH NI JSI?P#?P xHXI mpIHe VXf Rf o^L*QL*oR0Wt]0W pxHsI9L*HH_hI_hIKw(o`(o(o*VIVIVzDEUIVIZEwX*[vO n D nIK_hITNH[P\P&fL*-hI1L*u`BL*yL*}}xX/^}4}H'\Sͨ}XXc:\uդ}|l(ק(TŨTz@@XF0}}7 }N5}*})C}}/ 9 }J}} "=%} =]Dֲ}D}"E}&e%}&fò}&m }0mh}6{}A}B(}P5*RRk}k%}l0}lj0}x0~!!ӣ0!;0E5!0Y0En>P}P}P}ըP}P}#}### #}l|}|}}! }!%%L%(})! }* O90! }9 ʹ9<1}<! }#>|}}+G}}-IVz}.K! }/M=}1P}7X! }>`Ad1}Ed}Ws 9%9\s! }`~z}h@}jm}k! }qz}x! }yz}+z}! } }.! }!}Hm} ! }9! }y}|})ÊTS+S.+SSSSSʌSSS˘S2S`8SSSGSRSASSIS^S SuS+SSSпSfSjSSiSٺSSS枦SSߝS%S`SSS3SISiS)S&S&S 'S˚SSSꉦS SSRPS&SFS6S=SSƟSƺSSA#S#Si#S#SOSSp SjSjSjS~SSS%SSS4SWSS|S_SS2PS=SS(S(S4)SoSMS/S|gSkScSI`SqkS bSbSdS|.SbScbS:cScSV1߫1뚦DUVUBVV BVVBVV BVV(&BVVuBVV BVVuBVV%BVVZBVV)BVVq$BVVABVV%BVVBVVBVVrBVVA#BVV&BVV-BVV|BVVBVVBVVBVVIBVViBVV)BVV&BVV 'BVV#BVVBVVYBVVFBVV#BVV BVVRBVVi#BVV%BVV!BVVBVVBVVBVV\BVVBVVa BVVp BVEGV)GV2GVJGVEGV)GV2GVJGVGGV6GV*GV=GVQ뇦Q"QyQ?QQQpQ5Q-QQNQدLVFGV6*GVGVQGVGV)3GV"GVGGVJGVKGV2GVjxGV+GVxuGVQQ%Q|QBQ-QdQևQQQQIQ^QQ;QůQV6VV&HTHXV^[VWKU#0QD1ę.U1.U1.U1T.U1_.U1.UgUq\U\U!`V!eiV!JrV3{VVVC&i=U༫UUJ T(V6VPrVDUVVV;'VV#VDUV"VV!VV&VV{&VVVVVVVVVVVVVV#V$ ? 6V͑3U3U6VrV$INTV!VVVVV V!U6VVVVZVVVVVJ VuU6WWi=U༦U Ui=UWU iU iU(iU)U6W3WWDUVWV%WVWL!WV3!+W$5WlBWOW;ZWdWBVU nW0xWWW!WWp!KUDUVWV WV$WV`W!F!D*!7!};W6WWWnWWWZW`W"WVX0XZ X֞XX0iXۤX6XWWPWwWFW)X BV6%XrVrVrVdrVrVrVrVrVrV,rV rVrVrVrVBrVrV(rVrVrVrVrV rV"rVrVrVrVrV)*V6*Xn/Xt:XLGXGX2RX<]XVGXGX<RXP]XjGXGXFRXd]X}GXGXPRXw]XQiUQUQڈUQUQUQ)UQ{UQUQɈUQ>UQUQiUQUQڈUQUQUQ)UQ{UQUQUQɈUQ>UV6tXV)yX)X yXnXT:XYX XLXiXXmXrY4 Y6Y rV6YrVi=UYUJ Y(#Y)5Y?Y'OXOw![DY`cIYOY,t oVYX#]Y zXbY fY خz zY|P)Y\Y`oY|YYBYYƒƶY݃YY" Y%TY)Y-$ Z1ش$96d%Z64" #Z6h" ,Z7t9#Z; < <aw!<̈́ް6Z=^;Z=C9=N]@Z=FZ=MZ>!TZ?(" AR]ZAMfZB+C8YC@oZCLuZDܷ~ZFzZIzZKP&ZMl&ZPĸZSpZWعZXZ[r t ]Z^"Z`"Zb<ZdZeܽ>ZfXbYg"Zg[ [i"[jw"[l e"$[o`/[rԅ_6[t"@[v|OI[xvS[{XbY| Y[|b[~4E9XKei[ro[u[tu[~[)jD[[Æo[̆Yن^;ZA?N[zXbY[\" [w[d #[6b[b[L[~ÿ[][[][Y[`;[M[D \b[(" Qb[lE9K!\$\]!In&Ç̇ԇ݇R\L8"\;t %t ?ot ̊t $t $t 6t Hat Zt let ~t t t t ƈ[t ؈$t t |t ut >t 4t 4Jo(\XbYmu.\45\,4C\[M\`6X\`# b\i\r\y\y\\a,t (\‘\BYʼnO2\Ή[g\XbY\\d\<Z¿\Iq¿\V\<\c?\p\Q\4k\p~\P]Ċ ]Ԋ]]E$ƶY$]!{2]?]XbYYG]db[-yb[-yQ]8[]mhw! f] l] @1z_Tt_nпt_fz_jt_z_heٺz_z_z_t_*_Lߝz_b%_`z_t_t_3eIz_iz_)z_ &z_"&z_8 'z_N˚z_dz_zt_t_ _eRPz_&z_Fz_6e =t_( z_> Ɵz_T ƺz_j t_ A#_ #_ i#_ #t_+Oe7e p t_CjeOje[je ~z_, t_F t_` %z_v z_ _ 4t_  Wz_  t_  |t_ _z_$ z_g.Pe: =z_sO(e(e0)eP ot_j Mz_ /z_xgekeceE`eǐmkeӐbeߐbedex.ebe_be6ce'ce38ie?#`eKHJeWC=ec)eo+e sz_{te t_ KZz_ Ct_֠_O_n__$ J #!X_"e_#"s^_#w!% &(W$(_(( _* _, _01 _3 _5 _9 7_:0 K_;h _< _=> \>iY?|\? _@ z `@$ z `Bz -`E@z :`G<qM`J!j`Q!w`Tӑ!`W᱐`Y\FZZsMZ[`\]W`^3}F^;;^9^FT^^`^P \a aaa -"`b(I"`b0`bibb`b8A ^d@dHdQ`eY!`ea`eTf`e$`j XbYlqJ' alAalHXbYmiYm{antaq(ataxx9ax€?axЀc9y؀yFazQaz{g|0})g~Fag|g8 _a &ia ua!宂a #at#a#La$Xˉ&Ya\&a|'a'ߢa4(a,)a*/a\*DbT+b$,!$b0-=0b=7bx-ŭAb- Kb@.AXbؒ>bb.>zb$ҔbAt /ᒗbKҔt /FbDb&h b"b/XbY\΁ׁiY߁|\0"b0"b$1"b1ݵbX"b1dc2dc 3-c@cZ^c|cL3c3cL6$c6xc7z cT7mcH9c:ddd%d; +d-;\5d\;Ad;ЗHd;޳Nde<XbY<4Udfd =}d$ud d d )d=dJJ' a$>e>#e>7#e>3*eH?(5#ex?H1e?#e?#e ?2#e!Q;e" @(LBe#|@(LMe%@XbY'8A&'5a*=*Ec9*M*XFa+wVe+ie,Aie.D0,Eg1'e2E'e4,Fe74He:bHe;^<HF!e<Hܴe=pIIe?na;eAI˰eBJWeC2eF8NFeIN.fJQfLTR%fPR;3=fSgza$gb/.gcg:g79aC?a&?a5w!Mw!eDghd\iYȂ|\ۂ _dz Lgdz :`>ez bgpez -`ez rg`fz `fz ggz `$hr g܉ghg igxir gk_hkhl2hl3_%hxm1hm߃1hny1hPnǃ1hn45hzXbYǕ vh#ϕkht@th"h? 'han;{ d hp h[ hl h` hCXSh2hXhXi#iXbY m0i YDi`*9ҘTa$ h  *   t9 9 9 M9 9 ^  9  9  9 Si3%[ifaihioi I+XbY.%>uiFwuiNuiVui^uifduinuivui~uiBuiuipuiZb0E%Dipl<{i;ƙ>%W iLZfs@? K J$W08>TLLY' `3  0t=h Į  ! !<""9##@9$Úf9$֚9$9$09$W9$"9$59$Hr9$[9$n$%$ui&ui&ui&-ui&ui&]ui&Ǜui&ϛ)ui&כ=ui&ߛui&ui&ui&ui&Zb&0E%&i&l&<{i&;'>%'4W i(سh(<t(4)P) *d * +x +H 9, ,[-h-.x.// 0h0 1 1P&92X_&2tb93иx3w%94H%4P95u95Ɯ 95ٜ^95959595%95895d 5۹3%i5ji6KѠi7]pS!9vpi;+i=Ԧi>i@ܝ[iA֠iBiC(iD@iFX iGniI}+iL.+iLniLiMٺiNiOjiPiRŞjSOjUΞ/jVjX,j\BjaRejj<ktljlǸmܿsjndڷzjo jpƷjqDyirsjs 'vjwjy$jzlj{Pj|}j~Rw!mjLεjk8Ek\HOkOY8 Dt C\kek`.lk xk: ;k'9k3µk@֙kqskXbYkg'gkJkJkܸkw k0rkȹk0kll l]ll}glԡND+lw!Z1lϐ8l$t Cl`z LlLSlClz LlalClz LlClz Ll(~jl ~qlA8s99S λ^[nS jrKxlb;bjXbYvj{w! w! l l l l l~ZXbY{lVl ʁl ʢlآllLly90lllģ-l! # #XbY##v=}w!#Y$H(/XbY((;|[(f}[)XDl*cm+c)m,k|^-k^./v m/0m~`00m~`0XbY00|m01zA2s92Ԥ 2[n2Ԥ jrK2m2ܤ;b22zA3 s93 &[3[n3 jrK3C$m3;b3XbY33zm3|m4/m5(;!6m6EL%Am6T_%Hm7d%$Om8&Xm9,bm;6&mm;E%xm=ѥm>m@ mBS/E#mE#mGTmI&mM&mOhQ"Q* Q2mQT Q, RR:x9RWXbYRRc}mRkumSkmTsτmUsZmV{{mWmXY~^YZnZ4[;!"\Ϧen\Þ]F]&@h^L_mn_'XbYaa}ma@zmb{mc;|mdH{me3z%nfhZ}-nhhXbYiit}w!iZw!jPw!kŧw!l?w!mw!nw!o1"w!pLrw!qYՆw!rf~w!sw!tɂw!ulzw!v#w!wĨw!xߨw!y w!zyw!{0ͅw!|Aw!}\Uw!~mw!yw!\~w!\w!0w!݀w!~#өXbYߩ|6n=n/{FnfYnځYn (`nh{FnYnYn A`n{FnYn Yn [`n`Q|FnYn#5Yn `n0gnDDiThioib a$`hfu* t99 9M99Ϫ^ ު99  9+I0nnDDiThioi2 a$fhu* 6t99 9EM9T9 ^ 9cs9 9IeunznnznnɫznѫXbYݫ}[zn#m)#kk$$"n,nT{n$-nF98n2nlnncn`|nnXbYzw!ˬXbY׬W}w!ATs98 n[n8 jrKHn@;bH@~^$WvC7e77ZG7*Q_1im9OIIIE*C&E*C&YTE*|xC&YTA2 1x 1xuA2 1xu 1xuC&A2 1xC&A2 1x|xC&Y<Y<(\57Y<4ee_:-wU0^HR9_H^H^H5^H5Y<Y_,HdY^Hd^Hm4f94kB4kB4kHHHI8SIk8Sc8Sp]p8StHoP8Sk8SvDk8St_;H_ O OY<YC_\KsKsiiHH7n7n7nKs./]./]]_xHH6Y<]2;8CCCC;8;8;8($);8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;8;80tct;8]2 Z^]2/ Z^ Z^/ Z^Z7;8Z7Z7;8;87Z74;8Z77Z77t;87;8;8;8;87C_IyIIIIIwIIBwBCnHnw_E/Fo27Y<2o_Dy#9HHmxY<7TW7m.nYm_y#9:HH:H8U0jydjydjjjyjjjg6ww^j-Cj-y;I277yyCCCyCyCyF8J<HxR9;_I#9HH7_IHP6HdP6Hf`P6HhH_:HHHyHR9 9Y<Y<*pY<Y<(\4k77777]7]57]4k;;;YYYYYGYYt766<,7777Y<:7BY<7TW7TW8D'(D'D'(!)D'D'D'D'(!)D'(D'(D'(!))D'(!)D'(D'(!))D'D'(!)D'D'D'D'(!))))D'(!)D'D'(D'(D'D'(D'D'D'D'D'(D'(!))D'D'(!)D'D'(D'(D'D'D'D'D'D'D'D'D'(D'(D'(!)D'D'D'D'(D'D'D'D'(D'(!)D'(!)D'(!))D'(D'(D'D'(D'(D'D'D'(!)D'(D'D'(D'(D'D'D'D'(D'D'D'D'(D'D'(F6F6f//f/f/f//f/f/Cl.[D[DgGlnl.[D[DgGlnCCCCTC&*m&*m_eFFeFFe'ZhmeFFhh1i V*O V*O V1iee^F04:Cd0R9CDII1y171BoaIyK\\56Q56\f56CCK5^5^^^O\]O7:OOmOmOOmO<Oxcx1OlOmO,mO?:OHOYOOHOHOr:OjOO J X?<}cOX0cOXc005fc44 ,57 ,FE*7Bd^lFE*7TCQQuQuKQKQ1^uQQKiQ[ikQ[ikQikQKQk][i9Ev][nOk76tntjjw  [z-Em5QLh1ihK1ifKK1ih1ihK1iQUQh1iQUQhK1iK.KKKKK.KKKK ZK5K7E5ChhKhK5^7E7EK`SK/1i1iOY<OY<T;OO`uhO8mOOKfOt$<<xKfY6xKfxKfOY<wpcPOjO,,Kf1ijO42OOOOk[9~;OKf"~;1iOKf"~;1iOKfFu1i;fOKflFu"\O\Om/C/w5w5,w5TCeFFeKeFFeeFFKeFF&*mK&*m&*m_K&*m_eFz^eK ZKeFKYKeFXKz^eKeFz^eE*VFb_1ZD55CCXvCCCCCBXvCCCCP.XG"XGC)De)De.).7E7EKhhhhhI*3 dhHdSI#= dhHdr-p_dwr-p_7CShKSh1CXWt[l*CCCCCCCCCCCCWt[l*CCCCCCCCCCCCC~;DC67C67CF667767675]]A2 ]b_b_HVg65HV--576\A2A2 ]F6K67^'HIXXK^S=XK`^S=IXf[JXK ` ^=Y<&T];:;rQ5-[c-7Pw?<Y<YY2z7m WmY< X22/[J`]fm-mIY<I\wb_iCC4nC4nG`h[s[sh_Cslet78G5D1iuhIY<Y<<KY<Y<gr\\XK^^^ TKs^l^z<H^Jz<7n^z<Hz<y^z<H^z<H^z<H^z<H^CCJN\N\CN\C;\[tFF'j[[toD5'j[K'j['j[KZXi="l.;8;8gGlnl._I_IgGlns ._o_o_o_oU09U09-U0;-_U0R9-U0;_U0R9U0R97A2 1xDZXZXZXZXZXZX"i=i=DDKFuFu-uY<uY<Y<uY<uY<59mY<1iY<1iFE*7~;eeeeHG__tss++ZX*0CCC]2KDDDDD+s*"""""""""""""""""""""""""""""ttk___k___k___k___XShXXShX=e=e5GZXCmt -w_lm9-w_7n,((r(rc((""i=*!16;1==?=N N=NN1N5__=__1_5``=``1`5|&|=|"|1|5  )19AQYaiqy &,A2YaTis9 rFi#nirKZXyZb$rF,ZX4rF<ZXDrFLZXa&C;9uo2FEl  <l#!ifWW$A]Feaa^y1,ilo38 a4v |YqqS4qhq[iwnKFIGQx&;I;a=;]xI-9Yg1=dlZtrFd *T 0*6d*ts9iO|ZrF s9frAh<)cAsW$A$ Y T#blu#(9.@)(29F)O9W9fZrF9 xs94 x1;9t99&) /gd swY1I:;dZXrFW$*uGYf2M 93U1d7^q7Kd) 99vk9*6v9y & & KCP,v ..D D IFi9gB*G0J&g,E1V <^n6=!#bK1V)vGT cjgYkZrFs9Q$Q]1 : 1;! id9ie@ FI/jM1FSIh[ aId4I2I@AAL8lumL8RW$QjM*uG1f2! y 1L8d4@QhAZ rF s9%1^*uG yS{ YIhZrFs9!:h$W$1 W$#bK9 '8eD_s.!Z,rF4lu*4S4Z,s98 8<uDZXLrFu<W$<FF@<GF<3XF.D. !G04A u 2b& THC: BK 5t ty  j{` Y  1\  f2 \lu*\Z\Sd$ 9I d? dZ8Y vd) |jMAa / yy4y"kyvli ASAN11f2 1 y  ;9& 9si9d7 l #Ii |HC: QBK)sCK C {y6 -G eS aeS a)nf ieS ZrFs9W$*uGf2 d d Pl9ZrFs9W$@W$yM ZrFs9y y y t=SI I"kZt=S>uFB I IZt=S>uFB 9/hU  lu*ZSZ Zn r @s9. & /. k. P. }=9u969}=9u969 n1T - ZrF$>uF$B s9y  \\k \_*\HC \Z\\W$ 38 _ n,,@4ZX<rFdm=9q Dh2eH 0Q \Wf2DSLDT!!LYGY CT)!m!*n!o9)!2) ))/ 9^19Ka1Zb9vd&) Zb9 9BI1 );IDAIo!1H9,RQm[9WgQ;YtA*u\Qm!jYkW$ASAv54 B4 ZbK|S$ *$k:HYX>uFB ^*S8=C^NttW$2ukNn p^ Al&K FZXrF\WE$Qu>9Q t/@W$W$ki\Y $Fa Iq :Fna rX#Zn r >uFB s998k uyv >jM   IyyNaY&!4Y1 =!YGa1I-9aJS9759aJY_Y)_9aJA X)98l*9 6) Q-wQ`QpJQsaZXrF$Z,Z4rF4s9<ZDrFDs9L @wISXAEa^YxYr)YW)YHTY/TYEiYOttuiQETifT\it ^+ lAddd@dW$dl *\HC \_*l_*tt@=*r6zkkQkt*uG<@l* (eIm|ZXrF||@|A vnZXrF,@_*|W$|ZrF Ss9HC: ZSW$ t@W$W$Al&A3*4ZX rF@!QwTD! U-M! tv pS!AvY!aaKw!5e km CK!A9"L"i9=AxE" ;tt =P"Qm["Qo1b"GtD9Y =s"8J5v2z" 0 1u",gv3wa"1O f2jio0";!"TA|"u1;"\?,"\h,#d\%W E%A ! R%Hh%)5Vx%;n~%qq%q%yy%L.%TZXrFZXLW$%IOIH%Qm%LZrFs9QKFQpQqo [ & #msQ!s/&Q6s9QoQE 95& 95&Q7?9Qx?9Q8@9Q@<&Q>QAQZrFs9W$b&8#:&X T #T(QE&|ZrF ZXrFl7 ]C#'s9w+9sCK9a.0' Qo >uFB QEN' vQsE $ZX,rF0:'.% 0'/'4ts(tZ<rF<s9);9& lk DZR#LrFLs9k TZR#\rFS\s9ZdrFlv(Fl) ds9Ou9STKC/mm)|lu*t|tZtlu*|Z|HC #4)0)IBIB) Ct F)Z*i%K G *! 7Kd) dn*1 (2989JY* ]x9 *"*ZrFI9*s9$ ? dQs991,$l<* *ZZeHC HC ZHC I*YuW*ZXrF\lu*\S\Z m* *9a.+9y+ TC/+UtD5D+Au$A u\+Q +I @8K\-+|lddW$@\eZ8r s9 *:, ,,-*-[- -$-(<.,c.0.4.8,/<e/@/D0HH0L}0P0T0X 1\?1`v1d1h1lM2p2t2x 3|e333 4O44445U5556G6666E7778_8888U9999+:N::::;];; ;:<<<3= L=${=(=,=0>4Q>8><>@2?Dw?H?L@P`@T@X@\!A`fAdAhAl5BpzBtBxB|1C`CCCDHDDDDDEEEE,FgFFF&GIGtGGG7H$H(HTHhHlHpHtHxH|HHHHHHHHIII*IHHHH/I\I}IIIII0JJ4qJ8J<J@KD-KHZKLKPKx*I|HKK=LLHLL *I$H@*IDHHHLHPHMMNN*N3N@NKNvNNN N$O(mO,O0#P4P8P<@QQQQQ QQQQQ Q$Q(Q,Q0Q4Q8Q<Q@QDQHQLRPRT RXR\R`Rd!Rh&Rl+Rp0Rt5Rx:R|?RDRIRNRSRXR]RbRgRlRqRvR{RRRRRRRRRR SS =SZSPySTSXS\S` SdShSlSpTt!TxDT|OTdTTT*I HH*IH H$H(H,H0H4H8H<H@H *I H H` *Id Hh Hl H *I H H H H H H H H H *I H H H H H H H H H H H. H.p.p.#H.+p.3p.;H.Cp.Kp.Sp.[p.c q.k%q.sEq.{zq.zq.q.q.p.q.q.u.5uCvcvH#v >uC3H H3p3p{p {p# {pC {pc H H H H H H HC Hc H H H H H H H# Hd H kv H H HC Hc H H H H H3pH#HcHHH3paHH H(H!(H*H!*Ha-H ;H@;H`;H;HA3p`BHBHG+HH+H H+H@H+H`H+H I3p@I3p`I3pI3pI3pKuKuL HOHOHTHUHYH YH@YH`YH\H ]H@]H$_HfsHmsHHHH H@H`HHHH H`HHHHHH H`HHHHHH-v$HdHHHHHHHHHĨHz)8lRr)/5j~Eci'hnwd 'bt  C L 9 H N U ^ j s |   & 0 > ] l r  !;,n|{a'p$0UdvDc~ 9?|&4rFh+Jg /i@+ 3 e e!|!!!!!."U"j"":########I$e$k$$$$ %%K%Z%a%o%%%%%&H&s&&&&*':'V'r''''''''(+(=(Q(( ));)A)R)f)s))))))&*@*P*f*l******7++++++++Rtx      !./02<`c!e"g$m&r's)w,|0}1~2348:;=>?@NV_`ceipqrx| Wo<ooS2oF0ono$%o o oqg)o^.oC%oR]3oI9oF0oI?onDEoKoF0o^.oCNEoIPoIVoio;'ooR<\oS2o_gaoIqonoIwo}oIo-o}y%oaDo#Do4o4o6'%o&%o o3oH7oIoIoIo\i%o$}oD}o6$}o4,}o$}o!}o!}o!}oE}o}o+o.+o+oio3oo6oOoojojojo2PoS(o(o4)o|gokocoI`oqko bobodo|.obocbo:cocoY?[@[B]A]D_C_EaFaGcHcIeJeLgKgNiMi[k\m]o^q_s`uawbyc{d}efgopqsrutvwxyz{}|~78SU[]epvwxy}        $&N,9N.;N2=N4?N6AN8CN:E_E_;_O_?_A_Q_9`?`;`S`9`A`U`E|@ 9|B ;|H W|J ?|L A|N Y|P E=Ohpw~!Zc7 >08LU=E1 ; D X a m K _ z u~&p  ,DWcodQZf}CsW` ;OY%/@} "+4=^S]G \ !""" ###H#^#####$7$@$O$$%%&a&j&&&'''''''$((((((())0*F*\*r*|******K+w++++,@,),,c*,I,Jx,n<,H,L* ,X*,\X,gfOV"|!LMNO P QRSTUVWX%Y'Z'['\,],^,_,`,a.b1c1d1e1f1g1h1i3j3k3l6m6n9o:p;q;r;s;t;uBvBwDxDyEzK{c|c}xhsh.G'()7)-)q}}/W / , qq*,/,5,c,,,,aae g   ,Ce , f, OO  "a%" "9"C  ,#  f.$,f/B&',',K( C **i U+k U+k +o o +6 6+3System.Data.Entity.Design... !EdmCodeGenFixup- .tmpC.1EdmRelationshipAttribute1RelationshipMultiplicity-EdmEntityTypeAttributeeSystem.Runtime.Serialization.DataContractAttributeIsReference'System.Serializable_System.Runtime.Serialization.KnownTypeAttributeNamespaceName NameUEdmRelationshipNavigationPropertyAttributeKSystem.CodeDom.Compiler.GeneratedCode]System.Data.Entity.Design.EntityClassGenerator5EdmScalarPropertyAttribute#EntityKeyPropertyIsNullable7EdmComplexPropertyAttributekSystem.ComponentModel.DesignerSerializationVisibilityContentGSystem.Xml.Serialization.XmlElementISystem.Xml.Serialization.SoapElement/EdmComplexTypeAttributeaSystem.Runtime.Serialization.DataMemberAttribute?System.Data.Objects.DataClassesFullName;<param name="{0}">{1}</param> LeadingBlanksLongDescriptionsummary <{0}> </{0}>7^(?<LeadingBlanks>\s{1,})\S!OnContextCreated name=!connectionString!EntityConnectionconnectionObjectQueryCreateQuery[] AddToAddObjectExecuteFunctionParameterHasValue<KeyProperties>!</KeyProperties>public abstractpartial'Public MustOverridePartial Private End Suboverride sealedOverridesNotOverridablesetinternalSet FriendgetprivateGetPrivateprotectedProtected public Public static classstatic  {}// class @ ClassEnd Class!MustOverride SubFunctionSubPropertyEnd PropertyEnd SubEnd FunctionEnd GetEnd Set GetterAccessSetterAccessMethodAccessTypeAccessInternaleSystem.Data.Objects.DataClasses.EdmSchemaAttributeReference5InitializeRelatedReference'RelationshipManager Value7InitializeRelatedCollectionEntityReference!EntityCollection'GetRelatedReference)GetRelatedCollection valueGetValidValue-ReportPropertyChanging+ReportPropertyChangedSetValidValueCollectionKindOnChangingChangedD Create9VerifyComplexObjectIsNotNull'System.Data.ObjectsObjectResultObjectContext1IEntityWithRelationshipsid)System.Data.Objects.ASystem.Data.Objects.DataClasses.3System.Data.Metadata.Edm.3System.Data.EntityClient.qhttp://schemas.microsoft.com/ado/2006/04/codegeneration:__Initialize_PropertyInfo_piInitializedGEntityStoreGeneratorSchemaNotLoadedGEntityModelGeneratorSchemaNotLoaded;StonglyTypedAccessToNullValue'NoPrimaryKeyDefined1InvalidTypeForPrimaryKeySCannotCreateEntityWithNoPrimaryKeyDefinedOTableReferencedByAssociationWasNotFound?TableReferencedByTvfWasNotFound'UnsupportedDataType=UnsupportedDataTypeUnknownTypeCUnsupportedFunctionReturnDataTypeIUnsupportedFunctionParameterDataType9UnsupportedDataTypeForTargetUUnsupportedFunctionReturnDataTypeForTarget[UnsupportedFunctionParameterDataTypeForTarget3UnsupportedDbRelationship5ParameterDirectionNotValid+InvalidStringArgument?Serialization_UnknownGlobalItem#ReservedNamespace5ColumnFacetValueOutOfRange7AssociationMissingKeyColumnESingleStoreEntityContainerExpected=InvalidNonStoreEntityContainerUExcludedColumnWasAKeyColumnEntityIsInvalidWExcludedColumnWasAKeyColumnEntityIsReadOnlyCModelGeneration_UnGeneratableType9DuplicateEntityContainerNameEProviderFactoryReturnedNullFactory)ProviderSchemaErrors9InvalidNamespaceNameArgumentEInvalidEntityContainerNameArgumentCEntityClient_InvalidStoreProviderSDbProviderServicesInformationLocationPath9UnsupportedForeignKeyPatternYUnsupportedQueryViewInEntityContainerMapping!SharedForeignKey-UnmappedFunctionImport=CannotChangePropertyReturnTypeICannotChangePropertyReturnTypeToNull?CodeGenSourceFilePathIsNotAFile?InvalidAttributeSuppliedForType9InvalidMemberSuppliedForType?InvalidInterfaceSuppliedForTypeGInvalidAttributeSuppliedForPropertyMInvalidGetStatementSuppliedForPropertyMInvalidSetStatementSuppliedForProperty?PropertyExistsWithDifferentCaseAEntitySetExistsWithDifferentCase7ItemExistsWithDifferentCase)NullAdditionalSchema%DuplicateClassNameqTargetEntityFrameworkVersionToNewForEntityClassGenerator9MissingPropertyDocumentation?MissingComplexTypeDocumentation)MissingDocumentation5MissingDocumentationNoName#NamespaceComments7FactoryMethodSummaryComment5FactoryParamCommentGeneral%CtorSummaryComment/EmptyCtorSummaryCommentOGeneratedNavigationPropertyNameConflictMGeneratedPropertyAccessibilityConflictKEntityTypeAndSetAccessibilityConflictEGeneratedFactoryMethodNameConflictOMetadataItemErrorsFoundDuringGenerationSUnableToGenerateForeignKeyPropertiesForV1WUnableToGenerateFunctionImportParameterNameTypeComments/GetViewAtMethodComments'ConstructorComments-IndividualViewCommentsETargetVersionSchemaVersionMismatch=DuplicateEntryInUserDictionarySUnsupportedLocaleForPluralizationServices=Template_DuplicateTopLevelTypeQTemplate_ConflictingGeneratedNavPropNameETemplate_FactoryMethodNameConflictITemplate_CaseInsensitiveTypeConflictSTemplate_CaseInsensitiveEntitySetConflictMTemplate_CaseInsensitiveMemberConflictATemplate_GenCommentAddToMethodCsATemplate_GenCommentAddToMethodVb?Template_CommentNoDocumentationETemplate_CommentFactoryMethodParamETemplate_GeneratedCodeCommentLine1ETemplate_GeneratedCodeCommentLine2ETemplate_GeneratedCodeCommentLine3ETemplate_ContextDefaultCtorCommentCTemplate_ContextCommonCtorComment;Template_FactoryMethodComment9Template_RegionRelationships/Template_RegionContextsETemplate_RegionObjectSetProperties7Template_RegionAddToMethods=Template_RegionFunctionImports/Template_RegionEntitiesGTemplate_RegionNavigationProperties7Template_RegionComplexTypes9Template_RegionFactoryMethodETemplate_RegionPrimitiveProperties?Template_RegionSimplePropertiesATemplate_RegionComplexProperties1Template_RegionEnumTypes7Template_RegionConstructors;Template_RegionPartialMethodsGTemplate_ReplaceVsItemTemplateTokenCTemplate_CurrentlyRunningTemplate5Template_UnsupportedSchema#EdmSchemaNotValid+EdmSchemaFileNotFound3EntityCodeGenTargetTooLow5DefaultTargetVersionTooLow[EntityClient_DoesNotImplementIServiceProviderSEntityClient_ReturnedNullOnProviderMethodedmNamespaceobjectNamespacelanguageOptionsourceEdmSchema target)additionalEdmSchemas'additionalEdmSchema/sourceEdmSchemaFilePath9additionalEdmSchemaFilePathstargetPath .csdl'sourceEdmSchemaPath edmxedm ssdlmapq/edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/edm:Schemam/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schemac/edmx:Edmx/edmx:Runtime/edmx:Mappings/map:Mapping/edmx:Edmx/edmx:Designer/edmx:Connection/edmx:DesignerInfoPropertySet/edmx:DesignerProperty5MetadataArtifactProcessing[http://schemas.microsoft.com/ado/2007/06/edmxYhttp://schemas.microsoft.com/ado/2006/04/edmiurn:schemas-microsoft-com:windows:storage:mapping:CSchttp://schemas.microsoft.com/ado/2006/04/edm/ssdl[http://schemas.microsoft.com/ado/2008/10/edmxYhttp://schemas.microsoft.com/ado/2008/09/edmghttp://schemas.microsoft.com/ado/2008/09/mapping/cschttp://schemas.microsoft.com/ado/2009/02/edm/ssdl[http://schemas.microsoft.com/ado/2009/11/edmxYhttp://schemas.microsoft.com/ado/2009/11/edmghttp://schemas.microsoft.com/ado/2009/11/mapping/cschttp://schemas.microsoft.com/ado/2009/11/edm/ssdl .edmxnamespaceName1modelEntityContainerName'storeItemCollection)storeEntityContainer9targetEntityFrameworkVersionoutputFileName writerhttp://schemas.microsoft.com/ado/2009/02/edm/annotation:LazyLoadingEnabledannotationohttp://schemas.microsoft.com/ado/2009/02/edm/annotationReturnType_ResultApplication Target ModelContext+StoreGeneratedPatternhttp://schemas.microsoft.com/ado/2009/02/edm/annotation:StoreGeneratedPattern types?Edm_EntityMappingGeneratedViewscSystem.Data.Mapping.EntityViewGenerationAttribute-ViewsForBaseEntitySetsOSystem.Data.Mapping.EntityViewContainer-EdmEntityContainerName1StoreEntityContainerName-HashOverMappingClosure-HashOverAllExtentViewsViewCountGetViewAt<Summary></Summary>#mappingCollectionoutputPathoutputWriter indexGetViewToStringviewString AppendedmCollectionstoreCollectionreaders-entityFrameworkVersiondataSpace Edmx+providerInvariantNamefiltersContainer storehttp://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator Type Tables Views nullNullablePrecision ScaleMaxLength Schema{0}({1})_TemplateCodeGenerators.CSharpCodeGenTemplate.csYTemplateCodeGenerators.CSharpCodeGenTemplategTemplateCodeGenerators.CSharpCodeGenTemplateV5.0.cs_TemplateCodeGenerators.CSharpCodeGenTemplateV50WTemplateCodeGenerators.VBCodeGenTemplate.vbQTemplateCodeGenerators.VBCodeGenTemplate_TemplateCodeGenerators.VBCodeGenTemplateV5.0.vbWTemplateCodeGenerators.VBCodeGenTemplateV501/d:PREPROCESSED_TEMPLATE fishois sheep deerpos itisism bisonflounder pliers breamgallowsproceedingsbreechesgraffiti rabiesbritchesheadquarters salmon carp herpesscissorschassishigh-jinkssea-bassclippershomework seriescodinnings shearscontretempsjackanapesspecies corpsmackerel swine debrismeasles troutdiabetes mews tuna djinn mumpswhiting eland newswildebeestelkpincers police hairice chaos milk cotton[pneumonoultramicroscopicsilicovolcanoconiosisinformationaircraftscabiestraffic corn millet ricehay hemptobaccocabbage okrabroccoliasparaguslettuce beef porkvenison mutton cattleoffspringmolassesshamblesshinglesamareiswas werehas haveIweyouheshe theyitmeushimher them myselfourselvesyourselfhimselfherself itselfoneselfoneselvesmyour yourhis theirits mine yours hers theirs this that these thoseallanotheranyanybody anyoneanything both each other eithereveryoneeverybodyeverything most muchnothing nobody noneone others somesomebodysomeonesomething whatwhatever whichwhicheverwhowhoever whomwhomever whosebrotherbrothers childchildrencow cowsephemerisephemerides genie genies money moneysmongoosemongooses mythos mythoioctopusoctopusesox oxensoliloquysoliloquies trilbytrilbys crisis crisessynopsissynopses rose rosesgas gasesbus buses axis axes memo memos casinocasinos silo silos stereostereos studiostudios lens lenses aliasaliasespie pies corpuscorpora viscusviscerahippopotamushippopotami trace traces person people chilichiliesanalysisanalyses basis basesneurosisneuroses oasis oasessynthesissyntheses thesis theses changechangeslie liescaloriecaloriesfreebiefreebies case cases house houses valve valves clothclothestie ties movie movies bonusbonusesspecimenspecimens alumnaalumnae alga algaevertebravertebrae codexcodices murexmurices silexsilicesaphelionapheliahyperbatonhyperbataperihelionperiheliaasyndetonasyndetanoumenonnoumenaphenomenonphenomenacriterioncriteriaorganon organaprolegomenonprolegomenaagendum agenda datum dataextremumextremabacteriumbacteriadesideratumdesideratastratum stratacandelabrumcandelabraerratum errata ovumova forum foraaddendumaddendastadium stadiaautomatonautomatapolyhedronpolyhedra albinoalbinosgeneralissimogeneralissimosmanifestomanifestosarchipelagoarchipelagos ghettoghettos medicomedicosarmadilloarmadillos guano guanos octavooctavoscommandocommandosinfernoinfernos photo photos ditto dittos jumbo jumbospro pros dynamodynamos lingo lingos quartoquartos embryoembryoslumbagolumbagos rhino rhinos fiascofiascosmagnetomagnetos stylo stylos stamenstaminaforamenforamina lumen luminaanathemaanathemata enemaenemata oedemaoedemata bema bemata enigmaenigmatasarcomasarcomatacarcinomacarcinomata gummagummata schemaschematacharismacharismata lemmalemmata soma somatadiplomadiplomatalymphomalymphomata stigmastigmata dogmadogmata magmamagmata stomastomata dramadramatamelismamelismata traumatraumata edemaedemata miasmamiasmataabscissaabscissaeformulaformulae medusamedusae amoebaamoebae hydra hydrae nebulanebulaeantennaantennaehyperbolahyperbolae nova novae auroraaurorae lacunalacunaeparabolaparabolae apex apices latexlatices vertexvertices cortexcorticespontifexpontifices vortexvorticesindicessimplexsimplices iris iridesclitorisclitorides alto alticontraltocontraltisopranosoprani basso bassicrescendocrescendi tempo tempi canto canti solo soliaquariumaquariainterregnuminterregnaquantum quantacompendiumcompendialustrum lustrarostrum rostraconsortiumconsortiamaximum maximaspectrumspectracranium crania medium mediaspeculumspeculacurriculumcurriculamemorandummemoranda dictum dictamilleniummilleniatrapeziumtrapeziaemporiumemporiaminimum minimaultimatumultimataenconiumenconiamomentummomenta vacuum vacuagymnasiumgymnasiaoptimum optima velum velahonorariumhonoraria phylum phyla focus foci nimbus nimbisuccubussuccubi fungus funginucleolusnucleoli torus tori genius genii radius radiiumbilicusumbiliciincubus incubi stylus styli uterus uteristimulusstimuliapparatusimpetusprospectus cantus nexus sinus coitus plexus status hiatus afreetafreeti afrit afriti efreetefreeti cherubcherubimgoy goyim seraphseraphimalumnus alumnienterpriseenterprisespurchasepurchasessurprisesurprisesreleasereleasesdiseasediseasespromisepromises refuserefuses whoses phase phases noise noises nurse nursesfranchisefranchisessupervisesupervisesfarmhousefarmhousessuitcasesuitcasesrecourserecoursesimpulseimpulseslicenselicensesdiocesedioceses exciseexcises demisedemises blouseblouses bruisebruises misusemisuses curse curses prose proses purse purses goose gooses tease teases poise poises vase vases fuse fuses muse musesslaughterhouseslaughterhousesclearinghouseclearinghousesendonucleaseendonucleasessteeplechasesteeplechasesmetamorphosemetamorphosesintercourseintercoursescommonsensecommonsensesintersperseinterspersesmerchandisemerchandisesphosphatasephosphatasessummerhousesummerhouseswatercoursewatercoursescatchphrasecatchphrasescompromisecompromisesgreenhousegreenhouseslighthouselighthousesparaphraseparaphrasesmayonnaisemayonnaisesracecourseracecoursesapocalypseapocalypsescourthousecourthousespowerhousepowerhousesstorehousestorehousesglasshouseglasshouseshypotenusehypotenusesperoxidaseperoxidasespillowcasepillowcasesroundhouseroundhousesstreetwisestreetwisesexpertiseexpertisesdiscoursediscourseswarehousewarehousesstaircasestaircasesworkhouseworkhousesbriefcasebriefcasesclubhouseclubhousesclockwiseclockwisesconcourseconcoursesplayhouseplayhousesturquoiseturquoisesboathouseboathousescellulosecellulosesepitomiseepitomisesgatehousegatehousesgrandiosegrandiosesmenopausemenopausespenthousepenthousesracehorseracehorsestransposetransposesalmshousealmshousescustomisecustomisesfootloosefootloosesgalvanisegalvanisesprincesseprincessesuniverseuniversesworkhorseworkhorsesatherosclerosisatheroscleroseselectrophoresiselectrophoresespsychoanalysispsychoanalysesphotosynthesisphotosynthesesamniocentesisamniocentesesmetamorphosistoxoplasmosistoxoplasmosesendometriosisendometriosestuberculosistuberculosespathogenesispathogenesesosteoporosisosteoporosesparenthesisparenthesesanastomosisanastomosesperistalsisperistalseshypothesishypothesesantithesisantithesesapotheosisapotheosesthrombosisthrombosesdiagnosisdiagnosesparalysisparalysesprognosisprognosescirrhosiscirrhosessclerosissclerosespsychosispsychosesapoptosisapoptosessymbiosissymbiosesconsensusconsensuses censuscensuses sphinxsphinxes larynxlarynges lynx lynxespharynxpharynxesphalanxphalanxesen wordman louse mouse tooth foot zooncissisxis trixeauieuchshssalfelfolfeafarf nife life wifeayeyiyoyuyyiesaoeoiooouoosesxmen lice mice teeth geese feetzoa ches shes sses trices eaux ieux alves elves olves eaves arves nives lives wivesayseysiysoysuysaoseosiosoosuoscessesxesoes[^a-zA-Z\s]esesingular plural deafvescultureAND() NOT ( WHERECatalogNameSchemaName% OR AND  LIKE @pvm SELECT v.CatalogName , v.SchemaName , v.Name , v.ColumnName , v.Ordinal , v.IsNullable , v.TypeName , v.MaxLength , v.Precision , v.DateTimePrecision , v.Scale , v.IsIdentity , v.IsStoreGenerated , CASE WHEN pk.IsPrimaryKey IS NULL THEN false ELSE pk.IsPrimaryKey END as IsPrimaryKey FROM ( SELECT v.CatalogName , v.SchemaName , v.Name , c.Id as ColumnId , c.Name as ColumnName , c.Ordinal , c.IsNullable , c.ColumnType.TypeName as TypeName , c.ColumnType.MaxLength as MaxLength , c.ColumnType.Precision as Precision , c.ColumnType.DateTimePrecision as DateTimePrecision , c.ColumnType.Scale as Scale , c.IsIdentity , c.IsStoreGenerated FROM SchemaInformation.Views as v cross apply v.Columns as c ) as v LEFT OUTER JOIN ( SELECT true as IsPrimaryKey , pkc.Id FROM OfType(SchemaInformation.ViewConstraints, Store.PrimaryKeyConstraint) as pk CROSS APPLY pk.Columns as pkc) as pk ON v.ColumnId = pk.Id to SELECT t.CatalogName , t.SchemaName , t.Name , t.ColumnName , t.Ordinal , t.IsNullable , t.TypeName , t.MaxLength , t.Precision , t.DateTimePrecision , t.Scale , t.IsIdentity , t.IsStoreGenerated , CASE WHEN pk.IsPrimaryKey IS NULL THEN false ELSE pk.IsPrimaryKey END as IsPrimaryKey FROM ( SELECT t.CatalogName , t.SchemaName , t.Name , c.Id as ColumnId , c.Name as ColumnName , c.Ordinal , c.IsNullable , c.ColumnType.TypeName as TypeName , c.ColumnType.MaxLength as MaxLength , c.ColumnType.Precision as Precision , c.ColumnType.DateTimePrecision as DateTimePrecision , c.ColumnType.Scale as Scale , c.IsIdentity , c.IsStoreGenerated FROM SchemaInformation.Tables as t cross apply t.Columns as c ) as t LEFT OUTER JOIN ( SELECT true as IsPrimaryKey , pkc.Id FROM OfType(SchemaInformation.TableConstraints, Store.PrimaryKeyConstraint) as pk CROSS APPLY pk.Columns as pkc) as pk ON t.ColumnId = pk.Id tvfE SELECT tvf.CatalogName , tvf.SchemaName , tvf.Name , tvf.ColumnName , tvf.Ordinal , tvf.IsNullable , tvf.TypeName , tvf.MaxLength , tvf.Precision , tvf.DateTimePrecision , tvf.Scale , false as IsIdentity , false as IsStoreGenerated , false as IsPrimaryKey FROM ( SELECT t.CatalogName , t.SchemaName , t.Name , c.Id as ColumnId , c.Name as ColumnName , c.Ordinal , c.IsNullable , c.ColumnType.TypeName as TypeName , c.ColumnType.MaxLength as MaxLength , c.ColumnType.Precision as Precision , c.ColumnType.DateTimePrecision as DateTimePrecision , c.ColumnType.Scale as Scale FROM OfType(SchemaInformation.Functions, Store.TableValuedFunction) as t cross apply t.Columns as c ) as tvf r.FromTabler.ToTable= SELECT r.ToTable.CatalogName as ToTableCatalog , r.ToTable.SchemaName as ToTableSchema , r.ToTable.Name as ToTableName , r.ToColumnName , r.FromTable.CatalogName as FromTableCatalog , r.FromTable.SchemaName as FromTableSchema , r.FromTable.Name as FromTableName , r.FromColumnName , r.Ordinal , r.RelationshipName , r.RelationshipId , r.IsCascadeDelete FROM ( SELECT fks.ToColumn.Parent as ToTable , fks.ToColumn.Name as ToColumnName , c.Parent as FromTable , fks.FromColumn.Name as FromColumnName , fks.Ordinal as Ordinal , c.Name as RelationshipName , c.Id as RelationshipId , c.DeleteRule = 'CASCADE' as IsCascadeDelete FROM OfType(SchemaInformation.TableConstraints, Store.ForeignKeyConstraint) as c, ( SELECT Ref(fk.Constraint) as cRef , fk.ToColumn , fk.FromColumn , fk.Ordinal FROM c.ForeignKeys as fk) as fks WHERE fks.cRef = Ref(c)) as r INOUT INOUTsp ORDER BY sp.SchemaName , sp.Name , sp.Ordinal 'RelationshipDetailsPkCatalogPkSchemaPkTablePkColumnFkCatalogFkSchemaFkTableFkColumnOrdinal!RelationshipNameRelationshipIdIsCascadeDeleteTableDetailsTableNameColumnNameDataTypeMaximumLength#DateTimePrecisionIsIdentity#IsServerGeneratedIsPrimaryKeyEdm <!---->FunctionImportCollection(AggregateBuiltInNiladicFunctionIsComposable-ParameterTypeSemantics#StoreFunctionNameCommandTextCollectionType ModeComplexTypeBaseTypeAssociationRowType+ReferentialConstraintPrincipalDependent RolePropertyRefEndMultiplicityOnDelete Action*1 0..1EntityTypeAbstract trueKey%NavigationPropertyRelationshipFromRole ToRoleMaxDefaultValue'ClientAutoGeneratedConcurrencyModeCollation=GetAssociatedFacetDescriptionsNamespace Alias Self+UseStrongSpatialTypes falseProvider+ProviderManifestToken xmlnsEntityContainer%LazyLoadingEnabledAssociationSetEntitySetDefiningQuery TableCollection({0})factoryGetService, {0}& &amp;< &lt;> &gt;' &apos;" &quot;lookupsstoreContainermodelContainer-EntityContainerMapping-StorageEntityContainer%CdmEntityContainer+FunctionImportMappingFunctionName%FunctionImportNameResultMapping%ComplexTypeMappingTypeName+AssociationSetMappingStoreEntitySetCondition IsNullEndProperty!EntitySetMapping#EntityTypeMappingMappingFragmentScalarPropertyMapping SpaceC-S~//aNo Conceptual Schema node to embed as a resource[No Storage Schema node to embed as a resourceMNo Mapping node to embed as a resource .ssdl .mslcsTransformTextSourceCsdlPath%ReferenceCsdlPaths Errors/EdmToObjectNamespaceMap eeth eeseeetoaan ouse ooth ooseootoonffe; SELECT sp.SchemaName , sp.Name , sp.ReturnTypeName , sp.IsAggregate , sp.IsComposable , sp.IsBuiltIn , sp.IsNiladic , sp.ParameterName , sp.ParameterType , sp.Mode FROM ( (SELECT r.CatalogName as CatalogName , r.SchemaName as SchemaName , r.Name as Name , r.ReturnType.TypeName as ReturnTypeName , r.IsAggregate as IsAggregate , true as IsComposable , r.IsBuiltIn as IsBuiltIn , r.IsNiladic as IsNiladic , p.Name as ParameterName , p.ParameterType.TypeName as ParameterType , p.Mode as Mode , p.Ordinal as Ordinal FROM OfType(SchemaInformation.Functions, Store.ScalarFunction) as r OUTER APPLY r.Parameters as p) UNION ALL (SELECT r.CatalogName as CatalogName , r.SchemaName as SchemaName , r.Name as Name , CAST(NULL as string) as ReturnTypeName , false as IsAggregate , false as IsComposable , false as IsBuiltIn , false as IsNiladic , p.Name as ParameterName , p.ParameterType.TypeName as ParameterType , p.Mode as Mode , p.Ordinal as Ordinal FROM SchemaInformation.Procedures as r OUTER APPLY r.Parameters as p)) as sp 3 Function IsTvf(f Store.Function) as (f is of (Store.TableValuedFunction)) SELECT sp.CatalogName , sp.SchemaName , sp.Name , sp.ReturnTypeName , sp.IsAggregate , sp.IsComposable , sp.IsBuiltIn , sp.IsNiladic , sp.IsTvf , sp.ParameterName , sp.ParameterType , sp.Mode FROM ( (SELECT r.CatalogName as CatalogName , r.SchemaName as SchemaName , r.Name as Name , TREAT(r as Store.ScalarFunction).ReturnType.TypeName as ReturnTypeName , TREAT(r as Store.ScalarFunction).IsAggregate as IsAggregate , true as IsComposable , r.IsBuiltIn as IsBuiltIn , r.IsNiladic as IsNiladic , IsTvf(r) as IsTvf , p.Name as ParameterName , p.ParameterType.TypeName as ParameterType , p.Mode as Mode , p.Ordinal as Ordinal FROM SchemaInformation.Functions as r OUTER APPLY r.Parameters as p) UNION ALL (SELECT r.CatalogName as CatalogName , r.SchemaName as SchemaName , r.Name as Name , CAST(NULL as string) as ReturnTypeName , false as IsAggregate , false as IsComposable , false as IsBuiltIn , false as IsNiladic , false as IsTvf , p.Name as ParameterName , p.ParameterType.TypeName as ParameterType , p.Mode as Mode , p.Ordinal as Ordinal FROM SchemaInformation.Procedures as r OUTER APPLY r.Parameters as p)) as sp ~`B&U     %   e m  9   9 54999y            -          0        ) 0 0    4         %)%)         MM MM  - Y ] %   %U]]9%]9]]q]  ]5 9  ]]q U U  E U U U      Y    e a    q%  UuUAa%Im  y % } } e  a      U  %  %% m%]qq %  U% U UU U  UU3 %UUU  AUUU %U U %H 0 Ia a@ ) 4444 4   44D H44HH 4944494D49444 HH   )    ' ] 9XI     I IPLPL PL m i;%mUUq Uq  %Um %mq  U q!U! X%) ))- U       15 55qe e  %aIP P%=AP%EUU %U % I% M%IM%M%%IM%% M%   M% %%> QMUUUUYM  UQM Y Y M aa a aa  -MMM M   ttt  txxx x u 'yy9uuy u uyu9u: yy}9y yq4 yuuu y yu uyu 'u- u    & `u5551u            `        d99EEE   E 9 9 - % %       EE EE EE MM0 9l%9      % %AQQ    %*   H     E   / E  % %     EYM  E M M  E  M MM$ EMYiMM iii MY  MY  MM ii  % i Y  M I IY   p   t ,9 9   q     B9Q]a  5 5 MYM Y M+ AYM  U 9=   Ua    u u        I  @!%)-9EE%)% ! - %-9 EE%)!59 ! 5!?uuu5-5 u  u  0 e}9iMH%%A%U %U9EE9EBYMYME99 E E9  i   IM!Mq!9E H9qq   G9)))Q))))9 m m m)% m) ) m )m QQm%)5U UU!5Yuuu u']Maaee ]aMa i ma MaqMa u]a 5a % y}   #9uuu  u u.  = q q q|  u  uy  yu } q q                     91   9EEE     E E                 9 3 99 9    -%%  ii q  % )m))m9mm)m9m)a aQMM 9 9  9) % =51 9 9uu P      Y!      ' u9      08 P %% |     0   99 )Q aQ!% Q!%  q q E E E E E   -yyz\V4?_ :FEntityStoreGeneratorSchemaNotLoadedFEntityModelGeneratorSchemaNotLoaded:StonglyTypedAccessToNullValue&NoPrimaryKeyDefined0InvalidTypeForPrimaryKeyRCannotCreateEntityWithNoPrimaryKeyDefinedNTableReferencedByAssociationWasNotFound>TableReferencedByTvfWasNotFound&UnsupportedDataTypeSerialization_UnknownGlobalItem"ReservedNamespace4ColumnFacetValueOutOfRange6AssociationMissingKeyColumnDSingleStoreEntityContainerExpectedCodeGenSourceFilePathIsNotAFile>InvalidAttributeSuppliedForType8InvalidMemberSuppliedForType>InvalidInterfaceSuppliedForTypeFInvalidAttributeSuppliedForPropertyLInvalidGetStatementSuppliedForPropertyLInvalidSetStatementSuppliedForProperty>PropertyExistsWithDifferentCase@EntitySetExistsWithDifferentCase6ItemExistsWithDifferentCase(NullAdditionalSchema$DuplicateClassNamepTargetEntityFrameworkVersionToNewForEntityClassGenerator8MissingPropertyDocumentation>MissingComplexTypeDocumentation(MissingDocumentation4MissingDocumentationNoName"NamespaceComments6FactoryMethodSummaryComment4FactoryParamCommentGeneral$CtorSummaryComment.EmptyCtorSummaryCommentNGeneratedNavigationPropertyNameConflictLGeneratedPropertyAccessibilityConflictJEntityTypeAndSetAccessibilityConflictDGeneratedFactoryMethodNameConflictNMetadataItemErrorsFoundDuringGenerationRUnableToGenerateForeignKeyPropertiesForV1VUnableToGenerateFunctionImportParameterNameTypeComments.GetViewAtMethodComments&ConstructorComments,IndividualViewCommentsDTargetVersionSchemaVersionMismatchTemplate_CommentNoDocumentationDTemplate_CommentFactoryMethodParamDTemplate_GeneratedCodeCommentLine1DTemplate_GeneratedCodeCommentLine2DTemplate_GeneratedCodeCommentLine3DTemplate_ContextDefaultCtorCommentBTemplate_ContextCommonCtorComment:Template_FactoryMethodComment8Template_RegionRelationships.Template_RegionContextsDTemplate_RegionObjectSetProperties6Template_RegionAddToMethodsTemplate_RegionSimpleProperties@Template_RegionComplexProperties0Template_RegionEnumTypes6Template_RegionConstructors:Template_RegionPartialMethodsFTemplate_ReplaceVsItemTemplateTokenBTemplate_CurrentlyRunningTemplate4Template_UnsupportedSchema"EdmSchemaNotValid*EdmSchemaFileNotFound2EntityCodeGenTargetTooLow4DefaultTargetVersionTooLowZEntityClient_DoesNotImplementIServiceProviderREntityClient_ReturnedNullOnProviderMethodContext class    InternalProtected PublicPrivate Value,InlineObjectCollection DetachFromParent0IEntityWithRelationshipsObjectContextEntitySetObjectResultTSystem.Data.Metadata.Edm.MetadataWorkspace&System.Data.Objects>System.Data.Objects.DataClasses0System.Data.Metadata.Edm0System.Data.EntityClientSetValidValue,ReportPropertyChanging*ReportPropertyChangedGetValidValue8VerifyComplexObjectIsNotNullEdmxZhttp://schemas.microsoft.com/ado/2007/06/edmxZhttp://schemas.microsoft.com/ado/2008/10/edmxZhttp://schemas.microsoft.com/ado/2009/11/edmx ModelApplicationhttp://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGeneratornhttp://schemas.microsoft.com/ado/2009/02/edm/annotationType SchemaName Tables Views*StoreGeneratedPattern$LazyLoadingEnabledannotationContainerXTemplateCodeGenerators.CSharpCodeGenTemplatePTemplateCodeGenerators.VBCodeGenTemplate^TemplateCodeGenerators.CSharpCodeGenTemplateV50VTemplateCodeGenerators.VBCodeGenTemplateV50^TemplateCodeGenerators.CSharpCodeGenTemplate.csfTemplateCodeGenerators.CSharpCodeGenTemplateV5.0.csVTemplateCodeGenerators.VBCodeGenTemplate.vb^TemplateCodeGenerators.VBCodeGenTemplateV5.0.vbpqrstuvwxyz{|}~PkCatalogPkSchemaPkTablePkColumnFkCatalogFkSchemaFkTableFkColumnOrdinal RelationshipNameRelationshipIdIsCascadeDeleteCatalogNameSchemaNameTableNameColumnNameIsNullableDataTypeMaximumLengthPrecision"DateTimePrecision ScaleIsIdentity"IsServerGeneratedIsPrimaryKey, 8| `]uU<@4y PLL% I%IM%IM%%Mptx  ]  e` 1  <DHT\  E h    x  E   i         E m m)qa q   E EEE     EE MM    y  |        `         % % 8  )   E QM UY ` 0a a \a Xa Xa e im] e Pm] $a ]] m y}y} } } }} }  a  U U%U       m   U    <  < <    D  4HH  4 y yy y     X  mi )  %ii i  m% a%`  m] m  8 0U %%  U U U m% %% y  a] a ae    a%% % %% % % %M %% %% %M% %%MU]eiiL - )  q        t x p u uu   yy       y%  ] %  e          d  d d d d d d d d % d d d EdE MYdEE dEE  dE dMM  MdMMY MdMY             a  A A auuuuuu    u  1 15)!5   E     %   MY EMME2 EMq q'  q  5 5 M   u uu  u  u  u q        1  E 10 EEE1  1 1 A     E    99q 9  = = M" M    E  i  Y   % )m ) m  % %  M   y  = = =  u               y     9   X  X ` ` ` %`% ` %`%     9 9     i         q     E  m )m    q q   EE E E        Y Y      9(((`(((8(()(E(U((((<(4(y((%((((((q(((p ( (] ( (e((((( ( ((((!(1((((( (((}( (((( (($TSkipVerificationInFullTrust"System.Data.Entity.Design.dllMicrosoft CorporationMicrosoft® .NET Framework4/© Microsoft Corporation. All rights reserved. 4.8.3761.0 4.0.0.0 en-US)$f:\dd\tools\devdiv\EcmaPublicKey.snkH@002400000c800000140100000602000000240000525341310008000001000100613399aff18ef1a2c2514a273a42d9042b72321f1757102df9ebada69923e2738406c21e5b801552ab8d200a65a235e001ac9adc25f2d811eb09496a4c6a59d4619589c69f5baf0c4179a47311d92555cd006acc8b5959f2bd6e10e360c34537a1d266da8085856583c85d81da7f3ec01ed9564c58d93d713cd0172c8e23a10f0239b80c96b07736f5d8b022542a4e74251a5f432824318b3539a5a087f8e53d2f135f9ca47f3bb2e10aff0af0849504fb7cea3ff192dc8de0edad64c68efde34c56d302ad55fd6e80f302d5efcdeae953658d3452561b5f36c542efdbdd9f888538d374cef106acf7d93a4445c3c73cd911f0571aaf3d54da12b11ddec375b3a5a866e1ee186f807668209f3b11236ace5e21f117803a3143abb126dd035d7d2f876b6938aaf2ee3414d5420d753621400db44a49c486ce134300a2106adb6bdb433590fef8ad5c43cba82290dc49530effd86523d9483c00f458af46890036b0e2c61d077d7fbac467a506eba29e467a87198b053c749aa2a4d2840c784e6dTWrapNonExceptionThrowsE@System.Data.EntityModel.ClientApiGenerator+d__33JESystem.Data.Entity.Design.EntityViewGenerator+d__28]XSystem.Data.Entity.Design.EntityViewGenerator+d__29b]System.Data.Entity.Design.EntityStoreSchemaGenerator+LoadMethodSessionState+d__20 Item94Catalog={Catalog}, Schema={Schema}, Name={TableName}OlSystem.Resources.ResourceReader, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSettPADPADP/8mmmD77O^<͎!fKU̧D_G[|ջyDS c,s&a= &°E{[apwܠsc="Dmq͒ NiƹOX:(? ڴ(h{!L搠O"yNE <>v:n xT1EGW5> 4V q IBv6RkKyjP8! >$t*2+,.ٺ/(16q30!48,:Sv&CodeGenSourceFilePathIsNotAFile14ColumnFacetValueOutOfRangej&ConstructorComments$CtorSummaryCommentRDbProviderServicesInformationLocationPath4DefaultTargetVersionTooLow$DuplicateClassNameT8DuplicateEntityContainerNameInvalidAttributeSuppliedForTypeDInvalidEntityContainerNameArgumentNLInvalidGetStatementSuppliedForProperty>InvalidInterfaceSuppliedForType8InvalidMemberSuppliedForType,8InvalidNamespaceNameArgumentiMissingComplexTypeDocumentation(MissingDocumentation4MissingDocumentationNoNameE8MissingPropertyDocumentationkBModelGeneration_UnGeneratableType"NamespaceComments&NoPrimaryKeyDefined(NullAdditionalSchema4ParameterDirectionNotValid>PropertyExistsWithDifferentCasenDProviderFactoryReturnedNullFactory(ProviderSchemaErrors?"ReservedNamespace>Serialization_UnknownGlobalItem SharedForeignKeyDSingleStoreEntityContainerExpected:StonglyTypedAccessToNullValue<NTableReferencedByAssociationWasNotFoundr>TableReferencedByTvfWasNotFoundpTargetEntityFrameworkVersionToNewForEntityClassGeneratorDTargetVersionSchemaVersionMismatchRTemplate_CaseInsensitiveEntitySetConflict LTemplate_CaseInsensitiveMemberConflictHTemplate_CaseInsensitiveTypeConflictDTemplate_CommentFactoryMethodParam>Template_CommentNoDocumentationPTemplate_ConflictingGeneratedNavPropNameBTemplate_ContextCommonCtorCommentqDTemplate_ContextDefaultCtorCommentBTemplate_CurrentlyRunningTemplate Template_RegionSimpleProperties!FTemplate_ReplaceVsItemTemplateToken"4Template_UnsupportedSchema"TypeCommentsJ#RUnableToGenerateForeignKeyPropertiesForV1#VUnableToGenerateFunctionImportParameterName $,UnmappedFunctionImport$&UnsupportedDataTypeB%8UnsupportedDataTypeForTarget%The custom attribute supplied for property '{0}' is not valid.:The custom attribute supplied for type '{0}' is not valid.TThe modelEntityContainerName parameter '{0}' contains characters that are not valid.FThe additional get statement supplied for property '{0}' is not valid.>The additional interface supplied for type '{0}' is not valid.;The additional member supplied for type '{0}' is not valid.IThe namespaceName parameter '{0}' contains characters that are not valid.9The EntityContainer '{0}' is not a store EntityContainer.FThe additional Set statement supplied for property '{0}' is not valid.?Parameter '{0}' is not valid. String arguments cannot be empty.The table/view '{0}' has column '{1}' defined as a primary key, but the column type '{2}' is not a valid type for a key in the EDM. An attempt will be made to define the table/view as a read-only table/view.pThe {0} '{1}' differs only in case from an existing {0}, and is not compatible with the current language option.Errors Found During Generation:8There are no comments for ComplexType {0} in the schema.,There are no comments for {0} in the schema.$There are no comments in the schema.5There are no comments for property {0} in the schema.FThe GlobalItem of type '{0}' has no model generation patterns defined.-Original file name: {0} Generation date: {1} The table/view '{0}' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.4The value in the parameter {0} at index {1} is null.The function '{0}' has a parameter '{1}' that has a parameter direction value '{2}', which is not valid. Please use 'IN', 'OUT', or 'INOUT'.zThe property '{0}' differs only in case from an existing property, and is not compatible with the current language option.SThe '{0}' DbProviderFactory returned a null value from the CreateConnection method.CThe provider returned schema mapping information that is not valid.>The namespace '{0}' is a system namespace, and cannot be used.8The GlobalItem of type '{0}' is not a serializable type.Foreign key constraint '{0}' has been omitted from the storage model. Column '{1}' of table '{2}' is a foreign key participating in multiple relationships. A one-to-one Entity Model will not validate since data inconsistency is possible.LThe StoreItemCollection collection must contain exactly one EntityContainer.4The value for column '{0}' in table '{1}' is DBNull.EThe table '{0}' is referenced by a relationship, but cannot be found.The return table of the function '{0}' is not defined. Either all columns have been excluded or the table has no columns. The function has been excluded. To use the function, you will need to review your schema, specify the return type of the function, and uncomment it.The EntityClassGenerator is only for use with EntityFrameworkVersions.Version1 and the schemas provided have newer versions of the Model schema. Consider using EntityCodeGenerator or a template.wThe target Entity Framework version requires the edmx schema version {0} or lower. The specified schema is version {1}.The EntitySet '{0}.{1}' differs only in case from an existing EntitySet, and is not compatible with the current language option.zThe Member '{0}.{1}' differs only in case from an existing Member, and is not compatible with the current language option.The Type '{0}' is not unique. This may be caused by the types only differing in case which is not compatible with the current language option."Initial value of the {0} property.$No Metadata Documentation available.The NavigationProperty '{0}' on the type '{1}' is the source of a generated property '{2}' which conflicts with a member of the same name.Initialize a new {0} object.zInitializes a new {0} object using the connection string found in the '{1}' section of the application configuration file.Currently Running TemplateThe type name '{0}' is used for both an EntityContainer and a type. Duplicates are not allowed, please change one of the names.Create a new {0} object.OThe member '{0}' on the type '{1}' conflicts with the generated factory method.Deprecated Method for adding a new object to the {0} EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead.Deprecated Method for adding a new object to the {0} EntitySet. Consider using the .Add method of the associated ObjectSet(Of T) property instead.+ This code was generated from a template.Q Manual changes to this file may cause unexpected behavior in your application.N Manual changes to this file will be overwritten if the code is regenerated. AddTo MethodsComplex Properties ComplexTypes ConstructorsContextsEntitiesEnumsFactory MethodFunction ImportsNavigation PropertiesObjectSet PropertiesPartial MethodsPrimitive PropertiesEDM Relationship MetadataSimple PropertiesPlease overwrite the replacement token '$edmxInputFile$' with the actual name of the .edmx file you would like to generate from.The input file appears to be using a schema version not supported by this template. This may lead to compile errors. Please use 'Add New Generated Item' to add an updated template.^The type contains views for EntitySets and AssociationSets that were generated at design time.^Foreign keys may only be generated when targeting version 4.0 of the .NET Framework or higher.Unable to generate function import parameter name for the parameter '{0}' of the store function '{1}'. The store function will be ignored and the function import will not be generated.{The function import '{0}' is not mapped to a store function. A function import needs to be mapped for successful execution.The data type '{0}' is currently not supported for the target .NET Framework version; the column '{2}' in table '{1}' was excluded.The data type '{0}' is not supported for the target .NET Framework version. The column '{2}' in the table '{1}' was excluded from the model. To use the data type '{0}', target the .NET Framework 4.5 or higher.mThe data type of the column '{0}' is currently not supported so the column '{0}' in table '{1}' was excluded.The relationship '{0}' has columns that are not part of the key of the table on the primary side of the relationship. The relationship was excluded.The relationship '{0}' uses the set of foreign keys '{1}' that are partially contained in the set of primary keys '{2}' of the table '{3}'. The set of foreign keys must be fully contained in the set of primary keys, or fully not contained in the set of primary keys to be mapped to a model.The function '{0}' has a parameter '{1}' at parameter index {2} that has a data type '{3}' which is currently not supported for the target .NET Framework version. The function was excluded.The function '{0}' has the parameter '{1}' at the parameter index {2} that has the data type '{3}' which is not supported for the target .NET Framework version. The function was excluded from the model. To use the data type '{0}', target the .NET Framework 4.5 or higher.The function '{0}' has a return data type '{1}' that is currently not supported for the target .NET Framework version. The function was excluded.The function '{0}' returns the data type '{1}' that is not supported for the target .NET Framework version. The function was excluded from the model. To use the data type '{0}', target the .NET Framework 4.5 or higher.iThe culture '{0}' is not supported. Pluralization is currently only supported for the English language.The EntitySetMapping in EntityContainerMapping for entity container '{0}' contains a query view. Query views are not allowed in compile time view generation, so the view for this EntityContainerMapping will not be generated.)// ------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version: 11.0.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // // ------------------------------------------------------------------------------ namespace TemplateCodeGenerators { using System; using System.Linq; using System.IO; using System.Collections.Generic; using System.Data.Objects; using System.Data.Objects.DataClasses; using System.Xml; using System.Xml.Linq; using System.Globalization; using System.Reflection; using System.Data.Metadata.Edm; using System.Data.Mapping; using System.Data.Entity.Design; using System.CodeDom; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Text; /// /// Class to produce the template output /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")] public partial class CSharpCodeGenTemplate : CSharpCodeGenTemplateBase { /// /// Create the template output /// public virtual string TransformText() { // // // // // // // // // // // // // // // // // DefineMetadata(); UserSettings userSettings = new UserSettings { SourceCsdlPath = @"$edmxInputFile$", ReferenceCsdlPaths = new string[] {}, FullyQualifySystemTypes = true, CreateContextAddToMethods = true, CamelCaseFields = false, }; ApplyUserSettings(userSettings); if(Errors.HasErrors) { return String.Empty; } MetadataLoader loader = new MetadataLoader(this); MetadataTools ef = new MetadataTools(this); CodeRegion region = new CodeRegion(this); CodeGenerationTools code = new CodeGenerationTools(this){FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, CamelCaseFields = userSettings.CamelCaseFields}; ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray()); ModelNamespace = loader.GetModelNamespace(SourceCsdlPath); string namespaceName = GetNamespaceName(code); UpdateObjectNamespaceMap(namespaceName); this.Write("//------------------------------------------------------------------------------\r" + "\n// \r\n// "); this.Write(this.ToStringHelper.ToStringWithCulture(GetResourceString("Template_GeneratedCodeCommentLine1"))); this.Write("\r\n//\r\n// "); this.Write(this.ToStringHelper.ToStringWithCulture(GetResourceString("Template_GeneratedCodeCommentLine2"))); this.Write("\r\n// "); this.Write(this.ToStringHelper.ToStringWithCulture(GetResourceString("Template_GeneratedCodeCommentLine3"))); this.Write(@" // //------------------------------------------------------------------------------ using System; using System.ComponentModel; using System.Data.EntityClient; using System.Data.Objects; using System.Data.Objects.DataClasses; using System.Linq; using System.Runtime.Serialization; using System.Xml.Serialization; [assembly: EdmSchemaAttribute()] "); //////// //////// //////// region.Begin(GetResourceString("Template_RegionRelationships")); bool first = true; foreach (AssociationType association in GetSourceSchemaTypes()) { if (first) { WriteLine(string.Empty); first = false; } this.Write("[assembly: EdmRelationshipAttribute(\""); this.Write(this.ToStringHelper.ToStringWithCulture(association.NamespaceName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(association.Name)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(EndName(association, 0))); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(EndMultiplicity(association, 0, code))); this.Write(", typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(EscapeEndTypeName(association, 0, code))); this.Write("), \""); this.Write(this.ToStringHelper.ToStringWithCulture(EndName(association, 1))); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(EndMultiplicity(association, 1, code))); this.Write(", typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(EscapeEndTypeName(association, 1, code))); this.Write(")"); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", association.IsForeignKey ? "true" : null))); this.Write(")]\r\n"); } region.End(); if (!String.IsNullOrEmpty(namespaceName)) { this.Write("namespace "); this.Write(this.ToStringHelper.ToStringWithCulture(namespaceName)); this.Write("\r\n{\r\n"); PushIndent(CodeRegion.GetIndent(1)); } //////// //////// //////// region.Begin(GetResourceString("Template_RegionContexts")); foreach (EntityContainer container in GetSourceSchemaTypes()) { this.Write("\r\n/// \r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(container))); this.Write("\r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(container, region.CurrentIndentLevel))); this.Write("\r\n"); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(container))); this.Write(" partial class "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write(" : ObjectContext\r\n{\r\n #region "); this.Write(this.ToStringHelper.ToStringWithCulture(GetResourceString("Template_RegionConstructors"))); this.Write("\r\n\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ContextDefaultCtorComment"), container.Name, container.Name))); this.Write("\r\n /// \r\n public "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write("() : base(\"name="); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\")\r\n {\r\n"); WriteLazyLoadingEnabled(container); this.Write(" OnContextCreated();\r\n }\r\n\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ContextCommonCtorComment"), container.Name))); this.Write("\r\n /// \r\n public "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write("(string connectionString) : base(connectionString, \""); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\")\r\n {\r\n"); WriteLazyLoadingEnabled(container); this.Write(" OnContextCreated();\r\n }\r\n\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ContextCommonCtorComment"), container.Name))); this.Write("\r\n /// \r\n public "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write("(EntityConnection connection) : base(connection, \""); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\")\r\n {\r\n"); WriteLazyLoadingEnabled(container); this.Write(" OnContextCreated();\r\n }\r\n\r\n #endregion\r\n\r\n #region "); this.Write(this.ToStringHelper.ToStringWithCulture(GetResourceString("Template_RegionPartialMethods"))); this.Write("\r\n\r\n partial void OnContextCreated();\r\n\r\n #endregion\r\n\r\n"); //////// //////// //////// region.Begin(GetResourceString("Template_RegionObjectSetProperties")); foreach (EntitySet set in container.BaseEntitySets.OfType()) { VerifyEntityTypeAndSetAccessibilityCompatability(set); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(set))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(set, region.CurrentIndentLevel))); this.Write("\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(set)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForReadOnlyProperty(set))); this.Write(" ObjectSet<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(set))); this.Write("\r\n {\r\n get\r\n {\r\n if (("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(" == null))\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(" = base.CreateObjectSet<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(set.Name)); this.Write("\");\r\n }\r\n return "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(";\r\n }\r\n }\r\n private ObjectSet<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(";\r\n"); } region.End(); //////// //////// //////// //////// //////// //////// //////// //////// //////// //////// region.Begin(GetResourceString("Template_RegionAddToMethods")); IEnumerable addToMethods = CreateContextAddToMethods.Value ? container.BaseEntitySets.OfType() : Enumerable.Empty(); foreach (EntitySet set in addToMethods) { string parameterName = code.Escape(FixParameterName(set.ElementType.Name, code)); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_GenCommentAddToMethodCs"), set.Name))); this.Write("\r\n /// \r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(set.ElementType))); this.Write(" void AddTo"); this.Write(this.ToStringHelper.ToStringWithCulture(set.Name)); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(parameterName)); this.Write(")\r\n {\r\n base.AddObject(\""); this.Write(this.ToStringHelper.ToStringWithCulture(set.Name)); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(parameterName)); this.Write(");\r\n }\r\n"); } region.End(); //////// //////// //////// region.Begin(GetResourceString("Template_RegionFunctionImports")); foreach (EdmFunction edmFunction in container.FunctionImports) { IEnumerable parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef); string paramList = string.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray()); TypeUsage returnType = edmFunction.ReturnParameters.Count == 0 ? null : ef.GetElementType(edmFunction.ReturnParameters[0].TypeUsage); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))); this.Write(this.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(p => new Tuple(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))); this.Write("\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "int" : "ObjectResult<" + MultiSchemaEscape(returnType, code) + ">")); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(paramList)); this.Write(")\r\n {\r\n"); foreach (FunctionImportParameter parameter in parameters) { if (!parameter.NeedsLocalVariable) continue; this.Write(" ObjectParameter "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(";\r\n if ("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null")); this.Write(")\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(" = new ObjectParameter(\""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.FunctionParameterName)); this.Write(");\r\n }\r\n else\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(" = new ObjectParameter(\""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)); this.Write("\", typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.RawClrTypeName)); this.Write("));\r\n }\r\n\r\n"); } this.Write(" return base.ExecuteFunction"); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "" : "<" + MultiSchemaEscape(returnType, code) + ">")); this.Write("(\""); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.Name)); this.Write("\""); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())))); this.Write(");\r\n }\r\n"); if(returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType) { this.Write(" /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(p => new Tuple(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))); this.Write("\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "int" : "ObjectResult<" + MultiSchemaEscape(returnType, code) + ">")); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringAfter(paramList, ", "))); this.Write("MergeOption mergeOption)\r\n {\r\n"); foreach (FunctionImportParameter parameter in parameters) { if (!parameter.NeedsLocalVariable) continue; this.Write(" ObjectParameter "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(";\r\n if ("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null")); this.Write(")\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(" = new ObjectParameter(\""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.FunctionParameterName)); this.Write(");\r\n }\r\n else\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(" = new ObjectParameter(\""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)); this.Write("\", typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.RawClrTypeName)); this.Write("));\r\n }\r\n\r\n"); } this.Write(" return base."); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "ExecuteFunction" : "ExecuteFunction<" + MultiSchemaEscape(returnType, code) + ">")); this.Write("(\""); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.Name)); this.Write("\", mergeOption"); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())))); this.Write(");\r\n }\r\n"); } } region.End(); this.Write("}\r\n"); } region.End(); //////// //////// //////// region.Begin(GetResourceString("Template_RegionEntities")); foreach (EntityType entity in GetSourceSchemaTypes().OrderBy(e => e.Name)) { this.Write("\r\n/// \r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(entity))); this.Write("\r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(entity, region.CurrentIndentLevel))); this.Write("\r\n[EdmEntityTypeAttribute(NamespaceName=\""); this.Write(this.ToStringHelper.ToStringWithCulture(entity.NamespaceName)); this.Write("\", Name=\""); this.Write(this.ToStringHelper.ToStringWithCulture(entity.Name)); this.Write("\")]\r\n[Serializable()]\r\n[DataContractAttribute(IsReference=true)]\r\n"); foreach (EntityType subType in ItemCollection.GetItems().Where(b => b.BaseType == entity)) { this.Write("[KnownTypeAttribute(typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(subType, code))); this.Write("))]\r\n"); } this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(entity))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(code.AbstractOption(entity)))); this.Write("partial class "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(entity))); this.Write(" : "); this.Write(this.ToStringHelper.ToStringWithCulture(BaseTypeName(entity, code))); this.Write("\r\n{\r\n"); if (!entity.Abstract) { WriteFactoryMethod(entity, code); } region.Begin(GetResourceString("Template_RegionPrimitiveProperties")); foreach (EdmProperty property in entity.Properties.Where(p => p.DeclaringType == entity && p.TypeUsage.EdmType is PrimitiveType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WritePrimitiveTypeProperty(property, code); } region.End(); region.Begin(GetResourceString("Template_RegionComplexProperties")); foreach (EdmProperty property in entity.Properties.Where(p => p.DeclaringType == entity && p.TypeUsage.EdmType is ComplexType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WriteComplexTypeProperty(property, code); } region.End(); this.Write("\r\n"); //////// //////// //////// region.Begin(GetResourceString("Template_RegionNavigationProperties")); foreach (NavigationProperty navProperty in entity.NavigationProperties.Where(n => n.DeclaringType == entity)) { VerifyGetterAndSetterAccessibilityCompatability(navProperty); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))); this.Write("\r\n [XmlIgnoreAttribute()]\r\n [SoapIgnoreAttribute()]\r\n [DataMemberAttribu" + "te()]\r\n [EdmRelationshipNavigationPropertyAttribute(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.NamespaceName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.Name)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\")]\r\n"); if (navProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))); this.Write(" EntityCollection<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))); this.Write("get\r\n {\r\n return ((IEntityWithRelationships)this).RelationshipM" + "anager.GetRelatedCollection<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\");\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))); this.Write("set\r\n {\r\n if ((value != null))\r\n {\r\n " + "((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection" + "<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\", value);\r\n }\r\n }\r\n }\r\n"); } else { this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))); this.Write("get\r\n {\r\n return ((IEntityWithRelationships)this).RelationshipM" + "anager.GetRelatedReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\").Value;\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))); this.Write("set\r\n {\r\n ((IEntityWithRelationships)this).RelationshipManager." + "GetRelatedReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\").Value = value;\r\n }\r\n }\r\n"); string refPropertyName = navProperty.Name + "Reference"; if (entity.Members.Any(m => m.Name == refPropertyName)) { // Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6017", String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ConflictingGeneratedNavPropName"), navProperty.Name, entity.FullName, refPropertyName))); } this.Write(" /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))); this.Write("\r\n [BrowsableAttribute(false)]\r\n [DataMemberAttribute()]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))); this.Write(" EntityReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(refPropertyName)); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))); this.Write("get\r\n {\r\n return ((IEntityWithRelationships)this).RelationshipM" + "anager.GetRelatedReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\");\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))); this.Write("set\r\n {\r\n if ((value != null))\r\n {\r\n " + "((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<" + ""); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\", value);\r\n }\r\n }\r\n }\r\n"); } } region.End(); this.Write("}\r\n"); } region.End(); //////// //////// //////// region.Begin(GetResourceString("Template_RegionComplexTypes")); foreach (ComplexType complex in GetSourceSchemaTypes().OrderBy(c => c.Name)) { this.Write("\r\n/// \r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(complex))); this.Write("\r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complex, region.CurrentIndentLevel))); this.Write("\r\n[EdmComplexTypeAttribute(NamespaceName=\""); this.Write(this.ToStringHelper.ToStringWithCulture(complex.NamespaceName)); this.Write("\", Name=\""); this.Write(this.ToStringHelper.ToStringWithCulture(complex.Name)); this.Write("\")]\r\n[DataContractAttribute(IsReference=true)]\r\n[Serializable()]\r\n"); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(complex))); this.Write(" partial class "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(complex))); this.Write(" : ComplexObject\r\n{\r\n"); WriteFactoryMethod(complex, code); region.Begin(GetResourceString("Template_RegionPrimitiveProperties")); foreach (EdmProperty property in complex.Properties.Where(p => p.DeclaringType == complex && p.TypeUsage.EdmType is PrimitiveType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WritePrimitiveTypeProperty(property, code); } region.End(); region.Begin(GetResourceString("Template_RegionComplexProperties")); foreach (EdmProperty property in complex.Properties.Where(p => p.DeclaringType == complex && p.TypeUsage.EdmType is ComplexType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WriteComplexTypeProperty(property, code); } region.End(); this.Write("}\r\n"); } region.End(); this.Write("\r\n"); if (!String.IsNullOrEmpty(namespaceName)) { PopIndent(); this.Write("}\r\n"); } VerifyTypeUniqueness(); return this.GenerationEnvironment.ToString(); } //////// //////// //////// //////// //////// //////// private void WriteFactoryMethod(StructuralType structuralType, CodeGenerationTools code) { CodeRegion region = new CodeRegion(this, 1); string methodName = "Create" + structuralType.Name; UniqueIdentifierService uniqueIdentifier = new UniqueIdentifierService(); string instanceName = code.Escape(uniqueIdentifier.AdjustIdentifier((code.CamelCase(structuralType.Name)))); IEnumerable parameters = FactoryMethodParameter.CreateParameters(structuralType.Members.OfType().Where(p => IncludePropertyInFactoryMethod(structuralType, p)), uniqueIdentifier, MultiSchemaEscape, code); if (parameters.Count() == 0) return; if (structuralType.Members.Any(m => m.Name == methodName)) { // Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6029", String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_FactoryMethodNameConflict"), methodName, structuralType.FullName))); } region.Begin(GetResourceString("Template_RegionFactoryMethod")); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_FactoryMethodComment"), structuralType.Name))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(p => new Tuple(p.RawParameterName, p.ParameterComment)), region.CurrentIndentLevel))); this.Write("\r\n public static "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(methodName)); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", parameters.Select(p => p.ParameterType + " " + p.ParameterName).ToArray()))); this.Write(")\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write(" = new "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))); this.Write("();\r\n"); foreach (FactoryMethodParameter parameter in parameters) { if (parameter.IsComplexType) { // this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write("."); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))); this.Write(" = StructuralObject.VerifyComplexObjectIsNotNull("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.ParameterName)); this.Write(", \""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.Source.Name)); this.Write("\");\r\n"); } else { // this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write("."); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))); this.Write(" = "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.ParameterName)); this.Write(";\r\n"); } } this.Write(" return "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write(";\r\n }\r\n"); region.End(); } //////// //////// //////// private void WritePrimitiveTypeProperty(EdmProperty primitiveProperty, CodeGenerationTools code) { MetadataTools ef = new MetadataTools(this); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(primitiveProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(primitiveProperty, 1))); this.Write("\r\n [EdmScalarPropertyAttribute(EntityKeyProperty="); this.Write(this.ToStringHelper.ToStringWithCulture(code.CreateLiteral(ef.IsKey(primitiveProperty)))); this.Write(", IsNullable="); this.Write(this.ToStringHelper.ToStringWithCulture(code.CreateLiteral(ef.IsNullable(primitiveProperty)))); this.Write(")]\r\n [DataMemberAttribute()]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(primitiveProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(primitiveProperty))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty.TypeUsage))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(primitiveProperty)))); this.Write("get\r\n {\r\n"); if (ef.ClrType(primitiveProperty.TypeUsage) == typeof(byte[])) { this.Write(" return StructuralObject.GetValidValue("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))); this.Write(");\r\n"); } else { this.Write(" return "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))); this.Write(";\r\n"); } this.Write(" }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter((primitiveProperty))))); this.Write("set\r\n {\r\n"); if (ef.IsKey(primitiveProperty)) { if (ef.ClrType(primitiveProperty.TypeUsage) == typeof(byte[])) { this.Write(" if (!StructuralObject.BinaryEquals("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))); this.Write(", value))\r\n"); } else { this.Write(" if ("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))); this.Write(" != value)\r\n"); } this.Write(" {\r\n"); PushIndent(CodeRegion.GetIndent(1)); } this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(primitiveProperty))); this.Write("(value);\r\n ReportPropertyChanging(\""); this.Write(this.ToStringHelper.ToStringWithCulture(primitiveProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))); this.Write(" = StructuralObject.SetValidValue(value"); this.Write(this.ToStringHelper.ToStringWithCulture(OptionalNullableParameterForSetValidValue(primitiveProperty, code))); this.Write(");\r\n ReportPropertyChanged(\""); this.Write(this.ToStringHelper.ToStringWithCulture(primitiveProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(primitiveProperty))); this.Write("();\r\n"); if (ef.IsKey(primitiveProperty)) { PopIndent(); this.Write(" }\r\n"); } this.Write(" }\r\n }\r\n private "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty.TypeUsage))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(" = ", code.CreateLiteral(primitiveProperty.DefaultValue)))); this.Write(";\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(primitiveProperty))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty.TypeUsage))); this.Write(" value);\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(primitiveProperty))); this.Write("();\r\n"); } //////// //////// //////// private void WriteComplexTypeProperty(EdmProperty complexProperty, CodeGenerationTools code) { this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(complexProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complexProperty, 1))); this.Write("\r\n [EdmComplexPropertyAttribute()]\r\n [DesignerSerializationVisibility(Desig" + "nerSerializationVisibility.Content)]\r\n [XmlElement(IsNullable=true)]\r\n [So" + "apElement(IsNullable=true)]\r\n [DataMemberAttribute()]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(complexProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(complexProperty))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(complexProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(complexProperty)))); this.Write("get\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(" = GetValidValue("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(", \""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\", false, "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(" = true;\r\n return "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(";\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(complexProperty)))); this.Write("set\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))); this.Write("(value);\r\n ReportPropertyChanging(\""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(" = SetValidValue("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(", value, \""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(" = true;\r\n ReportPropertyChanged(\""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))); this.Write("();\r\n }\r\n }\r\n private "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(";\r\n private bool "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(";\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))); this.Write(" value);\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))); this.Write("();\r\n"); } private void WriteLazyLoadingEnabled(EntityContainer container) { string lazyLoadingAttributeValue = null; string lazyLoadingAttributeName = MetadataConstants.EDM_ANNOTATION_09_02 + ":LazyLoadingEnabled"; if(MetadataTools.TryGetStringMetadataPropertySetting(container, lazyLoadingAttributeName, out lazyLoadingAttributeValue)) { bool isLazyLoading = false; if(bool.TryParse(lazyLoadingAttributeValue, out isLazyLoading)) { this.Write(" this.ContextOptions.LazyLoadingEnabled = "); this.Write(this.ToStringHelper.ToStringWithCulture(isLazyLoading.ToString().ToLowerInvariant())); this.Write(";\r\n"); } } } //////// //////// //////// public string SourceCsdlPath{ get; set; } public string ModelNamespace{ get; set; } public EdmItemCollection ItemCollection{ get; set; } public IEnumerable ReferenceCsdlPaths{ get; set; } public Nullable CreateContextAddToMethods{ get; set; } public Dictionary EdmToObjectNamespaceMap { get { return _edmToObjectNamespaceMap; } set { _edmToObjectNamespaceMap = value; } } public Dictionary _edmToObjectNamespaceMap = new Dictionary(); public Double SourceEdmVersion { get { if (ItemCollection != null) { return ItemCollection.EdmVersion; } return 0.0; } } //////// //////// //////// static System.Resources.ResourceManager ResourceManager { get { if (_resourceManager == null) { System.Resources.ResourceManager resourceManager = new System.Resources.ResourceManager("System.Data.Entity.Design", typeof(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly); System.Threading.Interlocked.CompareExchange(ref _resourceManager, resourceManager, null); } return _resourceManager; } } static System.Resources.ResourceManager _resourceManager; private static string GetResourceString(string resourceName) { return ResourceManager.GetString(resourceName, null); // } private void VerifyTypeUniqueness() { HashSet hash = new HashSet(); IEnumerable allTypes = GetSourceSchemaTypes().Where(i => i is StructuralType || i is EntityContainer); foreach (GlobalItem type in allTypes) { if (!hash.Add(GetGlobalItemName(type))) { // Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6034", String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_DuplicateTopLevelType"), GetGlobalItemName(type)))); } } } protected string GetGlobalItemName(GlobalItem item) { if (item is EdmType) { // return ((EdmType)item).Name; } else { // return ((EntityContainer)item).Name; } } void ApplyUserSettings(UserSettings userSettings) { // if (SourceCsdlPath == null) { #if !PREPROCESSED_TEMPLATE if(userSettings.SourceCsdlPath == "$" + "edmxInputFile" + "$") { Errors.Add(new System.CodeDom.Compiler.CompilerError(Host.TemplateFile, -1, -1, "", GetResourceString("Template_ReplaceVsItemTemplateToken"))); return; } SourceCsdlPath = Host.ResolvePath(userSettings.SourceCsdlPath); #else SourceCsdlPath = userSettings.SourceCsdlPath; #endif } // normalize the path, remove ..\ from it SourceCsdlPath = Path.GetFullPath(SourceCsdlPath); if (ReferenceCsdlPaths == null) { ReferenceCsdlPaths = userSettings.ReferenceCsdlPaths; } if (!CreateContextAddToMethods.HasValue) { CreateContextAddToMethods = userSettings.CreateContextAddToMethods; } DefaultSummaryComment = GetResourceString("Template_CommentNoDocumentation"); } class UserSettings { public string SourceCsdlPath{ get; set; } public string[] ReferenceCsdlPaths{ get; set; } public bool FullyQualifySystemTypes{ get; set; } public bool CreateContextAddToMethods{ get; set; } public bool CamelCaseFields{ get; set; } } string GetNamespaceName(CodeGenerationTools code) { string namespaceName = code.VsNamespaceSuggestion(); #if PREPROCESSED_TEMPLATE if (String.IsNullOrEmpty(namespaceName)) { namespaceName = GetObjectNamespace(ModelNamespace); } #endif return namespaceName; } string MultiSchemaEscape(TypeUsage usage, CodeGenerationTools code) { StructuralType structural = usage.EdmType as StructuralType; if (structural != null) { return MultiSchemaEscape(structural, code); } return code.Escape(usage); } string MultiSchemaEscape(StructuralType type, CodeGenerationTools code) { if (type.NamespaceName != ModelNamespace) { return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(type.NamespaceName)), code.Escape(type)); } return code.Escape(type); } string NewModifier(NavigationProperty navigationProperty) { Type baseType = typeof(EntityObject); return NewModifier(baseType, navigationProperty.Name); } string NewModifier(EdmFunction edmFunction) { Type baseType = typeof(ObjectContext); return NewModifier(baseType, edmFunction.Name); } string NewModifier(EntitySet set) { Type baseType = typeof(ObjectContext); return NewModifier(baseType, set.Name); } string NewModifier(EdmProperty property) { Type baseType; if (property.DeclaringType.BuiltInTypeKind == BuiltInTypeKind.EntityType) { baseType = typeof(EntityObject); } else { baseType = typeof(ComplexObject); } return NewModifier(baseType, property.Name); } string NewModifier(Type type, string memberName) { if (HasBaseMemberWithMatchingName(type, memberName)) { return "new"; } return string.Empty; } static bool HasBaseMemberWithMatchingName(Type type, string memberName) { BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static; return type.GetMembers(bindingFlags).Where(m => IsVisibleMember(m)).Any(m => m.Name == memberName); } string ChangingMethodName(EdmMember member) { return string.Format(CultureInfo.InvariantCulture, "On{0}Changing", member.Name); } string ChangedMethodName(EdmMember member) { return string.Format(CultureInfo.InvariantCulture, "On{0}Changed", member.Name); } string InitializedTrackingField(EdmProperty property, CodeGenerationTools code) { string namePart = property.Name + "Initialized"; if (code.CamelCaseFields) { namePart = code.CamelCase(namePart); } return "_" + namePart; } string OptionalNullableParameterForSetValidValue(EdmMember member, CodeGenerationTools code) { MetadataTools ef = new MetadataTools(this); string list = string.Empty; if (((PrimitiveType)member.TypeUsage.EdmType).ClrEquivalentType.IsClass) { MetadataProperty storeGeneratedPatternProperty = null; bool isNullable = ef.IsNullable(member.TypeUsage) || (member.MetadataProperties.TryGetValue(MetadataConstants.EDM_ANNOTATION_09_02 + ":StoreGeneratedPattern", false, out storeGeneratedPatternProperty) && Object.Equals(storeGeneratedPatternProperty.Value, "Computed")); list += ", " + code.CreateLiteral(isNullable); } return list; } static bool IsVisibleMember(MemberInfo memberInfo) { if (memberInfo is EventInfo) { EventInfo ei = (EventInfo)memberInfo; MethodInfo add = ei.GetAddMethod(); MethodInfo remove = ei.GetRemoveMethod(); return IsVisibleMethod(add) || IsVisibleMethod(remove); } else if (memberInfo is FieldInfo) { FieldInfo fi = (FieldInfo)memberInfo; return !fi.IsPrivate && !fi.IsAssembly; } else if (memberInfo is MethodBase) { MethodBase mb = (MethodBase)memberInfo; if (mb.IsSpecialName) return false; return IsVisibleMethod(mb); } else if (memberInfo is PropertyInfo) { PropertyInfo pi = (PropertyInfo)memberInfo; MethodInfo get = pi.GetGetMethod(); MethodInfo set = pi.GetSetMethod(); return IsVisibleMethod(get) || IsVisibleMethod(set); } return false; } static bool IsVisibleMethod(MethodBase methodBase) { if (methodBase == null) return false; return !methodBase.IsPrivate && !methodBase.IsAssembly; } IEnumerable GetSourceSchemaTypes() where T : GlobalItem { if (Path.GetExtension(SourceCsdlPath) != ".edmx") { return ItemCollection.GetItems().Where(e => e.MetadataProperties.Any(mp => mp.Name == "SchemaSource" && (string)mp.Value == SourceCsdlPath)); } else { return ItemCollection.GetItems(); } } string EndName(AssociationType association, int index) { return association.AssociationEndMembers[index].Name; } string EndMultiplicity(AssociationType association, int index, CodeGenerationTools code) { return code.CreateLiteral(association.AssociationEndMembers[index].RelationshipMultiplicity); } string EscapeEndTypeName(AssociationType association, int index, CodeGenerationTools code) { EntityType entity = association.AssociationEndMembers[index].GetEntityType(); return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(entity.NamespaceName)), code.Escape(entity)); } string GetObjectNamespace(string csdlNamespaceName) { string objectNamespace; if (EdmToObjectNamespaceMap.TryGetValue(csdlNamespaceName, out objectNamespace)) { return objectNamespace; } return csdlNamespaceName; } void UpdateObjectNamespaceMap(string objectNamespace) { if(objectNamespace != ModelNamespace && !EdmToObjectNamespaceMap.ContainsKey(ModelNamespace)) { EdmToObjectNamespaceMap.Add(ModelNamespace, objectNamespace); } } static string FixParameterName(string name, CodeGenerationTools code) { // // if (StringComparer.OrdinalIgnoreCase.Equals(name, "id")) { // return "id"; } return code.CamelCase(name); } string BaseTypeName(EntityType entity, CodeGenerationTools code) { return entity.BaseType == null ? "EntityObject" : MultiSchemaEscape((StructuralType)entity.BaseType, code); } bool IncludePropertyInFactoryMethod(StructuralType factoryType, EdmProperty edmProperty) { if (edmProperty.Nullable) { return false; } if (edmProperty.DefaultValue != null) { return false; } if ((Accessibility.ForReadOnlyProperty(edmProperty) != "public" && Accessibility.ForWriteOnlyProperty(edmProperty) != "public") || (factoryType != edmProperty.DeclaringType && Accessibility.ForWriteOnlyProperty(edmProperty) == "private") ) { // return false; } return true; } class FactoryMethodParameter { public EdmProperty Source; public string RawParameterName; public string ParameterName; public string ParameterType; public string ParameterComment; public bool IsComplexType; public static IEnumerable CreateParameters(IEnumerable properties, UniqueIdentifierService unique, Func multiSchemaEscape, CodeGenerationTools code) { List parameters = new List(); foreach (EdmProperty property in properties) { FactoryMethodParameter parameter = new FactoryMethodParameter(); parameter.Source = property; parameter.IsComplexType = property.TypeUsage.EdmType is ComplexType; parameter.RawParameterName = unique.AdjustIdentifier(FixParameterName(property.Name, code)); parameter.ParameterName = code.Escape(parameter.RawParameterName); parameter.ParameterType = multiSchemaEscape(property.TypeUsage, code); parameter.ParameterComment = String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_CommentFactoryMethodParam"), property.Name); parameters.Add(parameter); } return parameters; } } string DefaultSummaryComment{ get; set; } string SummaryComment(MetadataItem item) { if (item.Documentation != null && item.Documentation.Summary != null) { return PrefixLinesOfMultilineComment(XMLCOMMENT_START + " ", XmlEntityize(item.Documentation.Summary)); } if (DefaultSummaryComment != null) { return DefaultSummaryComment; } return string.Empty; } string LongDescriptionCommentElement(MetadataItem item, int indentLevel) { if (item.Documentation != null && !String.IsNullOrEmpty(item.Documentation.LongDescription)) { string comment = Environment.NewLine; string lineStart = CodeRegion.GetIndent(indentLevel) + XMLCOMMENT_START + " "; comment += lineStart + "" + Environment.NewLine; comment += lineStart + PrefixLinesOfMultilineComment(lineStart, XmlEntityize(item.Documentation.LongDescription)) + Environment.NewLine; comment += lineStart + ""; return comment; } return string.Empty; } string PrefixLinesOfMultilineComment(string prefix, string comment) { return comment.Replace(Environment.NewLine, Environment.NewLine + prefix); } string ParameterComments(IEnumerable> parameters, int indentLevel) { System.Text.StringBuilder builder = new System.Text.StringBuilder(); foreach (Tuple parameter in parameters) { builder.AppendLine(); builder.Append(CodeRegion.GetIndent(indentLevel)); builder.Append(XMLCOMMENT_START); builder.Append(String.Format(CultureInfo.InvariantCulture, " {1}", parameter.Item1, parameter.Item2)); } return builder.ToString(); } string XmlEntityize(string text) { if (string.IsNullOrEmpty(text)) { return string.Empty; } text = text.Replace("&","&"); text = text.Replace("<","<").Replace(">",">"); string id = Guid.NewGuid().ToString(); text = text.Replace(Environment.NewLine, id); text = text.Replace("\r", " ").Replace("\n"," "); text = text.Replace(id, Environment.NewLine); return text.Replace("\'","'").Replace("\"","""); } const string XMLCOMMENT_START = "///"; IEnumerable GetProperties(StructuralType type) { if (type.BuiltInTypeKind == BuiltInTypeKind.EntityType) { return ((EntityType)type).Properties; } else { return ((ComplexType)type).Properties; } } protected void VerifyGetterAndSetterAccessibilityCompatability(EdmMember member) { string rawGetterAccessibility = Accessibility.ForReadOnlyProperty(member); string rawSetterAccessibility = Accessibility.ForWriteOnlyProperty(member); if ((rawGetterAccessibility == "internal" && rawSetterAccessibility == "protected") || (rawGetterAccessibility == "protected" && rawSetterAccessibility == "internal")) { Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6033", String.Format(CultureInfo.CurrentCulture, GetResourceString("GeneratedPropertyAccessibilityConflict"), member.Name, rawGetterAccessibility, rawSetterAccessibility))); } } private void VerifyEntityTypeAndSetAccessibilityCompatability(EntitySet set) { string typeAccess = Accessibility.ForType(set.ElementType); string setAccess = Accessibility.ForReadOnlyProperty(set); if(typeAccess == "internal" && (setAccess == "public" || setAccess == "protected")) { Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6036", String.Format(CultureInfo.CurrentCulture, GetResourceString("EntityTypeAndSetAccessibilityConflict"), set.ElementType.Name, typeAccess, set.Name, setAccess))); } } private void DefineMetadata() { TemplateMetadata[MetadataConstants.TT_TEMPLATE_NAME] = "CSharpCodeGen"; TemplateMetadata[MetadataConstants.TT_TEMPLATE_VERSION] = "4.0"; TemplateMetadata[MetadataConstants.TT_MINIMUM_ENTITY_FRAMEWORK_VERSION] = "4.0"; } //////// //////// //////// sealed class UniqueIdentifierService { private readonly HashSet _knownIdentifiers; public UniqueIdentifierService() { _knownIdentifiers = new HashSet(StringComparer.Ordinal); } /// /// /// /// public string AdjustIdentifier(string identifier) { // var numberOfConflicts = 0; var adjustedIdentifier = identifier; while (!_knownIdentifiers.Add(adjustedIdentifier)) { ++numberOfConflicts; adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture); } return adjustedIdentifier; } } // Copyright (c) Microsoft Corporation. All rights reserved. public static Dictionary TemplateMetadata = new Dictionary(); /// /// Responsible for helping to create source code that is /// correctly formated and functional /// public class CodeGenerationTools { private readonly DynamicTextTransformation _textTransformation; private readonly CSharpCodeProvider _code; private readonly MetadataTools _ef; /// /// Initializes a new CodeGenerationTools object with the TextTransformation (T4 generated class) /// that is currently running /// public CodeGenerationTools(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); _code = new CSharpCodeProvider(); _ef = new MetadataTools(_textTransformation); FullyQualifySystemTypes = false; CamelCaseFields = true; } /// /// When true, all types that are not being generated /// are fully qualified to keep them from conflicting with /// types that are being generated. Useful when you have /// something like a type being generated named System. /// /// Default is false. /// public bool FullyQualifySystemTypes { get; set; } /// /// When true, the field names are Camel Cased, /// otherwise they will preserve the case they /// start with. /// /// Default is true. /// public bool CamelCaseFields { get; set; } /// /// Returns the NamespaceName suggested by VS if running inside VS. Otherwise, returns /// null. /// public string VsNamespaceSuggestion() { string suggestion = _textTransformation.Host.ResolveParameterValue("directiveId", "namespaceDirectiveProcessor", "namespaceHint"); if (String.IsNullOrEmpty(suggestion)) { return null; } return suggestion; } /// /// Returns a string that is safe for use as an identifier in C#. /// Keywords are escaped. /// public string Escape(string name) { if (name == null) { return null; } return _code.CreateEscapedIdentifier(name); } /// /// Returns the name of the TypeUsage's EdmType that is safe for /// use as an identifier. /// public string Escape(TypeUsage typeUsage) { if (typeUsage == null) { return null; } if (typeUsage.EdmType is ComplexType || typeUsage.EdmType is EntityType) { return Escape(typeUsage.EdmType.Name); } else if (typeUsage.EdmType is SimpleType) { Type clrType = _ef.UnderlyingClrType(typeUsage.EdmType); string typeName = typeUsage.EdmType is EnumType ? Escape(typeUsage.EdmType.Name) : Escape(clrType); if (clrType.IsValueType && _ef.IsNullable(typeUsage)) { return String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName); } return typeName; } else if (typeUsage.EdmType is CollectionType) { return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", Escape(((CollectionType)typeUsage.EdmType).TypeUsage)); } throw new ArgumentException("typeUsage"); } /// /// Returns the name of the EdmMember that is safe for /// use as an identifier. /// public string Escape(EdmMember member) { if (member == null) { return null; } return Escape(member.Name); } /// /// Returns the name of the EdmType that is safe for /// use as an identifier. /// public string Escape(EdmType type) { if (type == null) { return null; } return Escape(type.Name); } /// /// Returns the name of the EdmFunction that is safe for /// use as an identifier. /// public string Escape(EdmFunction function) { if (function == null) { return null; } return Escape(function.Name); } /// /// Returns the name of the EnumMember that is safe for /// use as an identifier. /// public string Escape(EnumMember member) { if (member == null) { return null; } return Escape(member.Name); } /// /// Returns the name of the EntityContainer that is safe for /// use as an identifier. /// public string Escape(EntityContainer container) { if (container == null) { return null; } return Escape(container.Name); } /// /// Returns the name of the EntitySet that is safe for /// use as an identifier. /// public string Escape(EntitySet set) { if (set == null) { return null; } return Escape(set.Name); } /// /// Returns the name of the StructuralType that is safe for /// use as an identifier. /// public string Escape(StructuralType type) { if (type == null) { return null; } return Escape(type.Name); } /// /// Returns the NamespaceName with each segment safe to /// use as an identifier. /// public string EscapeNamespace(string namespaceName) { if (String.IsNullOrEmpty(namespaceName)) { return namespaceName; } string[] parts = namespaceName.Split('.'); namespaceName = String.Empty; foreach (string part in parts) { if (namespaceName != String.Empty) { namespaceName += "."; } namespaceName += Escape(part); } return namespaceName; } /// /// Returns the name of the EdmMember formatted for /// use as a field identifier. /// /// This method changes behavior based on the CamelCaseFields /// setting. /// public string FieldName(EdmMember member) { if (member == null) { return null; } return FieldName(member.Name); } /// /// Returns the name of the EntitySet formatted for /// use as a field identifier. /// /// This method changes behavior based on the CamelCaseFields /// setting. /// public string FieldName(EntitySet set) { if (set == null) { return null; } return FieldName(set.Name); } private string FieldName(string name) { if (CamelCaseFields) { return "_" + CamelCase(name); } else { return "_" + name; } } /// /// Returns the name of the Type object formatted for /// use in source code. /// /// This method changes behavior based on the FullyQualifySystemTypes /// setting. /// public string Escape(Type clrType) { return Escape(clrType, FullyQualifySystemTypes); } /// /// Returns the name of the Type object formatted for /// use in source code. /// public string Escape(Type clrType, bool fullyQualifySystemTypes) { if(clrType == null) { return null; } string typeName; if (fullyQualifySystemTypes) { typeName = "global::" + clrType.FullName; } else { typeName = _code.GetTypeOutput(new CodeTypeReference(clrType)); } return typeName; } /// /// Returns the abstract option if the entity is Abstract, otherwise returns String.Empty /// public string AbstractOption(EntityType entity) { if (entity.Abstract) { return "abstract"; } return String.Empty; } /// /// Returns the passed in identifier with the first letter changed to lowercase /// public string CamelCase(string identifier) { if (String.IsNullOrEmpty(identifier)) { return identifier; } if (identifier.Length == 1) { return identifier[0].ToString(CultureInfo.InvariantCulture).ToLowerInvariant(); } return identifier[0].ToString(CultureInfo.InvariantCulture).ToLowerInvariant() + identifier.Substring(1); } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with a single space concatenated on the end. /// public string SpaceAfter(string value) { return StringAfter(value, " "); } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with a single space concatenated on the end. /// public string SpaceBefore(string value) { return StringBefore(" ", value); } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with append concatenated on the end. /// public string StringAfter(string value, string append) { if (String.IsNullOrEmpty(value)) { return String.Empty; } return value + append; } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with prepend concatenated on the front. /// public string StringBefore(string prepend, string value) { if (String.IsNullOrEmpty(value)) { return String.Empty; } return prepend + value; } /// /// Returns false and shows an error if the supplied type names aren't case-insensitively unique, /// otherwise returns true. /// public bool VerifyCaseInsensitiveTypeUniqueness(IEnumerable types, string sourceFile) { return VerifyCaseInsensitiveUniqueness(types, t => string.Format(CultureInfo.CurrentCulture, GetResourceString("Template_CaseInsensitiveTypeConflict"), t), sourceFile); } /// /// Returns false and shows an error if the supplied strings aren't case-insensitively unique, /// otherwise returns true. /// private bool VerifyCaseInsensitiveUniqueness(IEnumerable items, Func formatMessage, string sourceFile) { HashSet hash = new HashSet(StringComparer.InvariantCultureIgnoreCase); foreach (string item in items) { if (!hash.Add(item)) { _textTransformation.Errors.Add(new System.CodeDom.Compiler.CompilerError(sourceFile, -1, -1, "6023", formatMessage(item))); return false; } } return true; } /// /// Returns the names of the items in the supplied collection that correspond to O-Space types. /// public IEnumerable GetAllGlobalItems(EdmItemCollection itemCollection) { return itemCollection.GetItems().Where(i => i is EntityType || i is ComplexType || i is EnumType || i is EntityContainer).Select(g => GetGlobalItemName(g)); } /// /// Returns the name of the supplied GlobalItem. /// public string GetGlobalItemName(GlobalItem item) { if (item is EdmType) { return ((EdmType)item).Name; } else { return ((EntityContainer)item).Name; } } /// /// Retuns as full of a name as possible, if a namespace is provided /// the namespace and name are combined with a period, otherwise just /// the name is returned. /// public string CreateFullName(string namespaceName, string name) { if (String.IsNullOrEmpty(namespaceName)) { return name; } return namespaceName + "." + name; } /// /// Retuns a literal representing the supplied value. /// public string CreateLiteral(object value) { if (value == null) { return string.Empty; } Type type = value.GetType(); if (type.IsEnum) { return type.FullName + "." + value.ToString(); } if (type == typeof(Guid)) { return string.Format(CultureInfo.InvariantCulture, "new Guid(\"{0}\")", ((Guid)value).ToString("D", CultureInfo.InvariantCulture)); } else if (type == typeof(DateTime)) { return string.Format(CultureInfo.InvariantCulture, "new DateTime({0}, DateTimeKind.Unspecified)", ((DateTime)value).Ticks); } else if (type == typeof(byte[])) { var arrayInit = string.Join(", ", ((byte[])value).Select(b => b.ToString(CultureInfo.InvariantCulture)).ToArray()); return string.Format(CultureInfo.InvariantCulture, "new Byte[] {{{0}}}", arrayInit); } else if (type == typeof(DateTimeOffset)) { var dto = (DateTimeOffset)value; return string.Format(CultureInfo.InvariantCulture, "new DateTimeOffset({0}, new TimeSpan({1}))", dto.Ticks, dto.Offset.Ticks); } else if (type == typeof(TimeSpan)) { return string.Format(CultureInfo.InvariantCulture, "new TimeSpan({0})", ((TimeSpan)value).Ticks); } var expression = new CodePrimitiveExpression(value); var writer = new StringWriter(); CSharpCodeProvider code = new CSharpCodeProvider(); code.GenerateCodeFromExpression(expression, writer, new CodeGeneratorOptions()); return writer.ToString(); } /// /// Returns a resource string from the System.Data.Entity.Design assembly. /// public static string GetResourceString(string resourceName, CultureInfo culture = null) { if(_resourceManager == null) { _resourceManager = new System.Resources.ResourceManager("System.Data.Entity.Design", typeof(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly); } return _resourceManager.GetString(resourceName, culture); } static System.Resources.ResourceManager _resourceManager; private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName"; /// /// Gets the entity, complex, or enum types for which code should be generated from the given item collection. /// Any types for which an ExternalTypeName annotation has been applied in the conceptual model /// metadata (CSDL) are filtered out of the returned list. /// /// The type of item to return. /// The item collection to look in. /// The items to generate. public IEnumerable GetItemsToGenerate(ItemCollection itemCollection) where T: GlobalItem { return itemCollection.GetItems().Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName)); } /// /// Returns the escaped type name to use for the given usage of a c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type usage to get a name for. /// The type name to use. public string GetTypeName(TypeUsage typeUsage) { return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace: null); } /// /// Returns the escaped type name to use for the given c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type to get a name for. /// The type name to use. public string GetTypeName(EdmType edmType) { return GetTypeName(edmType, isNullable: null, modelNamespace: null); } /// /// Returns the escaped type name to use for the given usage of an c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type usage to get a name for. /// If not null and the type's namespace does not match this namespace, then a /// fully qualified name will be returned. /// The type name to use. public string GetTypeName(TypeUsage typeUsage, string modelNamespace) { return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace); } /// /// Returns the escaped type name to use for the given c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type to get a name for. /// If not null and the type's namespace does not match this namespace, then a /// fully qualified name will be returned. /// The type name to use. public string GetTypeName(EdmType edmType, string modelNamespace) { return GetTypeName(edmType, isNullable: null, modelNamespace: modelNamespace); } /// /// Returns the escaped type name to use for the given c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type to get a name for. /// Set this to true for nullable usage of this type. /// If not null and the type's namespace does not match this namespace, then a /// fully qualified name will be returned. /// The type name to use. private string GetTypeName(EdmType edmType, bool? isNullable, string modelNamespace) { if (edmType == null) { return null; } var collectionType = edmType as CollectionType; if (collectionType != null) { return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", GetTypeName(collectionType.TypeUsage, modelNamespace)); } // Try to get an external type name, and if that is null, then try to get escape the name from metadata, // possibly namespace-qualifying it. var typeName = Escape(edmType.MetadataProperties .Where(p => p.Name == ExternalTypeNameAttributeName) .Select(p => (string)p.Value) .FirstOrDefault()) ?? (modelNamespace != null && edmType.NamespaceName != modelNamespace ? CreateFullName(EscapeNamespace(edmType.NamespaceName), Escape(edmType)) : Escape(edmType)); if (edmType is StructuralType) { return typeName; } if (edmType is SimpleType) { var clrType = _ef.UnderlyingClrType(edmType); if (!(edmType is EnumType)) { typeName = Escape(clrType); } return clrType.IsValueType && isNullable == true ? String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName) : typeName; } throw new ArgumentException("typeUsage"); } } /// /// Responsible for making the Entity Framework Metadata more /// accessible for code generation. /// public class MetadataTools { private readonly DynamicTextTransformation _textTransformation; /// /// Initializes an MetadataTools Instance with the /// TextTransformation (T4 generated class) that is currently running /// public MetadataTools(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); } /// /// This method returns the underlying CLR type of the o-space type corresponding to the supplied /// Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. /// public Type ClrType(TypeUsage typeUsage) { return UnderlyingClrType(typeUsage.EdmType); } /// /// This method returns the underlying CLR type given the c-space type. /// Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. /// public Type UnderlyingClrType(EdmType edmType) { var primitiveType = edmType as PrimitiveType; if (primitiveType != null) { return primitiveType.ClrEquivalentType; } var enumType = edmType as EnumType; if (enumType != null) { return enumType.UnderlyingType.ClrEquivalentType; } return typeof(object); } /// /// True if the EdmProperty is a key of its DeclaringType, False otherwise. /// public bool IsKey(EdmProperty property) { if (property != null && property.DeclaringType.BuiltInTypeKind == BuiltInTypeKind.EntityType) { return ((EntityType)property.DeclaringType).KeyMembers.Contains(property); } return false; } /// /// True if the EdmProperty TypeUsage is Nullable, False otherwise. /// public bool IsNullable(EdmProperty property) { return property != null && IsNullable(property.TypeUsage); } /// /// True if the TypeUsage is Nullable, False otherwise. /// public bool IsNullable(TypeUsage typeUsage) { Facet nullableFacet = null; if (typeUsage != null && typeUsage.Facets.TryGetValue("Nullable", true, out nullableFacet)) { return (bool)nullableFacet.Value; } return false; } /// /// If the passed in TypeUsage represents a collection this method returns final element /// type of the collection, otherwise it returns the value passed in. /// public TypeUsage GetElementType(TypeUsage typeUsage) { if (typeUsage == null) { return null; } if (typeUsage.EdmType is CollectionType) { return GetElementType(((CollectionType)typeUsage.EdmType).TypeUsage); } else { return typeUsage; } } /// /// Returns the NavigationProperty that is the other end of the same association set if it is /// available, otherwise it returns null. /// public NavigationProperty Inverse(NavigationProperty navProperty) { if(navProperty == null) { return null; } EntityType toEntity = navProperty.ToEndMember.GetEntityType(); return toEntity.NavigationProperties .SingleOrDefault(n => Object.ReferenceEquals(n.RelationshipType, navProperty.RelationshipType) && !Object.ReferenceEquals(n, navProperty)); } /// /// Given a property on the dependent end of a referential constraint, returns the corresponding property on the principal end. /// Requires: The association has a referential constraint, and the specified dependentProperty is one of the properties on the dependent end. /// public EdmProperty GetCorrespondingPrincipalProperty(NavigationProperty navProperty, EdmProperty dependentProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } if (dependentProperty == null) { throw new ArgumentNullException("dependentProperty"); } ReadOnlyMetadataCollection fromProperties = GetPrincipalProperties(navProperty); ReadOnlyMetadataCollection toProperties = GetDependentProperties(navProperty); return fromProperties[toProperties.IndexOf(dependentProperty)]; } /// /// Given a property on the principal end of a referential constraint, returns the corresponding property on the dependent end. /// Requires: The association has a referential constraint, and the specified principalProperty is one of the properties on the principal end. /// public EdmProperty GetCorrespondingDependentProperty(NavigationProperty navProperty, EdmProperty principalProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } if (principalProperty == null) { throw new ArgumentNullException("principalProperty"); } ReadOnlyMetadataCollection fromProperties = GetPrincipalProperties(navProperty); ReadOnlyMetadataCollection toProperties = GetDependentProperties(navProperty); return toProperties[fromProperties.IndexOf(principalProperty)]; } /// /// Gets the collection of properties that are on the principal end of a referential constraint for the specified navigation property. /// Requires: The association has a referential constraint. /// public ReadOnlyMetadataCollection GetPrincipalProperties(NavigationProperty navProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } return ((AssociationType)navProperty.RelationshipType).ReferentialConstraints[0].FromProperties; } /// /// Gets the collection of properties that are on the dependent end of a referential constraint for the specified navigation property. /// Requires: The association has a referential constraint. /// public ReadOnlyMetadataCollection GetDependentProperties(NavigationProperty navProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } return ((AssociationType)navProperty.RelationshipType).ReferentialConstraints[0].ToProperties; } /// /// True if this entity type requires the HandleCascadeDelete method defined and the method has /// not been defined on any base type /// public bool NeedsHandleCascadeDeleteMethod(ItemCollection itemCollection, EntityType entity) { bool needsMethod = ContainsCascadeDeleteAssociation(itemCollection, entity); // Check to make sure no base types have already declared this method EntityType baseType = entity.BaseType as EntityType; while(needsMethod && baseType != null) { needsMethod = !ContainsCascadeDeleteAssociation(itemCollection, baseType); baseType = baseType.BaseType as EntityType; } return needsMethod; } /// /// True if this entity type participates in any relationships where the other end has an OnDelete /// cascade delete defined, or if it is the dependent in any identifying relationships /// private bool ContainsCascadeDeleteAssociation(ItemCollection itemCollection, EntityType entity) { return itemCollection.GetItems().Where(a => ((RefType)a.AssociationEndMembers[0].TypeUsage.EdmType).ElementType == entity && IsCascadeDeletePrincipal(a.AssociationEndMembers[1]) || ((RefType)a.AssociationEndMembers[1].TypeUsage.EdmType).ElementType == entity && IsCascadeDeletePrincipal(a.AssociationEndMembers[0])).Any(); } /// /// True if the source end of the specified navigation property is the principal in an identifying relationship. /// or if the source end has cascade delete defined. /// public bool IsCascadeDeletePrincipal(NavigationProperty navProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } return IsCascadeDeletePrincipal((AssociationEndMember)navProperty.FromEndMember); } /// /// True if the specified association end is the principal in an identifying relationship. /// or if the association end has cascade delete defined. /// public bool IsCascadeDeletePrincipal(AssociationEndMember associationEnd) { if (associationEnd == null) { throw new ArgumentNullException("associationEnd"); } return associationEnd.DeleteBehavior == OperationAction.Cascade || IsPrincipalEndOfIdentifyingRelationship(associationEnd); } /// /// True if the specified association end is the principal end in an identifying relationship. /// In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. /// public bool IsPrincipalEndOfIdentifyingRelationship(AssociationEndMember associationEnd) { if (associationEnd == null) { throw new ArgumentNullException("associationEnd"); } ReferentialConstraint refConstraint = ((AssociationType)associationEnd.DeclaringType).ReferentialConstraints.Where(rc => rc.FromRole == associationEnd).SingleOrDefault(); if (refConstraint != null) { EntityType entity = refConstraint.ToRole.GetEntityType(); return !refConstraint.ToProperties.Where(tp => !entity.KeyMembers.Contains(tp)).Any(); } return false; } /// /// True if the specified association type is an identifying relationship. /// In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. /// public bool IsIdentifyingRelationship(AssociationType association) { if (association == null) { throw new ArgumentNullException("association"); } return IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers[0]) || IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers[1]); } /// /// requires: firstType is not null /// effects: if secondType is among the base types of the firstType, return true, /// otherwise returns false. /// when firstType is same as the secondType, return false. /// public bool IsSubtypeOf(EdmType firstType, EdmType secondType) { if (secondType == null) { return false; } // walk up firstType hierarchy list for (EdmType t = firstType.BaseType; t != null; t = t.BaseType) { if (t == secondType) return true; } return false; } /// /// Returns the subtype of the EntityType in the current itemCollection /// public IEnumerable GetSubtypesOf(EntityType type, ItemCollection itemCollection, bool includeAbstractTypes) { if (type != null) { IEnumerable typesInCollection = itemCollection.GetItems(); foreach (EntityType typeInCollection in typesInCollection) { if (type.Equals(typeInCollection) == false && this.IsSubtypeOf(typeInCollection, type)) { if ( includeAbstractTypes || !typeInCollection.Abstract) { yield return typeInCollection; } } } } } public static bool TryGetStringMetadataPropertySetting(MetadataItem item, string propertyName, out string value) { value = null; MetadataProperty property = item.MetadataProperties.FirstOrDefault(p => p.Name == propertyName); if (property != null) { value = (string)property.Value; } return value != null; } } /// /// Responsible for loading an EdmItemCollection from a .edmx file or .csdl files /// public class MetadataLoader { private readonly DynamicTextTransformation _textTransformation; /// /// Initializes an MetadataLoader Instance with the /// TextTransformation (T4 generated class) that is currently running /// public MetadataLoader(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); } /// /// Load the metadata for Edm, Store, and Mapping collections and register them /// with a new MetadataWorkspace, returns false if any of the parts can't be /// created, some of the ItemCollections may be registered and usable even if false is /// returned /// public bool TryLoadAllMetadata(string inputFile, out MetadataWorkspace metadataWorkspace) { metadataWorkspace = new MetadataWorkspace(); EdmItemCollection edmItemCollection = CreateEdmItemCollection(inputFile); metadataWorkspace.RegisterItemCollection(edmItemCollection); StoreItemCollection storeItemCollection = null; if (TryCreateStoreItemCollection(inputFile, out storeItemCollection)) { StorageMappingItemCollection storageMappingItemCollection = null; if (TryCreateStorageMappingItemCollection(inputFile, edmItemCollection, storeItemCollection, out storageMappingItemCollection)) { metadataWorkspace.RegisterItemCollection(storeItemCollection); metadataWorkspace.RegisterItemCollection(storageMappingItemCollection); return true; } } return false; } /// /// Create an EdmItemCollection loaded with the metadata provided /// public EdmItemCollection CreateEdmItemCollection(string sourcePath, params string[] referenceSchemas) { EdmItemCollection edmItemCollection; if(TryCreateEdmItemCollection(sourcePath, referenceSchemas, out edmItemCollection)) { return edmItemCollection; } return new EdmItemCollection(); } /// /// Attempts to create a EdmItemCollection from the specified metadata file /// public bool TryCreateEdmItemCollection(string sourcePath, out EdmItemCollection edmItemCollection) { return TryCreateEdmItemCollection(sourcePath, null, out edmItemCollection); } /// /// Attempts to create a EdmItemCollection from the specified metadata file /// public bool TryCreateEdmItemCollection(string sourcePath, string[] referenceSchemas, out EdmItemCollection edmItemCollection) { edmItemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } if (referenceSchemas == null) { referenceSchemas = new string[0]; } ItemCollection itemCollection = null; sourcePath = _textTransformation.Host.ResolvePath(sourcePath); EdmItemCollectionBuilder collectionBuilder = new EdmItemCollectionBuilder(_textTransformation, referenceSchemas.Select(s => _textTransformation.Host.ResolvePath(s)).Where(s => s != sourcePath)); if (collectionBuilder.TryCreateItemCollection(sourcePath, out itemCollection)) { edmItemCollection = (EdmItemCollection)itemCollection; } return edmItemCollection != null; } /// /// Attempts to create a StoreItemCollection from the specified metadata file /// public bool TryCreateStoreItemCollection(string sourcePath, out StoreItemCollection storeItemCollection) { storeItemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } ItemCollection itemCollection = null; StoreItemCollectionBuilder collectionBuilder = new StoreItemCollectionBuilder(_textTransformation); if (collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), out itemCollection)) { storeItemCollection = (StoreItemCollection)itemCollection; } return storeItemCollection != null; } /// /// Attempts to create a StorageMappingItemCollection from the specified metadata file, EdmItemCollection, and StoreItemCollection /// public bool TryCreateStorageMappingItemCollection(string sourcePath, EdmItemCollection edmItemCollection, StoreItemCollection storeItemCollection, out StorageMappingItemCollection storageMappingItemCollection) { storageMappingItemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } if (edmItemCollection == null) { throw new ArgumentNullException("edmItemCollection"); } if (storeItemCollection == null) { throw new ArgumentNullException("storeItemCollection"); } ItemCollection itemCollection = null; StorageMappingItemCollectionBuilder collectionBuilder = new StorageMappingItemCollectionBuilder(_textTransformation, edmItemCollection, storeItemCollection); if (collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), out itemCollection)) { storageMappingItemCollection = (StorageMappingItemCollection)itemCollection; } return storageMappingItemCollection != null; } /// /// Gets the Model Namespace from the provided schema file. /// public string GetModelNamespace(string sourcePath) { if (!ValidateInputPath(sourcePath, _textTransformation)) { return String.Empty; } EdmItemCollectionBuilder builder = new EdmItemCollectionBuilder(_textTransformation); XElement model; if(builder.TryLoadRootElement(_textTransformation.Host.ResolvePath(sourcePath), out model)) { XAttribute attribute = model.Attribute("Namespace"); if (attribute != null) { return attribute.Value; } } return String.Empty; } /// /// Returns true if the specified file path is valid /// private static bool ValidateInputPath(string sourcePath, DynamicTextTransformation textTransformation) { if (String.IsNullOrEmpty(sourcePath)) { throw new ArgumentException("sourcePath"); } if(sourcePath == "$edmxInputFile$") { textTransformation.Errors.Add(new CompilerError(textTransformation.Host.TemplateFile ?? CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate"), -1, -1, string.Empty, CodeGenerationTools.GetResourceString("Template_ReplaceVsItemTemplateToken"))); return false; } return true; } /// /// Base class for ItemCollectionBuilder classes that /// loads the specific types of metadata /// private abstract class ItemCollectionBuilder { private readonly DynamicTextTransformation _textTransformation; private readonly string _fileExtension; private readonly string _edmxSectionName; private readonly string _rootElementName; /// /// FileExtension for individual (non-edmx) metadata file for this /// specific ItemCollection type /// public string FileExtension { get { return _fileExtension; } } /// /// The name of the XmlElement in the .edmx element /// to find this ItemCollection's metadata /// public string EdmxSectionName { get { return _edmxSectionName; } } /// /// The name of the root element of this ItemCollection's metadata /// public string RootElementName { get { return _rootElementName; } } /// /// Method to build the appropriate ItemCollection /// protected abstract ItemCollection CreateItemCollection(IEnumerable readers, out IList errors); /// /// Ctor to setup the ItemCollectionBuilder members /// protected ItemCollectionBuilder(DynamicTextTransformation textTransformation, string fileExtension, string edmxSectionName, string rootElementName) { _textTransformation = textTransformation; _fileExtension = fileExtension; _edmxSectionName = edmxSectionName; _rootElementName = rootElementName; } /// /// Selects a namespace from the supplied constants. /// protected abstract string GetNamespace(SchemaConstants constants); /// /// Try to create an ItemCollection loaded with the metadata provided /// public bool TryCreateItemCollection(string sourcePath, out ItemCollection itemCollection) { itemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } XElement schemaElement = null; if (TryLoadRootElement(sourcePath, out schemaElement)) { List readers = new List(); try { readers.Add(schemaElement.CreateReader()); IList errors = null; ItemCollection tempItemCollection = CreateItemCollection(readers, out errors); if (ProcessErrors(errors, sourcePath)) { return false; } itemCollection = tempItemCollection; return true; } finally { foreach (XmlReader reader in readers) { ((IDisposable)reader).Dispose(); } } } return false; } /// /// Tries to load the root element from the metadata file provided /// public bool TryLoadRootElement(string sourcePath, out XElement schemaElement) { schemaElement = null; string extension = Path.GetExtension(sourcePath); if (extension.Equals(".edmx", StringComparison.InvariantCultureIgnoreCase)) { return TryLoadRootElementFromEdmx(sourcePath, out schemaElement); } else if(extension.Equals(FileExtension, StringComparison.InvariantCultureIgnoreCase)) { // load from single metadata file (.csdl, .ssdl, or .msl) schemaElement = XElement.Load(sourcePath, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); return true; } return false; } /// /// Tries to load the root element from the provided edmxDocument /// private bool TryLoadRootElementFromEdmx(XElement edmxDocument, SchemaConstants schemaConstants, string sectionName, string rootElementName, out XElement rootElement) { rootElement = null; XNamespace edmxNs = schemaConstants.EdmxNamespace; XNamespace sectionNs = GetNamespace(schemaConstants); XElement runtime = edmxDocument.Element(edmxNs + "Runtime"); if (runtime == null) { return false; } XElement section = runtime.Element(edmxNs + sectionName); if (section == null) { return false; } string templateVersion; if (!TemplateMetadata.TryGetValue(MetadataConstants.TT_TEMPLATE_VERSION, out templateVersion)) { templateVersion = MetadataConstants.DEFAULT_TEMPLATE_VERSION; } if (schemaConstants.MinimumTemplateVersion > new Version(templateVersion)) { _textTransformation.Errors.Add(new CompilerError( _textTransformation.Host.TemplateFile ?? CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate"), -1, -1, string.Empty, CodeGenerationTools.GetResourceString("Template_UnsupportedSchema")) {IsWarning = true}); } rootElement = section.Element(sectionNs + rootElementName); return rootElement != null; } /// /// Tries to load the root element from the provided .edmx metadata file /// private bool TryLoadRootElementFromEdmx(string edmxPath, out XElement rootElement) { rootElement = null; XElement element = XElement.Load(edmxPath, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); return TryLoadRootElementFromEdmx(element, MetadataConstants.V3_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, out rootElement) || TryLoadRootElementFromEdmx(element, MetadataConstants.V2_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, out rootElement) || TryLoadRootElementFromEdmx(element, MetadataConstants.V1_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, out rootElement); } /// /// Takes an Enumerable of EdmSchemaErrors, and adds them /// to the errors collection of the template class /// private bool ProcessErrors(IEnumerable errors, string sourceFilePath) { bool foundErrors = false; foreach (EdmSchemaError error in errors) { CompilerError newError = new CompilerError(error.SchemaLocation, error.Line, error.Column, error.ErrorCode.ToString(CultureInfo.InvariantCulture), error.Message); newError.IsWarning = error.Severity == EdmSchemaErrorSeverity.Warning; foundErrors |= error.Severity == EdmSchemaErrorSeverity.Error; if (error.SchemaLocation == null) { newError.FileName = sourceFilePath; } _textTransformation.Errors.Add(newError); } return foundErrors; } } /// /// Builder class for creating a StorageMappingItemCollection /// private class StorageMappingItemCollectionBuilder : ItemCollectionBuilder { private readonly EdmItemCollection _edmItemCollection; private readonly StoreItemCollection _storeItemCollection; public StorageMappingItemCollectionBuilder(DynamicTextTransformation textTransformation, EdmItemCollection edmItemCollection, StoreItemCollection storeItemCollection) : base(textTransformation, MetadataConstants.MSL_EXTENSION, MetadataConstants.MSL_EDMX_SECTION_NAME, MetadataConstants.MSL_ROOT_ELEMENT_NAME) { _edmItemCollection = edmItemCollection; _storeItemCollection = storeItemCollection; } protected override ItemCollection CreateItemCollection(IEnumerable readers, out IList errors) { return MetadataItemCollectionFactory.CreateStorageMappingItemCollection(_edmItemCollection, _storeItemCollection, readers, out errors); } /// /// Selects a namespace from the supplied constants. /// protected override string GetNamespace(SchemaConstants constants) { return constants.MslNamespace; } } /// /// Builder class for creating a StoreItemCollection /// private class StoreItemCollectionBuilder : ItemCollectionBuilder { public StoreItemCollectionBuilder(DynamicTextTransformation textTransformation) : base(textTransformation, MetadataConstants.SSDL_EXTENSION, MetadataConstants.SSDL_EDMX_SECTION_NAME, MetadataConstants.SSDL_ROOT_ELEMENT_NAME) { } protected override ItemCollection CreateItemCollection(IEnumerable readers, out IList errors) { return MetadataItemCollectionFactory.CreateStoreItemCollection(readers, out errors); } /// /// Selects a namespace from the supplied constants. /// protected override string GetNamespace(SchemaConstants constants) { return constants.SsdlNamespace; } } /// /// Builder class for creating a EdmItemCollection /// private class EdmItemCollectionBuilder : ItemCollectionBuilder { private List _referenceSchemas = new List(); public EdmItemCollectionBuilder(DynamicTextTransformation textTransformation) : base(textTransformation, MetadataConstants.CSDL_EXTENSION, MetadataConstants.CSDL_EDMX_SECTION_NAME, MetadataConstants.CSDL_ROOT_ELEMENT_NAME) { } public EdmItemCollectionBuilder(DynamicTextTransformation textTransformation, IEnumerable referenceSchemas) : this(textTransformation) { _referenceSchemas.AddRange(referenceSchemas); } protected override ItemCollection CreateItemCollection(IEnumerable readers, out IList errors) { List ownedReaders = new List(); List allReaders = new List(); try { allReaders.AddRange(readers); foreach (string path in _referenceSchemas.Distinct()) { XElement reference; if(TryLoadRootElement(path, out reference)) { XmlReader reader = reference.CreateReader(); allReaders.Add(reader); ownedReaders.Add(reader); } } return MetadataItemCollectionFactory.CreateEdmItemCollection(allReaders, out errors); } finally { foreach (XmlReader reader in ownedReaders) { ((IDisposable)reader).Dispose(); } } } /// /// Selects a namespace from the supplied constants. /// protected override string GetNamespace(SchemaConstants constants) { return constants.CsdlNamespace; } } } /// /// Responsible for encapsulating the retrieval and translation of the CodeGeneration /// annotations in the EntityFramework Metadata to a form that is useful in code generation. /// public static class Accessibility { private const string GETTER_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:GetterAccess"; private const string SETTER_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:SetterAccess"; private const string TYPE_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:TypeAccess"; private const string METHOD_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:MethodAccess"; private const string ACCESS_PROTECTED = "Protected"; private const string ACCESS_INTERNAL = "Internal"; private const string ACCESS_PRIVATE = "Private"; private static readonly Dictionary AccessibilityRankIdLookup = new Dictionary { { "private", 1}, { "internal", 2}, { "protected", 3}, { "public", 4}, }; /// /// Gets the accessibility that should be applied to a type being generated from the provided GlobalItem. /// /// defaults to public if no annotation is found. /// public static string ForType(GlobalItem item) { if (item == null) { return null; } return GetAccessibility(item, TYPE_ACCESS); } /// /// Gets the accessibility that should be applied at the property level for a property being /// generated from the provided EdmMember. /// /// defaults to public if no annotation is found. /// public static string ForProperty(EdmMember member) { if (member == null) { return null; } string getterAccess, setterAccess, propertyAccess; CalculatePropertyAccessibility(member, out propertyAccess, out getterAccess, out setterAccess); return propertyAccess; } /// /// Gets the accessibility that should be applied at the property level for a Read-Only property being /// generated from the provided EdmMember. /// /// defaults to public if no annotation is found. /// public static string ForReadOnlyProperty(EdmMember member) { if (member == null) { return null; } return GetAccessibility(member, GETTER_ACCESS); } /// /// Gets the accessibility that should be applied at the property level for a property being /// generated from the provided EntitySet. /// /// defaults to public if no annotation is found. /// public static string ForReadOnlyProperty(EntitySet set) { if (set == null) { return null; } return GetAccessibility(set, GETTER_ACCESS); } /// /// Gets the accessibility that should be applied at the property level for a Write-Only property being /// generated from the provided EdmMember. /// /// defaults to public if no annotation is found. /// public static string ForWriteOnlyProperty(EdmMember member) { if (member == null) { return null; } return GetAccessibility(member, SETTER_ACCESS); } /// /// Gets the accessibility that should be applied at the get level for a property being /// generated from the provided EdmMember. /// /// defaults to empty if no annotation is found or the accessibility is the same as the property level. /// public static string ForGetter(EdmMember member) { if (member == null) { return null; } string getterAccess, setterAccess, propertyAccess; CalculatePropertyAccessibility(member, out propertyAccess, out getterAccess, out setterAccess); return getterAccess; } /// /// Gets the accessibility that should be applied at the set level for a property being /// generated from the provided EdmMember. /// /// defaults to empty if no annotation is found or the accessibility is the same as the property level. /// public static string ForSetter(EdmMember member) { if (member == null) { return null; } string getterAccess, setterAccess, propertyAccess; CalculatePropertyAccessibility(member, out propertyAccess, out getterAccess, out setterAccess); return setterAccess; } /// /// Gets the accessibility that should be applied to a method being generated from the provided EdmFunction. /// /// defaults to public if no annotation is found. /// public static string ForMethod(EdmFunction function) { if (function == null) { return null; } return GetAccessibility(function, METHOD_ACCESS); } private static void CalculatePropertyAccessibility(MetadataItem item, out string propertyAccessibility, out string getterAccessibility, out string setterAccessibility) { getterAccessibility = GetAccessibility(item, GETTER_ACCESS); int getterRank = AccessibilityRankIdLookup[getterAccessibility]; setterAccessibility = GetAccessibility(item, SETTER_ACCESS); int setterRank = AccessibilityRankIdLookup[setterAccessibility]; int propertyRank = Math.Max(getterRank, setterRank); if (setterRank == propertyRank) { setterAccessibility = String.Empty; } if (getterRank == propertyRank) { getterAccessibility = String.Empty; } propertyAccessibility = AccessibilityRankIdLookup.Where(v => v.Value == propertyRank).Select(v => v.Key).Single(); } private static string GetAccessibility(MetadataItem item, string name) { string accessibility; if (MetadataTools.TryGetStringMetadataPropertySetting(item, name, out accessibility)) { return TranslateUserAccessibilityToCSharpAccessibility(accessibility); } return "public"; } private static string TranslateUserAccessibilityToCSharpAccessibility(string userAccessibility) { if (userAccessibility == ACCESS_PROTECTED) { return "protected"; } else if (userAccessibility == ACCESS_INTERNAL) { return "internal"; } else if (userAccessibility == ACCESS_PRIVATE) { return "private"; } else { // default to public return "public"; } } } /// /// Responsible for creating source code regions in code when the loop inside /// actually produces something. /// public class CodeRegion { private const int STANDARD_INDENT_LENGTH = 4; private readonly DynamicTextTransformation _textTransformation; private int _beforeRegionLength; private int _emptyRegionLength; private int _regionIndentLevel = -1; /// /// Initializes an CodeRegion instance with the /// TextTransformation (T4 generated class) that is currently running /// public CodeRegion(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); } /// /// Initializes an CodeRegion instance with the /// TextTransformation (T4 generated class) that is currently running, /// and the indent level to start the first region at. /// public CodeRegion(object textTransformation, int firstIndentLevel) : this(textTransformation) { if (firstIndentLevel < 0) { throw new ArgumentException("firstIndentLevel"); } _regionIndentLevel = firstIndentLevel - 1; } /// /// Starts the begining of a region /// public void Begin(string regionName) { if (regionName == null) { throw new ArgumentNullException("regionName"); } Begin(regionName, 1); } /// /// Start the begining of a region, indented /// the numbers of levels specified /// public void Begin(string regionName, int levelsToIncreaseIndent) { if (regionName == null) { throw new ArgumentNullException("regionName"); } _beforeRegionLength = _textTransformation.GenerationEnvironment.Length; _regionIndentLevel += levelsToIncreaseIndent; _textTransformation.Write(GetIndent(_regionIndentLevel)); _textTransformation.WriteLine("#region " + regionName); _emptyRegionLength = _textTransformation.GenerationEnvironment.Length; } /// /// Ends a region, or totaly removes it if nothing /// was generted since the begining of the region. /// public void End() { End(1); } /// /// Ends a region, or totaly removes it if nothing /// was generted since the begining of the region, also outdents /// the number of levels specified. /// public void End(int levelsToDecrease) { int indentLevel = _regionIndentLevel; _regionIndentLevel -= levelsToDecrease; if (_emptyRegionLength == _textTransformation.GenerationEnvironment.Length) _textTransformation.GenerationEnvironment.Length = _beforeRegionLength; else { _textTransformation.WriteLine(String.Empty); _textTransformation.Write(GetIndent(indentLevel)); _textTransformation.WriteLine("#endregion"); _textTransformation.WriteLine(String.Empty); } } /// /// Gets the current indent level that the next end region statement will be written /// at /// public int CurrentIndentLevel { get { return _regionIndentLevel; } } /// /// Get a string of spaces equivelent to the number of indents /// desired. /// public static string GetIndent(int indentLevel) { if (indentLevel < 0) { throw new ArgumentException("indentLevel"); } return String.Empty.PadLeft(indentLevel * STANDARD_INDENT_LENGTH); } } /// /// Responsible for collecting together the actual method parameters /// and the parameters that need to be sent to the Execute method. /// public class FunctionImportParameter { public FunctionParameter Source { get; set; } public string RawFunctionParameterName { get; set; } public string FunctionParameterName { get; set; } public string FunctionParameterType { get; set; } public string LocalVariableName { get; set; } public string RawClrTypeName { get; set; } public string ExecuteParameterName { get; set; } public string EsqlParameterName { get; set; } public bool NeedsLocalVariable { get; set; } public bool IsNullableOfT { get; set; } /// /// Creates a set of FunctionImportParameter objects from the parameters passed in. /// public static IEnumerable Create(IEnumerable parameters, CodeGenerationTools code, MetadataTools ef) { if (parameters == null) { throw new ArgumentNullException("parameters"); } if (code == null) { throw new ArgumentNullException("code"); } if (ef == null) { throw new ArgumentNullException("ef"); } UniqueIdentifierService unique = new UniqueIdentifierService(); List importParameters = new List(); foreach (FunctionParameter parameter in parameters) { FunctionImportParameter importParameter = new FunctionImportParameter(); importParameter.Source = parameter; importParameter.RawFunctionParameterName = unique.AdjustIdentifier(code.CamelCase(parameter.Name)); importParameter.FunctionParameterName = code.Escape(importParameter.RawFunctionParameterName); if (parameter.Mode == ParameterMode.In) { TypeUsage typeUsage = parameter.TypeUsage; importParameter.NeedsLocalVariable = true; importParameter.FunctionParameterType = code.GetTypeName(typeUsage); importParameter.EsqlParameterName = parameter.Name; Type clrType = ef.UnderlyingClrType(parameter.TypeUsage.EdmType); importParameter.RawClrTypeName = typeUsage.EdmType is EnumType ? code.GetTypeName(typeUsage.EdmType) : code.Escape(clrType); importParameter.IsNullableOfT = clrType.IsValueType; } else { importParameter.NeedsLocalVariable = false; importParameter.FunctionParameterType = "ObjectParameter"; importParameter.ExecuteParameterName = importParameter.FunctionParameterName; } importParameters.Add(importParameter); } // we save the local parameter uniquification for a second pass to make the visible parameters // as pretty and sensible as possible for (int i = 0; i < importParameters.Count; i++) { FunctionImportParameter importParameter = importParameters[i]; if (importParameter.NeedsLocalVariable) { importParameter.LocalVariableName = unique.AdjustIdentifier(importParameter.RawFunctionParameterName + "Parameter"); importParameter.ExecuteParameterName = importParameter.LocalVariableName; } } return importParameters; } // // Class to create unique variables within the same scope // private sealed class UniqueIdentifierService { private readonly HashSet _knownIdentifiers; public UniqueIdentifierService() { _knownIdentifiers = new HashSet(StringComparer.Ordinal); } /// /// Given an identifier, makes it unique within the scope by adding /// a suffix (1, 2, 3, ...), and returns the adjusted identifier. /// public string AdjustIdentifier(string identifier) { // find a unique name by adding suffix as necessary int numberOfConflicts = 0; string adjustedIdentifier = identifier; while (!_knownIdentifiers.Add(adjustedIdentifier)) { ++numberOfConflicts; adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture); } return adjustedIdentifier; } } } /// /// Responsible for marking the various sections of the generation, /// so they can be split up into separate files /// public class EntityFrameworkTemplateFileManager { /// /// Creates the VsEntityFrameworkTemplateFileManager if VS is detected, otherwise /// creates the file system version. /// public static EntityFrameworkTemplateFileManager Create(object textTransformation) { DynamicTextTransformation transformation = DynamicTextTransformation.Create(textTransformation); IDynamicHost host = transformation.Host; #if !PREPROCESSED_TEMPLATE var hostServiceProvider = host.AsIServiceProvider(); if (hostServiceProvider != null) { EnvDTE.DTE dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); if (dte != null) { return new VsEntityFrameworkTemplateFileManager(transformation); } } #endif return new EntityFrameworkTemplateFileManager(transformation); } private sealed class Block { public String Name; public int Start, Length; } private readonly List files = new List(); private readonly Block footer = new Block(); private readonly Block header = new Block(); private readonly DynamicTextTransformation _textTransformation; // reference to the GenerationEnvironment StringBuilder on the // TextTransformation object private readonly StringBuilder _generationEnvironment; private Block currentBlock; /// /// Initializes an EntityFrameworkTemplateFileManager Instance with the /// TextTransformation (T4 generated class) that is currently running /// private EntityFrameworkTemplateFileManager(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); _generationEnvironment = _textTransformation.GenerationEnvironment; } /// /// Marks the end of the last file if there was one, and starts a new /// and marks this point in generation as a new file. /// public void StartNewFile(string name) { if (name == null) { throw new ArgumentNullException("name"); } CurrentBlock = new Block { Name = name }; } public void StartFooter() { CurrentBlock = footer; } public void StartHeader() { CurrentBlock = header; } public void EndBlock() { if (CurrentBlock == null) { return; } CurrentBlock.Length = _generationEnvironment.Length - CurrentBlock.Start; if (CurrentBlock != header && CurrentBlock != footer) { files.Add(CurrentBlock); } currentBlock = null; } /// /// Produce the template output files. /// public virtual IEnumerable Process(bool split = true) { var generatedFileNames = new List(); if (split) { EndBlock(); var headerText = _generationEnvironment.ToString(header.Start, header.Length); var footerText = _generationEnvironment.ToString(footer.Start, footer.Length); var outputPath = Path.GetDirectoryName(_textTransformation.Host.TemplateFile); files.Reverse(); foreach (var block in files) { var fileName = Path.Combine(outputPath, block.Name); var content = headerText + _generationEnvironment.ToString(block.Start, block.Length) + footerText; generatedFileNames.Add(fileName); CreateFile(fileName, content); _generationEnvironment.Remove(block.Start, block.Length); } } return generatedFileNames; } protected virtual void CreateFile(string fileName, string content) { if (IsFileContentDifferent(fileName, content)) { File.WriteAllText(fileName, content); } } protected bool IsFileContentDifferent(String fileName, string newContent) { return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent); } private Block CurrentBlock { get { return currentBlock; } set { if (CurrentBlock != null) { EndBlock(); } if (value != null) { value.Start = _generationEnvironment.Length; } currentBlock = value; } } #if !PREPROCESSED_TEMPLATE private sealed class VsEntityFrameworkTemplateFileManager : EntityFrameworkTemplateFileManager { private EnvDTE.ProjectItem templateProjectItem; private EnvDTE.DTE dte; private Action checkOutAction; private Action> projectSyncAction; /// /// Creates an instance of the VsEntityFrameworkTemplateFileManager class with the IDynamicHost instance /// public VsEntityFrameworkTemplateFileManager(object textTemplating) : base(textTemplating) { var hostServiceProvider = _textTransformation.Host.AsIServiceProvider(); if (hostServiceProvider == null) { throw new ArgumentNullException("Could not obtain hostServiceProvider"); } dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); if (dte == null) { throw new ArgumentNullException("Could not obtain DTE from host"); } templateProjectItem = dte.Solution.FindProjectItem(_textTransformation.Host.TemplateFile); checkOutAction = fileName => dte.SourceControl.CheckOutItem(fileName); projectSyncAction = keepFileNames => ProjectSync(templateProjectItem, keepFileNames); } public override IEnumerable Process(bool split) { if (templateProjectItem.ProjectItems == null) { return new List(); } var generatedFileNames = base.Process(split); projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null)); return generatedFileNames; } protected override void CreateFile(string fileName, string content) { if (IsFileContentDifferent(fileName, content)) { CheckoutFileIfRequired(fileName); File.WriteAllText(fileName, content); } } private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable keepFileNames) { var keepFileNameSet = new HashSet(keepFileNames); var projectFiles = new Dictionary(); var originalOutput = Path.GetFileNameWithoutExtension(templateProjectItem.FileNames[0]); foreach (EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) { projectFiles.Add(projectItem.FileNames[0], projectItem); } // Remove unused items from the project foreach (var pair in projectFiles) { if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalOutput + ".")) { pair.Value.Delete(); } } // Add missing files to the project foreach (string fileName in keepFileNameSet) { if (!projectFiles.ContainsKey(fileName)) { templateProjectItem.ProjectItems.AddFromFile(fileName); } } } private void CheckoutFileIfRequired(string fileName) { if (dte.SourceControl == null || !dte.SourceControl.IsItemUnderSCC(fileName) || dte.SourceControl.IsItemCheckedOut(fileName)) { return; } // run on worker thread to prevent T4 calling back into VS checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null)); } } #endif } /// /// Responsible creating an instance that can be passed /// to helper classes that need to access the TextTransformation /// members. It accesses member by name and signature rather than /// by type. This is necessary when the /// template is being used in Preprocessed mode /// and there is no common known type that can be /// passed instead /// public class DynamicTextTransformation { private object _instance; IDynamicHost _dynamicHost; private readonly MethodInfo _write; private readonly MethodInfo _writeLine; private readonly PropertyInfo _generationEnvironment; private readonly PropertyInfo _errors; private readonly PropertyInfo _host; /// /// Creates an instance of the DynamicTextTransformation class around the passed in /// TextTransformation shapped instance passed in, or if the passed in instance /// already is a DynamicTextTransformation, it casts it and sends it back. /// public static DynamicTextTransformation Create(object instance) { if (instance == null) { throw new ArgumentNullException("instance"); } DynamicTextTransformation textTransformation = instance as DynamicTextTransformation; if (textTransformation != null) { return textTransformation; } return new DynamicTextTransformation(instance); } private DynamicTextTransformation(object instance) { _instance = instance; Type type = _instance.GetType(); _write = type.GetMethod("Write", new Type[] { typeof(string) }); _writeLine = type.GetMethod("WriteLine", new Type[] { typeof(string) }); _generationEnvironment = type.GetProperty("GenerationEnvironment", BindingFlags.Instance | BindingFlags.NonPublic); _host = type.GetProperty("Host"); _errors = type.GetProperty("Errors"); } /// /// Gets the value of the wrapped TextTranformation instance's GenerationEnvironment property /// public StringBuilder GenerationEnvironment { get { return (StringBuilder)_generationEnvironment.GetValue(_instance, null); } } /// /// Gets the value of the wrapped TextTranformation instance's Errors property /// public System.CodeDom.Compiler.CompilerErrorCollection Errors { get { return (System.CodeDom.Compiler.CompilerErrorCollection)_errors.GetValue(_instance, null); } } /// /// Calls the wrapped TextTranformation instance's Write method. /// public void Write(string text) { _write.Invoke(_instance, new object[] { text }); } /// /// Calls the wrapped TextTranformation instance's WriteLine method. /// public void WriteLine(string text) { _writeLine.Invoke(_instance, new object[] { text }); } /// /// Gets the value of the wrapped TextTranformation instance's Host property /// if available (shows up when hostspecific is set to true in the template directive) and returns /// the appropriate implementation of IDynamicHost /// public IDynamicHost Host { get { if (_dynamicHost == null) { if(_host == null) { _dynamicHost = new NullHost(); } else { _dynamicHost = new DynamicHost(_host.GetValue(_instance, null)); } } return _dynamicHost; } } } /// /// Reponsible for abstracting the use of Host between times /// when it is available and not /// public interface IDynamicHost { /// /// An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue /// string ResolveParameterValue(string id, string name, string otherName); /// /// An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath /// string ResolvePath(string path); /// /// An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile /// string TemplateFile { get; } /// /// Returns the Host instance cast as an IServiceProvider /// IServiceProvider AsIServiceProvider(); } /// /// Reponsible for implementing the IDynamicHost as a dynamic /// shape wrapper over the Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost interface /// rather than type dependent wrapper. We don't use the /// interface type so that the code can be run in preprocessed mode /// on a .net framework only installed machine. /// public class DynamicHost : IDynamicHost { private readonly object _instance; private readonly MethodInfo _resolveParameterValue; private readonly MethodInfo _resolvePath; private readonly PropertyInfo _templateFile; /// /// Creates an instance of the DynamicHost class around the passed in /// Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost shapped instance passed in. /// public DynamicHost(object instance) { _instance = instance; Type type = _instance.GetType(); _resolveParameterValue = type.GetMethod("ResolveParameterValue", new Type[] { typeof(string), typeof(string), typeof(string) }); _resolvePath = type.GetMethod("ResolvePath", new Type[] { typeof(string) }); _templateFile = type.GetProperty("TemplateFile"); } /// /// A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue /// public string ResolveParameterValue(string id, string name, string otherName) { return (string)_resolveParameterValue.Invoke(_instance, new object[] { id, name, otherName }); } /// /// A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath /// public string ResolvePath(string path) { return (string)_resolvePath.Invoke(_instance, new object[] { path }); } /// /// A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile /// public string TemplateFile { get { return (string)_templateFile.GetValue(_instance, null); } } /// /// Returns the Host instance cast as an IServiceProvider /// public IServiceProvider AsIServiceProvider() { return _instance as IServiceProvider; } } /// /// Reponsible for implementing the IDynamicHost when the /// Host property is not available on the TextTemplating type. The Host /// property only exists when the hostspecific attribute of the template /// directive is set to true. /// public class NullHost : IDynamicHost { /// /// An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue /// that simply retuns null. /// public string ResolveParameterValue(string id, string name, string otherName) { return null; } /// /// An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath /// that simply retuns the path passed in. /// public string ResolvePath(string path) { return path; } /// /// An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile /// that returns null. /// public string TemplateFile { get { return null; } } /// /// Returns null. /// public IServiceProvider AsIServiceProvider() { return null; } } /// /// Responsible for encapsulating the constants defined in Metadata /// public static class MetadataConstants { public const string CSDL_EXTENSION = ".csdl"; public const string CSDL_EDMX_SECTION_NAME = "ConceptualModels"; public const string CSDL_ROOT_ELEMENT_NAME = "Schema"; public const string EDM_ANNOTATION_09_02 = "http://schemas.microsoft.com/ado/2009/02/edm/annotation"; public const string SSDL_EXTENSION = ".ssdl"; public const string SSDL_EDMX_SECTION_NAME = "StorageModels"; public const string SSDL_ROOT_ELEMENT_NAME = "Schema"; public const string MSL_EXTENSION = ".msl"; public const string MSL_EDMX_SECTION_NAME = "Mappings"; public const string MSL_ROOT_ELEMENT_NAME = "Mapping"; public const string TT_TEMPLATE_NAME = "TemplateName"; public const string TT_TEMPLATE_VERSION = "TemplateVersion"; public const string TT_MINIMUM_ENTITY_FRAMEWORK_VERSION = "MinimumEntityFrameworkVersion"; public const string DEFAULT_TEMPLATE_VERSION = "4.0"; public static readonly SchemaConstants V1_SCHEMA_CONSTANTS = new SchemaConstants( "http://schemas.microsoft.com/ado/2007/06/edmx", "http://schemas.microsoft.com/ado/2006/04/edm", "http://schemas.microsoft.com/ado/2006/04/edm/ssdl", "urn:schemas-microsoft-com:windows:storage:mapping:CS", new Version("3.5")); public static readonly SchemaConstants V2_SCHEMA_CONSTANTS = new SchemaConstants( "http://schemas.microsoft.com/ado/2008/10/edmx", "http://schemas.microsoft.com/ado/2008/09/edm", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl", "http://schemas.microsoft.com/ado/2008/09/mapping/cs", new Version("4.0")); public static readonly SchemaConstants V3_SCHEMA_CONSTANTS = new SchemaConstants( "http://schemas.microsoft.com/ado/2009/11/edmx", "http://schemas.microsoft.com/ado/2009/11/edm", "http://schemas.microsoft.com/ado/2009/11/edm/ssdl", "http://schemas.microsoft.com/ado/2009/11/mapping/cs", new Version("5.0")); } public struct SchemaConstants { public SchemaConstants(string edmxNamespace, string csdlNamespace, string ssdlNamespace, string mslNamespace, Version minimumTemplateVersion) : this() { EdmxNamespace = edmxNamespace; CsdlNamespace = csdlNamespace; SsdlNamespace = ssdlNamespace; MslNamespace = mslNamespace; MinimumTemplateVersion = minimumTemplateVersion; } public string EdmxNamespace { get; private set; } public string CsdlNamespace { get; private set; } public string SsdlNamespace { get; private set; } public string MslNamespace { get; private set; } public Version MinimumTemplateVersion { get; private set; } } } #region Base class /// /// Base class for this transformation /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")] public class CSharpCodeGenTemplateBase { #region Fields private global::System.Text.StringBuilder generationEnvironmentField; private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; private global::System.Collections.Generic.List indentLengthsField; private string currentIndentField = ""; private bool endsWithNewline; private global::System.Collections.Generic.IDictionary sessionField; #endregion #region Properties /// /// The string builder that generation-time code is using to assemble generated output /// protected System.Text.StringBuilder GenerationEnvironment { get { if ((this.generationEnvironmentField == null)) { this.generationEnvironmentField = new global::System.Text.StringBuilder(); } return this.generationEnvironmentField; } set { this.generationEnvironmentField = value; } } /// /// The error collection for the generation process /// public System.CodeDom.Compiler.CompilerErrorCollection Errors { get { if ((this.errorsField == null)) { this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); } return this.errorsField; } } /// /// A list of the lengths of each indent that was added with PushIndent /// private System.Collections.Generic.List indentLengths { get { if ((this.indentLengthsField == null)) { this.indentLengthsField = new global::System.Collections.Generic.List(); } return this.indentLengthsField; } } /// /// Gets the current indent we use when adding lines to the output /// public string CurrentIndent { get { return this.currentIndentField; } } /// /// Current transformation session /// public virtual global::System.Collections.Generic.IDictionary Session { get { return this.sessionField; } set { this.sessionField = value; } } #endregion #region Transform-time helpers /// /// Write text directly into the generated output /// public void Write(string textToAppend) { if (string.IsNullOrEmpty(textToAppend)) { return; } // If we're starting off, or if the previous text ended with a newline, // we have to append the current indent first. if (((this.GenerationEnvironment.Length == 0) || this.endsWithNewline)) { this.GenerationEnvironment.Append(this.currentIndentField); this.endsWithNewline = false; } // Check if the current text ends with a newline if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) { this.endsWithNewline = true; } // This is an optimization. If the current indent is "", then we don't have to do any // of the more complex stuff further down. if ((this.currentIndentField.Length == 0)) { this.GenerationEnvironment.Append(textToAppend); return; } // Everywhere there is a newline in the text, add an indent after it textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); // If the text ends with a newline, then we should strip off the indent added at the very end // because the appropriate indent will be added when the next time Write() is called if (this.endsWithNewline) { this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); } else { this.GenerationEnvironment.Append(textToAppend); } } /// /// Write text directly into the generated output /// public void WriteLine(string textToAppend) { this.Write(textToAppend); this.GenerationEnvironment.AppendLine(); this.endsWithNewline = true; } /// /// Write formatted text directly into the generated output /// public void Write(string format, params object[] args) { this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); } /// /// Write formatted text directly into the generated output /// public void WriteLine(string format, params object[] args) { this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); } /// /// Raise an error /// public void Error(string message) { System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); error.ErrorText = message; this.Errors.Add(error); } /// /// Raise a warning /// public void Warning(string message) { System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); error.ErrorText = message; error.IsWarning = true; this.Errors.Add(error); } /// /// Increase the indent /// public void PushIndent(string indent) { if ((indent == null)) { throw new global::System.ArgumentNullException("indent"); } this.currentIndentField = (this.currentIndentField + indent); this.indentLengths.Add(indent.Length); } /// /// Remove the last indent that was added with PushIndent /// public string PopIndent() { string returnValue = ""; if ((this.indentLengths.Count > 0)) { int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); if ((indentLength > 0)) { returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); } } return returnValue; } /// /// Remove any indentation /// public void ClearIndent() { this.indentLengths.Clear(); this.currentIndentField = ""; } #endregion #region ToString Helpers /// /// Utility class to produce culture-oriented representation of an object as a string. /// public class ToStringInstanceHelper { private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; /// /// Gets or sets format provider to be used by ToStringWithCulture method. /// public System.IFormatProvider FormatProvider { get { return this.formatProviderField ; } set { if ((value != null)) { this.formatProviderField = value; } } } /// /// This is called from the compile/run appdomain to convert objects within an expression block to a string /// public string ToStringWithCulture(object objectToConvert) { if ((objectToConvert == null)) { throw new global::System.ArgumentNullException("objectToConvert"); } System.Type t = objectToConvert.GetType(); System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { typeof(System.IFormatProvider)}); if ((method == null)) { return objectToConvert.ToString(); } else { return ((string)(method.Invoke(objectToConvert, new object[] { this.formatProviderField }))); } } } private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); /// /// Helper to produce culture-oriented representation of an object as a string /// public ToStringInstanceHelper ToStringHelper { get { return this.toStringHelperField; } } #endregion } #endregion } // ------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version: 11.0.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // // ------------------------------------------------------------------------------ namespace TemplateCodeGenerators { using System; using System.Linq; using System.IO; using System.Collections.Generic; using System.Data.Objects; using System.Data.Objects.DataClasses; using System.Xml; using System.Xml.Linq; using System.Globalization; using System.Reflection; using System.Data.Metadata.Edm; using System.Data.Mapping; using System.Data.Entity.Design; using System.CodeDom; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Text; /// /// Class to produce the template output /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")] public partial class CSharpCodeGenTemplateV50 : CSharpCodeGenTemplateV50Base { /// /// Create the template output /// public virtual string TransformText() { // // // // // // // // // // // // // // // // // DefineMetadata(); UserSettings userSettings = new UserSettings { SourceCsdlPath = @"$edmxInputFile$", ReferenceCsdlPaths = new string[] {}, FullyQualifySystemTypes = true, CreateContextAddToMethods = true, CamelCaseFields = false, }; ApplyUserSettings(userSettings); if(Errors.HasErrors) { return String.Empty; } MetadataLoader loader = new MetadataLoader(this); MetadataTools ef = new MetadataTools(this); CodeRegion region = new CodeRegion(this); CodeGenerationTools code = new CodeGenerationTools(this){FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, CamelCaseFields = userSettings.CamelCaseFields}; ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray()); ModelNamespace = loader.GetModelNamespace(SourceCsdlPath); string namespaceName = GetNamespaceName(code); UpdateObjectNamespaceMap(namespaceName); this.Write("//------------------------------------------------------------------------------\r" + "\n// \r\n// "); this.Write(this.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1"))); this.Write("\r\n//\r\n// "); this.Write(this.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2"))); this.Write("\r\n// "); this.Write(this.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3"))); this.Write(@" // //------------------------------------------------------------------------------ using System; using System.ComponentModel; using System.Data.EntityClient; using System.Data.Objects; using System.Data.Objects.DataClasses; using System.Linq; using System.Runtime.Serialization; using System.Xml.Serialization; [assembly: EdmSchemaAttribute()] "); //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionRelationships")); bool first = true; foreach (AssociationType association in GetSourceSchemaTypes()) { if (first) { WriteLine(string.Empty); first = false; } this.Write("[assembly: EdmRelationshipAttribute(\""); this.Write(this.ToStringHelper.ToStringWithCulture(association.NamespaceName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(association.Name)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(EndName(association, 0))); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(EndMultiplicity(association, 0, code))); this.Write(", typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(EscapeEndTypeName(association, 0, code))); this.Write("), \""); this.Write(this.ToStringHelper.ToStringWithCulture(EndName(association, 1))); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(EndMultiplicity(association, 1, code))); this.Write(", typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(EscapeEndTypeName(association, 1, code))); this.Write(")"); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", association.IsForeignKey ? "true" : null))); this.Write(")]\r\n"); } region.End(); if (!String.IsNullOrEmpty(namespaceName)) { this.Write("namespace "); this.Write(this.ToStringHelper.ToStringWithCulture(namespaceName)); this.Write("\r\n{\r\n"); PushIndent(CodeRegion.GetIndent(1)); } //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionContexts")); foreach (EntityContainer container in GetSourceSchemaTypes()) { this.Write("\r\n/// \r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(container))); this.Write("\r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(container, region.CurrentIndentLevel))); this.Write("\r\n"); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(container))); this.Write(" partial class "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write(" : ObjectContext\r\n{\r\n #region "); this.Write(this.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_RegionConstructors"))); this.Write("\r\n\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ContextDefaultCtorComment"), container.Name, container.Name))); this.Write("\r\n /// \r\n public "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write("() : base(\"name="); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\")\r\n {\r\n"); WriteLazyLoadingEnabled(container); this.Write(" OnContextCreated();\r\n }\r\n\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ContextCommonCtorComment"), container.Name))); this.Write("\r\n /// \r\n public "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write("(string connectionString) : base(connectionString, \""); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\")\r\n {\r\n"); WriteLazyLoadingEnabled(container); this.Write(" OnContextCreated();\r\n }\r\n\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ContextCommonCtorComment"), container.Name))); this.Write("\r\n /// \r\n public "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(container))); this.Write("(EntityConnection connection) : base(connection, \""); this.Write(this.ToStringHelper.ToStringWithCulture(container.Name)); this.Write("\")\r\n {\r\n"); WriteLazyLoadingEnabled(container); this.Write(" OnContextCreated();\r\n }\r\n\r\n #endregion\r\n\r\n #region "); this.Write(this.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_RegionPartialMethods"))); this.Write("\r\n\r\n partial void OnContextCreated();\r\n\r\n #endregion\r\n\r\n"); //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionObjectSetProperties")); foreach (EntitySet set in container.BaseEntitySets.OfType()) { VerifyEntityTypeAndSetAccessibilityCompatability(set); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(set))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(set, region.CurrentIndentLevel))); this.Write("\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(set)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForReadOnlyProperty(set))); this.Write(" ObjectSet<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(set))); this.Write("\r\n {\r\n get\r\n {\r\n if (("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(" == null))\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(" = base.CreateObjectSet<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(set.Name)); this.Write("\");\r\n }\r\n return "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(";\r\n }\r\n }\r\n private ObjectSet<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(set))); this.Write(";\r\n"); } region.End(); //////// //////// //////// //////// //////// //////// //////// //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionAddToMethods")); IEnumerable addToMethods = CreateContextAddToMethods.Value ? container.BaseEntitySets.OfType() : Enumerable.Empty(); foreach (EntitySet set in addToMethods) { string parameterName = code.Escape(FixParameterName(set.ElementType.Name, code)); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_GenCommentAddToMethodCs"), set.Name))); this.Write("\r\n /// \r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(set.ElementType))); this.Write(" void AddTo"); this.Write(this.ToStringHelper.ToStringWithCulture(set.Name)); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(set.ElementType, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(parameterName)); this.Write(")\r\n {\r\n base.AddObject(\""); this.Write(this.ToStringHelper.ToStringWithCulture(set.Name)); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(parameterName)); this.Write(");\r\n }\r\n"); } region.End(); //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionFunctionImports")); foreach (EdmFunction edmFunction in container.FunctionImports) { IEnumerable parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef); string paramList = string.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray()); TypeUsage returnType = edmFunction.ReturnParameters.Count == 0 ? null : ef.GetElementType(edmFunction.ReturnParameters[0].TypeUsage); if (edmFunction.IsComposableAttribute) { this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))); this.Write(this.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(p => new Tuple(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))); this.Write("\r\n [EdmFunction(\""); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.NamespaceName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.Name)); this.Write("\")]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture("IQueryable<" + MultiSchemaEscape(returnType, code) + ">")); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(paramList)); this.Write(")\r\n {\r\n"); WriteFunctionParameters(parameters); this.Write(" return base.CreateQuery<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(returnType, code))); this.Write(">(\"["); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.NamespaceName)); this.Write("].["); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.Name)); this.Write("]("); this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", parameters.Select(p => "@" + p.EsqlParameterName).ToArray()))); this.Write(")\""); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())))); this.Write(");\r\n }\r\n"); } else { this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))); this.Write(this.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(p => new Tuple(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))); this.Write("\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "int" : "ObjectResult<" + MultiSchemaEscape(returnType, code) + ">")); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(paramList)); this.Write(")\r\n {\r\n"); WriteFunctionParameters(parameters); this.Write(" return base.ExecuteFunction"); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "" : "<" + MultiSchemaEscape(returnType, code) + ">")); this.Write("(\""); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.Name)); this.Write("\""); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())))); this.Write(");\r\n }\r\n"); if(returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType) { this.Write(" /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(p => new Tuple(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))); this.Write("\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "int" : "ObjectResult<" + MultiSchemaEscape(returnType, code) + ">")); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringAfter(paramList, ", "))); this.Write("MergeOption mergeOption)\r\n {\r\n"); WriteFunctionParameters(parameters); this.Write(" return base."); this.Write(this.ToStringHelper.ToStringWithCulture(returnType == null ? "ExecuteFunction" : "ExecuteFunction<" + MultiSchemaEscape(returnType, code) + ">")); this.Write("(\""); this.Write(this.ToStringHelper.ToStringWithCulture(edmFunction.Name)); this.Write("\", mergeOption"); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())))); this.Write(");\r\n }\r\n"); } } } region.End(); this.Write("}\r\n"); } region.End(); //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionEntities")); foreach (EntityType entity in GetSourceSchemaTypes().OrderBy(e => e.Name)) { this.Write("\r\n/// \r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(entity))); this.Write("\r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(entity, region.CurrentIndentLevel))); this.Write("\r\n[EdmEntityTypeAttribute(NamespaceName=\""); this.Write(this.ToStringHelper.ToStringWithCulture(entity.NamespaceName)); this.Write("\", Name=\""); this.Write(this.ToStringHelper.ToStringWithCulture(entity.Name)); this.Write("\")]\r\n[Serializable()]\r\n[DataContractAttribute(IsReference=true)]\r\n"); foreach (EntityType subType in ItemCollection.GetItems().Where(b => b.BaseType == entity)) { this.Write("[KnownTypeAttribute(typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(subType, code))); this.Write("))]\r\n"); } this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(entity))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(code.AbstractOption(entity)))); this.Write("partial class "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(entity))); this.Write(" : "); this.Write(this.ToStringHelper.ToStringWithCulture(BaseTypeName(entity, code))); this.Write("\r\n{\r\n"); if (!entity.Abstract) { WriteFactoryMethod(entity, code); } region.Begin(CodeGenerationTools.GetResourceString("Template_RegionSimpleProperties")); foreach (EdmProperty property in entity.Properties.Where(p => p.DeclaringType == entity && p.TypeUsage.EdmType is SimpleType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WriteSimpleTypeProperty(property, code); } region.End(); region.Begin(CodeGenerationTools.GetResourceString("Template_RegionComplexProperties")); foreach (EdmProperty property in entity.Properties.Where(p => p.DeclaringType == entity && p.TypeUsage.EdmType is ComplexType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WriteComplexTypeProperty(property, code); } region.End(); region.Begin(CodeGenerationTools.GetResourceString("Template_RegionNavigationProperties")); foreach (NavigationProperty navProperty in entity.NavigationProperties.Where(n => n.DeclaringType == entity)) { VerifyGetterAndSetterAccessibilityCompatability(navProperty); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))); this.Write("\r\n [XmlIgnoreAttribute()]\r\n [SoapIgnoreAttribute()]\r\n [DataMemberAttribu" + "te()]\r\n [EdmRelationshipNavigationPropertyAttribute(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.NamespaceName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.Name)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\")]\r\n"); if (navProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))); this.Write(" EntityCollection<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))); this.Write("get\r\n {\r\n return ((IEntityWithRelationships)this).RelationshipM" + "anager.GetRelatedCollection<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\");\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))); this.Write("set\r\n {\r\n if ((value != null))\r\n {\r\n " + "((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection" + "<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\", value);\r\n }\r\n }\r\n }\r\n"); } else { this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))); this.Write("get\r\n {\r\n return ((IEntityWithRelationships)this).RelationshipM" + "anager.GetRelatedReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\").Value;\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))); this.Write("set\r\n {\r\n ((IEntityWithRelationships)this).RelationshipManager." + "GetRelatedReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\").Value = value;\r\n }\r\n }\r\n"); string refPropertyName = navProperty.Name + "Reference"; if (entity.Members.Any(m => m.Name == refPropertyName)) { // Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6017", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ConflictingGeneratedNavPropName"), navProperty.Name, entity.FullName, refPropertyName))); } this.Write(" /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))); this.Write("\r\n [BrowsableAttribute(false)]\r\n [DataMemberAttribute()]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))); this.Write(" EntityReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write("> "); this.Write(this.ToStringHelper.ToStringWithCulture(refPropertyName)); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))); this.Write("get\r\n {\r\n return ((IEntityWithRelationships)this).RelationshipM" + "anager.GetRelatedReference<"); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\");\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))); this.Write("set\r\n {\r\n if ((value != null))\r\n {\r\n " + "((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<" + ""); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))); this.Write(">(\""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)); this.Write("\", \""); this.Write(this.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)); this.Write("\", value);\r\n }\r\n }\r\n }\r\n"); } } region.End(); this.Write("}\r\n"); } region.End(); //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionComplexTypes")); foreach (ComplexType complex in GetSourceSchemaTypes().OrderBy(c => c.Name)) { this.Write("\r\n/// \r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(complex))); this.Write("\r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complex, region.CurrentIndentLevel))); this.Write("\r\n[EdmComplexTypeAttribute(NamespaceName=\""); this.Write(this.ToStringHelper.ToStringWithCulture(complex.NamespaceName)); this.Write("\", Name=\""); this.Write(this.ToStringHelper.ToStringWithCulture(complex.Name)); this.Write("\")]\r\n[DataContractAttribute(IsReference=true)]\r\n[Serializable()]\r\n"); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(complex))); this.Write(" partial class "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(complex))); this.Write(" : ComplexObject\r\n{\r\n"); WriteFactoryMethod(complex, code); region.Begin(CodeGenerationTools.GetResourceString("Template_RegionSimpleProperties")); foreach (EdmProperty property in complex.Properties.Where(p => p.DeclaringType == complex && p.TypeUsage.EdmType is SimpleType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WriteSimpleTypeProperty(property, code); } region.End(); region.Begin(CodeGenerationTools.GetResourceString("Template_RegionComplexProperties")); foreach (EdmProperty property in complex.Properties.Where(p => p.DeclaringType == complex && p.TypeUsage.EdmType is ComplexType)) { VerifyGetterAndSetterAccessibilityCompatability(property); WriteComplexTypeProperty(property, code); } region.End(); this.Write("}\r\n"); } region.End(); //////// //////// //////// region.Begin(CodeGenerationTools.GetResourceString("Template_RegionEnumTypes")); foreach (EnumType enumType in GetSourceSchemaTypes().OrderBy(c => c.Name)) { this.Write("\r\n/// \r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(enumType))); this.Write("\r\n/// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(enumType, region.CurrentIndentLevel))); this.Write("\r\n[EdmEnumTypeAttribute(NamespaceName=\""); this.Write(this.ToStringHelper.ToStringWithCulture(enumType.NamespaceName)); this.Write("\", Name=\""); this.Write(this.ToStringHelper.ToStringWithCulture(enumType.Name)); this.Write("\")]\r\n[DataContractAttribute()]\r\n"); if (enumType.IsFlags) { this.Write("[FlagsAttribute()]\r\n"); } this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForType(enumType))); this.Write(" enum "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(enumType))); this.Write(" : "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(enumType.UnderlyingType.ClrEquivalentType, fullyQualifySystemTypes: false))); this.Write("\r\n{\r\n"); foreach (EnumMember member in enumType.Members) { this.Write(" /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(member))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(member, region.CurrentIndentLevel + 1))); this.Write("\r\n [EnumMemberAttribute()]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(member))); this.Write(" = "); this.Write(this.ToStringHelper.ToStringWithCulture(member.Value)); this.Write(",\r\n\r\n"); } // if (enumType.Members.Any()) { this.GenerationEnvironment.Remove( this.GenerationEnvironment.Length - (CurrentIndent.Length + 5), CurrentIndent.Length + 3); } this.Write("}\r\n"); } region.End(); if (!String.IsNullOrEmpty(namespaceName)) { PopIndent(); this.Write("}\r\n"); } if (!VerifyTypeUniqueness(GetSourceSchemaTypes() .Where(i => i is StructuralType || i is EnumType || i is EntityContainer) .Select(i => code.GetGlobalItemName(i)))) { return string.Empty; } return this.GenerationEnvironment.ToString(); } //////// //////// //////// //////// //////// //////// private void WriteFactoryMethod(StructuralType structuralType, CodeGenerationTools code) { CodeRegion region = new CodeRegion(this, 1); string methodName = "Create" + structuralType.Name; UniqueIdentifierService uniqueIdentifier = new UniqueIdentifierService(); string instanceName = code.Escape(uniqueIdentifier.AdjustIdentifier((code.CamelCase(structuralType.Name)))); IEnumerable parameters = FactoryMethodParameter.CreateParameters(structuralType.Members.OfType().Where(p => IncludePropertyInFactoryMethod(structuralType, p)), uniqueIdentifier, MultiSchemaEscape, code); if (parameters.Count() == 0) return; if (structuralType.Members.Any(m => m.Name == methodName)) { // Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6029", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_FactoryMethodNameConflict"), methodName, structuralType.FullName))); } region.Begin(CodeGenerationTools.GetResourceString("Template_RegionFactoryMethod")); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_FactoryMethodComment"), structuralType.Name))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(p => new Tuple(p.RawParameterName, p.ParameterComment)), region.CurrentIndentLevel))); this.Write("\r\n public static "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(methodName)); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(", ", parameters.Select(p => p.ParameterType + " " + p.ParameterName).ToArray()))); this.Write(")\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write(" = new "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))); this.Write("();\r\n"); foreach (FactoryMethodParameter parameter in parameters) { if (parameter.IsComplexType) { // this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write("."); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))); this.Write(" = StructuralObject.VerifyComplexObjectIsNotNull("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.ParameterName)); this.Write(", \""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.Source.Name)); this.Write("\");\r\n"); } else { // this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write("."); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))); this.Write(" = "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.ParameterName)); this.Write(";\r\n"); } } this.Write(" return "); this.Write(this.ToStringHelper.ToStringWithCulture(instanceName)); this.Write(";\r\n }\r\n"); region.End(); } //////// //////// //////// private void WriteSimpleTypeProperty(EdmProperty simpleProperty, CodeGenerationTools code) { MetadataTools ef = new MetadataTools(this); this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(simpleProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(simpleProperty, 1))); this.Write("\r\n [EdmScalarPropertyAttribute(EntityKeyProperty="); this.Write(this.ToStringHelper.ToStringWithCulture(code.CreateLiteral(ef.IsKey(simpleProperty)))); this.Write(", IsNullable="); this.Write(this.ToStringHelper.ToStringWithCulture(code.CreateLiteral(ef.IsNullable(simpleProperty)))); this.Write(")]\r\n [DataMemberAttribute()]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(simpleProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(simpleProperty))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(simpleProperty.TypeUsage, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(simpleProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(simpleProperty)))); this.Write("get\r\n {\r\n"); if (ef.ClrType(simpleProperty.TypeUsage) == typeof(byte[])) { this.Write(" return StructuralObject.GetValidValue("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))); this.Write(");\r\n"); } else { this.Write(" return "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))); this.Write(";\r\n"); } this.Write(" }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter((simpleProperty))))); this.Write("set\r\n {\r\n"); if (ef.IsKey(simpleProperty)) { if (ef.ClrType(simpleProperty.TypeUsage) == typeof(byte[])) { this.Write(" if (!StructuralObject.BinaryEquals("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))); this.Write(", value))\r\n"); } else { this.Write(" if ("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))); this.Write(" != value)\r\n"); } this.Write(" {\r\n"); PushIndent(CodeRegion.GetIndent(1)); } this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(simpleProperty))); this.Write("(value);\r\n ReportPropertyChanging(\""); this.Write(this.ToStringHelper.ToStringWithCulture(simpleProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))); this.Write(" = "); this.Write(this.ToStringHelper.ToStringWithCulture(CastToEnumType(simpleProperty.TypeUsage, code))); this.Write("StructuralObject.SetValidValue("); this.Write(this.ToStringHelper.ToStringWithCulture(CastToUnderlyingType(simpleProperty.TypeUsage, code))); this.Write("value"); this.Write(this.ToStringHelper.ToStringWithCulture(OptionalNullableParameterForSetValidValue(simpleProperty, code))); this.Write(", \""); this.Write(this.ToStringHelper.ToStringWithCulture(simpleProperty.Name)); this.Write("\");\r\n ReportPropertyChanged(\""); this.Write(this.ToStringHelper.ToStringWithCulture(simpleProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(simpleProperty))); this.Write("();\r\n"); if (ef.IsKey(simpleProperty)) { PopIndent(); this.Write(" }\r\n"); } this.Write(" }\r\n }\r\n private "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(simpleProperty.TypeUsage, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))); this.Write(this.ToStringHelper.ToStringWithCulture(code.StringBefore(" = ", code.CreateLiteral(simpleProperty.DefaultValue)))); this.Write(";\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(simpleProperty))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(simpleProperty.TypeUsage, code))); this.Write(" value);\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(simpleProperty))); this.Write("();\r\n"); } //////// //////// //////// private void WriteComplexTypeProperty(EdmProperty complexProperty, CodeGenerationTools code) { this.Write("\r\n /// \r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(SummaryComment(complexProperty))); this.Write("\r\n /// "); this.Write(this.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complexProperty, 1))); this.Write("\r\n [EdmComplexPropertyAttribute()]\r\n [DesignerSerializationVisibility(Desig" + "nerSerializationVisibility.Content)]\r\n [XmlElement(IsNullable=true)]\r\n [So" + "apElement(IsNullable=true)]\r\n [DataMemberAttribute()]\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(complexProperty)))); this.Write(this.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(complexProperty))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.Escape(complexProperty))); this.Write("\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(complexProperty)))); this.Write("get\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(" = GetValidValue("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(", \""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\", false, "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(" = true;\r\n return "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(";\r\n }\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(complexProperty)))); this.Write("set\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))); this.Write("(value);\r\n ReportPropertyChanging(\""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(" = SetValidValue("); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(", value, \""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(" = true;\r\n ReportPropertyChanged(\""); this.Write(this.ToStringHelper.ToStringWithCulture(complexProperty.Name)); this.Write("\");\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))); this.Write("();\r\n }\r\n }\r\n private "); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))); this.Write(" "); this.Write(this.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))); this.Write(";\r\n private bool "); this.Write(this.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))); this.Write(";\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))); this.Write("("); this.Write(this.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))); this.Write(" value);\r\n partial void "); this.Write(this.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))); this.Write("();\r\n"); } private void WriteFunctionParameters(IEnumerable parameters) { foreach (FunctionImportParameter parameter in parameters) { if (!parameter.NeedsLocalVariable) { continue; } this.Write(" ObjectParameter "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(";\r\n if ("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null")); this.Write(")\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(" = new ObjectParameter(\""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)); this.Write("\", "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.FunctionParameterName)); this.Write(");\r\n }\r\n else\r\n {\r\n "); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)); this.Write(" = new ObjectParameter(\""); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)); this.Write("\", typeof("); this.Write(this.ToStringHelper.ToStringWithCulture(parameter.RawClrTypeName)); this.Write("));\r\n }\r\n\r\n"); } } private void WriteLazyLoadingEnabled(EntityContainer container) { string lazyLoadingAttributeValue = null; string lazyLoadingAttributeName = MetadataConstants.EDM_ANNOTATION_09_02 + ":LazyLoadingEnabled"; if(MetadataTools.TryGetStringMetadataPropertySetting(container, lazyLoadingAttributeName, out lazyLoadingAttributeValue)) { bool isLazyLoading = false; if(bool.TryParse(lazyLoadingAttributeValue, out isLazyLoading)) { this.Write(" this.ContextOptions.LazyLoadingEnabled = "); this.Write(this.ToStringHelper.ToStringWithCulture(isLazyLoading.ToString().ToLowerInvariant())); this.Write(";\r\n"); } } } //////// //////// //////// public string SourceCsdlPath{ get; set; } public string ModelNamespace{ get; set; } public EdmItemCollection ItemCollection{ get; set; } public IEnumerable ReferenceCsdlPaths{ get; set; } public Nullable CreateContextAddToMethods{ get; set; } public Dictionary EdmToObjectNamespaceMap { get { return _edmToObjectNamespaceMap; } set { _edmToObjectNamespaceMap = value; } } public Dictionary _edmToObjectNamespaceMap = new Dictionary(); public Double SourceEdmVersion { get { if (ItemCollection != null) { return ItemCollection.EdmVersion; } return 0.0; } } private bool VerifyTypeUniqueness(IEnumerable types) { HashSet hash = new HashSet(); foreach (string type in types) { if (!hash.Add(type)) { // Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6034", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_DuplicateTopLevelType"), type))); return false; } } return true; } void ApplyUserSettings(UserSettings userSettings) { // if (SourceCsdlPath == null) { #if !PREPROCESSED_TEMPLATE if(userSettings.SourceCsdlPath == "$" + "edmxInputFile" + "$") { Errors.Add(new System.CodeDom.Compiler.CompilerError(Host.TemplateFile, -1, -1, "", CodeGenerationTools.GetResourceString("Template_ReplaceVsItemTemplateToken"))); return; } SourceCsdlPath = Host.ResolvePath(userSettings.SourceCsdlPath); #else SourceCsdlPath = userSettings.SourceCsdlPath; #endif } // normalize the path, remove ..\ from it SourceCsdlPath = Path.GetFullPath(SourceCsdlPath); if (ReferenceCsdlPaths == null) { ReferenceCsdlPaths = userSettings.ReferenceCsdlPaths; } if (!CreateContextAddToMethods.HasValue) { CreateContextAddToMethods = userSettings.CreateContextAddToMethods; } DefaultSummaryComment = CodeGenerationTools.GetResourceString("Template_CommentNoDocumentation"); } class UserSettings { public string SourceCsdlPath{ get; set; } public string[] ReferenceCsdlPaths{ get; set; } public bool FullyQualifySystemTypes{ get; set; } public bool CreateContextAddToMethods{ get; set; } public bool CamelCaseFields{ get; set; } } string GetNamespaceName(CodeGenerationTools code) { string namespaceName = code.VsNamespaceSuggestion(); #if PREPROCESSED_TEMPLATE if (String.IsNullOrEmpty(namespaceName)) { namespaceName = GetObjectNamespace(ModelNamespace); } #endif return namespaceName; } string MultiSchemaEscape(TypeUsage usage, CodeGenerationTools code) { MetadataTools ef = new MetadataTools(this); if (usage.EdmType != null) { if (usage.EdmType is StructuralType) { return MultiSchemaEscape(usage.EdmType, code); } else if (usage.EdmType is EnumType) { string typeName = MultiSchemaEscape(usage.EdmType, code); if (ef.IsNullable(usage)) { return String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName); } return typeName; } } return code.Escape(usage); } string MultiSchemaEscape(EdmType type, CodeGenerationTools code) { if (type.NamespaceName != ModelNamespace) { return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(type.NamespaceName)), code.Escape(type)); } return code.Escape(type); } string NewModifier(NavigationProperty navigationProperty) { Type baseType = typeof(EntityObject); return NewModifier(baseType, navigationProperty.Name); } string NewModifier(EdmFunction edmFunction) { Type baseType = typeof(ObjectContext); return NewModifier(baseType, edmFunction.Name); } string NewModifier(EntitySet set) { Type baseType = typeof(ObjectContext); return NewModifier(baseType, set.Name); } string NewModifier(EdmProperty property) { Type baseType; if (property.DeclaringType.BuiltInTypeKind == BuiltInTypeKind.EntityType) { baseType = typeof(EntityObject); } else { baseType = typeof(ComplexObject); } return NewModifier(baseType, property.Name); } string NewModifier(Type type, string memberName) { if (HasBaseMemberWithMatchingName(type, memberName)) { return "new"; } return string.Empty; } static bool HasBaseMemberWithMatchingName(Type type, string memberName) { BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static; return type.GetMembers(bindingFlags).Where(m => IsVisibleMember(m)).Any(m => m.Name == memberName); } string CastToEnumType(TypeUsage typeUsage, CodeGenerationTools code) { EnumType type = typeUsage.EdmType as EnumType; if (type == null) return string.Empty; return "(" + MultiSchemaEscape(typeUsage, code) + ")"; } string CastToUnderlyingType(TypeUsage typeUsage, CodeGenerationTools code) { MetadataTools ef = new MetadataTools(this); EnumType type = typeUsage.EdmType as EnumType; if (type == null) { return string.Empty; } string clrType = code.Escape(type.UnderlyingType.ClrEquivalentType, fullyQualifySystemTypes: false); if (ef.IsNullable(typeUsage)) { clrType = String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", clrType); } return "(" + clrType + ")"; } string ChangingMethodName(EdmMember member) { return string.Format(CultureInfo.InvariantCulture, "On{0}Changing", member.Name); } string ChangedMethodName(EdmMember member) { return string.Format(CultureInfo.InvariantCulture, "On{0}Changed", member.Name); } string InitializedTrackingField(EdmProperty property, CodeGenerationTools code) { string namePart = property.Name + "Initialized"; if (code.CamelCaseFields) { namePart = code.CamelCase(namePart); } return "_" + namePart; } string OptionalNullableParameterForSetValidValue(EdmMember member, CodeGenerationTools code) { MetadataTools ef = new MetadataTools(this); string list = string.Empty; PrimitiveType type = member.TypeUsage.EdmType as PrimitiveType; if (type != null && type.ClrEquivalentType.IsClass) { MetadataProperty storeGeneratedPatternProperty = null; bool isNullable = ef.IsNullable(member.TypeUsage) || (member.MetadataProperties.TryGetValue(MetadataConstants.EDM_ANNOTATION_09_02 + ":StoreGeneratedPattern", false, out storeGeneratedPatternProperty) && Object.Equals(storeGeneratedPatternProperty.Value, "Computed")); list += ", " + code.CreateLiteral(isNullable); } return list; } static bool IsVisibleMember(MemberInfo memberInfo) { if (memberInfo is EventInfo) { EventInfo ei = (EventInfo)memberInfo; MethodInfo add = ei.GetAddMethod(); MethodInfo remove = ei.GetRemoveMethod(); return IsVisibleMethod(add) || IsVisibleMethod(remove); } else if (memberInfo is FieldInfo) { FieldInfo fi = (FieldInfo)memberInfo; return !fi.IsPrivate && !fi.IsAssembly; } else if (memberInfo is MethodBase) { MethodBase mb = (MethodBase)memberInfo; if (mb.IsSpecialName) return false; return IsVisibleMethod(mb); } else if (memberInfo is PropertyInfo) { PropertyInfo pi = (PropertyInfo)memberInfo; MethodInfo get = pi.GetGetMethod(); MethodInfo set = pi.GetSetMethod(); return IsVisibleMethod(get) || IsVisibleMethod(set); } return false; } static bool IsVisibleMethod(MethodBase methodBase) { if (methodBase == null) return false; return !methodBase.IsPrivate && !methodBase.IsAssembly; } IEnumerable GetSourceSchemaTypes() where T : GlobalItem { if (Path.GetExtension(SourceCsdlPath) != ".edmx") { return ItemCollection.GetItems().Where(e => e.MetadataProperties.Any(mp => mp.Name == "SchemaSource" && (string)mp.Value == SourceCsdlPath)); } else { return ItemCollection.GetItems(); } } string EndName(AssociationType association, int index) { return association.AssociationEndMembers[index].Name; } string EndMultiplicity(AssociationType association, int index, CodeGenerationTools code) { return code.CreateLiteral(association.AssociationEndMembers[index].RelationshipMultiplicity); } string EscapeEndTypeName(AssociationType association, int index, CodeGenerationTools code) { EntityType entity = association.AssociationEndMembers[index].GetEntityType(); return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(entity.NamespaceName)), code.Escape(entity)); } string GetObjectNamespace(string csdlNamespaceName) { string objectNamespace; if (EdmToObjectNamespaceMap.TryGetValue(csdlNamespaceName, out objectNamespace)) { return objectNamespace; } return csdlNamespaceName; } void UpdateObjectNamespaceMap(string objectNamespace) { if(objectNamespace != ModelNamespace && !EdmToObjectNamespaceMap.ContainsKey(ModelNamespace)) { EdmToObjectNamespaceMap.Add(ModelNamespace, objectNamespace); } } static string FixParameterName(string name, CodeGenerationTools code) { // // if (StringComparer.OrdinalIgnoreCase.Equals(name, "id")) { // return "id"; } return code.CamelCase(name); } string BaseTypeName(EntityType entity, CodeGenerationTools code) { return entity.BaseType == null ? "EntityObject" : MultiSchemaEscape(entity.BaseType, code); } bool IncludePropertyInFactoryMethod(StructuralType factoryType, EdmProperty edmProperty) { if (edmProperty.Nullable) { return false; } if (edmProperty.DefaultValue != null) { return false; } if ((Accessibility.ForReadOnlyProperty(edmProperty) != "public" && Accessibility.ForWriteOnlyProperty(edmProperty) != "public") || (factoryType != edmProperty.DeclaringType && Accessibility.ForWriteOnlyProperty(edmProperty) == "private") ) { // return false; } return true; } class FactoryMethodParameter { public EdmProperty Source; public string RawParameterName; public string ParameterName; public string ParameterType; public string ParameterComment; public bool IsComplexType; public static IEnumerable CreateParameters(IEnumerable properties, UniqueIdentifierService unique, Func multiSchemaEscape, CodeGenerationTools code) { List parameters = new List(); foreach (EdmProperty property in properties) { FactoryMethodParameter parameter = new FactoryMethodParameter(); parameter.Source = property; parameter.IsComplexType = property.TypeUsage.EdmType is ComplexType; parameter.RawParameterName = unique.AdjustIdentifier(FixParameterName(property.Name, code)); parameter.ParameterName = code.Escape(parameter.RawParameterName); parameter.ParameterType = multiSchemaEscape(property.TypeUsage, code); parameter.ParameterComment = String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_CommentFactoryMethodParam"), property.Name); parameters.Add(parameter); } return parameters; } } string DefaultSummaryComment{ get; set; } string SummaryComment(MetadataItem item) { if (item.Documentation != null && item.Documentation.Summary != null) { return PrefixLinesOfMultilineComment(XMLCOMMENT_START + " ", XmlEntityize(item.Documentation.Summary)); } if (DefaultSummaryComment != null) { return DefaultSummaryComment; } return string.Empty; } string LongDescriptionCommentElement(MetadataItem item, int indentLevel) { if (item.Documentation != null && !String.IsNullOrEmpty(item.Documentation.LongDescription)) { string comment = Environment.NewLine; string lineStart = CodeRegion.GetIndent(indentLevel) + XMLCOMMENT_START + " "; comment += lineStart + "" + Environment.NewLine; comment += lineStart + PrefixLinesOfMultilineComment(lineStart, XmlEntityize(item.Documentation.LongDescription)) + Environment.NewLine; comment += lineStart + ""; return comment; } return string.Empty; } string PrefixLinesOfMultilineComment(string prefix, string comment) { return comment.Replace(Environment.NewLine, Environment.NewLine + prefix); } string ParameterComments(IEnumerable> parameters, int indentLevel) { System.Text.StringBuilder builder = new System.Text.StringBuilder(); foreach (Tuple parameter in parameters) { builder.AppendLine(); builder.Append(CodeRegion.GetIndent(indentLevel)); builder.Append(XMLCOMMENT_START); builder.Append(String.Format(CultureInfo.InvariantCulture, " {1}", parameter.Item1, parameter.Item2)); } return builder.ToString(); } string XmlEntityize(string text) { if (string.IsNullOrEmpty(text)) { return string.Empty; } text = text.Replace("&","&"); text = text.Replace("<","<").Replace(">",">"); string id = Guid.NewGuid().ToString(); text = text.Replace(Environment.NewLine, id); text = text.Replace("\r", " ").Replace("\n"," "); text = text.Replace(id, Environment.NewLine); return text.Replace("\'","'").Replace("\"","""); } const string XMLCOMMENT_START = "///"; IEnumerable GetProperties(StructuralType type) { if (type.BuiltInTypeKind == BuiltInTypeKind.EntityType) { return ((EntityType)type).Properties; } else { return ((ComplexType)type).Properties; } } protected void VerifyGetterAndSetterAccessibilityCompatability(EdmMember member) { string rawGetterAccessibility = Accessibility.ForReadOnlyProperty(member); string rawSetterAccessibility = Accessibility.ForWriteOnlyProperty(member); if ((rawGetterAccessibility == "internal" && rawSetterAccessibility == "protected") || (rawGetterAccessibility == "protected" && rawSetterAccessibility == "internal")) { Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6033", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("GeneratedPropertyAccessibilityConflict"), member.Name, rawGetterAccessibility, rawSetterAccessibility))); } } private void VerifyEntityTypeAndSetAccessibilityCompatability(EntitySet set) { string typeAccess = Accessibility.ForType(set.ElementType); string setAccess = Accessibility.ForReadOnlyProperty(set); if(typeAccess == "internal" && (setAccess == "public" || setAccess == "protected")) { Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6036", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("EntityTypeAndSetAccessibilityConflict"), set.ElementType.Name, typeAccess, set.Name, setAccess))); } } private void DefineMetadata() { TemplateMetadata[MetadataConstants.TT_TEMPLATE_NAME] = "CSharpCodeGen"; TemplateMetadata[MetadataConstants.TT_TEMPLATE_VERSION] = "5.0"; TemplateMetadata[MetadataConstants.TT_MINIMUM_ENTITY_FRAMEWORK_VERSION] = "5.0"; } sealed class UniqueIdentifierService { private readonly HashSet _knownIdentifiers; public UniqueIdentifierService() { _knownIdentifiers = new HashSet(StringComparer.Ordinal); } /// /// /// /// public string AdjustIdentifier(string identifier) { // var numberOfConflicts = 0; var adjustedIdentifier = identifier; while (!_knownIdentifiers.Add(adjustedIdentifier)) { ++numberOfConflicts; adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture); } return adjustedIdentifier; } } // Copyright (c) Microsoft Corporation. All rights reserved. public static Dictionary TemplateMetadata = new Dictionary(); /// /// Responsible for helping to create source code that is /// correctly formated and functional /// public class CodeGenerationTools { private readonly DynamicTextTransformation _textTransformation; private readonly CSharpCodeProvider _code; private readonly MetadataTools _ef; /// /// Initializes a new CodeGenerationTools object with the TextTransformation (T4 generated class) /// that is currently running /// public CodeGenerationTools(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); _code = new CSharpCodeProvider(); _ef = new MetadataTools(_textTransformation); FullyQualifySystemTypes = false; CamelCaseFields = true; } /// /// When true, all types that are not being generated /// are fully qualified to keep them from conflicting with /// types that are being generated. Useful when you have /// something like a type being generated named System. /// /// Default is false. /// public bool FullyQualifySystemTypes { get; set; } /// /// When true, the field names are Camel Cased, /// otherwise they will preserve the case they /// start with. /// /// Default is true. /// public bool CamelCaseFields { get; set; } /// /// Returns the NamespaceName suggested by VS if running inside VS. Otherwise, returns /// null. /// public string VsNamespaceSuggestion() { string suggestion = _textTransformation.Host.ResolveParameterValue("directiveId", "namespaceDirectiveProcessor", "namespaceHint"); if (String.IsNullOrEmpty(suggestion)) { return null; } return suggestion; } /// /// Returns a string that is safe for use as an identifier in C#. /// Keywords are escaped. /// public string Escape(string name) { if (name == null) { return null; } return _code.CreateEscapedIdentifier(name); } /// /// Returns the name of the TypeUsage's EdmType that is safe for /// use as an identifier. /// public string Escape(TypeUsage typeUsage) { if (typeUsage == null) { return null; } if (typeUsage.EdmType is ComplexType || typeUsage.EdmType is EntityType) { return Escape(typeUsage.EdmType.Name); } else if (typeUsage.EdmType is SimpleType) { Type clrType = _ef.UnderlyingClrType(typeUsage.EdmType); string typeName = typeUsage.EdmType is EnumType ? Escape(typeUsage.EdmType.Name) : Escape(clrType); if (clrType.IsValueType && _ef.IsNullable(typeUsage)) { return String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName); } return typeName; } else if (typeUsage.EdmType is CollectionType) { return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", Escape(((CollectionType)typeUsage.EdmType).TypeUsage)); } throw new ArgumentException("typeUsage"); } /// /// Returns the name of the EdmMember that is safe for /// use as an identifier. /// public string Escape(EdmMember member) { if (member == null) { return null; } return Escape(member.Name); } /// /// Returns the name of the EdmType that is safe for /// use as an identifier. /// public string Escape(EdmType type) { if (type == null) { return null; } return Escape(type.Name); } /// /// Returns the name of the EdmFunction that is safe for /// use as an identifier. /// public string Escape(EdmFunction function) { if (function == null) { return null; } return Escape(function.Name); } /// /// Returns the name of the EnumMember that is safe for /// use as an identifier. /// public string Escape(EnumMember member) { if (member == null) { return null; } return Escape(member.Name); } /// /// Returns the name of the EntityContainer that is safe for /// use as an identifier. /// public string Escape(EntityContainer container) { if (container == null) { return null; } return Escape(container.Name); } /// /// Returns the name of the EntitySet that is safe for /// use as an identifier. /// public string Escape(EntitySet set) { if (set == null) { return null; } return Escape(set.Name); } /// /// Returns the name of the StructuralType that is safe for /// use as an identifier. /// public string Escape(StructuralType type) { if (type == null) { return null; } return Escape(type.Name); } /// /// Returns the NamespaceName with each segment safe to /// use as an identifier. /// public string EscapeNamespace(string namespaceName) { if (String.IsNullOrEmpty(namespaceName)) { return namespaceName; } string[] parts = namespaceName.Split('.'); namespaceName = String.Empty; foreach (string part in parts) { if (namespaceName != String.Empty) { namespaceName += "."; } namespaceName += Escape(part); } return namespaceName; } /// /// Returns the name of the EdmMember formatted for /// use as a field identifier. /// /// This method changes behavior based on the CamelCaseFields /// setting. /// public string FieldName(EdmMember member) { if (member == null) { return null; } return FieldName(member.Name); } /// /// Returns the name of the EntitySet formatted for /// use as a field identifier. /// /// This method changes behavior based on the CamelCaseFields /// setting. /// public string FieldName(EntitySet set) { if (set == null) { return null; } return FieldName(set.Name); } private string FieldName(string name) { if (CamelCaseFields) { return "_" + CamelCase(name); } else { return "_" + name; } } /// /// Returns the name of the Type object formatted for /// use in source code. /// /// This method changes behavior based on the FullyQualifySystemTypes /// setting. /// public string Escape(Type clrType) { return Escape(clrType, FullyQualifySystemTypes); } /// /// Returns the name of the Type object formatted for /// use in source code. /// public string Escape(Type clrType, bool fullyQualifySystemTypes) { if(clrType == null) { return null; } string typeName; if (fullyQualifySystemTypes) { typeName = "global::" + clrType.FullName; } else { typeName = _code.GetTypeOutput(new CodeTypeReference(clrType)); } return typeName; } /// /// Returns the abstract option if the entity is Abstract, otherwise returns String.Empty /// public string AbstractOption(EntityType entity) { if (entity.Abstract) { return "abstract"; } return String.Empty; } /// /// Returns the passed in identifier with the first letter changed to lowercase /// public string CamelCase(string identifier) { if (String.IsNullOrEmpty(identifier)) { return identifier; } if (identifier.Length == 1) { return identifier[0].ToString(CultureInfo.InvariantCulture).ToLowerInvariant(); } return identifier[0].ToString(CultureInfo.InvariantCulture).ToLowerInvariant() + identifier.Substring(1); } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with a single space concatenated on the end. /// public string SpaceAfter(string value) { return StringAfter(value, " "); } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with a single space concatenated on the end. /// public string SpaceBefore(string value) { return StringBefore(" ", value); } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with append concatenated on the end. /// public string StringAfter(string value, string append) { if (String.IsNullOrEmpty(value)) { return String.Empty; } return value + append; } /// /// If the value parameter is null or empty an empty string is returned, /// otherwise it retuns value with prepend concatenated on the front. /// public string StringBefore(string prepend, string value) { if (String.IsNullOrEmpty(value)) { return String.Empty; } return prepend + value; } /// /// Returns false and shows an error if the supplied type names aren't case-insensitively unique, /// otherwise returns true. /// public bool VerifyCaseInsensitiveTypeUniqueness(IEnumerable types, string sourceFile) { return VerifyCaseInsensitiveUniqueness(types, t => string.Format(CultureInfo.CurrentCulture, GetResourceString("Template_CaseInsensitiveTypeConflict"), t), sourceFile); } /// /// Returns false and shows an error if the supplied strings aren't case-insensitively unique, /// otherwise returns true. /// private bool VerifyCaseInsensitiveUniqueness(IEnumerable items, Func formatMessage, string sourceFile) { HashSet hash = new HashSet(StringComparer.InvariantCultureIgnoreCase); foreach (string item in items) { if (!hash.Add(item)) { _textTransformation.Errors.Add(new System.CodeDom.Compiler.CompilerError(sourceFile, -1, -1, "6023", formatMessage(item))); return false; } } return true; } /// /// Returns the names of the items in the supplied collection that correspond to O-Space types. /// public IEnumerable GetAllGlobalItems(EdmItemCollection itemCollection) { return itemCollection.GetItems().Where(i => i is EntityType || i is ComplexType || i is EnumType || i is EntityContainer).Select(g => GetGlobalItemName(g)); } /// /// Returns the name of the supplied GlobalItem. /// public string GetGlobalItemName(GlobalItem item) { if (item is EdmType) { return ((EdmType)item).Name; } else { return ((EntityContainer)item).Name; } } /// /// Retuns as full of a name as possible, if a namespace is provided /// the namespace and name are combined with a period, otherwise just /// the name is returned. /// public string CreateFullName(string namespaceName, string name) { if (String.IsNullOrEmpty(namespaceName)) { return name; } return namespaceName + "." + name; } /// /// Retuns a literal representing the supplied value. /// public string CreateLiteral(object value) { if (value == null) { return string.Empty; } Type type = value.GetType(); if (type.IsEnum) { return type.FullName + "." + value.ToString(); } if (type == typeof(Guid)) { return string.Format(CultureInfo.InvariantCulture, "new Guid(\"{0}\")", ((Guid)value).ToString("D", CultureInfo.InvariantCulture)); } else if (type == typeof(DateTime)) { return string.Format(CultureInfo.InvariantCulture, "new DateTime({0}, DateTimeKind.Unspecified)", ((DateTime)value).Ticks); } else if (type == typeof(byte[])) { var arrayInit = string.Join(", ", ((byte[])value).Select(b => b.ToString(CultureInfo.InvariantCulture)).ToArray()); return string.Format(CultureInfo.InvariantCulture, "new Byte[] {{{0}}}", arrayInit); } else if (type == typeof(DateTimeOffset)) { var dto = (DateTimeOffset)value; return string.Format(CultureInfo.InvariantCulture, "new DateTimeOffset({0}, new TimeSpan({1}))", dto.Ticks, dto.Offset.Ticks); } else if (type == typeof(TimeSpan)) { return string.Format(CultureInfo.InvariantCulture, "new TimeSpan({0})", ((TimeSpan)value).Ticks); } var expression = new CodePrimitiveExpression(value); var writer = new StringWriter(); CSharpCodeProvider code = new CSharpCodeProvider(); code.GenerateCodeFromExpression(expression, writer, new CodeGeneratorOptions()); return writer.ToString(); } /// /// Returns a resource string from the System.Data.Entity.Design assembly. /// public static string GetResourceString(string resourceName, CultureInfo culture = null) { if(_resourceManager == null) { _resourceManager = new System.Resources.ResourceManager("System.Data.Entity.Design", typeof(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly); } return _resourceManager.GetString(resourceName, culture); } static System.Resources.ResourceManager _resourceManager; private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName"; /// /// Gets the entity, complex, or enum types for which code should be generated from the given item collection. /// Any types for which an ExternalTypeName annotation has been applied in the conceptual model /// metadata (CSDL) are filtered out of the returned list. /// /// The type of item to return. /// The item collection to look in. /// The items to generate. public IEnumerable GetItemsToGenerate(ItemCollection itemCollection) where T: GlobalItem { return itemCollection.GetItems().Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName)); } /// /// Returns the escaped type name to use for the given usage of a c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type usage to get a name for. /// The type name to use. public string GetTypeName(TypeUsage typeUsage) { return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace: null); } /// /// Returns the escaped type name to use for the given c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type to get a name for. /// The type name to use. public string GetTypeName(EdmType edmType) { return GetTypeName(edmType, isNullable: null, modelNamespace: null); } /// /// Returns the escaped type name to use for the given usage of an c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type usage to get a name for. /// If not null and the type's namespace does not match this namespace, then a /// fully qualified name will be returned. /// The type name to use. public string GetTypeName(TypeUsage typeUsage, string modelNamespace) { return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace); } /// /// Returns the escaped type name to use for the given c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type to get a name for. /// If not null and the type's namespace does not match this namespace, then a /// fully qualified name will be returned. /// The type name to use. public string GetTypeName(EdmType edmType, string modelNamespace) { return GetTypeName(edmType, isNullable: null, modelNamespace: modelNamespace); } /// /// Returns the escaped type name to use for the given c-space type in o-space. This might be /// an external type name if the ExternalTypeName annotation has been specified in the /// conceptual model metadata (CSDL). /// /// The c-space type to get a name for. /// Set this to true for nullable usage of this type. /// If not null and the type's namespace does not match this namespace, then a /// fully qualified name will be returned. /// The type name to use. private string GetTypeName(EdmType edmType, bool? isNullable, string modelNamespace) { if (edmType == null) { return null; } var collectionType = edmType as CollectionType; if (collectionType != null) { return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", GetTypeName(collectionType.TypeUsage, modelNamespace)); } // Try to get an external type name, and if that is null, then try to get escape the name from metadata, // possibly namespace-qualifying it. var typeName = Escape(edmType.MetadataProperties .Where(p => p.Name == ExternalTypeNameAttributeName) .Select(p => (string)p.Value) .FirstOrDefault()) ?? (modelNamespace != null && edmType.NamespaceName != modelNamespace ? CreateFullName(EscapeNamespace(edmType.NamespaceName), Escape(edmType)) : Escape(edmType)); if (edmType is StructuralType) { return typeName; } if (edmType is SimpleType) { var clrType = _ef.UnderlyingClrType(edmType); if (!(edmType is EnumType)) { typeName = Escape(clrType); } return clrType.IsValueType && isNullable == true ? String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName) : typeName; } throw new ArgumentException("typeUsage"); } } /// /// Responsible for making the Entity Framework Metadata more /// accessible for code generation. /// public class MetadataTools { private readonly DynamicTextTransformation _textTransformation; /// /// Initializes an MetadataTools Instance with the /// TextTransformation (T4 generated class) that is currently running /// public MetadataTools(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); } /// /// This method returns the underlying CLR type of the o-space type corresponding to the supplied /// Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. /// public Type ClrType(TypeUsage typeUsage) { return UnderlyingClrType(typeUsage.EdmType); } /// /// This method returns the underlying CLR type given the c-space type. /// Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. /// public Type UnderlyingClrType(EdmType edmType) { var primitiveType = edmType as PrimitiveType; if (primitiveType != null) { return primitiveType.ClrEquivalentType; } var enumType = edmType as EnumType; if (enumType != null) { return enumType.UnderlyingType.ClrEquivalentType; } return typeof(object); } /// /// True if the EdmProperty is a key of its DeclaringType, False otherwise. /// public bool IsKey(EdmProperty property) { if (property != null && property.DeclaringType.BuiltInTypeKind == BuiltInTypeKind.EntityType) { return ((EntityType)property.DeclaringType).KeyMembers.Contains(property); } return false; } /// /// True if the EdmProperty TypeUsage is Nullable, False otherwise. /// public bool IsNullable(EdmProperty property) { return property != null && IsNullable(property.TypeUsage); } /// /// True if the TypeUsage is Nullable, False otherwise. /// public bool IsNullable(TypeUsage typeUsage) { Facet nullableFacet = null; if (typeUsage != null && typeUsage.Facets.TryGetValue("Nullable", true, out nullableFacet)) { return (bool)nullableFacet.Value; } return false; } /// /// If the passed in TypeUsage represents a collection this method returns final element /// type of the collection, otherwise it returns the value passed in. /// public TypeUsage GetElementType(TypeUsage typeUsage) { if (typeUsage == null) { return null; } if (typeUsage.EdmType is CollectionType) { return GetElementType(((CollectionType)typeUsage.EdmType).TypeUsage); } else { return typeUsage; } } /// /// Returns the NavigationProperty that is the other end of the same association set if it is /// available, otherwise it returns null. /// public NavigationProperty Inverse(NavigationProperty navProperty) { if(navProperty == null) { return null; } EntityType toEntity = navProperty.ToEndMember.GetEntityType(); return toEntity.NavigationProperties .SingleOrDefault(n => Object.ReferenceEquals(n.RelationshipType, navProperty.RelationshipType) && !Object.ReferenceEquals(n, navProperty)); } /// /// Given a property on the dependent end of a referential constraint, returns the corresponding property on the principal end. /// Requires: The association has a referential constraint, and the specified dependentProperty is one of the properties on the dependent end. /// public EdmProperty GetCorrespondingPrincipalProperty(NavigationProperty navProperty, EdmProperty dependentProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } if (dependentProperty == null) { throw new ArgumentNullException("dependentProperty"); } ReadOnlyMetadataCollection fromProperties = GetPrincipalProperties(navProperty); ReadOnlyMetadataCollection toProperties = GetDependentProperties(navProperty); return fromProperties[toProperties.IndexOf(dependentProperty)]; } /// /// Given a property on the principal end of a referential constraint, returns the corresponding property on the dependent end. /// Requires: The association has a referential constraint, and the specified principalProperty is one of the properties on the principal end. /// public EdmProperty GetCorrespondingDependentProperty(NavigationProperty navProperty, EdmProperty principalProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } if (principalProperty == null) { throw new ArgumentNullException("principalProperty"); } ReadOnlyMetadataCollection fromProperties = GetPrincipalProperties(navProperty); ReadOnlyMetadataCollection toProperties = GetDependentProperties(navProperty); return toProperties[fromProperties.IndexOf(principalProperty)]; } /// /// Gets the collection of properties that are on the principal end of a referential constraint for the specified navigation property. /// Requires: The association has a referential constraint. /// public ReadOnlyMetadataCollection GetPrincipalProperties(NavigationProperty navProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } return ((AssociationType)navProperty.RelationshipType).ReferentialConstraints[0].FromProperties; } /// /// Gets the collection of properties that are on the dependent end of a referential constraint for the specified navigation property. /// Requires: The association has a referential constraint. /// public ReadOnlyMetadataCollection GetDependentProperties(NavigationProperty navProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } return ((AssociationType)navProperty.RelationshipType).ReferentialConstraints[0].ToProperties; } /// /// True if this entity type requires the HandleCascadeDelete method defined and the method has /// not been defined on any base type /// public bool NeedsHandleCascadeDeleteMethod(ItemCollection itemCollection, EntityType entity) { bool needsMethod = ContainsCascadeDeleteAssociation(itemCollection, entity); // Check to make sure no base types have already declared this method EntityType baseType = entity.BaseType as EntityType; while(needsMethod && baseType != null) { needsMethod = !ContainsCascadeDeleteAssociation(itemCollection, baseType); baseType = baseType.BaseType as EntityType; } return needsMethod; } /// /// True if this entity type participates in any relationships where the other end has an OnDelete /// cascade delete defined, or if it is the dependent in any identifying relationships /// private bool ContainsCascadeDeleteAssociation(ItemCollection itemCollection, EntityType entity) { return itemCollection.GetItems().Where(a => ((RefType)a.AssociationEndMembers[0].TypeUsage.EdmType).ElementType == entity && IsCascadeDeletePrincipal(a.AssociationEndMembers[1]) || ((RefType)a.AssociationEndMembers[1].TypeUsage.EdmType).ElementType == entity && IsCascadeDeletePrincipal(a.AssociationEndMembers[0])).Any(); } /// /// True if the source end of the specified navigation property is the principal in an identifying relationship. /// or if the source end has cascade delete defined. /// public bool IsCascadeDeletePrincipal(NavigationProperty navProperty) { if (navProperty == null) { throw new ArgumentNullException("navProperty"); } return IsCascadeDeletePrincipal((AssociationEndMember)navProperty.FromEndMember); } /// /// True if the specified association end is the principal in an identifying relationship. /// or if the association end has cascade delete defined. /// public bool IsCascadeDeletePrincipal(AssociationEndMember associationEnd) { if (associationEnd == null) { throw new ArgumentNullException("associationEnd"); } return associationEnd.DeleteBehavior == OperationAction.Cascade || IsPrincipalEndOfIdentifyingRelationship(associationEnd); } /// /// True if the specified association end is the principal end in an identifying relationship. /// In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. /// public bool IsPrincipalEndOfIdentifyingRelationship(AssociationEndMember associationEnd) { if (associationEnd == null) { throw new ArgumentNullException("associationEnd"); } ReferentialConstraint refConstraint = ((AssociationType)associationEnd.DeclaringType).ReferentialConstraints.Where(rc => rc.FromRole == associationEnd).SingleOrDefault(); if (refConstraint != null) { EntityType entity = refConstraint.ToRole.GetEntityType(); return !refConstraint.ToProperties.Where(tp => !entity.KeyMembers.Contains(tp)).Any(); } return false; } /// /// True if the specified association type is an identifying relationship. /// In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. /// public bool IsIdentifyingRelationship(AssociationType association) { if (association == null) { throw new ArgumentNullException("association"); } return IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers[0]) || IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers[1]); } /// /// requires: firstType is not null /// effects: if secondType is among the base types of the firstType, return true, /// otherwise returns false. /// when firstType is same as the secondType, return false. /// public bool IsSubtypeOf(EdmType firstType, EdmType secondType) { if (secondType == null) { return false; } // walk up firstType hierarchy list for (EdmType t = firstType.BaseType; t != null; t = t.BaseType) { if (t == secondType) return true; } return false; } /// /// Returns the subtype of the EntityType in the current itemCollection /// public IEnumerable GetSubtypesOf(EntityType type, ItemCollection itemCollection, bool includeAbstractTypes) { if (type != null) { IEnumerable typesInCollection = itemCollection.GetItems(); foreach (EntityType typeInCollection in typesInCollection) { if (type.Equals(typeInCollection) == false && this.IsSubtypeOf(typeInCollection, type)) { if ( includeAbstractTypes || !typeInCollection.Abstract) { yield return typeInCollection; } } } } } public static bool TryGetStringMetadataPropertySetting(MetadataItem item, string propertyName, out string value) { value = null; MetadataProperty property = item.MetadataProperties.FirstOrDefault(p => p.Name == propertyName); if (property != null) { value = (string)property.Value; } return value != null; } } /// /// Responsible for loading an EdmItemCollection from a .edmx file or .csdl files /// public class MetadataLoader { private readonly DynamicTextTransformation _textTransformation; /// /// Initializes an MetadataLoader Instance with the /// TextTransformation (T4 generated class) that is currently running /// public MetadataLoader(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); } /// /// Load the metadata for Edm, Store, and Mapping collections and register them /// with a new MetadataWorkspace, returns false if any of the parts can't be /// created, some of the ItemCollections may be registered and usable even if false is /// returned /// public bool TryLoadAllMetadata(string inputFile, out MetadataWorkspace metadataWorkspace) { metadataWorkspace = new MetadataWorkspace(); EdmItemCollection edmItemCollection = CreateEdmItemCollection(inputFile); metadataWorkspace.RegisterItemCollection(edmItemCollection); StoreItemCollection storeItemCollection = null; if (TryCreateStoreItemCollection(inputFile, out storeItemCollection)) { StorageMappingItemCollection storageMappingItemCollection = null; if (TryCreateStorageMappingItemCollection(inputFile, edmItemCollection, storeItemCollection, out storageMappingItemCollection)) { metadataWorkspace.RegisterItemCollection(storeItemCollection); metadataWorkspace.RegisterItemCollection(storageMappingItemCollection); return true; } } return false; } /// /// Create an EdmItemCollection loaded with the metadata provided /// public EdmItemCollection CreateEdmItemCollection(string sourcePath, params string[] referenceSchemas) { EdmItemCollection edmItemCollection; if(TryCreateEdmItemCollection(sourcePath, referenceSchemas, out edmItemCollection)) { return edmItemCollection; } return new EdmItemCollection(); } /// /// Attempts to create a EdmItemCollection from the specified metadata file /// public bool TryCreateEdmItemCollection(string sourcePath, out EdmItemCollection edmItemCollection) { return TryCreateEdmItemCollection(sourcePath, null, out edmItemCollection); } /// /// Attempts to create a EdmItemCollection from the specified metadata file /// public bool TryCreateEdmItemCollection(string sourcePath, string[] referenceSchemas, out EdmItemCollection edmItemCollection) { edmItemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } if (referenceSchemas == null) { referenceSchemas = new string[0]; } ItemCollection itemCollection = null; sourcePath = _textTransformation.Host.ResolvePath(sourcePath); EdmItemCollectionBuilder collectionBuilder = new EdmItemCollectionBuilder(_textTransformation, referenceSchemas.Select(s => _textTransformation.Host.ResolvePath(s)).Where(s => s != sourcePath)); if (collectionBuilder.TryCreateItemCollection(sourcePath, out itemCollection)) { edmItemCollection = (EdmItemCollection)itemCollection; } return edmItemCollection != null; } /// /// Attempts to create a StoreItemCollection from the specified metadata file /// public bool TryCreateStoreItemCollection(string sourcePath, out StoreItemCollection storeItemCollection) { storeItemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } ItemCollection itemCollection = null; StoreItemCollectionBuilder collectionBuilder = new StoreItemCollectionBuilder(_textTransformation); if (collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), out itemCollection)) { storeItemCollection = (StoreItemCollection)itemCollection; } return storeItemCollection != null; } /// /// Attempts to create a StorageMappingItemCollection from the specified metadata file, EdmItemCollection, and StoreItemCollection /// public bool TryCreateStorageMappingItemCollection(string sourcePath, EdmItemCollection edmItemCollection, StoreItemCollection storeItemCollection, out StorageMappingItemCollection storageMappingItemCollection) { storageMappingItemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } if (edmItemCollection == null) { throw new ArgumentNullException("edmItemCollection"); } if (storeItemCollection == null) { throw new ArgumentNullException("storeItemCollection"); } ItemCollection itemCollection = null; StorageMappingItemCollectionBuilder collectionBuilder = new StorageMappingItemCollectionBuilder(_textTransformation, edmItemCollection, storeItemCollection); if (collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), out itemCollection)) { storageMappingItemCollection = (StorageMappingItemCollection)itemCollection; } return storageMappingItemCollection != null; } /// /// Gets the Model Namespace from the provided schema file. /// public string GetModelNamespace(string sourcePath) { if (!ValidateInputPath(sourcePath, _textTransformation)) { return String.Empty; } EdmItemCollectionBuilder builder = new EdmItemCollectionBuilder(_textTransformation); XElement model; if(builder.TryLoadRootElement(_textTransformation.Host.ResolvePath(sourcePath), out model)) { XAttribute attribute = model.Attribute("Namespace"); if (attribute != null) { return attribute.Value; } } return String.Empty; } /// /// Returns true if the specified file path is valid /// private static bool ValidateInputPath(string sourcePath, DynamicTextTransformation textTransformation) { if (String.IsNullOrEmpty(sourcePath)) { throw new ArgumentException("sourcePath"); } if(sourcePath == "$edmxInputFile$") { textTransformation.Errors.Add(new CompilerError(textTransformation.Host.TemplateFile ?? CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate"), -1, -1, string.Empty, CodeGenerationTools.GetResourceString("Template_ReplaceVsItemTemplateToken"))); return false; } return true; } /// /// Base class for ItemCollectionBuilder classes that /// loads the specific types of metadata /// private abstract class ItemCollectionBuilder { private readonly DynamicTextTransformation _textTransformation; private readonly string _fileExtension; private readonly string _edmxSectionName; private readonly string _rootElementName; /// /// FileExtension for individual (non-edmx) metadata file for this /// specific ItemCollection type /// public string FileExtension { get { return _fileExtension; } } /// /// The name of the XmlElement in the .edmx element /// to find this ItemCollection's metadata /// public string EdmxSectionName { get { return _edmxSectionName; } } /// /// The name of the root element of this ItemCollection's metadata /// public string RootElementName { get { return _rootElementName; } } /// /// Method to build the appropriate ItemCollection /// protected abstract ItemCollection CreateItemCollection(IEnumerable readers, out IList errors); /// /// Ctor to setup the ItemCollectionBuilder members /// protected ItemCollectionBuilder(DynamicTextTransformation textTransformation, string fileExtension, string edmxSectionName, string rootElementName) { _textTransformation = textTransformation; _fileExtension = fileExtension; _edmxSectionName = edmxSectionName; _rootElementName = rootElementName; } /// /// Selects a namespace from the supplied constants. /// protected abstract string GetNamespace(SchemaConstants constants); /// /// Try to create an ItemCollection loaded with the metadata provided /// public bool TryCreateItemCollection(string sourcePath, out ItemCollection itemCollection) { itemCollection = null; if (!ValidateInputPath(sourcePath, _textTransformation)) { return false; } XElement schemaElement = null; if (TryLoadRootElement(sourcePath, out schemaElement)) { List readers = new List(); try { readers.Add(schemaElement.CreateReader()); IList errors = null; ItemCollection tempItemCollection = CreateItemCollection(readers, out errors); if (ProcessErrors(errors, sourcePath)) { return false; } itemCollection = tempItemCollection; return true; } finally { foreach (XmlReader reader in readers) { ((IDisposable)reader).Dispose(); } } } return false; } /// /// Tries to load the root element from the metadata file provided /// public bool TryLoadRootElement(string sourcePath, out XElement schemaElement) { schemaElement = null; string extension = Path.GetExtension(sourcePath); if (extension.Equals(".edmx", StringComparison.InvariantCultureIgnoreCase)) { return TryLoadRootElementFromEdmx(sourcePath, out schemaElement); } else if(extension.Equals(FileExtension, StringComparison.InvariantCultureIgnoreCase)) { // load from single metadata file (.csdl, .ssdl, or .msl) schemaElement = XElement.Load(sourcePath, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); return true; } return false; } /// /// Tries to load the root element from the provided edmxDocument /// private bool TryLoadRootElementFromEdmx(XElement edmxDocument, SchemaConstants schemaConstants, string sectionName, string rootElementName, out XElement rootElement) { rootElement = null; XNamespace edmxNs = schemaConstants.EdmxNamespace; XNamespace sectionNs = GetNamespace(schemaConstants); XElement runtime = edmxDocument.Element(edmxNs + "Runtime"); if (runtime == null) { return false; } XElement section = runtime.Element(edmxNs + sectionName); if (section == null) { return false; } string templateVersion; if (!TemplateMetadata.TryGetValue(MetadataConstants.TT_TEMPLATE_VERSION, out templateVersion)) { templateVersion = MetadataConstants.DEFAULT_TEMPLATE_VERSION; } if (schemaConstants.MinimumTemplateVersion > new Version(templateVersion)) { _textTransformation.Errors.Add(new CompilerError( _textTransformation.Host.TemplateFile ?? CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate"), -1, -1, string.Empty, CodeGenerationTools.GetResourceString("Template_UnsupportedSchema")) {IsWarning = true}); } rootElement = section.Element(sectionNs + rootElementName); return rootElement != null; } /// /// Tries to load the root element from the provided .edmx metadata file /// private bool TryLoadRootElementFromEdmx(string edmxPath, out XElement rootElement) { rootElement = null; XElement element = XElement.Load(edmxPath, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo); return TryLoadRootElementFromEdmx(element, MetadataConstants.V3_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, out rootElement) || TryLoadRootElementFromEdmx(element, MetadataConstants.V2_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, out rootElement) || TryLoadRootElementFromEdmx(element, MetadataConstants.V1_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, out rootElement); } /// /// Takes an Enumerable of EdmSchemaErrors, and adds them /// to the errors collection of the template class /// private bool ProcessErrors(IEnumerable errors, string sourceFilePath) { bool foundErrors = false; foreach (EdmSchemaError error in errors) { CompilerError newError = new CompilerError(error.SchemaLocation, error.Line, error.Column, error.ErrorCode.ToString(CultureInfo.InvariantCulture), error.Message); newError.IsWarning = error.Severity == EdmSchemaErrorSeverity.Warning; foundErrors |= error.Severity == EdmSchemaErrorSeverity.Error; if (error.SchemaLocation == null) { newError.FileName = sourceFilePath; } _textTransformation.Errors.Add(newError); } return foundErrors; } } /// /// Builder class for creating a StorageMappingItemCollection /// private class StorageMappingItemCollectionBuilder : ItemCollectionBuilder { private readonly EdmItemCollection _edmItemCollection; private readonly StoreItemCollection _storeItemCollection; public StorageMappingItemCollectionBuilder(DynamicTextTransformation textTransformation, EdmItemCollection edmItemCollection, StoreItemCollection storeItemCollection) : base(textTransformation, MetadataConstants.MSL_EXTENSION, MetadataConstants.MSL_EDMX_SECTION_NAME, MetadataConstants.MSL_ROOT_ELEMENT_NAME) { _edmItemCollection = edmItemCollection; _storeItemCollection = storeItemCollection; } protected override ItemCollection CreateItemCollection(IEnumerable readers, out IList errors) { return MetadataItemCollectionFactory.CreateStorageMappingItemCollection(_edmItemCollection, _storeItemCollection, readers, out errors); } /// /// Selects a namespace from the supplied constants. /// protected override string GetNamespace(SchemaConstants constants) { return constants.MslNamespace; } } /// /// Builder class for creating a StoreItemCollection /// private class StoreItemCollectionBuilder : ItemCollectionBuilder { public StoreItemCollectionBuilder(DynamicTextTransformation textTransformation) : base(textTransformation, MetadataConstants.SSDL_EXTENSION, MetadataConstants.SSDL_EDMX_SECTION_NAME, MetadataConstants.SSDL_ROOT_ELEMENT_NAME) { } protected override ItemCollection CreateItemCollection(IEnumerable readers, out IList errors) { return MetadataItemCollectionFactory.CreateStoreItemCollection(readers, out errors); } /// /// Selects a namespace from the supplied constants. /// protected override string GetNamespace(SchemaConstants constants) { return constants.SsdlNamespace; } } /// /// Builder class for creating a EdmItemCollection /// private class EdmItemCollectionBuilder : ItemCollectionBuilder { private List _referenceSchemas = new List(); public EdmItemCollectionBuilder(DynamicTextTransformation textTransformation) : base(textTransformation, MetadataConstants.CSDL_EXTENSION, MetadataConstants.CSDL_EDMX_SECTION_NAME, MetadataConstants.CSDL_ROOT_ELEMENT_NAME) { } public EdmItemCollectionBuilder(DynamicTextTransformation textTransformation, IEnumerable referenceSchemas) : this(textTransformation) { _referenceSchemas.AddRange(referenceSchemas); } protected override ItemCollection CreateItemCollection(IEnumerable readers, out IList errors) { List ownedReaders = new List(); List allReaders = new List(); try { allReaders.AddRange(readers); foreach (string path in _referenceSchemas.Distinct()) { XElement reference; if(TryLoadRootElement(path, out reference)) { XmlReader reader = reference.CreateReader(); allReaders.Add(reader); ownedReaders.Add(reader); } } return MetadataItemCollectionFactory.CreateEdmItemCollection(allReaders, out errors); } finally { foreach (XmlReader reader in ownedReaders) { ((IDisposable)reader).Dispose(); } } } /// /// Selects a namespace from the supplied constants. /// protected override string GetNamespace(SchemaConstants constants) { return constants.CsdlNamespace; } } } /// /// Responsible for encapsulating the retrieval and translation of the CodeGeneration /// annotations in the EntityFramework Metadata to a form that is useful in code generation. /// public static class Accessibility { private const string GETTER_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:GetterAccess"; private const string SETTER_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:SetterAccess"; private const string TYPE_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:TypeAccess"; private const string METHOD_ACCESS = "http://schemas.microsoft.com/ado/2006/04/codegeneration:MethodAccess"; private const string ACCESS_PROTECTED = "Protected"; private const string ACCESS_INTERNAL = "Internal"; private const string ACCESS_PRIVATE = "Private"; private static readonly Dictionary AccessibilityRankIdLookup = new Dictionary { { "private", 1}, { "internal", 2}, { "protected", 3}, { "public", 4}, }; /// /// Gets the accessibility that should be applied to a type being generated from the provided GlobalItem. /// /// defaults to public if no annotation is found. /// public static string ForType(GlobalItem item) { if (item == null) { return null; } return GetAccessibility(item, TYPE_ACCESS); } /// /// Gets the accessibility that should be applied at the property level for a property being /// generated from the provided EdmMember. /// /// defaults to public if no annotation is found. /// public static string ForProperty(EdmMember member) { if (member == null) { return null; } string getterAccess, setterAccess, propertyAccess; CalculatePropertyAccessibility(member, out propertyAccess, out getterAccess, out setterAccess); return propertyAccess; } /// /// Gets the accessibility that should be applied at the property level for a Read-Only property being /// generated from the provided EdmMember. /// /// defaults to public if no annotation is found. /// public static string ForReadOnlyProperty(EdmMember member) { if (member == null) { return null; } return GetAccessibility(member, GETTER_ACCESS); } /// /// Gets the accessibility that should be applied at the property level for a property being /// generated from the provided EntitySet. /// /// defaults to public if no annotation is found. /// public static string ForReadOnlyProperty(EntitySet set) { if (set == null) { return null; } return GetAccessibility(set, GETTER_ACCESS); } /// /// Gets the accessibility that should be applied at the property level for a Write-Only property being /// generated from the provided EdmMember. /// /// defaults to public if no annotation is found. /// public static string ForWriteOnlyProperty(EdmMember member) { if (member == null) { return null; } return GetAccessibility(member, SETTER_ACCESS); } /// /// Gets the accessibility that should be applied at the get level for a property being /// generated from the provided EdmMember. /// /// defaults to empty if no annotation is found or the accessibility is the same as the property level. /// public static string ForGetter(EdmMember member) { if (member == null) { return null; } string getterAccess, setterAccess, propertyAccess; CalculatePropertyAccessibility(member, out propertyAccess, out getterAccess, out setterAccess); return getterAccess; } /// /// Gets the accessibility that should be applied at the set level for a property being /// generated from the provided EdmMember. /// /// defaults to empty if no annotation is found or the accessibility is the same as the property level. /// public static string ForSetter(EdmMember member) { if (member == null) { return null; } string getterAccess, setterAccess, propertyAccess; CalculatePropertyAccessibility(member, out propertyAccess, out getterAccess, out setterAccess); return setterAccess; } /// /// Gets the accessibility that should be applied to a method being generated from the provided EdmFunction. /// /// defaults to public if no annotation is found. /// public static string ForMethod(EdmFunction function) { if (function == null) { return null; } return GetAccessibility(function, METHOD_ACCESS); } private static void CalculatePropertyAccessibility(MetadataItem item, out string propertyAccessibility, out string getterAccessibility, out string setterAccessibility) { getterAccessibility = GetAccessibility(item, GETTER_ACCESS); int getterRank = AccessibilityRankIdLookup[getterAccessibility]; setterAccessibility = GetAccessibility(item, SETTER_ACCESS); int setterRank = AccessibilityRankIdLookup[setterAccessibility]; int propertyRank = Math.Max(getterRank, setterRank); if (setterRank == propertyRank) { setterAccessibility = String.Empty; } if (getterRank == propertyRank) { getterAccessibility = String.Empty; } propertyAccessibility = AccessibilityRankIdLookup.Where(v => v.Value == propertyRank).Select(v => v.Key).Single(); } private static string GetAccessibility(MetadataItem item, string name) { string accessibility; if (MetadataTools.TryGetStringMetadataPropertySetting(item, name, out accessibility)) { return TranslateUserAccessibilityToCSharpAccessibility(accessibility); } return "public"; } private static string TranslateUserAccessibilityToCSharpAccessibility(string userAccessibility) { if (userAccessibility == ACCESS_PROTECTED) { return "protected"; } else if (userAccessibility == ACCESS_INTERNAL) { return "internal"; } else if (userAccessibility == ACCESS_PRIVATE) { return "private"; } else { // default to public return "public"; } } } /// /// Responsible for creating source code regions in code when the loop inside /// actually produces something. /// public class CodeRegion { private const int STANDARD_INDENT_LENGTH = 4; private readonly DynamicTextTransformation _textTransformation; private int _beforeRegionLength; private int _emptyRegionLength; private int _regionIndentLevel = -1; /// /// Initializes an CodeRegion instance with the /// TextTransformation (T4 generated class) that is currently running /// public CodeRegion(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); } /// /// Initializes an CodeRegion instance with the /// TextTransformation (T4 generated class) that is currently running, /// and the indent level to start the first region at. /// public CodeRegion(object textTransformation, int firstIndentLevel) : this(textTransformation) { if (firstIndentLevel < 0) { throw new ArgumentException("firstIndentLevel"); } _regionIndentLevel = firstIndentLevel - 1; } /// /// Starts the begining of a region /// public void Begin(string regionName) { if (regionName == null) { throw new ArgumentNullException("regionName"); } Begin(regionName, 1); } /// /// Start the begining of a region, indented /// the numbers of levels specified /// public void Begin(string regionName, int levelsToIncreaseIndent) { if (regionName == null) { throw new ArgumentNullException("regionName"); } _beforeRegionLength = _textTransformation.GenerationEnvironment.Length; _regionIndentLevel += levelsToIncreaseIndent; _textTransformation.Write(GetIndent(_regionIndentLevel)); _textTransformation.WriteLine("#region " + regionName); _emptyRegionLength = _textTransformation.GenerationEnvironment.Length; } /// /// Ends a region, or totaly removes it if nothing /// was generted since the begining of the region. /// public void End() { End(1); } /// /// Ends a region, or totaly removes it if nothing /// was generted since the begining of the region, also outdents /// the number of levels specified. /// public void End(int levelsToDecrease) { int indentLevel = _regionIndentLevel; _regionIndentLevel -= levelsToDecrease; if (_emptyRegionLength == _textTransformation.GenerationEnvironment.Length) _textTransformation.GenerationEnvironment.Length = _beforeRegionLength; else { _textTransformation.WriteLine(String.Empty); _textTransformation.Write(GetIndent(indentLevel)); _textTransformation.WriteLine("#endregion"); _textTransformation.WriteLine(String.Empty); } } /// /// Gets the current indent level that the next end region statement will be written /// at /// public int CurrentIndentLevel { get { return _regionIndentLevel; } } /// /// Get a string of spaces equivelent to the number of indents /// desired. /// public static string GetIndent(int indentLevel) { if (indentLevel < 0) { throw new ArgumentException("indentLevel"); } return String.Empty.PadLeft(indentLevel * STANDARD_INDENT_LENGTH); } } /// /// Responsible for collecting together the actual method parameters /// and the parameters that need to be sent to the Execute method. /// public class FunctionImportParameter { public FunctionParameter Source { get; set; } public string RawFunctionParameterName { get; set; } public string FunctionParameterName { get; set; } public string FunctionParameterType { get; set; } public string LocalVariableName { get; set; } public string RawClrTypeName { get; set; } public string ExecuteParameterName { get; set; } public string EsqlParameterName { get; set; } public bool NeedsLocalVariable { get; set; } public bool IsNullableOfT { get; set; } /// /// Creates a set of FunctionImportParameter objects from the parameters passed in. /// public static IEnumerable Create(IEnumerable parameters, CodeGenerationTools code, MetadataTools ef) { if (parameters == null) { throw new ArgumentNullException("parameters"); } if (code == null) { throw new ArgumentNullException("code"); } if (ef == null) { throw new ArgumentNullException("ef"); } UniqueIdentifierService unique = new UniqueIdentifierService(); List importParameters = new List(); foreach (FunctionParameter parameter in parameters) { FunctionImportParameter importParameter = new FunctionImportParameter(); importParameter.Source = parameter; importParameter.RawFunctionParameterName = unique.AdjustIdentifier(code.CamelCase(parameter.Name)); importParameter.FunctionParameterName = code.Escape(importParameter.RawFunctionParameterName); if (parameter.Mode == ParameterMode.In) { TypeUsage typeUsage = parameter.TypeUsage; importParameter.NeedsLocalVariable = true; importParameter.FunctionParameterType = code.GetTypeName(typeUsage); importParameter.EsqlParameterName = parameter.Name; Type clrType = ef.UnderlyingClrType(parameter.TypeUsage.EdmType); importParameter.RawClrTypeName = typeUsage.EdmType is EnumType ? code.GetTypeName(typeUsage.EdmType) : code.Escape(clrType); importParameter.IsNullableOfT = clrType.IsValueType; } else { importParameter.NeedsLocalVariable = false; importParameter.FunctionParameterType = "ObjectParameter"; importParameter.ExecuteParameterName = importParameter.FunctionParameterName; } importParameters.Add(importParameter); } // we save the local parameter uniquification for a second pass to make the visible parameters // as pretty and sensible as possible for (int i = 0; i < importParameters.Count; i++) { FunctionImportParameter importParameter = importParameters[i]; if (importParameter.NeedsLocalVariable) { importParameter.LocalVariableName = unique.AdjustIdentifier(importParameter.RawFunctionParameterName + "Parameter"); importParameter.ExecuteParameterName = importParameter.LocalVariableName; } } return importParameters; } // // Class to create unique variables within the same scope // private sealed class UniqueIdentifierService { private readonly HashSet _knownIdentifiers; public UniqueIdentifierService() { _knownIdentifiers = new HashSet(StringComparer.Ordinal); } /// /// Given an identifier, makes it unique within the scope by adding /// a suffix (1, 2, 3, ...), and returns the adjusted identifier. /// public string AdjustIdentifier(string identifier) { // find a unique name by adding suffix as necessary int numberOfConflicts = 0; string adjustedIdentifier = identifier; while (!_knownIdentifiers.Add(adjustedIdentifier)) { ++numberOfConflicts; adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture); } return adjustedIdentifier; } } } /// /// Responsible for marking the various sections of the generation, /// so they can be split up into separate files /// public class EntityFrameworkTemplateFileManager { /// /// Creates the VsEntityFrameworkTemplateFileManager if VS is detected, otherwise /// creates the file system version. /// public static EntityFrameworkTemplateFileManager Create(object textTransformation) { DynamicTextTransformation transformation = DynamicTextTransformation.Create(textTransformation); IDynamicHost host = transformation.Host; #if !PREPROCESSED_TEMPLATE var hostServiceProvider = host.AsIServiceProvider(); if (hostServiceProvider != null) { EnvDTE.DTE dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); if (dte != null) { return new VsEntityFrameworkTemplateFileManager(transformation); } } #endif return new EntityFrameworkTemplateFileManager(transformation); } private sealed class Block { public String Name; public int Start, Length; } private readonly List files = new List(); private readonly Block footer = new Block(); private readonly Block header = new Block(); private readonly DynamicTextTransformation _textTransformation; // reference to the GenerationEnvironment StringBuilder on the // TextTransformation object private readonly StringBuilder _generationEnvironment; private Block currentBlock; /// /// Initializes an EntityFrameworkTemplateFileManager Instance with the /// TextTransformation (T4 generated class) that is currently running /// private EntityFrameworkTemplateFileManager(object textTransformation) { if (textTransformation == null) { throw new ArgumentNullException("textTransformation"); } _textTransformation = DynamicTextTransformation.Create(textTransformation); _generationEnvironment = _textTransformation.GenerationEnvironment; } /// /// Marks the end of the last file if there was one, and starts a new /// and marks this point in generation as a new file. /// public void StartNewFile(string name) { if (name == null) { throw new ArgumentNullException("name"); } CurrentBlock = new Block { Name = name }; } public void StartFooter() { CurrentBlock = footer; } public void StartHeader() { CurrentBlock = header; } public void EndBlock() { if (CurrentBlock == null) { return; } CurrentBlock.Length = _generationEnvironment.Length - CurrentBlock.Start; if (CurrentBlock != header && CurrentBlock != footer) { files.Add(CurrentBlock); } currentBlock = null; } /// /// Produce the template output files. /// public virtual IEnumerable Process(bool split = true) { var generatedFileNames = new List(); if (split) { EndBlock(); var headerText = _generationEnvironment.ToString(header.Start, header.Length); var footerText = _generationEnvironment.ToString(footer.Start, footer.Length); var outputPath = Path.GetDirectoryName(_textTransformation.Host.TemplateFile); files.Reverse(); foreach (var block in files) { var fileName = Path.Combine(outputPath, block.Name); var content = headerText + _generationEnvironment.ToString(block.Start, block.Length) + footerText; generatedFileNames.Add(fileName); CreateFile(fileName, content); _generationEnvironment.Remove(block.Start, block.Length); } } return generatedFileNames; } protected virtual void CreateFile(string fileName, string content) { if (IsFileContentDifferent(fileName, content)) { File.WriteAllText(fileName, content); } } protected bool IsFileContentDifferent(String fileName, string newContent) { return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent); } private Block CurrentBlock { get { return currentBlock; } set { if (CurrentBlock != null) { EndBlock(); } if (value != null) { value.Start = _generationEnvironment.Length; } currentBlock = value; } } #if !PREPROCESSED_TEMPLATE private sealed class VsEntityFrameworkTemplateFileManager : EntityFrameworkTemplateFileManager { private EnvDTE.ProjectItem templateProjectItem; private EnvDTE.DTE dte; private Action checkOutAction; private Action> projectSyncAction; /// /// Creates an instance of the VsEntityFrameworkTemplateFileManager class with the IDynamicHost instance /// public VsEntityFrameworkTemplateFileManager(object textTemplating) : base(textTemplating) { var hostServiceProvider = _textTransformation.Host.AsIServiceProvider(); if (hostServiceProvider == null) { throw new ArgumentNullException("Could not obtain hostServiceProvider"); } dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE)); if (dte == null) { throw new ArgumentNullException("Could not obtain DTE from host"); } templateProjectItem = dte.Solution.FindProjectItem(_textTransformation.Host.TemplateFile); checkOutAction = fileName => dte.SourceControl.CheckOutItem(fileName); projectSyncAction = keepFileNames => ProjectSync(templateProjectItem, keepFileNames); } public override IEnumerable Process(bool split) { if (templateProjectItem.ProjectItems == null) { return new List(); } var generatedFileNames = base.Process(split); projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null)); return generatedFileNames; } protected override void CreateFile(string fileName, string content) { if (IsFileContentDifferent(fileName, content)) { CheckoutFileIfRequired(fileName); File.WriteAllText(fileName, content); } } private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable keepFileNames) { var keepFileNameSet = new HashSet(keepFileNames); var projectFiles = new Dictionary(); var originalOutput = Path.GetFileNameWithoutExtension(templateProjectItem.FileNames[0]); foreach (EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems) { projectFiles.Add(projectItem.FileNames[0], projectItem); } // Remove unused items from the project foreach (var pair in projectFiles) { if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalOutput + ".")) { pair.Value.Delete(); } } // Add missing files to the project foreach (string fileName in keepFileNameSet) { if (!projectFiles.ContainsKey(fileName)) { templateProjectItem.ProjectItems.AddFromFile(fileName); } } } private void CheckoutFileIfRequired(string fileName) { if (dte.SourceControl == null || !dte.SourceControl.IsItemUnderSCC(fileName) || dte.SourceControl.IsItemCheckedOut(fileName)) { return; } // run on worker thread to prevent T4 calling back into VS checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null)); } } #endif } /// /// Responsible creating an instance that can be passed /// to helper classes that need to access the TextTransformation /// members. It accesses member by name and signature rather than /// by type. This is necessary when the /// template is being used in Preprocessed mode /// and there is no common known type that can be /// passed instead /// public class DynamicTextTransformation { private object _instance; IDynamicHost _dynamicHost; private readonly MethodInfo _write; private readonly MethodInfo _writeLine; private readonly PropertyInfo _generationEnvironment; private readonly PropertyInfo _errors; private readonly PropertyInfo _host; /// /// Creates an instance of the DynamicTextTransformation class around the passed in /// TextTransformation shapped instance passed in, or if the passed in instance /// already is a DynamicTextTransformation, it casts it and sends it back. /// public static DynamicTextTransformation Create(object instance) { if (instance == null) { throw new ArgumentNullException("instance"); } DynamicTextTransformation textTransformation = instance as DynamicTextTransformation; if (textTransformation != null) { return textTransformation; } return new DynamicTextTransformation(instance); } private DynamicTextTransformation(object instance) { _instance = instance; Type type = _instance.GetType(); _write = type.GetMethod("Write", new Type[] { typeof(string) }); _writeLine = type.GetMethod("WriteLine", new Type[] { typeof(string) }); _generationEnvironment = type.GetProperty("GenerationEnvironment", BindingFlags.Instance | BindingFlags.NonPublic); _host = type.GetProperty("Host"); _errors = type.GetProperty("Errors"); } /// /// Gets the value of the wrapped TextTranformation instance's GenerationEnvironment property /// public StringBuilder GenerationEnvironment { get { return (StringBuilder)_generationEnvironment.GetValue(_instance, null); } } /// /// Gets the value of the wrapped TextTranformation instance's Errors property /// public System.CodeDom.Compiler.CompilerErrorCollection Errors { get { return (System.CodeDom.Compiler.CompilerErrorCollection)_errors.GetValue(_instance, null); } } /// /// Calls the wrapped TextTranformation instance's Write method. /// public void Write(string text) { _write.Invoke(_instance, new object[] { text }); } /// /// Calls the wrapped TextTranformation instance's WriteLine method. /// public void WriteLine(string text) { _writeLine.Invoke(_instance, new object[] { text }); } /// /// Gets the value of the wrapped TextTranformation instance's Host property /// if available (shows up when hostspecific is set to true in the template directive) and returns /// the appropriate implementation of IDynamicHost /// public IDynamicHost Host { get { if (_dynamicHost == null) { if(_host == null) { _dynamicHost = new NullHost(); } else { _dynamicHost = new DynamicHost(_host.GetValue(_instance, null)); } } return _dynamicHost; } } } /// /// Reponsible for abstracting the use of Host between times /// when it is available and not /// public interface IDynamicHost { /// /// An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue /// string ResolveParameterValue(string id, string name, string otherName); /// /// An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath /// string ResolvePath(string path); /// /// An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile /// string TemplateFile { get; } /// /// Returns the Host instance cast as an IServiceProvider /// IServiceProvider AsIServiceProvider(); } /// /// Reponsible for implementing the IDynamicHost as a dynamic /// shape wrapper over the Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost interface /// rather than type dependent wrapper. We don't use the /// interface type so that the code can be run in preprocessed mode /// on a .net framework only installed machine. /// public class DynamicHost : IDynamicHost { private readonly object _instance; private readonly MethodInfo _resolveParameterValue; private readonly MethodInfo _resolvePath; private readonly PropertyInfo _templateFile; /// /// Creates an instance of the DynamicHost class around the passed in /// Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost shapped instance passed in. /// public DynamicHost(object instance) { _instance = instance; Type type = _instance.GetType(); _resolveParameterValue = type.GetMethod("ResolveParameterValue", new Type[] { typeof(string), typeof(string), typeof(string) }); _resolvePath = type.GetMethod("ResolvePath", new Type[] { typeof(string) }); _templateFile = type.GetProperty("TemplateFile"); } /// /// A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue /// public string ResolveParameterValue(string id, string name, string otherName) { return (string)_resolveParameterValue.Invoke(_instance, new object[] { id, name, otherName }); } /// /// A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath /// public string ResolvePath(string path) { return (string)_resolvePath.Invoke(_instance, new object[] { path }); } /// /// A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile /// public string TemplateFile { get { return (string)_templateFile.GetValue(_instance, null); } } /// /// Returns the Host instance cast as an IServiceProvider /// public IServiceProvider AsIServiceProvider() { return _instance as IServiceProvider; } } /// /// Reponsible for implementing the IDynamicHost when the /// Host property is not available on the TextTemplating type. The Host /// property only exists when the hostspecific attribute of the template /// directive is set to true. /// public class NullHost : IDynamicHost { /// /// An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue /// that simply retuns null. /// public string ResolveParameterValue(string id, string name, string otherName) { return null; } /// /// An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath /// that simply retuns the path passed in. /// public string ResolvePath(string path) { return path; } /// /// An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile /// that returns null. /// public string TemplateFile { get { return null; } } /// /// Returns null. /// public IServiceProvider AsIServiceProvider() { return null; } } /// /// Responsible for encapsulating the constants defined in Metadata /// public static class MetadataConstants { public const string CSDL_EXTENSION = ".csdl"; public const string CSDL_EDMX_SECTION_NAME = "ConceptualModels"; public const string CSDL_ROOT_ELEMENT_NAME = "Schema"; public const string EDM_ANNOTATION_09_02 = "http://schemas.microsoft.com/ado/2009/02/edm/annotation"; public const string SSDL_EXTENSION = ".ssdl"; public const string SSDL_EDMX_SECTION_NAME = "StorageModels"; public const string SSDL_ROOT_ELEMENT_NAME = "Schema"; public const string MSL_EXTENSION = ".msl"; public const string MSL_EDMX_SECTION_NAME = "Mappings"; public const string MSL_ROOT_ELEMENT_NAME = "Mapping"; public const string TT_TEMPLATE_NAME = "TemplateName"; public const string TT_TEMPLATE_VERSION = "TemplateVersion"; public const string TT_MINIMUM_ENTITY_FRAMEWORK_VERSION = "MinimumEntityFrameworkVersion"; public const string DEFAULT_TEMPLATE_VERSION = "4.0"; public static readonly SchemaConstants V1_SCHEMA_CONSTANTS = new SchemaConstants( "http://schemas.microsoft.com/ado/2007/06/edmx", "http://schemas.microsoft.com/ado/2006/04/edm", "http://schemas.microsoft.com/ado/2006/04/edm/ssdl", "urn:schemas-microsoft-com:windows:storage:mapping:CS", new Version("3.5")); public static readonly SchemaConstants V2_SCHEMA_CONSTANTS = new SchemaConstants( "http://schemas.microsoft.com/ado/2008/10/edmx", "http://schemas.microsoft.com/ado/2008/09/edm", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl", "http://schemas.microsoft.com/ado/2008/09/mapping/cs", new Version("4.0")); public static readonly SchemaConstants V3_SCHEMA_CONSTANTS = new SchemaConstants( "http://schemas.microsoft.com/ado/2009/11/edmx", "http://schemas.microsoft.com/ado/2009/11/edm", "http://schemas.microsoft.com/ado/2009/11/edm/ssdl", "http://schemas.microsoft.com/ado/2009/11/mapping/cs", new Version("5.0")); } public struct SchemaConstants { public SchemaConstants(string edmxNamespace, string csdlNamespace, string ssdlNamespace, string mslNamespace, Version minimumTemplateVersion) : this() { EdmxNamespace = edmxNamespace; CsdlNamespace = csdlNamespace; SsdlNamespace = ssdlNamespace; MslNamespace = mslNamespace; MinimumTemplateVersion = minimumTemplateVersion; } public string EdmxNamespace { get; private set; } public string CsdlNamespace { get; private set; } public string SsdlNamespace { get; private set; } public string MslNamespace { get; private set; } public Version MinimumTemplateVersion { get; private set; } } } #region Base class /// /// Base class for this transformation /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")] public class CSharpCodeGenTemplateV50Base { #region Fields private global::System.Text.StringBuilder generationEnvironmentField; private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField; private global::System.Collections.Generic.List indentLengthsField; private string currentIndentField = ""; private bool endsWithNewline; private global::System.Collections.Generic.IDictionary sessionField; #endregion #region Properties /// /// The string builder that generation-time code is using to assemble generated output /// protected System.Text.StringBuilder GenerationEnvironment { get { if ((this.generationEnvironmentField == null)) { this.generationEnvironmentField = new global::System.Text.StringBuilder(); } return this.generationEnvironmentField; } set { this.generationEnvironmentField = value; } } /// /// The error collection for the generation process /// public System.CodeDom.Compiler.CompilerErrorCollection Errors { get { if ((this.errorsField == null)) { this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection(); } return this.errorsField; } } /// /// A list of the lengths of each indent that was added with PushIndent /// private System.Collections.Generic.List indentLengths { get { if ((this.indentLengthsField == null)) { this.indentLengthsField = new global::System.Collections.Generic.List(); } return this.indentLengthsField; } } /// /// Gets the current indent we use when adding lines to the output /// public string CurrentIndent { get { return this.currentIndentField; } } /// /// Current transformation session /// public virtual global::System.Collections.Generic.IDictionary Session { get { return this.sessionField; } set { this.sessionField = value; } } #endregion #region Transform-time helpers /// /// Write text directly into the generated output /// public void Write(string textToAppend) { if (string.IsNullOrEmpty(textToAppend)) { return; } // If we're starting off, or if the previous text ended with a newline, // we have to append the current indent first. if (((this.GenerationEnvironment.Length == 0) || this.endsWithNewline)) { this.GenerationEnvironment.Append(this.currentIndentField); this.endsWithNewline = false; } // Check if the current text ends with a newline if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture)) { this.endsWithNewline = true; } // This is an optimization. If the current indent is "", then we don't have to do any // of the more complex stuff further down. if ((this.currentIndentField.Length == 0)) { this.GenerationEnvironment.Append(textToAppend); return; } // Everywhere there is a newline in the text, add an indent after it textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField)); // If the text ends with a newline, then we should strip off the indent added at the very end // because the appropriate indent will be added when the next time Write() is called if (this.endsWithNewline) { this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length)); } else { this.GenerationEnvironment.Append(textToAppend); } } /// /// Write text directly into the generated output /// public void WriteLine(string textToAppend) { this.Write(textToAppend); this.GenerationEnvironment.AppendLine(); this.endsWithNewline = true; } /// /// Write formatted text directly into the generated output /// public void Write(string format, params object[] args) { this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); } /// /// Write formatted text directly into the generated output /// public void WriteLine(string format, params object[] args) { this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args)); } /// /// Raise an error /// public void Error(string message) { System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); error.ErrorText = message; this.Errors.Add(error); } /// /// Raise a warning /// public void Warning(string message) { System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError(); error.ErrorText = message; error.IsWarning = true; this.Errors.Add(error); } /// /// Increase the indent /// public void PushIndent(string indent) { if ((indent == null)) { throw new global::System.ArgumentNullException("indent"); } this.currentIndentField = (this.currentIndentField + indent); this.indentLengths.Add(indent.Length); } /// /// Remove the last indent that was added with PushIndent /// public string PopIndent() { string returnValue = ""; if ((this.indentLengths.Count > 0)) { int indentLength = this.indentLengths[(this.indentLengths.Count - 1)]; this.indentLengths.RemoveAt((this.indentLengths.Count - 1)); if ((indentLength > 0)) { returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength)); this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength)); } } return returnValue; } /// /// Remove any indentation /// public void ClearIndent() { this.indentLengths.Clear(); this.currentIndentField = ""; } #endregion #region ToString Helpers /// /// Utility class to produce culture-oriented representation of an object as a string. /// public class ToStringInstanceHelper { private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture; /// /// Gets or sets format provider to be used by ToStringWithCulture method. /// public System.IFormatProvider FormatProvider { get { return this.formatProviderField ; } set { if ((value != null)) { this.formatProviderField = value; } } } /// /// This is called from the compile/run appdomain to convert objects within an expression block to a string /// public string ToStringWithCulture(object objectToConvert) { if ((objectToConvert == null)) { throw new global::System.ArgumentNullException("objectToConvert"); } System.Type t = objectToConvert.GetType(); System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] { typeof(System.IFormatProvider)}); if ((method == null)) { return objectToConvert.ToString(); } else { return ((string)(method.Invoke(objectToConvert, new object[] { this.formatProviderField }))); } } } private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper(); /// /// Helper to produce culture-oriented representation of an object as a string /// public ToStringInstanceHelper ToStringHelper { get { return this.toStringHelperField; } } #endregion } #endregion } Imports System Imports System.Linq Imports System.IO Imports System.Collections.Generic Imports System.Data.Objects Imports System.Data.Objects.DataClasses Imports System.Xml Imports System.Xml.Linq Imports System.Globalization Imports System.Reflection Imports System.Data.Metadata.Edm Imports System.Data.Mapping Imports System.Data.Entity.Design Imports System.CodeDom Imports System.CodeDom.Compiler Imports Microsoft.VisualBasic Imports System.Text '------------------------------------------------------------------------------ ' ' This code was generated by a tool. ' Runtime Version: 11.0.0.0 ' ' Changes to this file may cause incorrect behavior and will be lost if ' the code is regenerated. ' '------------------------------------------------------------------------------ Namespace TemplateCodeGenerators ''' '''Class to produce the template output ''' _ Partial Public Class VBCodeGenTemplate Inherits VBCodeGenTemplateBase ''' '''Create the template output ''' Public Overridable Function TransformText() As String ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' DefineMetadata() Dim userSettings As UserSettings = New UserSettings With _ { _ .SourceCsdlPath = "$edmxInputFile$", _ .ReferenceCsdlPaths = New string () {}, _ .FullyQualifySystemTypes = True, _ .CreateContextAddToMethods = True, _ .CamelCaseFields = False _ } ApplyUserSettings(userSettings) If Errors.HasErrors Return String.Empty End If Dim loader As New MetadataLoader(Me) Dim ef As New MetadataTools(Me) Dim region As New CodeRegion(Me) Dim code As New CodeGenerationTools(Me) With {.FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, .CamelCaseFields = userSettings.CamelCaseFields} ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray()) ModelNamespace = loader.GetModelNamespace(SourceCsdlPath) Dim namespaceName As String = GetNamespaceName(code) UpdateObjectNamespaceMap(namespaceName) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"'------------------------------------------------------------------------------"& _ ""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(GetResourceString("Template_GeneratedCodeCommentLine1"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"'"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(GetResourceString("Template_GeneratedCodeCommentLine2"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(GetResourceString("Template_GeneratedCodeCommentLine3"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"'---------------------------------------------------------"& _ "---------------------"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.ComponentModel"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports "& _ "System.Data.EntityClient"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Data.Objects"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Data.Objec"& _ "ts.DataClasses"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Linq"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Runtime.Serialization"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Impor"& _ "ts System.Xml.Serialization"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) '''''''' '''''''' Write Relationship Attributes. '''''''' region.Begin(GetResourceString("Template_RegionRelationships")) For Each association As AssociationType in GetSourceSchemaTypes(Of AssociationType)() Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next region.End() If(Not String.IsNullOrEmpty(namespaceName)) Then Me.Write("Namespace ") Me.Write(Me.ToStringHelper.ToStringWithCulture(namespaceName)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) PushIndent(CodeRegion.GetIndent(1)) End If '''''''' '''''''' '''''''' region.Begin(GetResourceString("Template_RegionContexts")) For Each container as EntityContainer in GetSourceSchemaTypes(Of EntityContainer)() Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(container))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(container, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(container))) Me.Write(" Partial Class ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(container))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Inherits ObjectContext"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #Region """) Me.Write(Me.ToStringHelper.ToStringWithCulture(GetResourceString("Template_RegionConstructors"))) Me.Write(""""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ContextDefaultCtorComment"), container.Name, container.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Sub New()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" MyBase.New(""name=") Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteLazyLoadingEnabled(container) Me.Write(" OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ContextCommonCtorComment"), container.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Sub New(ByVal connectionString As String)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "& _ " MyBase.New(connectionString, """) Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteLazyLoadingEnabled(container) Me.Write(" OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ContextCommonCtorComment"), container.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Sub New(ByVal connection As EntityConnection)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "& _ " MyBase.New(connection, """) Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteLazyLoadingEnabled(container) Me.Write(" OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #End Region"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #Region """) Me.Write(Me.ToStringHelper.ToStringWithCulture(GetResourceString("Template_RegionPartialMethods"))) Me.Write(""""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Partial Private Sub OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #End Region"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)& _ ""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) '''''''' '''''''' '''''''' region.Begin(GetResourceString("Template_RegionObjectSetProperties")) For Each entitySet As EntitySet In container.BaseEntitySets.OfType(Of EntitySet)() VerifyEntityTypeAndSetAccessibilityCompatability(entitySet) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(entitySet))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(entitySet, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(entitySet)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForReadOnlyProperty(entitySet))) Me.Write(" ReadOnly Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(entitySet))) Me.Write("() As ObjectSet(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(entitySet.ElementType, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(" Is Nothing) Then"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(" = MyBase.CreateObjectSet(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(entitySet.ElementType, code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(entitySet.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(" As ObjectSet(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(entitySet.ElementType, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next region.End() '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' region.Begin(GetResourceString("Template_RegionAddToMethods")) Dim addToMethods As IEnumerable(Of EntitySet) = If(CreateContextAddToMethods.Value, container.BaseEntitySets.OfType(Of EntitySet)(), Enumerable.Empty(Of EntitySet)()) For Each addTo As EntitySet in addToMethods Dim parameterName As String = code.Escape(FixParameterName(addTo.ElementType.Name, code)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_GenCommentAddToMethodVb"), addTo.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(addTo.ElementType))) Me.Write(" Sub AddTo") Me.Write(Me.ToStringHelper.ToStringWithCulture(addTo.Name)) Me.Write("(ByVal ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameterName)) Me.Write(" As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(addTo.ElementType, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" MyBase.AddObject(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(addTo.Name)) Me.Write(""", ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameterName)) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next region.End() region.Begin(GetResourceString("Template_RegionFunctionImports")) For Each edmFunction As EdmFunction in container.FunctionImports Dim parameters As IEnumerable(Of FunctionImportParameter) = FunctionImportParameter.Create(edmFunction.Parameters, code, ef) Dim paramList As String = String.Join(", ", parameters.Select(Function(p) p.FunctionParameterName & " As " & p.FunctionParameterType).ToArray()) Dim returnType As TypeUsage = If(edmFunction.ReturnParameters.Count = 0, Nothing, ef.GetElementType(edmFunction.ReturnParameters(0).TypeUsage)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))) Me.Write(Me.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(Function(p) New Tuple(Of string, string)(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))) Me.Write(" Function ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))) Me.Write("(") Me.Write(Me.ToStringHelper.ToStringWithCulture(paramList)) Me.Write(") As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(returnType IsNot Nothing, "ObjectResult(Of " & MultiSchemaEscape(returnType, code) & ")", "Integer"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) For Each parameter As FunctionImportParameter In parameters If (Not parameter.NeedsLocalVariable) Then Continue For End If Me.Write(" Dim ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" As ObjectParameter"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(parameter.IsNullableOfT, parameter.FunctionParameterName + ".HasValue", parameter.FunctionParameterName & " IsNot Nothing"))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" = New ObjectParameter(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)) Me.Write(""", ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.FunctionParameterName)) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Else"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" = New ObjectParameter(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)) Me.Write(""", GetType(") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.RawClrTypeName)) Me.Write("))"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next Me.Write(" Return MyBase.ExecuteFunction") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(returnType Is Nothing, "", "(Of " & MultiSchemaEscape(returnType, code) & ")"))) Me.Write("(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(edmFunction.Name)) Me.Write("""") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", String.Join(", ", parameters.Select(Function(p) p.ExecuteParameterName).ToArray())))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Function"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If (returnType IsNot Nothing AndAlso returnType.EdmType.BuiltInTypeKind = BuiltInTypeKind.EntityType) Me.Write(" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(Function(p) New Tuple(Of string, string)(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))) Me.Write(" Function ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))) Me.Write("(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringAfter(paramList, ", "))) Me.Write("mergeOption As MergeOption) As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(returnType IsNot Nothing, "ObjectResult(Of " & MultiSchemaEscape(returnType, code) & ")", "Integer"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) For Each parameter As FunctionImportParameter In parameters If (Not parameter.NeedsLocalVariable) Then Continue For End If Me.Write(" Dim ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" As ObjectParameter"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(parameter.IsNullableOfT, parameter.FunctionParameterName + ".HasValue", parameter.FunctionParameterName & " IsNot Nothing"))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" = New ObjectParameter(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)) Me.Write(""", ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.FunctionParameterName)) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Else"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" = New ObjectParameter(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)) Me.Write(""", GetType(") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.RawClrTypeName)) Me.Write("))"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next Me.Write(" Return MyBase.ExecuteFunction(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(returnType, code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(edmFunction.Name)) Me.Write(""", mergeOption") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", String.Join(", ", parameters.Select(Function(p) p.ExecuteParameterName).ToArray())))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Function"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Next region.End() Me.Write("End Class"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) VerifyCaseInsensitiveEntitySetUniqueness(container.BaseEntitySets.OfType(Of EntitySet)()) Next region.End() '''''''' '''''''' '''''''' region.Begin(GetResourceString("Template_RegionEntities")) For Each loopEntity As EntityType in GetSourceSchemaTypes(Of EntityType)().OrderBy(Function(e) e.Name) Dim entity As EntityType = loopEntity Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(entity))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(entity, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) For Each subType As EntityType in ItemCollection.GetItems(Of EntityType)().Where(Function(b) b.BaseType is entity) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(entity))) Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(code.MustInheritOption(entity)))) Me.Write("Partial Class ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(entity))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Inherits ") Me.Write(Me.ToStringHelper.ToStringWithCulture(BaseTypeName(entity, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(Not entity.Abstract) Then WriteFactoryMethod(entity, code) End If region.Begin(GetResourceString("Template_RegionPrimitiveProperties")) For Each edmProperty As EdmProperty in entity.Properties.Where(Function(p) p.DeclaringType Is entity AndAlso TypeOf p.TypeUsage.EdmType Is PrimitiveType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WritePrimitiveTypeProperty(edmProperty, code) Next region.End() region.Begin(GetResourceString("Template_RegionComplexProperties")) For Each edmProperty As EdmProperty in entity.Properties.Where(Function(p) p.DeclaringType Is entity AndAlso TypeOf p.TypeUsage.EdmType Is ComplexType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WriteComplexTypeProperty(edmProperty, code) Next region.End() '''''''' '''''''' '''''''' region.Begin(GetResourceString("Template_RegionNavigationProperties")) For Each navProperty As NavigationProperty in entity.NavigationProperties.Where(Function(n) n.DeclaringType Is entity) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(navProperty.ToEndMember.RelationshipMultiplicity = RelationshipMultiplicity.Many) Then Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))) Me.Write("() As EntityCollection(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return CType(Me,IEntityWithRelationships).RelationshipManager.Ge"& _ "tRelatedCollection(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (Not value Is Nothing)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" CType(Me, IEntityWith"& _ "Relationships).RelationshipManager.InitializeRelatedCollection(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""", value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))) Me.Write("() As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return CType(Me, IEntityWithRelationships).RelationshipManager.G"& _ "etRelatedReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""").Value"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" CType(Me, IEntityWithRelationships).RelationshipManager.GetRelat"& _ "edReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""").Value = value"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Dim refPropertyName As String = navProperty.Name & "Reference" If(entity.Members.Any(Function(m) m.Name = refPropertyName)) Then ' Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6017", String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_ConflictingGeneratedNavPropName"), navProperty.Name, entity.FullName, refPropertyName))) End If Me.Write(" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(refPropertyName)) Me.Write("() As EntityReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return CType(Me, IEntityWithRelationships).RelationshipManager.G"& _ "etRelatedReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (Not value Is Nothing)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" CType(Me, IEntityWith"& _ "Relationships).RelationshipManager.InitializeRelatedReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""", value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Next region.End() Me.Write("End Class"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) VerifyCaseInsensitiveMemberUniqueness(GetAllDeclaredMembers(entity)) Next region.End() '''''''' '''''''' '''''''' region.Begin(GetResourceString("Template_RegionComplexTypes")) For Each loopComplex As ComplexType in GetSourceSchemaTypes(Of ComplexType)().OrderBy(Function(e) e.Name) Dim complex As ComplexType = loopComplex Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(complex))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complex, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(complex))) Me.Write(" Partial Class ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(complex))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Inherits ComplexObject"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteFactoryMethod(complex, code) region.Begin(GetResourceString("Template_RegionPrimitiveProperties")) For Each edmProperty As EdmProperty in complex.Properties.Where(Function(p) p.DeclaringType Is complex AndAlso TypeOf p.TypeUsage.EdmType Is PrimitiveType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WritePrimitiveTypeProperty(edmProperty, code) Next region.End() region.Begin(GetResourceString("Template_RegionComplexProperties")) For Each edmProperty As EdmProperty in complex.Properties.Where(Function(p) p.DeclaringType Is complex AndAlso TypeOf p.TypeUsage.EdmType Is ComplexType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WriteComplexTypeProperty(edmProperty, code) Next region.End() Me.Write("End Class"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) VerifyCaseInsensitiveMemberUniqueness(GetAllDeclaredMembers(complex)) Next region.End() Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If (Not String.IsNullOrEmpty(namespaceName)) Then PopIndent() Me.Write("End Namespace"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If VerifyCaseInsensitiveTypeUniqueness() Return Me.GenerationEnvironment.ToString End Function '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' Private Sub WriteFactoryMethod(structuralType As StructuralType, code As CodeGenerationTools) Dim region As CodeRegion = New CodeRegion(Me, 1) Dim methodName As String = "Create" + structuralType.Name Dim uniqueIdentifier As UniqueIdentifierService = New UniqueIdentifierService() Dim instanceName As String = code.Escape(uniqueIdentifier.AdjustIdentifier((code.CamelCase(structuralType.Name)))) Dim parameters As IEnumerable(Of FactoryMethodParameter) = FactoryMethodParameter.CreateParameters(structuralType.Members.OfType(Of EdmProperty)().Where(Function(p) IncludePropertyInFactoryMethod(structuralType, p)), uniqueIdentifier, Function(t, c) MultiSchemaEscape(t, c), code) If (parameters.Count() = 0) Then Return End If If(structuralType.Members.Any(Function(m) m.Name = methodName)) Then ' Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6029", String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_FactoryMethodNameConflict"), methodName, structuralType.FullName))) End If region.Begin(GetResourceString("Template_RegionFactoryMethod")) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_FactoryMethodComment"), structuralType.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(Function(p) New Tuple(Of String, String)(p.RawParameterName, p.ParameterComment)), region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Shared Function ") Me.Write(Me.ToStringHelper.ToStringWithCulture(methodName)) Me.Write("(") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Join(", ", parameters.Select(Function(p) p.ParameterName & " As " & p.ParameterType).ToArray()))) Me.Write(") As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Dim ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(" as ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))) Me.Write(" = New ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) For Each parameter As FactoryMethodParameter in parameters If(parameter.IsComplexType) Then ' Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(".") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))) Me.Write(" = StructuralObject.VerifyComplexObjectIsNotNull(") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.ParameterName)) Me.Write(", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.Source.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else ' Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(".") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))) Me.Write(" = ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.ParameterName)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Next Me.Write(" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Function"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) region.End() End Sub '''''''' '''''''' '''''''' Private Sub WritePrimitiveTypeProperty(primitiveProperty As EdmProperty, code As CodeGenerationTools) Dim ef As MetadataTools = New MetadataTools(Me) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(primitiveProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(primitiveProperty, 1))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(primitiveProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(primitiveProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty))) Me.Write("() As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty.TypeUsage))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(primitiveProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(ef.ClrType(primitiveProperty.TypeUsage) = GetType(byte())) Then Me.Write(" Return StructuralObject.GetValidValue(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else Me.Write(" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Me.Write(" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter((primitiveProperty))))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(ef.IsKey(primitiveProperty)) Then If(ef.ClrType(primitiveProperty.TypeUsage) = GetType(byte())) Then Me.Write(" If (Not StructuralObject.BinaryEquals(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))) Me.Write(", Value)) Then"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else Me.Write(" If (") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))) Me.Write(" <> Value) Then"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If PushIndent(CodeRegion.GetIndent(1)) End If Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(primitiveProperty))) Me.Write("(value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanging(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(primitiveProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))) Me.Write(" = StructuralObject.SetValidValue(value") Me.Write(Me.ToStringHelper.ToStringWithCulture(OptionalNullableParameterForSetValidValue(primitiveProperty, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanged(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(primitiveProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(primitiveProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(ef.IsKey(primitiveProperty)) Then PopIndent() Me.Write(" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Me.Write(" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(primitiveProperty))) Me.Write(" As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty.TypeUsage))) Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringBefore(" = ", code.CreateLiteral(primitiveProperty.DefaultValue)))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(primitiveProperty))) Me.Write("(value As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(primitiveProperty.TypeUsage))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(primitiveProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End Sub '''''''' '''''''' '''''''' Private Sub WriteComplexTypeProperty(complexProperty As EdmProperty, code As CodeGenerationTools) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(complexProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complexProperty, 1))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(complexProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(complexProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(complexProperty))) Me.Write("() As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(complexProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(" = GetValidValue(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""", False, ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(" = True"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(complexProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))) Me.Write("(value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanging(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(" = SetValidValue(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(", value, """) Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(" = True"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanged(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(" As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(" As Boolean"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))) Me.Write("(value As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End Sub Private Sub WriteLazyLoadingEnabled(ByVal container As EntityContainer) Dim lazyLoadingAttributeValue As String = Nothing Dim lazyLoadingAttributeName As String = MetadataConstants.EDM_ANNOTATION_09_02 & ":LazyLoadingEnabled" If MetadataTools.TryGetStringMetadataPropertySetting(container, lazyLoadingAttributeName, lazyLoadingAttributeValue) Then Dim isLazyLoading As Boolean = False If Boolean.TryParse(lazyLoadingAttributeValue, isLazyLoading) Then Me.Write(" MyBase.ContextOptions.LazyLoadingEnabled = ") Me.Write(Me.ToStringHelper.ToStringWithCulture(isLazyLoading.ToString().ToLowerInvariant())) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If End If End Sub '''''''' '''''''' '''''''' Public Property SourceCsdlPath() As String Public Property ModelNamespace() As String Public Property ItemCollection() As EdmItemCollection Public Property ReferenceCsdlPaths() As IEnumerable(Of String) Public Property FullyQualifySystemTypes() As Nullable(Of Boolean) Public Property CreateContextAddToMethods As Nullable(Of Boolean) Public Property EdmToObjectNamespaceMap() As Dictionary(Of string, string) Get Return _edmToObjectNamespaceMap End Get Set _edmToObjectNamespaceMap = Value End Set End Property Dim _edmToObjectNamespaceMap As Dictionary(Of string, string) = New Dictionary(Of string, string) Public ReadOnly Property SourceEdmVersion As Double Get If (Not ItemCollection Is Nothing) Then Return ItemCollection.EdmVersion End If Return 0.0 End Get End Property '''''''' '''''''' '''''''' Private Shared ReadOnly Property ResourceManager As System.Resources.ResourceManager Get If(_resourceManager Is Nothing) Dim manager As System.Resources.ResourceManager = New System.Resources.ResourceManager("System.Data.Entity.Design", GetType(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly) System.Threading.Interlocked.CompareExchange(_resourceManager, manager, Nothing) End If Return _resourceManager End Get End Property Dim Shared _resourceManager As System.Resources.ResourceManager Private Shared Function GetResourceString(resourceName As String) As String Return ResourceManager.GetString(resourceName, _ Nothing) ' End Function Private Sub ApplyUserSettings(userSettings as UserSettings) If(SourceCsdlPath Is Nothing) Then #If NOT PREPROCESSED_TEMPLATE If userSettings.SourceCsdlPath = ("$" & "edmxInputFile" & "$") Errors.Add(New System.CodeDom.Compiler.CompilerError(Host.TemplateFile, -1, -1, String.Empty, GetResourceString("Template_ReplaceVsItemTemplateToken"))) Return End If SourceCsdlPath = Host.ResolvePath(userSettings.SourceCsdlPath) #Else SourceCsdlPath = userSettings.SourceCsdlPath #End If End If ' normalize the path, remove ..\ from it SourceCsdlPath = Path.GetFullPath(SourceCsdlPath) If(ReferenceCsdlPaths Is Nothing) Then ReferenceCsdlPaths = userSettings.ReferenceCsdlPaths End If If(Not FullyQualifySystemTypes.HasValue) Then FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes End If If(Not CreateContextAddToMethods.HasValue) Then CreateContextAddToMethods = userSettings.CreateContextAddToMethods End If DefaultSummaryComment = GetResourceString("Template_CommentNoDocumentation") End Sub '''''''' '''''''' '''''''' Private Class UserSettings Public Property SourceCsdlPath() As String Public Property ReferenceCsdlPaths() As String () Public Property FullyQualifySystemTypes() As Boolean Public Property CreateContextAddToMethods() As Boolean Public Property CamelCaseFields() As Boolean End Class Private Function GetNamespaceName(code As CodeGenerationTools) As String Dim namespaceName As String = code.VsNamespaceSuggestion() #If PREPROCESSED_TEMPLATE Then If String.IsNullOrEmpty(namespaceName) Then namespaceName = GetObjectNamespace(ModelNamespace) End If #End If Return namespaceName End Function Private Function MultiSchemaEscape(ByVal usage As TypeUsage, ByVal code As CodeGenerationTools) As String Dim structural As StructuralType = TryCast(usage.EdmType, StructuralType) If structural IsNot Nothing Then Return MultiSchemaEscape(structural, code) End If Return code.Escape(usage) End Function Private Function MultiSchemaEscape(ByVal type As StructuralType, ByVal code As CodeGenerationTools) As String If type.NamespaceName <> ModelNamespace Then Return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(type.NamespaceName)), code.Escape(type)) End If Return code.Escape(type) End Function Private Function NewModifier(ByVal navigationProperty As NavigationProperty) As String Dim baseType As Type = GetType(EntityObject) Return NewModifier(baseType, navigationProperty.Name) End Function Private Function NewModifier(ByVal edmFunction As EdmFunction) As String Dim baseType As Type = GetType(ObjectContext) Return NewModifier(baseType, edmFunction.Name) End Function Private Function NewModifier(ByVal entitySet As EntitySet) As String Dim baseType As Type = GetType(ObjectContext) Return NewModifier(baseType, entitySet.Name) End Function Private Function NewModifier(ByVal edmProperty As EdmProperty) As String Dim baseType As Type If edmProperty.DeclaringType.BuiltInTypeKind = BuiltInTypeKind.EntityType Then baseType = GetType(EntityObject) Else baseType = GetType(ComplexObject) End If Return NewModifier(baseType, edmProperty.Name) End Function Private Function NewModifier(ByVal type As Type, ByVal memberName As String) As String If HasBaseMemberWithMatchingName(type, memberName) Then Return "Shadows" End If Return String.Empty End Function Private Function ChangingMethodName(ByVal member As EdmMember) As String Return String.Format(CultureInfo.InvariantCulture, "On{0}Changing", member.Name) End Function Private Function ChangedMethodName(ByVal member As EdmMember) As String Return String.Format(CultureInfo.InvariantCulture, "On{0}Changed", member.Name) End Function Private Function InitializedTrackingField(ByVal edmProperty As EdmProperty, ByVal code As CodeGenerationTools) As String Dim namePart As String = edmProperty.Name & "Initialized" If code.CamelCaseFields Then namePart = code.CamelCase(namePart) End If Return "_" & namePart End Function Private Function OptionalNullableParameterForSetValidValue(ByVal member As EdmMember, ByVal code As CodeGenerationTools) As String Dim ef As New MetadataTools(Me) Dim list As String = String.Empty If DirectCast(member.TypeUsage.EdmType, PrimitiveType).ClrEquivalentType.IsClass Then Dim storeGeneratedPatternProperty As MetadataProperty = Nothing Dim isNullable As Boolean = ef.IsNullable(member.TypeUsage) OrElse (member.MetadataProperties.TryGetValue(MetadataConstants.EDM_ANNOTATION_09_02 & ":StoreGeneratedPattern", False, storeGeneratedPatternProperty) AndAlso Object.Equals(storeGeneratedPatternProperty.Value, "Computed")) list += ", " & code.CreateLiteral(isNullable) End If Return list End Function Private Shared Function IsVisibleMember(ByVal memberInfo As MemberInfo) As Boolean If TypeOf memberInfo Is EventInfo Then Dim ei As EventInfo = DirectCast(memberInfo, EventInfo) Dim add As MethodInfo = ei.GetAddMethod() Dim remove As MethodInfo = ei.GetRemoveMethod() Return IsVisibleMethod(add) OrElse IsVisibleMethod(remove) ElseIf TypeOf memberInfo Is FieldInfo Then Dim fi As FieldInfo = DirectCast(memberInfo, FieldInfo) Return Not fi.IsPrivate AndAlso Not fi.IsAssembly ElseIf TypeOf memberInfo Is MethodBase Then Dim mb As MethodBase = DirectCast(memberInfo, MethodBase) If mb.IsSpecialName Then Return False End If Return IsVisibleMethod(mb) ElseIf TypeOf memberInfo Is PropertyInfo Then Dim pi As PropertyInfo = DirectCast(memberInfo, PropertyInfo) Dim getMethod As MethodInfo = pi.GetGetMethod() Dim entitySet As MethodInfo = pi.GetSetMethod() Return IsVisibleMethod(getMethod) OrElse IsVisibleMethod(entitySet) End If Return False End Function Private Shared Function IsVisibleMethod(ByVal methodBase As MethodBase) As Boolean If methodBase Is Nothing Then Return False End If Return Not methodBase.IsPrivate AndAlso Not methodBase.IsAssembly End Function Private Shared Function HasBaseMemberWithMatchingName(ByVal type As Type, ByVal memberName As String) As Boolean Dim bindings As BindingFlags = BindingFlags.FlattenHierarchy Or BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static Return type.GetMembers(bindings).Where(Function(m) IsVisibleMember(m)).Any(Function(m) m.Name.Equals(memberName, StringComparison.OrdinalIgnoreCase)) End Function Private Function GetSourceSchemaTypes(Of T As GlobalItem)() As IEnumerable(Of T) If Path.GetExtension(SourceCsdlPath) <> ".edmx" Then Return ItemCollection.GetItems(Of T)().Where(Function(e) e.MetadataProperties.Any(Function(mp) mp.Name = "SchemaSource" AndAlso DirectCast(mp.Value, String) = SourceCsdlPath)) Else Return ItemCollection.GetItems(Of T)() End If End Function Private Function EndName(ByVal association As AssociationType, ByVal index As Integer) As String Return association.AssociationEndMembers(index).Name End Function Private Function EndMultiplicity(ByVal association As AssociationType, ByVal index As Integer, ByVal code As CodeGenerationTools) As String Return code.CreateLiteral(association.AssociationEndMembers(index).RelationshipMultiplicity) End Function Private Function EscapeEndTypeName(ByVal association As AssociationType, ByVal index As Integer, ByVal code As CodeGenerationTools) As String Dim entity As EntityType = association.AssociationEndMembers(index).GetEntityType() Return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(entity.NamespaceName)), code.Escape(entity)) End Function Private Function GetObjectNamespace(ByVal csdlNamespaceName As String) As String Dim objectNamespace As String = Nothing If EdmToObjectNamespaceMap.TryGetValue(csdlNamespaceName, objectNamespace) Then Return objectNamespace End If Return csdlNamespaceName End Function Private Sub UpdateObjectNamespaceMap(objectNamespace As String) If Not objectNamespace = ModelNamespace AndAlso Not EdmToObjectNamespaceMap.ContainsKey(ModelNamespace) EdmToObjectNamespaceMap.Add(ModelNamespace, objectNamespace) End If End Sub Private Shared Function FixParameterName(ByVal name As String, ByVal code As CodeGenerationTools) As String ' ' If StringComparer.OrdinalIgnoreCase.Equals(name, "id") Then ' Return "id" End If Return code.CamelCase(name) End Function Private Function BaseTypeName(ByVal entity As EntityType, ByVal code As CodeGenerationTools) As String Return If(entity.BaseType Is Nothing, "EntityObject", MultiSchemaEscape(DirectCast(entity.BaseType, StructuralType), code)) End Function Private Function IncludePropertyInFactoryMethod(ByVal factoryType As StructuralType, ByVal edmProperty As EdmProperty) As Boolean If edmProperty.Nullable Then Return False End If If edmProperty.DefaultValue IsNot Nothing Then Return False End If If (Accessibility.ForReadOnlyProperty(edmProperty) <> "Public" AndAlso Accessibility.ForWriteOnlyProperty(edmProperty) <> "Public") OrElse (factoryType IsNot edmProperty.DeclaringType AndAlso Accessibility.ForWriteOnlyProperty(edmProperty) = "Private") Then ' Return False End If Return True End Function Private Class FactoryMethodParameter Public Source As EdmProperty Public RawParameterName As String Public ParameterName As String Public ParameterType As String Public ParameterComment As String Public IsComplexType As Boolean Public Shared Function CreateParameters(ByVal properties As IEnumerable(Of EdmProperty), ByVal unique As UniqueIdentifierService, ByVal multiSchemaEscape As Func(Of TypeUsage, CodeGenerationTools, String), ByVal code As CodeGenerationTools) As IEnumerable(Of FactoryMethodParameter) Dim parameters As New List(Of FactoryMethodParameter)() For Each edmProperty As EdmProperty In properties Dim parameter As New FactoryMethodParameter() parameter.Source = edmProperty parameter.IsComplexType = TypeOf edmProperty.TypeUsage.EdmType Is ComplexType parameter.RawParameterName = unique.AdjustIdentifier(FixParameterName(edmProperty.Name, code)) parameter.ParameterName = code.Escape(parameter.RawParameterName) parameter.ParameterType = multiSchemaEscape(edmProperty.TypeUsage, code) parameter.ParameterComment = String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_CommentFactoryMethodParam"), edmProperty.Name) parameters.Add(parameter) Next Return parameters End Function End Class Private Property DefaultSummaryComment() As String Private Function SummaryComment(ByVal item As MetadataItem) As String If item.Documentation IsNot Nothing AndAlso item.Documentation.Summary IsNot Nothing Then Return PrefixLinesOfMultilineComment(XMLCOMMENT_START & " ", XmlEntityize(item.Documentation.Summary)) End If If DefaultSummaryComment IsNot Nothing Then Return DefaultSummaryComment End If Return String.Empty End Function Private Function LongDescriptionCommentElement(ByVal item As MetadataItem, ByVal indentLevel As Integer) As String If item.Documentation IsNot Nothing AndAlso Not String.IsNullOrEmpty(item.Documentation.LongDescription) Then Dim comment As String = Environment.NewLine Dim lineStart As String = CodeRegion.GetIndent(indentLevel) + XMLCOMMENT_START & " " comment += (lineStart & "") + Environment.NewLine comment += lineStart + PrefixLinesOfMultilineComment(lineStart, XmlEntityize(item.Documentation.LongDescription)) + Environment.NewLine comment += lineStart & "" Return comment End If Return String.Empty End Function Private Function PrefixLinesOfMultilineComment(ByVal prefix As String, ByVal comment As String) As String Return comment.Replace(Environment.NewLine, Environment.NewLine + prefix) End Function Private Function ParameterComments(ByVal parameters As IEnumerable(Of Tuple(Of String, String)), ByVal indentLevel As Integer) As String Dim builder As New System.Text.StringBuilder() For Each parameter As Tuple(Of String, String) In parameters builder.AppendLine() builder.Append(CodeRegion.GetIndent(indentLevel)) builder.Append(XMLCOMMENT_START) builder.Append(String.Format(CultureInfo.InvariantCulture, " {1}", parameter.Item1, parameter.Item2)) Next Return builder.ToString() End Function Private Function XmlEntityize(ByVal text As String) As String If String.IsNullOrEmpty(text) Then Return String.Empty End If text = text.Replace("&", "&") text = text.Replace("<", "<").Replace(">", ">") Dim id As String = Guid.NewGuid().ToString() text = text.Replace(Environment.NewLine, id) text = text.Replace(vbCr, " ").Replace(vbLf, " ") text = text.Replace(id, Environment.NewLine) Return text.Replace("'", "'").Replace("""", """) End Function Const XMLCOMMENT_START As String = "'''" Private Function GetProperties(ByVal type As StructuralType) As IEnumerable(Of EdmProperty) If type.BuiltInTypeKind = BuiltInTypeKind.EntityType Then Return DirectCast(type, EntityType).Properties Else Return DirectCast(type, ComplexType).Properties End If End Function '''''''' '''''''' '''''''' Private Function GetGlobalItemName(item As GlobalItem) As String If TypeOf item Is EdmType Then ' Return CType(item, EdmType).Name Else ' Return CType(item, EntityContainer).Name End If End Function Protected Sub VerifyGetterAndSetterAccessibilityCompatability(ByVal member As EdmMember) Dim rawGetterAccessibility As String = Accessibility.ForReadOnlyProperty(member) Dim rawSetterAccessibility As String = Accessibility.ForWriteOnlyProperty(member) If (rawGetterAccessibility = "Friend" AndAlso rawSetterAccessibility = "Protected") OrElse (rawGetterAccessibility = "Protected" AndAlso rawSetterAccessibility = "Friend") Then Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6033", String.Format(CultureInfo.CurrentCulture, GetResourceString("GeneratedPropertyAccessibilityConflict"), member.Name, rawGetterAccessibility, rawSetterAccessibility))) End If End Sub Private Sub VerifyEntityTypeAndSetAccessibilityCompatability(ByVal entitySet As EntitySet) Dim typeAccess As String = Accessibility.ForType(entitySet.ElementType) Dim setAccess As String = Accessibility.ForReadOnlyProperty(entitySet) If typeAccess = "Friend" AndAlso (setAccess = "Public" OrElse setAccess = "Protected") Then Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6036", String.Format(CultureInfo.CurrentCulture, GetResourceString("EntityTypeAndSetAccessibilityConflict"), entitySet.ElementType.Name, typeAccess, entitySet.Name, setAccess))) End If End Sub Private Sub VerifyCaseInsensitiveTypeUniqueness() VerifyCaseInsensitiveUniqueness(GetSourceSchemaTypes(Of GlobalItem)().Where(Function(i) TypeOf i is StructuralType OrElse TypeOf i is EntityContainer), _ Function(g) GetGlobalItemName(g), _ Function(g) String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_CaseInsensitiveTypeConflict"), GetGlobalItemName(g))) End Sub Private Sub VerifyCaseInsensitiveEntitySetUniqueness(entitySets As IEnumerable(Of EntitySet)) VerifyCaseInsensitiveUniqueness(entitySets, Function(e) e.Name, _ Function(e) String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_CaseInsensitiveEntitySetConflict"), e.EntityContainer.Name, e.Name)) End Sub Private Sub VerifyCaseInsensitiveMemberUniqueness(members As IEnumerable(Of EdmMember)) VerifyCaseInsensitiveUniqueness(members, Function(m) m.Name, _ Function(m) String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_CaseInsensitiveMemberConflict"), m.DeclaringType.FullName, m.Name)) End Sub Private Sub VerifyCaseInsensitiveUniqueness(Of T As MetadataItem)(items As IEnumerable(Of T), getIdentity As Func(Of T, String), formatMessage As Func(Of T, String) ) Dim hash As HashSet(Of String) = New HashSet(Of String)(StringComparer.InvariantCultureIgnoreCase) For Each item As MetadataItem in items If Not hash.Add(getIdentity(item)) Then ' Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, 6023, formatMessage(item))) End If Next End Sub Public Function GetAllDeclaredMembers(structural As StructuralType) As IEnumerable(Of EdmMember) If(TypeOf structural Is EntityType) Then Dim entity As EntityType = CType(structural, EntityType) Dim declaredMembers As IEnumerable(Of EdmMember) = entity.Members.Where(Function(m) m.DeclaringType Is entity) Dim decalredNavigationProperties As IEnumerable(Of NavigationProperty) = entity.NavigationProperties.Where(Function(n) n.DeclaringType Is entity) Return declaredMembers.Union(decalredNavigationProperties.Cast(Of EdmMember)()) End If Return structural.Members.Where(Function(m) m.DeclaringType Is structural) End Function Private Sub DefineMetadata() TemplateMetadata(MetadataConstants.TT_TEMPLATE_NAME) = "VBCodeGen" TemplateMetadata(MetadataConstants.TT_TEMPLATE_VERSION) = "4.0" TemplateMetadata(MetadataConstants.TT_MINIMUM_ENTITY_FRAMEWORK_VERSION) = "4.0" End Sub Private NotInheritable Class UniqueIdentifierService Private ReadOnly _knownIdentifiers As HashSet(Of String) = New HashSet(Of string)(StringComparer.OrdinalIgnoreCase) ''' ''' ''' ''' Public Function AdjustIdentifier(identifier As String) As String ' Dim numberOfConflicts As Int32 = 0 Dim adjustedIdentifier As String = identifier While Not _knownIdentifiers.Add(adjustedIdentifier) numberOfConflicts += 1 adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture) End While Return adjustedIdentifier End Function End Class ' Copyright (c) Microsoft Corporation. All rights reserved. Public Shared TemplateMetadata As New Dictionary(Of String, String)() ''' ''' Responsible for helping to create source code that is ''' correctly formated and functional ''' Public Class CodeGenerationTools Private ReadOnly _textTransformation As DynamicTextTransformation Private ReadOnly _code As VBCodeProvider Private ReadOnly _ef As MetadataTools ''' ''' Initializes a new CodeGenerationTools object with the TextTransformation (T4 generated class) ''' that is currently running. ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) _code = New VBCodeProvider() _ef = New MetadataTools(_textTransformation) FullyQualifySystemTypes = False CamelCaseFields = True End Sub ''' ''' When true, all types that are not being generated ''' are fully qualified to keep them from conflicting with ''' types that are being generated. Useful when you have ''' something like a type being generated named System. ''' ''' Default is false. ''' Private _FullyQualifySystemTypes As Boolean Public Property FullyQualifySystemTypes() As Boolean Get Return _FullyQualifySystemTypes End Get Set(ByVal value As Boolean) _FullyQualifySystemTypes = value End Set End Property ''' ''' When true, the field names are Camel Cased, ''' otherwise they will preserve the case they ''' start with. ''' ''' Default is true. ''' Private _CamelCaseFields As Boolean Public Property CamelCaseFields() As Boolean Get Return _CamelCaseFields End Get Set(ByVal value As Boolean) _CamelCaseFields = value End Set End Property ''' ''' Returns the NamespaceName suggested by VS if running inside VS. Otherwise, returns ''' null. ''' Public Function VsNamespaceSuggestion() As String Dim suggestion As String = _textTransformation.Host.ResolveParameterValue("directiveId", "namespaceDirectiveProcessor", "namespaceHint") If String.IsNullOrEmpty(suggestion) Then Return Nothing End If Return suggestion End Function ''' ''' Returns a string that is safe for use as an identifier in C#. ''' Keywords are escaped. ''' Public Function Escape(ByVal name As String) As String If name Is Nothing Then Return Nothing End If Return _code.CreateEscapedIdentifier(name) End Function ''' ''' Returns the name of the TypeUsage's EdmType that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal typeUsage As TypeUsage) As String If typeUsage Is Nothing Then Return Nothing End If If TypeOf typeUsage.EdmType Is ComplexType OrElse TypeOf typeUsage.EdmType Is EntityType Then Return Escape(typeUsage.EdmType.Name) ElseIf TypeOf typeUsage.EdmType Is SimpleType Then Dim clrType As Type = _ef.UnderlyingClrType(typeUsage.EdmType) Dim typeName As String = If(TypeOf typeUsage.EdmType Is EnumType, Escape(typeUsage.EdmType.Name), Escape(clrType)) If clrType.IsValueType AndAlso _ef.IsNullable(typeUsage) Then Return String.Format(CultureInfo.InvariantCulture, "Nullable(Of {0})", typeName) End If Return typeName ElseIf TypeOf typeUsage.EdmType Is CollectionType Then Return String.Format(CultureInfo.InvariantCulture, "ICollection(Of {0})", Escape(DirectCast(typeUsage.EdmType, CollectionType).TypeUsage)) End If Throw New ArgumentException("typeUsage") End Function ''' ''' Returns the name of the EdmMember that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return Escape(member.Name) End Function ''' ''' Returns the name of the EdmType that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal type As EdmType) As String If type Is Nothing Then Return Nothing End If Return Escape(type.Name) End Function ''' ''' Returns the name of the EdmFunction that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal edmFunction As EdmFunction) As String If edmFunction Is Nothing Then Return Nothing End If Return Escape(edmFunction.Name) End Function ''' ''' Returns the name of the EnumMember that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal member As EnumMember) As String If member Is Nothing Then Return Nothing End If Return Escape(member.Name) End Function ''' ''' Returns the name of the EntityContainer that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal container As EntityContainer) As String If container Is Nothing Then Return Nothing End If Return Escape(container.Name) End Function ''' ''' Returns the name of the EntitySet that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal edmSet As EntitySet) As String If edmSet Is Nothing Then Return Nothing End If Return Escape(edmSet.Name) End Function ''' ''' Returns the name of the StructuralType that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal type As StructuralType) As String If type Is Nothing Then Return Nothing End If Return Escape(type.Name) End Function ''' ''' Returns the NamespaceName with each segment safe to ''' use as an identifier. ''' Public Function EscapeNamespace(ByVal namespaceName As String) As String If String.IsNullOrEmpty(namespaceName) Then Return namespaceName End If Dim parts As String() = namespaceName.Split("."c) namespaceName = String.Empty For Each part As String In parts If namespaceName <> String.Empty Then namespaceName += "." End If namespaceName += Escape(part) Next Return namespaceName End Function ''' ''' Returns the name of the EdmMember formatted for ''' use as a field identifier. ''' ''' This method changes behavior based on the CamelCaseFields ''' setting. ''' Public Function FieldName(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return FieldName(member.Name) End Function ''' ''' Returns the name of the EntitySet formatted for ''' use as a field identifier. ''' ''' This method changes behavior based on the CamelCaseFields ''' setting. ''' Public Function FieldName(ByVal edmSet As EntitySet) As String If edmSet Is Nothing Then Return Nothing End If Return FieldName(edmSet.Name) End Function Private Function FieldName(ByVal name As String) As String If CamelCaseFields Then Return "_" & CamelCase(name) Else Return "_" & name End If End Function ''' ''' Returns the name of the Type object formatted for ''' use in source code. ''' ''' This method changes behavior based on the FullyQualifySystemTypes ''' setting. ''' Public Function Escape(ByVal clrType As Type) As String Return Escape(clrType, FullyQualifySystemTypes) End Function ''' ''' Returns the name of the Type object formatted for ''' use in source code. ''' Public Function Escape(ByVal clrType As Type, ByVal fullyQualifySystemTypes As Boolean) As String If clrType Is Nothing Then Return Nothing End If Dim typeName As String If fullyQualifySystemTypes Then If(Not clrType.IsArray) Then typeName = clrType.FullName Else typeName = clrType.GetElementType().FullName & "()" End If typeName = "Global." & typeName Else typeName = _code.GetTypeOutput(New CodeTypeReference(clrType)) End If Return typeName End Function ''' ''' Returns the abstract option if the entity is Abstract, otherwise returns String.Empty ''' Public Function MustInheritOption(entity As EntityType) As String If entity.Abstract Then Return "MustInherit" End If Return String.Empty End Function ''' ''' Returns the passed in identifier with the first letter changed to lowercase ''' Public Function CamelCase(ByVal identifier As String) As String If String.IsNullOrEmpty(identifier) Then Return identifier End If If identifier.Length = 1 Then Return identifier(0).ToString(CultureInfo.InvariantCulture).ToLowerInvariant() End If Return identifier(0).ToString(CultureInfo.InvariantCulture).ToLowerInvariant() + identifier.Substring(1) End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with a single space concatenated on the end. ''' Public Function SpaceAfter(ByVal value As String) As String Return StringAfter(value, " ") End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with a single space concatenated on the end. ''' Public Function SpaceBefore(ByVal value As String) As String Return StringBefore(" ", value) End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with append concatenated on the end. ''' Public Function StringAfter(ByVal value As String, ByVal append As String) As String If String.IsNullOrEmpty(value) Then Return String.Empty End If Return value + append End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with prepend concatenated on the front. ''' Public Function StringBefore(ByVal prepend As String, ByVal value As String) As String If String.IsNullOrEmpty(value) Then Return String.Empty End If Return prepend + value End Function ''' ''' Returns false and shows an error if the supplied type names aren't case-insensitively unique, ''' otherwise returns true. ''' Public Function VerifyCaseInsensitiveTypeUniqueness(types As IEnumerable(Of String), ByVal sourceFile As String) As Boolean Return VerifyCaseInsensitiveUniqueness(types, _ Function(t) String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_CaseInsensitiveTypeConflict"), t), sourceFile) End Function ''' ''' Returns false and shows an error if the supplied entity set names aren't case-insensitively unique, ''' otherwise returns true. ''' Public Function VerifyCaseInsensitiveEntitySetUniqueness(entitySets As IEnumerable(Of String), ByVal entityContainerName As String, ByVal sourceFile As String) As Boolean Return VerifyCaseInsensitiveUniqueness(entitySets, Function(e) String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_CaseInsensitiveEntitySetConflict"), entityContainerName, e), sourceFile) End Function ''' ''' Returns false and shows an error if the supplied type members names aren't case-insensitively unique, ''' otherwise returns true. ''' Public Function VerifyCaseInsensitiveMemberUniqueness(members As IEnumerable(Of String), ByVal declaringType As String, ByVal sourceFile As String) As Boolean Return VerifyCaseInsensitiveUniqueness(members, _ Function(m) String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_CaseInsensitiveMemberConflict"), declaringType, m), sourceFile) End Function ''' ''' Returns false and shows an error if the supplied strings aren't case-insensitively unique, ''' otherwise returns true. ''' Private Function VerifyCaseInsensitiveUniqueness(items As IEnumerable(Of String), formatMessage As Func(Of String, String), ByVal sourceFile As String) As Boolean Dim hash As HashSet(Of String) = New HashSet(Of String)(StringComparer.InvariantCultureIgnoreCase) For Each item As String in items If Not hash.Add(item) Then _textTransformation.Errors.Add(New System.CodeDom.Compiler.CompilerError(sourceFile, -1, -1, 6023, formatMessage(item))) Return False End If Next Return True End Function ''' ''' Returns the names of the items in the supplied collection that correspond to O-Space types. ''' Public Function GetAllGlobalItems(ByVal itemCollection As EdmItemCollection) As IEnumerable(Of String) Return itemCollection.GetItems(Of GlobalItem)() _ .Where(Function(i) TypeOf i Is EntityType OrElse TypeOf i Is ComplexType OrElse TypeOf i Is EnumType OrElse TypeOf i is EntityContainer) _ .Select(Function(g) GetGlobalItemName(g)) End Function ''' ''' Returns the name of the supplied GlobalItem. ''' Private Function GetGlobalItemName(item As GlobalItem) As String If TypeOf item Is EdmType Then Return CType(item, EdmType).Name Else Return CType(item, EntityContainer).Name End If End Function ''' ''' Returns the names of the members of the supplied EdmType. ''' Public Function GetAllDeclaredMembers(edmType As EdmType) As IEnumerable(Of String) Dim entity As EntityType = TryCast(edmType, EntityType) If Not entity Is Nothing Then Dim declaredMembers As IEnumerable(Of EdmMember) = entity.Members.Where(Function(m) m.DeclaringType Is entity) Dim decalredNavigationProperties As IEnumerable(Of NavigationProperty) = entity.NavigationProperties.Where(Function(n) n.DeclaringType Is entity) Return declaredMembers.Union(decalredNavigationProperties.Cast(Of EdmMember)()).Select(Function(m) m.Name) End If Dim structural As StructuralType = TryCast(edmType, StructuralType) If Not structural Is Nothing Then Return structural.Members.Where(Function(m) m.DeclaringType Is structural).Select(Function(m) m.Name) End If Dim enumType As EnumType = TryCast(edmType, EnumType) If Not enumType Is Nothing Then Return enumType.Members.Select(Function(m) m.Name) End If Return Enumerable.Empty(Of String)() End Function ''' ''' Retuns as full of a name as possible, if a namespace is provided ''' the namespace and name are combined with a period, otherwise just ''' the name is returned. ''' Public Function CreateFullName(ByVal namespaceName As String, ByVal name As String) As String If String.IsNullOrEmpty(namespaceName) Then Return name End If Return (namespaceName & ".") + name End Function ''' ''' Retuns a literal representing the supplied value. ''' Public Function CreateLiteral(ByVal value As Object) As String If value Is Nothing Then Return String.Empty End If Dim type As Type = value.GetType() If type.IsEnum Then Return (type.FullName & ".") + value.ToString() End If If type Is GetType(Guid) Then Return String.Format(CultureInfo.InvariantCulture, "New Guid(""{0}"")", DirectCast(value, Guid).ToString("D", CultureInfo.InvariantCulture)) ElseIf type Is GetType(DateTime) Then Return String.Format(CultureInfo.InvariantCulture, "New DateTime({0}, DateTimeKind.Unspecified)", DirectCast(value, DateTime).Ticks) ElseIf type Is GetType(Byte()) Then Dim arrayInit As String = String.Join(", ", DirectCast(value, Byte()).Select(Function(b) b.ToString(CultureInfo.InvariantCulture)).ToArray()) Return String.Format(CultureInfo.InvariantCulture, "New Byte() {{{0}}}", arrayInit) ElseIf type Is GetType(DateTimeOffset) Then Dim dto As DateTimeOffset = DirectCast(value, DateTimeOffset) Return String.Format(CultureInfo.InvariantCulture, "New DateTimeOffset({0}, New TimeSpan({1}))", dto.Ticks, dto.Offset.Ticks) ElseIf type Is GetType(Decimal) Then Return String.Format(CultureInfo.InvariantCulture, "{0}D", DirectCast(value, Decimal).ToString(CultureInfo.InvariantCulture)) ElseIf type Is GetType(TimeSpan) Then Return String.Format(CultureInfo.InvariantCulture, "New TimeSpan({0})", DirectCast(value, TimeSpan).Ticks) End If Dim expression As CodePrimitiveExpression = New CodePrimitiveExpression(value) Dim writer As StringWriter = New StringWriter() Dim code As VBCodeProvider = New VBCodeProvider() code.GenerateCodeFromExpression(expression, writer, New CodeGeneratorOptions()) Return writer.ToString() End Function ''' ''' Returns a resource string from the System.Data.Entity.Design assembly. ''' Public Shared Function GetResourceString(resourceName As String, Optional culture As CultureInfo = Nothing) As String If _resourceManager Is Nothing Then _resourceManager = New System.Resources.ResourceManager("System.Data.Entity.Design", GetType(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly) End If Return _resourceManager.GetString(resourceName, culture) End Function Shared Private _resourceManager As System.Resources.ResourceManager Private Const ExternalTypeNameAttributeName As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName" ''' ''' Gets the entity, complex, or enum types for which code should be generated from the given item collection. ''' Any types for which an ExternalTypeName annotation has been applied in the conceptual model ''' metadata (CSDL) are filtered out of the returned list. ''' ''' The type of item to return. ''' The item collection to look in. ''' The items to generate. Public Function GetItemsToGenerate(Of T As GlobalItem)(itemCollection As ItemCollection) As IEnumerable(Of T) Return itemCollection.GetItems(Of T)().Where(Function(i) Not i.MetadataProperties.Any(Function(p) p.Name = ExternalTypeNameAttributeName)) End Function ''' ''' Returns the escaped type name to use for the given usage of an o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type usage to get a name for. ''' The type name to use. Public Function GetTypeName(typeUsage As TypeUsage) As String Return If(typeUsage Is Nothing, Nothing, GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace := Nothing)) End Function ''' ''' Returns the escaped type name to use for the given o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type to get a name for. ''' The type name to use. Public Function GetTypeName(edmType As EdmType) As String Return GetTypeName(edmType, isNullable := Nothing, modelNamespace := Nothing) End Function ''' ''' Returns the escaped type name to use for the given usage of an o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type usage to get a name for. ''' If not null and the type's namespace does not match this namespace, then a ''' fully qualified name will be returned. ''' The type name to use. Public Function GetTypeName(typeUsage As TypeUsage, modelNamespace As String) As String Return If(typeUsage Is Nothing, Nothing, GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace)) End Function ''' ''' Returns the escaped type name to use for the given o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type to get a name for. ''' If not null and the type's namespace does not match this namespace, then a ''' fully qualified name will be returned. ''' The type name to use. Public Function GetTypeName(edmType As EdmType, modelNamespace As String) As String Return GetTypeName(edmType, isNullable := Nothing, modelNamespace := modelNamespace) End Function ''' ''' Returns the escaped type name to use for the given o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type to get a name for. ''' Set this to true for nullable usage of this type. ''' If not null and the type's namespace does not match this namespace, then a ''' fully qualified name will be returned. ''' The type name to use. Private Function GetTypeName(edmType As EdmType, isNullable As System.Nullable(Of Boolean), modelNamespace As String) As String If edmType Is Nothing Then Return Nothing End If Dim collectionType = TryCast(edmType, CollectionType) If collectionType IsNot Nothing Then Return String.Format(CultureInfo.InvariantCulture, "ICollection( Of {0})", GetTypeName(collectionType.TypeUsage, modelNamespace)) End If Dim typeName = If(Escape(edmType.MetadataProperties.Where(Function(p) p.Name = ExternalTypeNameAttributeName).[Select](Function(p) DirectCast(p.Value, String)).FirstOrDefault()), (If(modelNamespace IsNot Nothing AndAlso edmType.NamespaceName <> modelNamespace, CreateFullName(EscapeNamespace(edmType.NamespaceName), Escape(edmType)), Escape(edmType)))) If TypeOf edmType Is StructuralType Then Return typeName End If If TypeOf edmType Is SimpleType Then Dim clrType = _ef.UnderlyingClrType(edmType) If Not (TypeOf edmType Is EnumType) Then typeName = Escape(clrType) End If Return If(clrType.IsValueType AndAlso isNullable = True, String.Format(CultureInfo.InvariantCulture, "Nullable(Of {0})", typeName), typeName) End If Throw New ArgumentException("typeUsage") End Function End Class ''' ''' Responsible for making the Entity Framework Metadata more ''' accessible for code generation. ''' Public Class MetadataTools Private ReadOnly _textTransformation As DynamicTextTransformation ''' ''' Initializes an MetadataTools Instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) End Sub ''' ''' This method returns the underlying CLR type of the O-space type corresponding to the supplied ''' Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. ''' Public Function ClrType(typeUsage As TypeUsage) As Type Return UnderlyingClrType(typeUsage.EdmType) End Function ''' ''' This method returns the underlying CLR type of given the O-space type. ''' Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. ''' Public Function UnderlyingClrType(edmType As EdmType) As Type Dim primitiveType = TryCast(edmType, PrimitiveType) If primitiveType IsNot Nothing Then Return primitiveType.ClrEquivalentType End If Dim enumType = TryCast(edmType, EnumType) If enumType IsNot Nothing Then Return enumType.UnderlyingType.ClrEquivalentType End If Return GetType(Object) End Function ''' ''' True if the EdmProperty is a key of its DeclaringType, False otherwise. ''' Public Function IsKey(ByVal edmProp As EdmProperty) As Boolean If edmProp IsNot Nothing AndAlso edmProp.DeclaringType.BuiltInTypeKind = BuiltInTypeKind.EntityType Then Return DirectCast(edmProp.DeclaringType, EntityType).KeyMembers.Contains(edmProp) End If Return False End Function ''' ''' True if the EdmProperty TypeUsage is Nullable, False otherwise. ''' Public Function IsNullable(ByVal edmProp As EdmProperty) As Boolean Return edmProp IsNot Nothing AndAlso IsNullable(edmProp.TypeUsage) End Function ''' ''' True if the TypeUsage is Nullable, False otherwise. ''' Public Function IsNullable(ByVal typeUsage As TypeUsage) As Boolean Dim nullableFacet As Facet = Nothing If typeUsage IsNot Nothing AndAlso typeUsage.Facets.TryGetValue("Nullable", True, nullableFacet) Then Return CBool(nullableFacet.Value) End If Return False End Function ''' ''' If the passed in TypeUsage represents a collection this method returns final element ''' type of the collection, otherwise it returns the value passed in. ''' Public Function GetElementType(ByVal typeUsage As TypeUsage) As TypeUsage If typeUsage Is Nothing Then Return Nothing End If If TypeOf typeUsage.EdmType Is CollectionType Then Return GetElementType(DirectCast(typeUsage.EdmType, CollectionType).TypeUsage) Else Return typeUsage End If End Function ''' ''' Returns the NavigationProperty that is the other end of the same association set if it is ''' available, otherwise it returns null. ''' Public Function Inverse(ByVal navProperty As NavigationProperty) As NavigationProperty If navProperty Is Nothing Then Return Nothing End If Dim toEntity As EntityType = navProperty.ToEndMember.GetEntityType() Return toEntity.NavigationProperties.SingleOrDefault(Function(n) n.RelationshipType Is navProperty.RelationshipType AndAlso n IsNot navProperty) End Function ''' ''' Given a property on the dependent end of a referential constraint, returns the corresponding property on the principal end. ''' Requires: The association has a referential constraint, and the specified dependentProperty is one of the properties on the dependent end. ''' Public Function GetCorrespondingPrincipalProperty(ByVal navProperty As NavigationProperty, ByVal dependentProperty As EdmProperty) As EdmProperty If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If If dependentProperty Is Nothing Then Throw New ArgumentNullException("dependentProperty") End If Dim fromProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetPrincipalProperties(navProperty) Dim toProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetDependentProperties(navProperty) Return fromProperties(toProperties.IndexOf(dependentProperty)) End Function ''' ''' Given a property on the principal end of a referential constraint, returns the corresponding property on the dependent end. ''' Requires: The association has a referential constraint, and the specified principalProperty is one of the properties on the principal end. ''' Public Function GetCorrespondingDependentProperty(ByVal navProperty As NavigationProperty, ByVal principalProperty As EdmProperty) As EdmProperty If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If If principalProperty Is Nothing Then Throw New ArgumentNullException("principalProperty") End If Dim fromProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetPrincipalProperties(navProperty) Dim toProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetDependentProperties(navProperty) Return toProperties(fromProperties.IndexOf(principalProperty)) End Function ''' ''' Gets the collection of properties that are on the principal end of a referential constraint for the specified navigation property. ''' Requires: The association has a referential constraint. ''' Public Function GetPrincipalProperties(ByVal navProperty As NavigationProperty) As ReadOnlyMetadataCollection(Of EdmProperty) If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If Return DirectCast(navProperty.RelationshipType, AssociationType).ReferentialConstraints(0).FromProperties End Function ''' ''' Gets the collection of properties that are on the dependent end of a referential constraint for the specified navigation property. ''' Requires: The association has a referential constraint. ''' Public Function GetDependentProperties(ByVal navProperty As NavigationProperty) As ReadOnlyMetadataCollection(Of EdmProperty) If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If Return DirectCast(navProperty.RelationshipType, AssociationType).ReferentialConstraints(0).ToProperties End Function ''' ''' True if this entity type requires the HandleCascadeDelete method defined and the method has ''' not been defined on any base type ''' Public Function NeedsHandleCascadeDeleteMethod(itemCollection As ItemCollection, entity As EntityType) As Boolean Dim needsMethod As Boolean = ContainsCascadeDeleteAssociation(itemCollection, entity) ' Check to make sure no base types have already declared this method Dim baseType As EntityType = TryCast(entity.BaseType, EntityType) While needsMethod AndAlso baseType IsNot Nothing needsMethod = Not ContainsCascadeDeleteAssociation(itemCollection, baseType) baseType = TryCast(baseType.BaseType, EntityType) End While Return needsMethod End Function ''' ''' True if this entity type participates in any relationships where the other end has an OnDelete ''' cascade delete defined, or if it is the dependent in any identifying relationships ''' Private Function ContainsCascadeDeleteAssociation(itemCollection As ItemCollection, entity As EntityType) As Boolean Return itemCollection.GetItems(Of AssociationType)().Where(Function(a) DirectCast(a.AssociationEndMembers(0).TypeUsage.EdmType, RefType).ElementType Is entity AndAlso IsCascadeDeletePrincipal(a.AssociationEndMembers(1)) OrElse DirectCast(a.AssociationEndMembers(1).TypeUsage.EdmType, RefType).ElementType Is entity AndAlso IsCascadeDeletePrincipal(a.AssociationEndMembers(0))).Any() End Function ''' ''' True if the source end of the specified navigation property is the principal in an identifying relationship. ''' or if the source end has cascade delete defined. ''' Public Function IsCascadeDeletePrincipal(ByVal navProperty As NavigationProperty) As Boolean If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If Return IsCascadeDeletePrincipal(DirectCast(navProperty.FromEndMember, AssociationEndMember)) End Function ''' ''' True if the specified association end is the principal in an identifying relationship. ''' or if the association end has cascade delete defined. ''' Public Function IsCascadeDeletePrincipal(ByVal associationEnd As AssociationEndMember) As Boolean If associationEnd Is Nothing Then Throw New ArgumentNullException("associationEnd") End If Return associationEnd.DeleteBehavior = OperationAction.Cascade OrElse IsPrincipalEndOfIdentifyingRelationship(associationEnd) End Function ''' ''' True if the specified association end is the principal end in an identifying relationship. ''' In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. ''' Public Function IsPrincipalEndOfIdentifyingRelationship(ByVal associationEnd As AssociationEndMember) As Boolean If associationEnd Is Nothing Then Throw New ArgumentNullException("associationEnd") End If Dim refConstraint As ReferentialConstraint = DirectCast(associationEnd.DeclaringType, AssociationType).ReferentialConstraints.Where(Function(rc) rc.FromRole Is associationEnd).SingleOrDefault() If refConstraint IsNot Nothing Then Dim entity As EntityType = refConstraint.ToRole.GetEntityType() Return Not refConstraint.ToProperties.Where(Function(tp) Not entity.KeyMembers.Contains(tp)).Any() End If Return False End Function ''' ''' True if the specified association type is an identifying relationship. ''' In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. ''' Public Function IsIdentifyingRelationship(ByVal association As AssociationType) As Boolean If association Is Nothing Then Throw New ArgumentNullException("association") End If Return IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers(0)) OrElse IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers(1)) End Function ''' ''' requires: firstType is not null ''' effects: if secondType is among the base types of the firstType, return true, ''' otherwise returns false. ''' when firstType is same as the secondType, return false. ''' Public Function IsSubtypeOf(ByVal firstType As EdmType, ByVal secondType As EdmType) As Boolean If secondType Is Nothing Then Return False End If ' walk up firstType hierarchy list Dim t As EdmType = firstType.BaseType While t IsNot Nothing If t.Equals(secondType) Then Return True End If t = t.BaseType End While Return False End Function ''' ''' Returns the subtype of the EntityType in the current itemCollection ''' Public Function GetSubtypesOf(ByVal type As EntityType, ByVal itemCollection As ItemCollection, ByVal includeAbstractTypes As Boolean) As IEnumerable(Of EntityType) Dim subTypes As List(Of EntityType) = New List(Of EntityType) If type IsNot Nothing Then Dim typesInCollection As IEnumerable(Of EntityType) = itemCollection.GetItems(Of EntityType)() For Each typeInCollection As EntityType In typesInCollection If type.Equals(typeInCollection) = False AndAlso Me.IsSubtypeOf(typeInCollection, type) Then If includeAbstractTypes OrElse Not typeInCollection.Abstract Then subTypes.Add(typeInCollection) End If End If Next End If Return subTypes End Function Public Shared Function TryGetStringMetadataPropertySetting(ByVal item As MetadataItem, ByVal propertyName As String, ByRef value As String) As Boolean Dim [property] As MetadataProperty = item.MetadataProperties.FirstOrDefault(Function(p) p.Name = propertyName) If [property] IsNot Nothing Then value = DirectCast([property].Value, String) End If Return value IsNot Nothing End Function End Class ''' ''' Responsible for loading an EdmItemCollection from a .edmx file or .csdl files ''' Public Class MetadataLoader Private ReadOnly _textTransformation As DynamicTextTransformation ''' ''' Initializes an MetadataLoader Instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) End Sub ''' ''' Load the metadata for Edm, Store, and Mapping collections and register them ''' with a new MetadataWorkspace, returns false if any of the parts can't be ''' created, some of the ItemCollections may be registered and usable even if false is ''' returned ''' Public Function TryLoadAllMetadata(ByVal inputFile As String, ByRef metadataWorkspace As MetadataWorkspace) As Boolean metadataWorkspace = New MetadataWorkspace() Dim edmItemCollection As EdmItemCollection = CreateEdmItemCollection(inputFile) metadataWorkspace.RegisterItemCollection(edmItemCollection) Dim storeItemCollection As StoreItemCollection = Nothing If TryCreateStoreItemCollection(inputFile, storeItemCollection) Then Dim storageMappingItemCollection As StorageMappingItemCollection = Nothing If TryCreateStorageMappingItemCollection(inputFile, edmItemCollection, storeItemCollection, storageMappingItemCollection) Then metadataWorkspace.RegisterItemCollection(storeItemCollection) metadataWorkspace.RegisterItemCollection(storageMappingItemCollection) Return True End If End If Return False End Function ''' ''' Create an EdmItemCollection loaded with the metadata provided ''' Public Function CreateEdmItemCollection(ByVal sourcePath As String, ByVal ParamArray referenceSchemas As String()) As EdmItemCollection Dim edmItemCollection As EdmItemCollection = Nothing If TryCreateEdmItemCollection(sourcePath, referenceSchemas, edmItemCollection) Then Return edmItemCollection End If Return New EdmItemCollection() End Function ''' ''' Attempts to create a EdmItemCollection from the specified metadata file ''' Public Function TryCreateEdmItemCollection(ByVal sourcePath As String, ByRef edmItemCollection As EdmItemCollection) As Boolean Return TryCreateEdmItemCollection(sourcePath, Nothing, edmItemCollection) End Function ''' ''' Attempts to create a EdmItemCollection from the specified metadata file ''' Public Function TryCreateEdmItemCollection(ByVal sourcePath As String, ByVal referenceSchemas As String(), ByRef edmItemCollection As EdmItemCollection) As Boolean edmItemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If If referenceSchemas Is Nothing Then referenceSchemas = New String(-1) {} End If Dim itemCollection As ItemCollection = Nothing sourcePath = _textTransformation.Host.ResolvePath(sourcePath) Dim collectionBuilder As New EdmItemCollectionBuilder(_textTransformation, referenceSchemas.Select(Function(s) _textTransformation.Host.ResolvePath(s)).Where(Function(s) s <> sourcePath)) If collectionBuilder.TryCreateItemCollection(sourcePath, itemCollection) Then edmItemCollection = DirectCast(itemCollection, EdmItemCollection) End If Return edmItemCollection IsNot Nothing End Function ''' ''' Attempts to create a StoreItemCollection from the specified metadata file ''' Public Function TryCreateStoreItemCollection(ByVal sourcePath As String, ByRef storeItemCollection As StoreItemCollection) As Boolean storeItemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If Dim itemCollection As ItemCollection = Nothing Dim collectionBuilder As New StoreItemCollectionBuilder(_textTransformation) If collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), itemCollection) Then storeItemCollection = DirectCast(itemCollection, StoreItemCollection) End If Return storeItemCollection IsNot Nothing End Function ''' ''' Attempts to create a StorageMappingItemCollection from the specified metadata file, EdmItemCollection, and StoreItemCollection ''' Public Function TryCreateStorageMappingItemCollection(ByVal sourcePath As String, ByVal edmItemCollection As EdmItemCollection, ByVal storeItemCollection As StoreItemCollection, ByRef storageMappingItemCollection As StorageMappingItemCollection) As Boolean storageMappingItemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If If edmItemCollection Is Nothing Then Throw New ArgumentNullException("edmItemCollection") End If If storeItemCollection Is Nothing Then Throw New ArgumentNullException("storeItemCollection") End If Dim itemCollection As ItemCollection = Nothing Dim collectionBuilder As New StorageMappingItemCollectionBuilder(_textTransformation, edmItemCollection, storeItemCollection) If collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), itemCollection) Then storageMappingItemCollection = DirectCast(itemCollection, StorageMappingItemCollection) End If Return storageMappingItemCollection IsNot Nothing End Function ''' ''' Gets the Model Namespace from the provided schema file. ''' Public Function GetModelNamespace(ByVal sourcePath As String) As String If Not ValidateInputPath(sourcePath, _textTransformation) Then Return String.Empty End If Dim builder As New EdmItemCollectionBuilder(_textTransformation) Dim model As XElement = Nothing If builder.TryLoadRootElement(_textTransformation.Host.ResolvePath(sourcePath), model) Then Dim attribute As XAttribute = model.Attribute("Namespace") If attribute IsNot Nothing Then Return attribute.Value End If End If Return String.Empty End Function ''' ''' Returns true if the specified file path is valid ''' Private Shared Function ValidateInputPath(sourcePath As String, textTransformation As DynamicTextTransformation) As Boolean If String.IsNullOrEmpty(sourcePath) Then Throw New ArgumentException("sourcePath") End If If sourcePath = "$edmxInputFile$" Then textTransformation.Errors.Add(New CompilerError(If(textTransformation.Host.TemplateFile, CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate")), -1, -1, String.Empty, _ CodeGenerationTools.GetResourceString("Template_ReplaceVsItemTemplateToken"))) Return False End If Return True End Function ''' ''' base class for ItemCollectionBuilder classes that ''' load the specific types of metadata ''' Private MustInherit Class ItemCollectionBuilder Private ReadOnly _textTransformation As DynamicTextTransformation Private ReadOnly _fileExtension As String Private ReadOnly _edmxSectionName As String Private ReadOnly _rootElementName As String ''' ''' FileExtension for individual (non-edmx) metadata file for this ''' specific ItemCollection type ''' Public ReadOnly Property FileExtension() As String Get Return _fileExtension End Get End Property ''' ''' The name of the XmlElement in the .edmx element ''' to find this ItemCollection's metadata ''' Public ReadOnly Property EdmxSectionName() As String Get Return _edmxSectionName End Get End Property ''' ''' The name of the root element of this ItemCollection's metadata ''' Public ReadOnly Property RootElementName() As String Get Return _rootElementName End Get End Property ''' ''' Method to build the appropriate ItemCollection ''' Protected MustOverride Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection ''' ''' Ctor to setup the ItemCollectionBuilder members ''' Protected Sub New(ByVal textTransformation As DynamicTextTransformation, ByVal fileExtension As String, ByVal edmxSectionName As String, ByVal rootElementName As String) _textTransformation = textTransformation _fileExtension = fileExtension _edmxSectionName = edmxSectionName _rootElementName = rootElementName End Sub ''' ''' Selects a namespace from the supplied constants. ''' Protected MustOverride Function GetNamespace(ByVal constants As SchemaConstants) As String ''' ''' Try to create an ItemCollection loaded with the metadata provided ''' Public Function TryCreateItemCollection(ByVal sourcePath As String, ByRef itemCollection As ItemCollection) As Boolean itemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If Dim schemaElement As XElement = Nothing If TryLoadRootElement(sourcePath, schemaElement) Then Dim readers As New List(Of XmlReader)() Try readers.Add(schemaElement.CreateReader()) Dim errors As IList(Of EdmSchemaError) = Nothing Dim tempItemCollection As ItemCollection = CreateItemCollection(readers, errors) If ProcessErrors(errors, sourcePath) Then Return False End If itemCollection = tempItemCollection Return True Finally For Each reader As XmlReader In readers DirectCast(reader, IDisposable).Dispose() Next End Try End If Return False End Function ''' ''' Tries to load the root element from the metadata file provided ''' Public Function TryLoadRootElement(ByVal sourcePath As String, ByRef schemaElement As XElement) As Boolean schemaElement = Nothing Dim extension As String = Path.GetExtension(sourcePath) If extension.Equals(".edmx", StringComparison.InvariantCultureIgnoreCase) Then Return TryLoadRootElementFromEdmx(sourcePath, schemaElement) ElseIf extension.Equals(FileExtension, StringComparison.InvariantCultureIgnoreCase) Then ' load from single metadata file (.csdl, .ssdl, or .msl) schemaElement = XElement.Load(sourcePath, LoadOptions.SetBaseUri Or LoadOptions.SetLineInfo) Return True End If Return False End Function ''' ''' Tries to load the root element from the provided edmxDocument ''' Private Function TryLoadRootElementFromEdmx(ByVal edmxDocument As XElement, ByVal schemaConstants As SchemaConstants, ByVal sectionName As String, ByVal rootElementName As String, ByRef rootElement As XElement) As Boolean rootElement = Nothing Dim edmxNs As XNamespace = schemaConstants.EdmxNamespace Dim sectionNs As XNamespace = GetNamespace(schemaConstants) Dim runtime As XElement = edmxDocument.Element(edmxNs + "Runtime") If runtime Is Nothing Then Return False End If Dim section As XElement = runtime.Element(edmxNs + sectionName) If section Is Nothing Then Return False End If Dim templateVersion As String = Nothing If Not TemplateMetadata.TryGetValue(MetadataConstants.TT_TEMPLATE_VERSION, templateVersion) Then templateVersion = MetadataConstants.DEFAULT_TEMPLATE_VERSION End If If schemaConstants.MinimumTemplateVersion > New Version(templateVersion) Then _textTransformation.Errors.Add(New CompilerError(If(_textTransformation.Host.TemplateFile, CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate")), -1, -1, String.Empty, _ CodeGenerationTools.GetResourceString("Template_UnsupportedSchema")) With { _ .IsWarning = True _ }) End If rootElement = section.Element(sectionNs + rootElementName) Return rootElement IsNot Nothing End Function ''' ''' Tries to load the root element from the provided .edmx metadata file ''' Private Function TryLoadRootElementFromEdmx(ByVal edmxPath As String, ByRef rootElement As XElement) As Boolean rootElement = Nothing Dim element As XElement = XElement.Load(edmxPath, LoadOptions.SetBaseUri Or LoadOptions.SetLineInfo) Return TryLoadRootElementFromEdmx(element, MetadataConstants.V3_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, rootElement) OrElse TryLoadRootElementFromEdmx(element, MetadataConstants.V2_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, rootElement) OrElse TryLoadRootElementFromEdmx(element, MetadataConstants.V1_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, rootElement) End Function ''' ''' Takes an Enumerable of EdmSchemaErrors, and adds them ''' to the errors collection of the template class ''' Private Function ProcessErrors(ByVal errors As IEnumerable(Of EdmSchemaError), ByVal sourceFilePath As String) As Boolean Dim foundErrors As Boolean = False For Each schemaError As EdmSchemaError In errors Dim newError As New CompilerError(schemaError.SchemaLocation, schemaError.Line, schemaError.Column, schemaError.ErrorCode.ToString(CultureInfo.InvariantCulture), schemaError.Message) newError.IsWarning = schemaError.Severity = EdmSchemaErrorSeverity.Warning foundErrors = foundErrors Or schemaError.Severity = EdmSchemaErrorSeverity.Error If schemaError.SchemaLocation Is Nothing Then newError.FileName = sourceFilePath End If _textTransformation.Errors.Add(newError) Next Return foundErrors End Function End Class ''' ''' Builder class for creating a StorageMappingItemCollection ''' Private Class StorageMappingItemCollectionBuilder Inherits ItemCollectionBuilder Private ReadOnly _edmItemCollection As EdmItemCollection Private ReadOnly _storeItemCollection As StoreItemCollection Public Sub New(ByVal textTransformation As DynamicTextTransformation, ByVal edmItemCollection As EdmItemCollection, ByVal storeItemCollection As StoreItemCollection) MyBase.New(textTransformation, MetadataConstants.MSL_EXTENSION, MetadataConstants.MSL_EDMX_SECTION_NAME, MetadataConstants.MSL_ROOT_ELEMENT_NAME) _edmItemCollection = edmItemCollection _storeItemCollection = storeItemCollection End Sub Protected Overloads Overrides Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection Return MetadataItemCollectionFactory.CreateStorageMappingItemCollection(_edmItemCollection, _storeItemCollection, readers, errors) End Function ''' ''' Selects a namespace from the supplied constants. ''' Protected Overrides Function GetNamespace(ByVal constants As SchemaConstants) As String Return constants.MslNamespace End Function End Class ''' ''' Builder class for creating a StoreItemCollection ''' Private Class StoreItemCollectionBuilder Inherits ItemCollectionBuilder Public Sub New(ByVal textTransformation As DynamicTextTransformation) MyBase.New(textTransformation, MetadataConstants.SSDL_EXTENSION, MetadataConstants.SSDL_EDMX_SECTION_NAME, MetadataConstants.SSDL_ROOT_ELEMENT_NAME) End Sub Protected Overloads Overrides Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection Return MetadataItemCollectionFactory.CreateStoreItemCollection(readers, errors) End Function ''' ''' Selects a namespace from the supplied constants. ''' Protected Overrides Function GetNamespace(ByVal constants As SchemaConstants) As String Return constants.SsdlNamespace End Function End Class ''' ''' Builder class for creating a EdmItemCollection ''' Private Class EdmItemCollectionBuilder Inherits ItemCollectionBuilder Private _referenceSchemas As New List(Of String)() Public Sub New(ByVal textTransformation As DynamicTextTransformation) MyBase.New(textTransformation, MetadataConstants.CSDL_EXTENSION, MetadataConstants.CSDL_EDMX_SECTION_NAME, MetadataConstants.CSDL_ROOT_ELEMENT_NAME) End Sub Public Sub New(ByVal textTransformation As DynamicTextTransformation, ByVal referenceSchemas As IEnumerable(Of String)) Me.New(textTransformation) _referenceSchemas.AddRange(referenceSchemas) End Sub Protected Overloads Overrides Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection Dim ownedReaders As New List(Of XmlReader)() Dim allReaders As New List(Of XmlReader)() Try allReaders.AddRange(readers) For Each path As String In _referenceSchemas.Distinct() Dim reference As XElement = Nothing If TryLoadRootElement(path, reference) Then Dim reader As XmlReader = reference.CreateReader() allReaders.Add(reader) ownedReaders.Add(reader) End If Next Return MetadataItemCollectionFactory.CreateEdmItemCollection(allReaders, errors) Finally For Each reader As XmlReader In ownedReaders DirectCast(reader, IDisposable).Dispose() Next End Try End Function ''' ''' Selects a namespace from the supplied constants. ''' Protected Overrides Function GetNamespace(ByVal constants As SchemaConstants) As String Return constants.CsdlNamespace End Function End Class End Class ''' ''' Responsible for encapsulating the retrieval and translation of the CodeGeneration ''' annotations in the EntityFramework Metadata to a form that is useful in code generation. ''' Public Class Accessibility Private Sub New() End Sub Private Const GETTER_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:GetterAccess" Private Const SETTER_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:SetterAccess" Private Const TYPE_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:TypeAccess" Private Const METHOD_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:MethodAccess" Private Const ACCESS_PROTECTED As String = "Protected" Private Const ACCESS_INTERNAL As String = "Internal" Private Const ACCESS_PRIVATE As String = "Private" Private Shared ReadOnly AccessibilityRankIdLookup As New Dictionary(Of String, Integer)() From _ { _ { "Private", 1}, _ { "Friend", 2}, _ { "Protected", 3}, _ { "Public", 4} _ } ''' ''' Gets the accessibility that should be applied to a type being generated from the provided GlobalItem. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForType(ByVal item As GlobalItem) As String If item Is Nothing Then Return Nothing End If Return GetAccessibility(item, TYPE_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the property level for a property being ''' generated from the provided EdmMember. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForProperty(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Dim getterAccess As String = Nothing Dim setterAccess As String = Nothing Dim propertyAccess As String = Nothing CalculatePropertyAccessibility(member, propertyAccess, getterAccess, setterAccess) Return propertyAccess End Function ''' ''' Gets the accessibility that should be applied at the property level for a Read-Only property being ''' generated from the provided EdmMember. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForReadOnlyProperty(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return GetAccessibility(member, GETTER_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the property level for a property being ''' generated from the provided EntitySet. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForReadOnlyProperty(ByVal edmSet As EntitySet) As String If edmSet Is Nothing Then Return Nothing End If Return GetAccessibility(edmSet, GETTER_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the property level for a Write-Only property being ''' generated from the provided EdmMember. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForWriteOnlyProperty(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return GetAccessibility(member, SETTER_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the get level for a property being ''' generated from the provided EdmMember. ''' ''' defaults to empty if no annotation is found or the accessibility is the same as the property level. ''' Public Shared Function ForGetter(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Dim getterAccess As String = Nothing Dim setterAccess As String = Nothing Dim propertyAccess As String = Nothing CalculatePropertyAccessibility(member, propertyAccess, getterAccess, setterAccess) Return getterAccess End Function ''' ''' Gets the accessibility that should be applied at the set level for a property being ''' generated from the provided EdmMember. ''' ''' defaults to empty if no annotation is found or the accessibility is the same as the property level. ''' Public Shared Function ForSetter(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Dim getterAccess As String = Nothing Dim setterAccess As String = Nothing Dim propertyAccess As String = Nothing CalculatePropertyAccessibility(member, propertyAccess, getterAccess, setterAccess) Return setterAccess End Function ''' ''' Gets the accessibility that should be applied to a method being generated from the provided EdmFunction. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForMethod(ByVal edmFunction As EdmFunction) As String If edmFunction Is Nothing Then Return Nothing End If Return GetAccessibility(edmFunction, METHOD_ACCESS) End Function Private Shared Sub CalculatePropertyAccessibility(ByVal item As MetadataItem, ByRef propertyAccessibility As String, ByRef getterAccessibility As String, ByRef setterAccessibility As String) getterAccessibility = GetAccessibility(item, GETTER_ACCESS) Dim getterRank As Integer = AccessibilityRankIdLookup(getterAccessibility) setterAccessibility = GetAccessibility(item, SETTER_ACCESS) Dim setterRank As Integer = AccessibilityRankIdLookup(setterAccessibility) Dim propertyRank As Integer = Math.Max(getterRank, setterRank) If setterRank = propertyRank Then setterAccessibility = String.Empty End If If getterRank = propertyRank Then getterAccessibility = String.Empty End If propertyAccessibility = AccessibilityRankIdLookup.Where(Function(v) v.Value = propertyRank).Select(Function(v) v.Key).Single() End Sub Private Shared Function GetAccessibility(ByVal item As MetadataItem, ByVal name As String) As String Dim accessibility As String = Nothing If MetadataTools.TryGetStringMetadataPropertySetting(item, name, accessibility) Then Return TranslateUserAccessibilityToCSharpAccessibility(accessibility) End If Return "Public" End Function Private Shared Function TranslateUserAccessibilityToCSharpAccessibility(ByVal userAccessibility As String) As String If userAccessibility = ACCESS_PROTECTED Then Return "Protected" ElseIf userAccessibility = ACCESS_INTERNAL Then Return "Friend" ElseIf userAccessibility = ACCESS_PRIVATE Then Return "Private" Else ' default to public Return "Public" End If End Function End Class ''' ''' Responsible for creating source code regions in code when the loop inside ''' actually produces something. ''' Public Class CodeRegion Private Const STANDARD_INDENT_LENGTH As Integer = 4 Private ReadOnly _textTransformation As DynamicTextTransformation Private _beforeRegionLength As Integer Private _emptyRegionLength As Integer Private _regionIndentLevel As Integer = -1 ''' ''' Initializes an CodeRegion instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) End Sub ''' ''' Initializes an CodeRegion instance with the ''' TextTransformation (T4 generated class) that is currently running, ''' and the indent level to start the first region at. ''' Public Sub New(ByVal textTransformation As Object, ByVal firstIndentLevel As Integer) Me.New(textTransformation) If firstIndentLevel < 0 Then Throw New ArgumentException("firstIndentLevel") End If _regionIndentLevel = firstIndentLevel - 1 End Sub ''' ''' Starts the begining of a region ''' Public Sub Begin(ByVal regionName As String) If regionName Is Nothing Then Throw New ArgumentNullException("regionName") End If Begin(regionName, 1) End Sub ''' ''' Start the begining of a region, indented ''' the numbers of levels specified ''' Public Sub Begin(ByVal regionName As String, ByVal levelsToIncreaseIndent As Integer) If regionName Is Nothing Then Throw New ArgumentNullException("regionName") End If _beforeRegionLength = _textTransformation.GenerationEnvironment.Length _regionIndentLevel += levelsToIncreaseIndent _textTransformation.Write(GetIndent(_regionIndentLevel)) _textTransformation.WriteLine("#Region """ + regionName + """") _emptyRegionLength = _textTransformation.GenerationEnvironment.Length End Sub ''' ''' Ends a region, or totaly removes it if nothing ''' was generted since the begining of the region. ''' Public Sub [End]() [End](1) End Sub ''' ''' Ends a region, or totaly removes it if nothing ''' was generted since the begining of the region, also outdents ''' the number of levels specified. ''' Public Sub [End](ByVal levelsToDecrease As Integer) Dim indentLevel As Integer = _regionIndentLevel _regionIndentLevel -= levelsToDecrease If _emptyRegionLength = _textTransformation.GenerationEnvironment.Length Then _textTransformation.GenerationEnvironment.Length = _beforeRegionLength Else _textTransformation.WriteLine(String.Empty) _textTransformation.Write(GetIndent(indentLevel)) _textTransformation.WriteLine("#End Region") _textTransformation.WriteLine(String.Empty) End If End Sub ''' ''' Gets the current indent level that the next end region statement will be written ''' at ''' Public ReadOnly Property CurrentIndentLevel() As Integer Get Return _regionIndentLevel End Get End Property ''' ''' Get a string of spaces equivelent to the number of indents ''' desired. ''' Public Shared Function GetIndent(ByVal indentLevel As Integer) As String If indentLevel < 0 Then Throw New ArgumentException("indentLevel") End If Return String.Empty.PadLeft(indentLevel * STANDARD_INDENT_LENGTH) End Function End Class ''' ''' Responsible for collecting together the actual method parameters ''' and the parameters that need to be sent to the Execute method. ''' Public Class FunctionImportParameter Private _Source As FunctionParameter Public Property Source() As FunctionParameter Get Return _Source End Get Set(ByVal value As FunctionParameter) _Source = value End Set End Property Private _RawFunctionParameterName As String Public Property RawFunctionParameterName() As String Get Return _RawFunctionParameterName End Get Set(ByVal value As String) _RawFunctionParameterName = value End Set End Property Private _FunctionParameterName As String Public Property FunctionParameterName() As String Get Return _FunctionParameterName End Get Set(ByVal value As String) _FunctionParameterName = value End Set End Property Private _FunctionParameterType As String Public Property FunctionParameterType() As String Get Return _FunctionParameterType End Get Set(ByVal value As String) _FunctionParameterType = value End Set End Property Private _LocalVariableName As String Public Property LocalVariableName() As String Get Return _LocalVariableName End Get Set(ByVal value As String) _LocalVariableName = value End Set End Property Private _RawClrTypeName As String Public Property RawClrTypeName() As String Get Return _RawClrTypeName End Get Set(ByVal value As String) _RawClrTypeName = value End Set End Property Private _ExecuteParameterName As String Public Property ExecuteParameterName() As String Get Return _ExecuteParameterName End Get Set(ByVal value As String) _ExecuteParameterName = value End Set End Property Private _EsqlParameterName As String Public Property EsqlParameterName() As String Get Return _EsqlParameterName End Get Set(ByVal value As String) _EsqlParameterName = value End Set End Property Private _NeedsLocalVariable As Boolean Public Property NeedsLocalVariable() As Boolean Get Return _NeedsLocalVariable End Get Set(ByVal value As Boolean) _NeedsLocalVariable = value End Set End Property Private _IsNullableOfT As Boolean Public Property IsNullableOfT() As Boolean Get Return _IsNullableOfT End Get Set(ByVal value As Boolean) _IsNullableOfT = value End Set End Property ''' ''' Creates a set of FunctionImportParameter objects from the parameters passed in. ''' Public Shared Function Create(ByVal parameters As IEnumerable(Of FunctionParameter), ByVal code As CodeGenerationTools, ByVal ef As MetadataTools) As IEnumerable(Of FunctionImportParameter) If parameters Is Nothing Then Throw New ArgumentNullException("parameters") End If If code Is Nothing Then Throw New ArgumentNullException("code") End If If ef Is Nothing Then Throw New ArgumentNullException("ef") End If Dim unique As New UniqueIdentifierService() Dim importParameters As New List(Of FunctionImportParameter)() For Each parameter As FunctionParameter In parameters Dim importParameter As New FunctionImportParameter() importParameter.Source = parameter importParameter.RawFunctionParameterName = unique.AdjustIdentifier(code.CamelCase(parameter.Name)) importParameter.FunctionParameterName = code.Escape(importParameter.RawFunctionParameterName) If parameter.Mode = ParameterMode.In Then Dim typeUsage As TypeUsage = parameter.TypeUsage importParameter.NeedsLocalVariable = True importParameter.FunctionParameterType = code.GetTypeName(typeUsage) importParameter.EsqlParameterName = parameter.Name Dim clrType As Type = ef.UnderlyingClrType(parameter.TypeUsage.EdmType) importParameter.RawClrTypeName = If(TypeOf typeUsage.EdmType Is EnumType, code.GetTypeName(typeUsage.EdmType), code.Escape(clrType)) importParameter.IsNullableOfT = clrType.IsValueType Else importParameter.NeedsLocalVariable = False importParameter.FunctionParameterType = "ObjectParameter" importParameter.ExecuteParameterName = importParameter.FunctionParameterName End If importParameters.Add(importParameter) Next ' we save the local parameter uniquification for a second pass to make the visible parameters ' as pretty and sensible as possible For i As Integer = 0 To importParameters.Count - 1 Dim importParameter As FunctionImportParameter = importParameters(i) If importParameter.NeedsLocalVariable Then importParameter.LocalVariableName = unique.AdjustIdentifier(importParameter.RawFunctionParameterName & "Parameter") importParameter.ExecuteParameterName = importParameter.LocalVariableName End If Next Return importParameters End Function ' ' Class to create unique variables within the same scope ' Private NotInheritable Class UniqueIdentifierService Private ReadOnly _knownIdentifiers As HashSet(Of String) Public Sub New() _knownIdentifiers = New HashSet(Of String)(StringComparer.OrdinalIgnoreCase) End Sub ''' ''' Given an identifier, makes it unique within the scope by adding ''' a suffix (1, 2, 3, ...), and returns the adjusted identifier. ''' Public Function AdjustIdentifier(ByVal identifier As String) As String ' find a unique name by adding suffix as necessary Dim numberOfConflicts As Integer = 0 Dim adjustedIdentifier As String = identifier While Not _knownIdentifiers.Add(adjustedIdentifier) numberOfConflicts += 1 adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture) End While Return adjustedIdentifier End Function End Class End Class ''' ''' Responsible for marking the various sections of the generation, ''' so they can be split up into separate files ''' Public Class EntityFrameworkTemplateFileManager ''' ''' Creates the VsEntityFrameworkTemplateFileManager if VS is detected, otherwise ''' creates the file system version. ''' Public Shared Function Create(ByVal textTransformation As Object) As EntityFrameworkTemplateFileManager Dim transformation As DynamicTextTransformation = DynamicTextTransformation.Create(textTransformation) Dim host As IDynamicHost = transformation.Host #If Not PREPROCESSED_TEMPLATE Then Dim hostServiceProvider = host.AsIServiceProvider() If hostServiceProvider IsNot Nothing Then Dim dte = DirectCast(hostServiceProvider.GetService(GetType(EnvDTE.DTE)), EnvDTE.DTE) If dte IsNot Nothing Then Return New VsEntityFrameworkTemplateFileManager(transformation) End If End If #End If Return New EntityFrameworkTemplateFileManager(transformation) End Function Private NotInheritable Class Block Public Name As String Public Start As Integer, Length As Integer End Class Private ReadOnly files As New List(Of Block)() Private ReadOnly footer As New Block() Private ReadOnly header As New Block() Private ReadOnly _textTransformation As DynamicTextTransformation ' reference to the GenerationEnvironment StringBuilder on the ' TextTransformation object Private ReadOnly _generationEnvironment As StringBuilder Private m_currentBlock As Block ''' ''' Initializes an EntityFrameworkTemplateFileManager Instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Private Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) _generationEnvironment = _textTransformation.GenerationEnvironment End Sub ''' ''' Marks the end of the last file if there was one, and starts a new ''' and marks this point in generation as a new file. ''' Public Sub StartNewFile(ByVal name As String) If name Is Nothing Then Throw New ArgumentNullException("name") End If CurrentBlock = New Block() With { .Name = name } End Sub Public Sub StartFooter() CurrentBlock = footer End Sub Public Sub StartHeader() CurrentBlock = header End Sub Public Sub EndBlock() If CurrentBlock Is Nothing Then Exit Sub End If CurrentBlock.Length = _generationEnvironment.Length - CurrentBlock.Start If CurrentBlock IsNot header AndAlso CurrentBlock IsNot footer Then files.Add(CurrentBlock) End If m_currentBlock = Nothing End Sub ''' ''' Produce the template output files. ''' Public Overridable Function Process(Optional split As Boolean = True) As IEnumerable(Of String) Dim generatedFileNames As List(Of String) = New List(Of String)() If split Then EndBlock() Dim headerText As String = _generationEnvironment.ToString(header.Start, header.Length) Dim footerText As String = _generationEnvironment.ToString(footer.Start, footer.Length) Dim outputPath As String = Path.GetDirectoryName(_textTransformation.Host.TemplateFile) files.Reverse() For Each block As Block In files Dim fileName As String = Path.Combine(outputPath, block.Name) Dim content = headerText + _generationEnvironment.ToString(block.Start, block.Length) + footerText generatedFileNames.Add(fileName) CreateFile(fileName, content) _generationEnvironment.Remove(block.Start, block.Length) Next End If Return generatedFileNames End Function Protected Overridable Sub CreateFile(ByVal fileName As String, ByVal content As String) If IsFileContentDifferent(fileName, content) Then File.WriteAllText(fileName, content) End If End Sub Protected Function IsFileContentDifferent(ByVal fileName As String, ByVal newContent As String) As Boolean Return Not (File.Exists(fileName) AndAlso File.ReadAllText(fileName) = newContent) End Function Private Property CurrentBlock() As Block Get Return m_currentBlock End Get Set(ByVal value As Block) If CurrentBlock IsNot Nothing Then EndBlock() End If If value IsNot Nothing Then value.Start = _generationEnvironment.Length End If m_currentBlock = value End Set End Property #If Not PREPROCESSED_TEMPLATE Then Private NotInheritable Class VsEntityFrameworkTemplateFileManager Inherits EntityFrameworkTemplateFileManager Private templateProjectItem As EnvDTE.ProjectItem Private dte As EnvDTE.DTE Private checkOutAction As Action(Of String) Private projectSyncAction As Action(Of IEnumerable(Of String)) ''' ''' Creates an instance of the VsEntityFrameworkTemplateFileManager class with the IDynamicHost instance ''' Public Sub New(ByVal textTemplating As Object) MyBase.New(textTemplating) Dim hostServiceProvider = _textTransformation.Host.AsIServiceProvider() If hostServiceProvider Is Nothing Then Throw New ArgumentNullException("Could not obtain hostServiceProvider") End If dte = DirectCast(hostServiceProvider.GetService(GetType(EnvDTE.DTE)), EnvDTE.DTE) If dte Is Nothing Then Throw New ArgumentNullException("Could not obtain DTE from host") End If templateProjectItem = dte.Solution.FindProjectItem(_textTransformation.Host.TemplateFile) checkOutAction = Function(fileName) dte.SourceControl.CheckOutItem(fileName) projectSyncAction = Sub(keepFileNames) ProjectSync(templateProjectItem, keepFileNames) End Sub Public Overloads Overrides Function Process(Optional split As Boolean = True) As IEnumerable(Of String) If templateProjectItem.ProjectItems Is Nothing Then Return New List(Of String) End If Dim generatedFileNames As IEnumerable(Of String) = MyBase.Process(split) projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, Nothing, Nothing)) Return generatedFileNames End Function Protected Overloads Overrides Sub CreateFile(ByVal fileName As String, ByVal content As String) If IsFileContentDifferent(fileName, content) Then CheckoutFileIfRequired(fileName) File.WriteAllText(fileName, content) End If End Sub Private Shared Sub ProjectSync(ByVal templateProjectItem As EnvDTE.ProjectItem, ByVal keepFileNames As IEnumerable(Of String)) Dim keepFileNameSet = New HashSet(Of String)(keepFileNames) Dim projectFiles = New Dictionary(Of String, EnvDTE.ProjectItem)() Dim originalOutput = Path.GetFileNameWithoutExtension(templateProjectItem.FileNames(0)) For Each projectItem As EnvDTE.ProjectItem In templateProjectItem.ProjectItems projectFiles.Add(projectItem.FileNames(0), projectItem) Next ' Remove unused items from the project For Each pair As KeyValuePair(Of String, EnvDTE.ProjectItem) In projectFiles If Not keepFileNames.Contains(pair.Key) _ AndAlso Not (Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalOutput + ".") Then pair.Value.Delete() End If Next ' Add missing files to the project For Each fileName As String In keepFileNameSet If Not projectFiles.ContainsKey(fileName) Then templateProjectItem.ProjectItems.AddFromFile(fileName) End If Next End Sub Private Sub CheckoutFileIfRequired(ByVal fileName As String) If dte.SourceControl Is Nothing OrElse Not dte.SourceControl.IsItemUnderSCC(fileName) OrElse dte.SourceControl.IsItemCheckedOut(fileName) Then Exit Sub End If ' run on worker thread to prevent T4 calling back into VS checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, Nothing, Nothing)) End Sub End Class #End If End Class ''' ''' Responsible creating an instance that can be passed ''' to helper classes that need to access the TextTransformation ''' members. It accesses member by name and signature rather than ''' by type. This is necessary when the ''' template is being used in Preprocessed mode ''' and there is no common known type that can be ''' passed instead ''' Public Class DynamicTextTransformation Private _instance As Object Private _dynamicHost As IDynamicHost Private ReadOnly _write As MethodInfo Private ReadOnly _writeLine As MethodInfo Private ReadOnly _generationEnvironment As PropertyInfo Private ReadOnly _errors As PropertyInfo Private ReadOnly _host As PropertyInfo ''' ''' Creates an instance of the DynamicTextTransformation class around the passed in ''' TextTransformation shapped instance passed in, or if the passed in instance ''' already is a DynamicTextTransformation, it casts it and sends it back. ''' Public Shared Function Create(ByVal instance As Object) As DynamicTextTransformation If instance Is Nothing Then Throw New ArgumentNullException("instance") End If Dim textTransformation As DynamicTextTransformation = TryCast(instance, DynamicTextTransformation) If textTransformation IsNot Nothing Then Return textTransformation End If Return New DynamicTextTransformation(instance) End Function Private Sub New(ByVal instance As Object) _instance = instance Dim type As Type = _instance.GetType() _write = type.GetMethod("Write", New Type() {GetType(String)}) _writeLine = type.GetMethod("WriteLine", New Type() {GetType(String)}) _generationEnvironment = type.GetProperty("GenerationEnvironment", BindingFlags.Instance Or BindingFlags.NonPublic) _host = type.GetProperty("Host") _errors = type.GetProperty("Errors") End Sub ''' ''' Gets the value of the wrapped TextTranformation instance's GenerationEnvironment property ''' Public ReadOnly Property GenerationEnvironment() As StringBuilder Get Return DirectCast(_generationEnvironment.GetValue(_instance, Nothing), StringBuilder) End Get End Property ''' ''' Gets the value of the wrapped TextTranformation instance's Errors property ''' Public ReadOnly Property Errors() As System.CodeDom.Compiler.CompilerErrorCollection Get Return DirectCast(_errors.GetValue(_instance, Nothing), System.CodeDom.Compiler.CompilerErrorCollection) End Get End Property ''' ''' Calls the wrapped TextTranformation instance's Write method. ''' Public Sub Write(ByVal text As String) _write.Invoke(_instance, New Object() {text}) End Sub ''' ''' Calls the wrapped TextTranformation instance's WriteLine method. ''' Public Sub WriteLine(ByVal text As String) _writeLine.Invoke(_instance, New Object() {text}) End Sub ''' ''' Gets the value of the wrapped TextTranformation instance's Host property ''' if available (shows up when hostspecific is set to true in the template directive) and returns ''' the appropriate implementation of IDynamicHost ''' Public ReadOnly Property Host() As IDynamicHost Get If _dynamicHost Is Nothing Then If _host Is Nothing Then _dynamicHost = New NullHost() Else _dynamicHost = New DynamicHost(_host.GetValue(_instance, Nothing)) End If End If Return _dynamicHost End Get End Property End Class ''' ''' Reponsible for abstracting the use of Host between times ''' when it is available and not ''' Public Interface IDynamicHost ''' ''' An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue ''' Function ResolveParameterValue(ByVal id As String, ByVal name As String, ByVal otherName As String) As String ''' ''' An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath ''' Function ResolvePath(ByVal path As String) As String ''' ''' An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile ''' ReadOnly Property TemplateFile() As String ''' ''' Returns the Host instance cast as an IServiceProvider ''' Function AsIServiceProvider() As IServiceProvider End Interface ''' ''' Reponsible for implementing the IDynamicHost as a dynamic ''' shape wrapper over the Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost interface ''' rather than type dependent wrapper. We don't use the ''' interface type so that the code can be run in preprocessed mode ''' on a .net framework only installed machine. ''' Public Class DynamicHost Implements IDynamicHost Private ReadOnly _instance As Object Private ReadOnly _resolveParameterValue As MethodInfo Private ReadOnly _resolvePath As MethodInfo Private ReadOnly _templateFile As PropertyInfo ''' ''' Creates an instance of the DynamicHost class around the passed in ''' Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost shapped instance passed in. ''' Public Sub New(ByVal instance As Object) _instance = instance Dim type As Type = _instance.GetType() _resolveParameterValue = type.GetMethod("ResolveParameterValue", New Type() {GetType(String), GetType(String), GetType(String)}) _resolvePath = type.GetMethod("ResolvePath", New Type() {GetType(String)}) _templateFile = type.GetProperty("TemplateFile") End Sub ''' ''' A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue ''' Public Function ResolveParameterValue(ByVal id As String, ByVal name As String, ByVal otherName As String) As String Implements IDynamicHost.ResolveParameterValue Return DirectCast(_resolveParameterValue.Invoke(_instance, New Object() {id, name, otherName}), String) End Function ''' ''' A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath ''' Public Function ResolvePath(ByVal path As String) As String Implements IDynamicHost.ResolvePath Return DirectCast(_resolvePath.Invoke(_instance, New Object() {path}), String) End Function ''' ''' A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile ''' Public ReadOnly Property TemplateFile() As String Implements IDynamicHost.TemplateFile Get Return DirectCast(_templateFile.GetValue(_instance, Nothing), String) End Get End Property ''' ''' Returns the Host instance cast as an IServiceProvider ''' Public Function AsIServiceProvider() As IServiceProvider Implements IDynamicHost.AsIServiceProvider Return TryCast(_instance, IServiceProvider) End Function End Class ''' ''' Reponsible for implementing the IDynamicHost when the ''' Host property is not available on the TextTemplating type. The Host ''' property only exists when the hostspecific attribute of the template ''' directive is set to true. ''' Public Class NullHost Implements IDynamicHost ''' ''' An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue ''' that simply retuns null. ''' Public Function ResolveParameterValue(ByVal id As String, ByVal name As String, ByVal otherName As String) As String Implements IDynamicHost.ResolveParameterValue Return Nothing End Function ''' ''' An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath ''' that simply retuns the path passed in. ''' Public Function ResolvePath(ByVal path As String) As String Implements IDynamicHost.ResolvePath Return path End Function ''' ''' An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile ''' that returns null. ''' Public ReadOnly Property TemplateFile() As String Implements IDynamicHost.TemplateFile Get Return Nothing End Get End Property ''' ''' Returns null. ''' Public Function AsIServiceProvider() As IServiceProvider Implements IDynamicHost.AsIServiceProvider Return Nothing End Function End Class ''' ''' Responsible for encapsulating the constants defined in Metadata ''' Public NotInheritable Class MetadataConstants Private Sub New() End Sub Public Const CSDL_EXTENSION As String = ".csdl" Public Const CSDL_EDMX_SECTION_NAME As String = "ConceptualModels" Public Const CSDL_ROOT_ELEMENT_NAME As String = "Schema" Public Const EDM_ANNOTATION_09_02 As String = "http://schemas.microsoft.com/ado/2009/02/edm/annotation" Public Const SSDL_EXTENSION As String = ".ssdl" Public Const SSDL_EDMX_SECTION_NAME As String = "StorageModels" Public Const SSDL_ROOT_ELEMENT_NAME As String = "Schema" Public Const MSL_EXTENSION As String = ".msl" Public Const MSL_EDMX_SECTION_NAME As String = "Mappings" Public Const MSL_ROOT_ELEMENT_NAME As String = "Mapping" Public Const TT_TEMPLATE_NAME As String = "TemplateName" Public Const TT_TEMPLATE_VERSION As String = "TemplateVersion" Public Const TT_MINIMUM_ENTITY_FRAMEWORK_VERSION As String = "MinimumEntityFrameworkVersion" Public Const DEFAULT_TEMPLATE_VERSION As String = "4.0" Public Shared ReadOnly V1_SCHEMA_CONSTANTS As New SchemaConstants( "http://schemas.microsoft.com/ado/2007/06/edmx", "http://schemas.microsoft.com/ado/2006/04/edm", "http://schemas.microsoft.com/ado/2006/04/edm/ssdl", "urn:schemas-microsoft-com:windows:storage:mapping:CS", New Version("3.5")) Public Shared ReadOnly V2_SCHEMA_CONSTANTS As New SchemaConstants( "http://schemas.microsoft.com/ado/2008/10/edmx", "http://schemas.microsoft.com/ado/2008/09/edm", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl", "http://schemas.microsoft.com/ado/2008/09/mapping/cs", New Version("4.0")) Public Shared ReadOnly V3_SCHEMA_CONSTANTS As New SchemaConstants( "http://schemas.microsoft.com/ado/2009/11/edmx", "http://schemas.microsoft.com/ado/2009/11/edm", "http://schemas.microsoft.com/ado/2009/11/edm/ssdl", "http://schemas.microsoft.com/ado/2009/11/mapping/cs", New Version("5.0")) End Class Public Structure SchemaConstants Public Sub New(ByVal edmxNamespace As String, ByVal csdlNamespace As String, ByVal ssdlNamespace As String, ByVal mslNamespace As String, ByVal minimumTemplateVersion As Version) Me.EdmxNamespace = edmxNamespace Me.CsdlNamespace = csdlNamespace Me.SsdlNamespace = ssdlNamespace Me.MslNamespace = mslNamespace Me.MinimumTemplateVersion = minimumTemplateVersion End Sub Public Property EdmxNamespace() As String Get Return m_EdmxNamespace End Get Private Set m_EdmxNamespace = Value End Set End Property Private m_EdmxNamespace As String Public Property CsdlNamespace() As String Get Return m_CsdlNamespace End Get Private Set m_CsdlNamespace = Value End Set End Property Private m_CsdlNamespace As String Public Property SsdlNamespace() As String Get Return m_SsdlNamespace End Get Private Set m_SsdlNamespace = Value End Set End Property Private m_SsdlNamespace As String Public Property MslNamespace() As String Get Return m_MslNamespace End Get Private Set m_MslNamespace = Value End Set End Property Private m_MslNamespace As String Public Property MinimumTemplateVersion() As Version Get Return m_MinimumTemplateVersion End Get Private Set m_MinimumTemplateVersion = Value End Set End Property Private m_MinimumTemplateVersion As Version End Structure End Class #Region "Base class" ''' '''Base class for this transformation ''' _ Public Class VBCodeGenTemplateBase #Region "Fields" Private generationEnvironmentField As Global.System.Text.StringBuilder Private errorsField As Global.System.CodeDom.Compiler.CompilerErrorCollection Private indentLengthsField As Global.System.Collections.Generic.List(Of Integer) Private currentIndentField As String = "" Private endsWithNewline As Boolean Private sessionField As Global.System.Collections.Generic.IDictionary(Of String, Object) #End Region #Region "Properties" ''' '''The string builder that generation-time code is using to assemble generated output ''' Protected Property GenerationEnvironment() As System.Text.StringBuilder Get If (Me.generationEnvironmentField Is Nothing) Then Me.generationEnvironmentField = New Global.System.Text.StringBuilder() End If Return Me.generationEnvironmentField End Get Set Me.generationEnvironmentField = value End Set End Property ''' '''The error collection for the generation process ''' Public ReadOnly Property Errors() As System.CodeDom.Compiler.CompilerErrorCollection Get If (Me.errorsField Is Nothing) Then Me.errorsField = New Global.System.CodeDom.Compiler.CompilerErrorCollection() End If Return Me.errorsField End Get End Property ''' '''A list of the lengths of each indent that was added with PushIndent ''' Private ReadOnly Property indentLengths() As System.Collections.Generic.List(Of Integer) Get If (Me.indentLengthsField Is Nothing) Then Me.indentLengthsField = New Global.System.Collections.Generic.List(Of Integer)() End If Return Me.indentLengthsField End Get End Property ''' '''Gets the current indent we use when adding lines to the output ''' Public ReadOnly Property CurrentIndent() As String Get Return Me.currentIndentField End Get End Property ''' '''Current transformation session ''' Public Overridable Property Session() As Global.System.Collections.Generic.IDictionary(Of String, Object) Get Return Me.sessionField End Get Set Me.sessionField = value End Set End Property #End Region #Region "Transform-time helpers" ''' '''Write text directly into the generated output ''' Public Overloads Sub Write(ByVal textToAppend As String) If String.IsNullOrEmpty(textToAppend) Then Return End If 'If we're starting off, or if the previous text ended with a newline, 'we have to append the current indent first. If ((Me.GenerationEnvironment.Length = 0) _ OrElse Me.endsWithNewline) Then Me.GenerationEnvironment.Append(Me.currentIndentField) Me.endsWithNewline = false End If 'Check if the current text ends with a newline If textToAppend.EndsWith(Global.System.Environment.NewLine, Global.System.StringComparison.CurrentCulture) Then Me.endsWithNewline = true End If 'This is an optimization. If the current indent is "", then we don't have to do any 'of the more complex stuff further down. If (Me.currentIndentField.Length = 0) Then Me.GenerationEnvironment.Append(textToAppend) Return End If 'Everywhere there is a newline in the text, add an indent after it textToAppend = textToAppend.Replace(Global.System.Environment.NewLine, (Global.System.Environment.NewLine + Me.currentIndentField)) 'If the text ends with a newline, then we should strip off the indent added at the very end 'because the appropriate indent will be added when the next time Write() is called If Me.endsWithNewline Then Me.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - Me.currentIndentField.Length)) Else Me.GenerationEnvironment.Append(textToAppend) End If End Sub ''' '''Write text directly into the generated output ''' Public Overloads Sub WriteLine(ByVal textToAppend As String) Me.Write(textToAppend) Me.GenerationEnvironment.AppendLine Me.endsWithNewline = true End Sub ''' '''Write formatted text directly into the generated output ''' Public Overloads Sub Write(ByVal format As String, ByVal args() As Object) Me.Write(String.Format(Global.System.Globalization.CultureInfo.CurrentCulture, format, args)) End Sub ''' '''Write formatted text directly into the generated output ''' Public Overloads Sub WriteLine(ByVal format As String, ByVal args() As Object) Me.WriteLine(String.Format(Global.System.Globalization.CultureInfo.CurrentCulture, format, args)) End Sub ''' '''Raise an error ''' Public Sub [Error](ByVal message As String) Dim [error] As System.CodeDom.Compiler.CompilerError = New Global.System.CodeDom.Compiler.CompilerError() [error].ErrorText = message Me.Errors.Add([error]) End Sub ''' '''Raise a warning ''' Public Sub Warning(ByVal message As String) Dim [error] As System.CodeDom.Compiler.CompilerError = New Global.System.CodeDom.Compiler.CompilerError() [error].ErrorText = message [error].IsWarning = true Me.Errors.Add([error]) End Sub ''' '''Increase the indent ''' Public Sub PushIndent(ByVal indent As String) If (indent = Nothing) Then Throw New Global.System.ArgumentNullException("indent") End If Me.currentIndentField = (Me.currentIndentField + indent) Me.indentLengths.Add(indent.Length) End Sub ''' '''Remove the last indent that was added with PushIndent ''' Public Function PopIndent() As String Dim returnValue As String = "" If (Me.indentLengths.Count > 0) Then Dim indentLength As Integer = Me.indentLengths((Me.indentLengths.Count - 1)) Me.indentLengths.RemoveAt((Me.indentLengths.Count - 1)) If (indentLength > 0) Then returnValue = Me.currentIndentField.Substring((Me.currentIndentField.Length - indentLength)) Me.currentIndentField = Me.currentIndentField.Remove((Me.currentIndentField.Length - indentLength)) End If End If Return returnValue End Function ''' '''Remove any indentation ''' Public Sub ClearIndent() Me.indentLengths.Clear Me.currentIndentField = "" End Sub #End Region #Region "ToString Helpers" ''' '''Utility class to produce culture-oriented representation of an object as a string. ''' Public Class ToStringInstanceHelper Private formatProviderField As System.IFormatProvider = Global.System.Globalization.CultureInfo.InvariantCulture ''' '''Gets or sets format provider to be used by ToStringWithCulture method. ''' Public Property FormatProvider() As System.IFormatProvider Get Return Me.formatProviderField End Get Set If (Not (value) Is Nothing) Then Me.formatProviderField = value End If End Set End Property ''' '''This is called from the compile/run appdomain to convert objects within an expression block to a string ''' Public Function ToStringWithCulture(ByVal objectToConvert As Object) As String If (objectToConvert Is Nothing) Then Throw New Global.System.ArgumentNullException("objectToConvert") End If Dim t As System.Type = objectToConvert.GetType Dim method As System.Reflection.MethodInfo = t.GetMethod("ToString", New System.Type() {GetType(System.IFormatProvider)}) If (method Is Nothing) Then Return objectToConvert.ToString Else Return CType(method.Invoke(objectToConvert, New Object() {Me.formatProviderField }),String) End If End Function End Class Private toStringHelperField As ToStringInstanceHelper = New ToStringInstanceHelper() ''' '''Helper to produce culture-oriented representation of an object as a string ''' Public ReadOnly Property ToStringHelper() As ToStringInstanceHelper Get Return Me.toStringHelperField End Get End Property #End Region End Class #End Region End Namespace $Imports System Imports System.Linq Imports System.IO Imports System.Collections.Generic Imports System.Data.Objects Imports System.Data.Objects.DataClasses Imports System.Xml Imports System.Xml.Linq Imports System.Globalization Imports System.Reflection Imports System.Data.Metadata.Edm Imports System.Data.Mapping Imports System.Data.Entity.Design Imports System.CodeDom Imports System.CodeDom.Compiler Imports Microsoft.VisualBasic Imports System.Text '------------------------------------------------------------------------------ ' ' This code was generated by a tool. ' Runtime Version: 11.0.0.0 ' ' Changes to this file may cause incorrect behavior and will be lost if ' the code is regenerated. ' '------------------------------------------------------------------------------ Namespace TemplateCodeGenerators ''' '''Class to produce the template output ''' _ Partial Public Class VBCodeGenTemplateV50 Inherits VBCodeGenTemplateV50Base ''' '''Create the template output ''' Public Overridable Function TransformText() As String ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' DefineMetadata() Dim userSettings As UserSettings = New UserSettings With _ { _ .SourceCsdlPath = "$edmxInputFile$", _ .ReferenceCsdlPaths = new string () {}, _ .FullyQualifySystemTypes = True, _ .CreateContextAddToMethods = True, _ .CamelCaseFields = False _ } ApplyUserSettings(userSettings) If Errors.HasErrors Return String.Empty End If Dim loader As New MetadataLoader(Me) Dim ef As New MetadataTools(Me) Dim region As New CodeRegion(Me) Dim code As New CodeGenerationTools(Me) With {.FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes, .CamelCaseFields = userSettings.CamelCaseFields} ItemCollection = loader.CreateEdmItemCollection(SourceCsdlPath, ReferenceCsdlPaths.ToArray()) ModelNamespace = loader.GetModelNamespace(SourceCsdlPath) Dim namespaceName As String = GetNamespaceName(code) UpdateObjectNamespaceMap(namespaceName) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"'------------------------------------------------------------------------------"& _ ""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"'"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"'---------------------------------------------------------"& _ "---------------------"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.ComponentModel"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports "& _ "System.Data.EntityClient"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Data.Objects"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Data.Objec"& _ "ts.DataClasses"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Linq"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Imports System.Runtime.Serialization"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"Impor"& _ "ts System.Xml.Serialization"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) '''''''' '''''''' Write Relationship Attributes. '''''''' region.Begin(CodeGenerationTools.GetResourceString("Template_RegionRelationships")) For Each association As AssociationType in GetSourceSchemaTypes(Of AssociationType)() Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next region.End() If(Not String.IsNullOrEmpty(namespaceName)) Then Me.Write("Namespace ") Me.Write(Me.ToStringHelper.ToStringWithCulture(namespaceName)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) PushIndent(CodeRegion.GetIndent(1)) End If '''''''' '''''''' '''''''' region.Begin(CodeGenerationTools.GetResourceString("Template_RegionContexts")) For Each container as EntityContainer in GetSourceSchemaTypes(Of EntityContainer)() Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(container))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(container, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(container))) Me.Write(" Partial Class ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(container))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Inherits ObjectContext"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #Region """) Me.Write(Me.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_RegionConstructors"))) Me.Write(""""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ContextDefaultCtorComment"), container.Name, container.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Sub New()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" MyBase.New(""name=") Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteLazyLoadingEnabled(container) Me.Write(" OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ContextCommonCtorComment"), container.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Sub New(ByVal connectionString As String)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "& _ " MyBase.New(connectionString, """) Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteLazyLoadingEnabled(container) Me.Write(" OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ContextCommonCtorComment"), container.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Sub New(ByVal connection As EntityConnection)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "& _ " MyBase.New(connection, """) Me.Write(Me.ToStringHelper.ToStringWithCulture(container.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteLazyLoadingEnabled(container) Me.Write(" OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #End Region"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #Region """) Me.Write(Me.ToStringHelper.ToStringWithCulture(CodeGenerationTools.GetResourceString("Template_RegionPartialMethods"))) Me.Write(""""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Partial Private Sub OnContextCreated()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" #End Region"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)& _ ""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) '''''''' '''''''' '''''''' region.Begin(CodeGenerationTools.GetResourceString("Template_RegionObjectSetProperties")) For Each entitySet As EntitySet In container.BaseEntitySets.OfType(Of EntitySet)() VerifyEntityTypeAndSetAccessibilityCompatability(entitySet) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(entitySet))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(entitySet, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(entitySet)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForReadOnlyProperty(entitySet))) Me.Write(" ReadOnly Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(entitySet))) Me.Write("() As ObjectSet(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(entitySet.ElementType, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(" Is Nothing) Then"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(" = MyBase.CreateObjectSet(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(entitySet.ElementType, code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(entitySet.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(entitySet))) Me.Write(" As ObjectSet(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(entitySet.ElementType, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next region.End() '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' region.Begin(CodeGenerationTools.GetResourceString("Template_RegionAddToMethods")) Dim addToMethods As IEnumerable(Of EntitySet) = If(CreateContextAddToMethods.Value, container.BaseEntitySets.OfType(Of EntitySet)(), Enumerable.Empty(Of EntitySet)()) For Each addTo As EntitySet in addToMethods Dim parameterName As String = code.Escape(FixParameterName(addTo.ElementType.Name, code)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_GenCommentAddToMethodVb"), addTo.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(addTo.ElementType))) Me.Write(" Sub AddTo") Me.Write(Me.ToStringHelper.ToStringWithCulture(addTo.Name)) Me.Write("(ByVal ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameterName)) Me.Write(" As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(addTo.ElementType, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" MyBase.AddObject(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(addTo.Name)) Me.Write(""", ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameterName)) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next region.End() region.Begin(CodeGenerationTools.GetResourceString("Template_RegionFunctionImports")) For Each edmFunction As EdmFunction in container.FunctionImports Dim parameters As IEnumerable(Of FunctionImportParameter) = FunctionImportParameter.Create(edmFunction.Parameters, code, ef) Dim paramList As String = String.Join(", ", parameters.Select(Function(p) p.FunctionParameterName & " As " & p.FunctionParameterType).ToArray()) Dim returnType As TypeUsage = If(edmFunction.ReturnParameters.Count = 0, Nothing, ef.GetElementType(edmFunction.ReturnParameters(0).TypeUsage)) If edmFunction.IsComposableAttribute Then Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))) Me.Write(Me.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(Function(p) New Tuple(Of string, string)(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))) Me.Write(" Function ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))) Me.Write("(") Me.Write(Me.ToStringHelper.ToStringWithCulture(paramList)) Me.Write(") As IQueryable(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(returnType, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteFunctionParameters(parameters) Me.Write(" Return MyBase.CreateQuery(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(returnType, code))) Me.Write(")(""[") Me.Write(Me.ToStringHelper.ToStringWithCulture(edmFunction.NamespaceName)) Me.Write("].[") Me.Write(Me.ToStringHelper.ToStringWithCulture(edmFunction.Name)) Me.Write("](") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Join(", ", parameters.Select(Function(p) "@" + p.EsqlParameterName).ToArray()))) Me.Write(")""") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", String.Join(", ", parameters.Select(Function(p) p.ExecuteParameterName).ToArray())))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Function"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))) Me.Write(Me.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(Function(p) New Tuple(Of string, string)(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))) Me.Write(" Function ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))) Me.Write("(") Me.Write(Me.ToStringHelper.ToStringWithCulture(paramList)) Me.Write(") As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(returnType IsNot Nothing, "ObjectResult(Of " & MultiSchemaEscape(returnType, code) & ")", "Integer"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteFunctionParameters(parameters) Me.Write(" Return MyBase.ExecuteFunction") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(returnType Is Nothing, "", "(Of " & MultiSchemaEscape(returnType, code) & ")"))) Me.Write("(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(edmFunction.Name)) Me.Write("""") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", String.Join(", ", parameters.Select(Function(p) p.ExecuteParameterName).ToArray())))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Function"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If (returnType IsNot Nothing AndAlso returnType.EdmType.BuiltInTypeKind = BuiltInTypeKind.EntityType) Me.Write(" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(edmFunction))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(edmFunction, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(Function(p) New Tuple(Of string, string)(p.RawFunctionParameterName, SummaryComment(p.Source))), region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(edmFunction)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForMethod(edmFunction))) Me.Write(" Function ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(edmFunction))) Me.Write("(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringAfter(paramList, ", "))) Me.Write("mergeOption As MergeOption) As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(returnType IsNot Nothing, "ObjectResult(Of " & MultiSchemaEscape(returnType, code) & ")", "Integer"))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteFunctionParameters(parameters) Me.Write(" Return MyBase.ExecuteFunction(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(returnType, code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(edmFunction.Name)) Me.Write(""", mergeOption") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringBefore(", ", String.Join(", ", parameters.Select(Function(p) p.ExecuteParameterName).ToArray())))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Function"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If End If Next region.End() Me.Write("End Class"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If Not code.VerifyCaseInsensitiveEntitySetUniqueness(container.BaseEntitySets.OfType(Of EntitySet)().Select(Function(e) e.Name), _ container.Name, SourceCsdlPath) Then Return String.Empty End If Next region.End() '''''''' '''''''' '''''''' region.Begin(CodeGenerationTools.GetResourceString("Template_RegionEntities")) For Each loopEntity As EntityType in GetSourceSchemaTypes(Of EntityType)().OrderBy(Function(e) e.Name) Dim entity As EntityType = loopEntity Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(entity))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(entity, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) For Each subType As EntityType in ItemCollection.GetItems(Of EntityType)().Where(Function(b) b.BaseType is entity) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(entity))) Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(code.MustInheritOption(entity)))) Me.Write("Partial Class ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(entity))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Inherits ") Me.Write(Me.ToStringHelper.ToStringWithCulture(BaseTypeName(entity, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(Not entity.Abstract) Then WriteFactoryMethod(entity, code) End If region.Begin(CodeGenerationTools.GetResourceString("Template_RegionSimpleProperties")) For Each edmProperty As EdmProperty in entity.Properties.Where(Function(p) p.DeclaringType Is entity AndAlso TypeOf p.TypeUsage.EdmType Is SimpleType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WriteSimpleTypeProperty(edmProperty, code) Next region.End() region.Begin(CodeGenerationTools.GetResourceString("Template_RegionComplexProperties")) For Each edmProperty As EdmProperty in entity.Properties.Where(Function(p) p.DeclaringType Is entity AndAlso TypeOf p.TypeUsage.EdmType Is ComplexType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WriteComplexTypeProperty(edmProperty, code) Next region.End() region.Begin(CodeGenerationTools.GetResourceString("Template_RegionNavigationProperties")) For Each navProperty As NavigationProperty in entity.NavigationProperties.Where(Function(n) n.DeclaringType Is entity) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(navProperty.ToEndMember.RelationshipMultiplicity = RelationshipMultiplicity.Many) Then Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))) Me.Write("() As EntityCollection(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return CType(Me,IEntityWithRelationships).RelationshipManager.Ge"& _ "tRelatedCollection(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (Not value Is Nothing)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" CType(Me, IEntityWith"& _ "Relationships).RelationshipManager.InitializeRelatedCollection(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""", value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(navProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(navProperty))) Me.Write("() As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return CType(Me, IEntityWithRelationships).RelationshipManager.G"& _ "etRelatedReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""").Value"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" CType(Me, IEntityWithRelationships).RelationshipManager.GetRelat"& _ "edReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""").Value = value"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Dim refPropertyName As String = navProperty.Name & "Reference" If(entity.Members.Any(Function(m) m.Name = refPropertyName)) Then ' Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6017", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_ConflictingGeneratedNavPropName"), navProperty.Name, entity.FullName, refPropertyName))) End If Me.Write(" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(navProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(navProperty, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(navProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(refPropertyName)) Me.Write("() As EntityReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(navProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return CType(Me, IEntityWithRelationships).RelationshipManager.G"& _ "etRelatedReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(navProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (Not value Is Nothing)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" CType(Me, IEntityWith"& _ "Relationships).RelationshipManager.InitializeRelatedReference(Of ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(navProperty.ToEndMember.GetEntityType(), code))) Me.Write(")(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.RelationshipType.FullName)) Me.Write(""", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(navProperty.ToEndMember.Name)) Me.Write(""", value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Next region.End() Me.Write("End Class"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If Not code.VerifyCaseInsensitiveMemberUniqueness(code.GetAllDeclaredMembers(entity), entity.FullName, SourceCsdlPath) Then Return String.Empty End If Next region.End() '''''''' '''''''' '''''''' region.Begin(CodeGenerationTools.GetResourceString("Template_RegionComplexTypes")) For Each loopComplex As ComplexType in GetSourceSchemaTypes(Of ComplexType)().OrderBy(Function(e) e.Name) Dim complex As ComplexType = loopComplex Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(complex))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complex, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(complex))) Me.Write(" Partial Class ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(complex))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Inherits ComplexObject"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) WriteFactoryMethod(complex, code) region.Begin(CodeGenerationTools.GetResourceString("Template_RegionSimpleProperties")) For Each edmProperty As EdmProperty in complex.Properties.Where(Function(p) p.DeclaringType Is complex AndAlso TypeOf p.TypeUsage.EdmType Is SimpleType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WriteSimpleTypeProperty(edmProperty, code) Next region.End() region.Begin(CodeGenerationTools.GetResourceString("Template_RegionComplexProperties")) For Each edmProperty As EdmProperty in complex.Properties.Where(Function(p) p.DeclaringType Is complex AndAlso TypeOf p.TypeUsage.EdmType Is ComplexType) VerifyGetterAndSetterAccessibilityCompatability(edmProperty) WriteComplexTypeProperty(edmProperty, code) Next region.End() Me.Write("End Class"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If Not code.VerifyCaseInsensitiveMemberUniqueness(code.GetAllDeclaredMembers(complex), complex.FullName, SourceCsdlPath) Then Return String.Empty End If Next region.End() '''''''' '''''''' '''''''' region.Begin(CodeGenerationTools.GetResourceString("Template_RegionEnumTypes")) For Each enumType As EnumType in GetSourceSchemaTypes(Of EnumType)().OrderBy(Function(e) e.Name) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(enumType))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(enumType, region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If enumType.IsFlags Then Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForType(enumType))) Me.Write(" Enum ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(enumType))) Me.Write(" As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(enumType.UnderlyingType.ClrEquivalentType, fullyQualifySystemTypes:= False))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) For Each member As EnumMember In enumType.Members Me.Write(" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(member))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(member, region.CurrentIndentLevel + 1))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(member))) Me.Write(" = ") Me.Write(Me.ToStringHelper.ToStringWithCulture(member.Value)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next '' If enumType.Members.Any() Then Me.GenerationEnvironment.Remove( Me.GenerationEnvironment.Length - (CurrentIndent.Length + 2), (CurrentIndent.Length + 2)) Else Me.Write(" None"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Me.Write("End Enum"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If Not code.VerifyCaseInsensitiveMemberUniqueness(code.GetAllDeclaredMembers(enumType), enumType.FullName, SourceCsdlPath) Then Return String.Empty End If Next region.End() If (Not String.IsNullOrEmpty(namespaceName)) Then PopIndent() Me.Write("End Namespace"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If If Not code.VerifyCaseInsensitiveTypeUniqueness(code.GetAllGlobalItems(ItemCollection), SourceCsdlPath) Then Return String.Empty End If Return Me.GenerationEnvironment.ToString End Function '''''''' '''''''' '''''''' '''''''' '''''''' '''''''' Private Sub WriteFactoryMethod(structuralType As StructuralType, code As CodeGenerationTools) Dim region As CodeRegion = new CodeRegion(Me, 1) Dim methodName As String = "Create" + structuralType.Name Dim uniqueIdentifier As UniqueIdentifierService = new UniqueIdentifierService() Dim instanceName As String = code.Escape(uniqueIdentifier.AdjustIdentifier((code.CamelCase(structuralType.Name)))) Dim parameters As IEnumerable(Of FactoryMethodParameter) = FactoryMethodParameter.CreateParameters(structuralType.Members.OfType(Of EdmProperty)().Where(Function(p) IncludePropertyInFactoryMethod(structuralType, p)), uniqueIdentifier, Function(t, c) MultiSchemaEscape(t, c), code) If (parameters.Count() = 0) Then Return End If If(structuralType.Members.Any(Function(m) m.Name = methodName)) Then ' Errors.Add(new System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6029", String.Format(CultureInfo.CurrentCulture, _ CodeGenerationTools.GetResourceString("Template_FactoryMethodNameConflict"), methodName, structuralType.FullName))) End If region.Begin(CodeGenerationTools.GetResourceString("Template_RegionFactoryMethod")) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_FactoryMethodComment"), structuralType.Name))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ParameterComments(parameters.Select(Function(p) New Tuple(Of String, String)(p.RawParameterName, p.ParameterComment)), region.CurrentIndentLevel))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Public Shared Function ") Me.Write(Me.ToStringHelper.ToStringWithCulture(methodName)) Me.Write("(") Me.Write(Me.ToStringHelper.ToStringWithCulture(String.Join(", ", parameters.Select(Function(p) p.ParameterName & " As " & p.ParameterType).ToArray()))) Me.Write(") As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Dim ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(" as ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))) Me.Write(" = New ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(structuralType))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) For Each parameter As FactoryMethodParameter in parameters If(parameter.IsComplexType) Then ' Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(".") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))) Me.Write(" = StructuralObject.VerifyComplexObjectIsNotNull(") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.ParameterName)) Me.Write(", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.Source.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else ' Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(".") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(parameter.Source))) Me.Write(" = ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.ParameterName)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Next Me.Write(" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(instanceName)) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Function"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) region.End() End Sub '''''''' '''''''' '''''''' Private Sub WriteSimpleTypeProperty(simpleProperty As EdmProperty, code As CodeGenerationTools) Dim ef As MetadataTools = New MetadataTools(Me) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(simpleProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(simpleProperty, 1))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(simpleProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(simpleProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(simpleProperty))) Me.Write("() As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(simpleProperty.TypeUsage, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(simpleProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(ef.ClrType(simpleProperty.TypeUsage) = GetType(byte())) Then Me.Write(" Return StructuralObject.GetValidValue(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else Me.Write(" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Me.Write(" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter((simpleProperty))))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(ef.IsKey(simpleProperty)) Then If(ef.ClrType(simpleProperty.TypeUsage) = GetType(byte())) Then Me.Write(" If (Not StructuralObject.BinaryEquals(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))) Me.Write(", Value)) Then"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Else Me.Write(" If (") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))) Me.Write(" <> Value) Then"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If PushIndent(CodeRegion.GetIndent(1)) End If Me.Write(" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(simpleProperty))) Me.Write("(value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanging(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(simpleProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))) Me.Write(" = ") Me.Write(Me.ToStringHelper.ToStringWithCulture(BeginCastToEnumType(simpleProperty.TypeUsage, code))) Me.Write("StructuralObject.SetValidValue(") Me.Write(Me.ToStringHelper.ToStringWithCulture(BeginCastToUnderlyingType(simpleProperty.TypeUsage, code))) Me.Write("value") Me.Write(Me.ToStringHelper.ToStringWithCulture(EndCastToUnderlyingType(simpleProperty.TypeUsage, code))) Me.Write(Me.ToStringHelper.ToStringWithCulture(OptionalNullableParameterForSetValidValue(simpleProperty, code))) Me.Write(", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(simpleProperty.Name)) Me.Write(""")") Me.Write(Me.ToStringHelper.ToStringWithCulture(EndCastToEnumType(simpleProperty.TypeUsage, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanged(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(simpleProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(simpleProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) If(ef.IsKey(simpleProperty)) Then PopIndent() Me.Write(" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If Me.Write(" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(simpleProperty))) Me.Write(" As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(simpleProperty.TypeUsage, code))) Me.Write(Me.ToStringHelper.ToStringWithCulture(code.StringBefore(" = ", code.CreateLiteral(simpleProperty.DefaultValue)))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(simpleProperty))) Me.Write("(value As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(simpleProperty.TypeUsage, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(simpleProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End Sub '''''''' '''''''' '''''''' Private Sub WriteComplexTypeProperty(complexProperty As EdmProperty, code As CodeGenerationTools) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(SummaryComment(complexProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ''' ") Me.Write(Me.ToStringHelper.ToStringWithCulture(LongDescriptionCommentElement(complexProperty, 1))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(NewModifier(complexProperty)))) Me.Write(Me.ToStringHelper.ToStringWithCulture(Accessibility.ForProperty(complexProperty))) Me.Write(" Property ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.Escape(complexProperty))) Me.Write("() As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForGetter(complexProperty)))) Me.Write("Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(" = GetValidValue(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(", """) Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""", False, ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(" = True"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Return ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Get"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.SpaceAfter(Accessibility.ForSetter(complexProperty)))) Me.Write("Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))) Me.Write("(value)"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanging(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(" = SetValidValue(") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(", value, """) Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(" = True"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ReportPropertyChanged(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(complexProperty.Name)) Me.Write(""")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Set"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Property"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(code.FieldName(complexProperty))) Me.Write(" As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private ") Me.Write(Me.ToStringHelper.ToStringWithCulture(InitializedTrackingField(complexProperty, code))) Me.Write(" As Boolean"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangingMethodName(complexProperty))) Me.Write("(value As ") Me.Write(Me.ToStringHelper.ToStringWithCulture(MultiSchemaEscape(complexProperty.TypeUsage, code))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Private Partial Sub ") Me.Write(Me.ToStringHelper.ToStringWithCulture(ChangedMethodName(complexProperty))) Me.Write("()"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End Sub"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End Sub Private Sub WriteFunctionParameters(ByVal parameters As IEnumerable(Of FunctionImportParameter)) For Each parameter As FunctionImportParameter In parameters If (Not parameter.NeedsLocalVariable) Then Continue For End If Me.Write(" Dim ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" As ObjectParameter"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" If (") Me.Write(Me.ToStringHelper.ToStringWithCulture(If(parameter.IsNullableOfT, parameter.FunctionParameterName + ".HasValue", parameter.FunctionParameterName & " IsNot Nothing"))) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" = New ObjectParameter(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)) Me.Write(""", ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.FunctionParameterName)) Me.Write(")"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" Else"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" ") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.LocalVariableName)) Me.Write(" = New ObjectParameter(""") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.EsqlParameterName)) Me.Write(""", GetType(") Me.Write(Me.ToStringHelper.ToStringWithCulture(parameter.RawClrTypeName)) Me.Write("))"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&" End If"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) Next End Sub Private Sub WriteLazyLoadingEnabled(ByVal container As EntityContainer) Dim lazyLoadingAttributeValue As String = Nothing Dim lazyLoadingAttributeName As String = MetadataConstants.EDM_ANNOTATION_09_02 & ":LazyLoadingEnabled" If MetadataTools.TryGetStringMetadataPropertySetting(container, lazyLoadingAttributeName, lazyLoadingAttributeValue) Then Dim isLazyLoading As Boolean = False If Boolean.TryParse(lazyLoadingAttributeValue, isLazyLoading) Then Me.Write(" MyBase.ContextOptions.LazyLoadingEnabled = ") Me.Write(Me.ToStringHelper.ToStringWithCulture(isLazyLoading.ToString().ToLowerInvariant())) Me.Write(""&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)) End If End If End Sub '''''''' '''''''' '''''''' Public Property SourceCsdlPath() As String Public Property ModelNamespace() As String Public Property ItemCollection() As EdmItemCollection Public Property ReferenceCsdlPaths() As IEnumerable(Of String) Public Property FullyQualifySystemTypes() As Nullable(Of Boolean) Public Property CreateContextAddToMethods As Nullable(Of Boolean) Public Property EdmToObjectNamespaceMap() As Dictionary(Of string, string) Get Return _edmToObjectNamespaceMap End Get Set _edmToObjectNamespaceMap = Value End Set End Property Dim _edmToObjectNamespaceMap As Dictionary(Of string, string) = new Dictionary(Of string, string) Public ReadOnly Property SourceEdmVersion As Double Get If (Not ItemCollection Is Nothing) Then Return ItemCollection.EdmVersion End If Return 0.0 End Get End Property Private Sub ApplyUserSettings(userSettings as UserSettings) If(SourceCsdlPath Is Nothing) Then #If NOT PREPROCESSED_TEMPLATE If userSettings.SourceCsdlPath = ("$" & "edmxInputFile" & "$") Errors.Add(New System.CodeDom.Compiler.CompilerError(Host.TemplateFile, -1, -1, String.Empty, CodeGenerationTools.GetResourceString("Template_ReplaceVsItemTemplateToken"))) Return End If SourceCsdlPath = Host.ResolvePath(userSettings.SourceCsdlPath) #Else SourceCsdlPath = userSettings.SourceCsdlPath #End If End If ' normalize the path, remove ..\ from it SourceCsdlPath = Path.GetFullPath(SourceCsdlPath) If(ReferenceCsdlPaths Is Nothing) Then ReferenceCsdlPaths = userSettings.ReferenceCsdlPaths End If If(Not FullyQualifySystemTypes.HasValue) Then FullyQualifySystemTypes = userSettings.FullyQualifySystemTypes End If If(Not CreateContextAddToMethods.HasValue) Then CreateContextAddToMethods = userSettings.CreateContextAddToMethods End If DefaultSummaryComment = CodeGenerationTools.GetResourceString("Template_CommentNoDocumentation") End Sub '''''''' '''''''' '''''''' Private Class UserSettings Public Property SourceCsdlPath() As String Public Property ReferenceCsdlPaths() As String () Public Property FullyQualifySystemTypes() As Boolean Public Property CreateContextAddToMethods() As Boolean Public Property CamelCaseFields() As Boolean End Class Private Function GetNamespaceName(code As CodeGenerationTools) As String Dim namespaceName As String = code.VsNamespaceSuggestion() #If PREPROCESSED_TEMPLATE Then If String.IsNullOrEmpty(namespaceName) Then namespaceName = GetObjectNamespace(ModelNamespace) End If #End If Return namespaceName End Function Private Function MultiSchemaEscape(ByVal usage As TypeUsage, ByVal code As CodeGenerationTools) As String Dim ef As MetadataTools = New MetadataTools(Me) If usage.EdmType IsNot Nothing Then If TypeOf usage.EdmType Is StructuralType Then Return MultiSchemaEscape(usage.EdmType, code) ElseIf TypeOf usage.EdmType Is EnumType Then Dim typeName As String = MultiSchemaEscape(usage.EdmType, code) If ef.IsNullable(usage) Then Return String.Format(CultureInfo.InvariantCulture, "Nullable(Of {0})", typeName) End If Return typeName End If End If Return code.Escape(usage) End Function Private Function MultiSchemaEscape(ByVal type As EdmType, ByVal code As CodeGenerationTools) As String If type.NamespaceName <> ModelNamespace Then Return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(type.NamespaceName)), code.Escape(type)) End If Return code.Escape(type) End Function Private Function NewModifier(ByVal navigationProperty As NavigationProperty) As String Dim baseType As Type = GetType(EntityObject) Return NewModifier(baseType, navigationProperty.Name) End Function Private Function NewModifier(ByVal edmFunction As EdmFunction) As String Dim baseType As Type = GetType(ObjectContext) Return NewModifier(baseType, edmFunction.Name) End Function Private Function NewModifier(ByVal entitySet As EntitySet) As String Dim baseType As Type = GetType(ObjectContext) Return NewModifier(baseType, entitySet.Name) End Function Private Function NewModifier(ByVal edmProperty As EdmProperty) As String Dim baseType As Type If edmProperty.DeclaringType.BuiltInTypeKind = BuiltInTypeKind.EntityType Then baseType = GetType(EntityObject) Else baseType = GetType(ComplexObject) End If Return NewModifier(baseType, edmProperty.Name) End Function Private Function NewModifier(ByVal type As Type, ByVal memberName As String) As String If HasBaseMemberWithMatchingName(type, memberName) Then Return "Shadows" End If Return String.Empty End Function Private Function ChangingMethodName(ByVal member As EdmMember) As String Return String.Format(CultureInfo.InvariantCulture, "On{0}Changing", member.Name) End Function Private Function ChangedMethodName(ByVal member As EdmMember) As String Return String.Format(CultureInfo.InvariantCulture, "On{0}Changed", member.Name) End Function Private Function InitializedTrackingField(ByVal edmProperty As EdmProperty, ByVal code As CodeGenerationTools) As String Dim namePart As String = edmProperty.Name & "Initialized" If code.CamelCaseFields Then namePart = code.CamelCase(namePart) End If Return "_" & namePart End Function Private Function OptionalNullableParameterForSetValidValue(ByVal member As EdmMember, ByVal code As CodeGenerationTools) As String Dim ef As New MetadataTools(Me) Dim list As String = String.Empty Dim type As PrimitiveType = TryCast(member.TypeUsage.EdmType, PrimitiveType) If type IsNot Nothing AndAlso type.ClrEquivalentType.IsClass Then Dim storeGeneratedPatternProperty As MetadataProperty = Nothing Dim isNullable As Boolean = ef.IsNullable(member.TypeUsage) OrElse (member.MetadataProperties.TryGetValue(MetadataConstants.EDM_ANNOTATION_09_02 & ":StoreGeneratedPattern", False, storeGeneratedPatternProperty) AndAlso Object.Equals(storeGeneratedPatternProperty.Value, "Computed")) list += ", " & code.CreateLiteral(isNullable) End If Return list End Function Private Shared Function IsVisibleMember(ByVal memberInfo As MemberInfo) As Boolean If TypeOf memberInfo Is EventInfo Then Dim ei As EventInfo = DirectCast(memberInfo, EventInfo) Dim add As MethodInfo = ei.GetAddMethod() Dim remove As MethodInfo = ei.GetRemoveMethod() Return IsVisibleMethod(add) OrElse IsVisibleMethod(remove) ElseIf TypeOf memberInfo Is FieldInfo Then Dim fi As FieldInfo = DirectCast(memberInfo, FieldInfo) Return Not fi.IsPrivate AndAlso Not fi.IsAssembly ElseIf TypeOf memberInfo Is MethodBase Then Dim mb As MethodBase = DirectCast(memberInfo, MethodBase) If mb.IsSpecialName Then Return False End If Return IsVisibleMethod(mb) ElseIf TypeOf memberInfo Is PropertyInfo Then Dim pi As PropertyInfo = DirectCast(memberInfo, PropertyInfo) Dim getMethod As MethodInfo = pi.GetGetMethod() Dim entitySet As MethodInfo = pi.GetSetMethod() Return IsVisibleMethod(getMethod) OrElse IsVisibleMethod(entitySet) End If Return False End Function Private Shared Function IsVisibleMethod(ByVal methodBase As MethodBase) As Boolean If methodBase Is Nothing Then Return False End If Return Not methodBase.IsPrivate AndAlso Not methodBase.IsAssembly End Function Private Shared Function HasBaseMemberWithMatchingName(ByVal type As Type, ByVal memberName As String) As Boolean Dim bindings As BindingFlags = BindingFlags.FlattenHierarchy Or BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static Return type.GetMembers(bindings).Where(Function(m) IsVisibleMember(m)).Any(Function(m) m.Name.Equals(memberName, StringComparison.OrdinalIgnoreCase)) End Function Private Function BeginCastToEnumType(ByVal typeUsage As TypeUsage, ByVal code As CodeGenerationTools) As String Dim type As EnumType = TryCast(typeUsage.EdmType, EnumType) If type Is Nothing Then Return String.Empty End If Return "CType(" End Function Private Function EndCastToEnumType(ByVal typeUsage As TypeUsage, ByVal code As CodeGenerationTools) As String Dim type As EnumType = TryCast(typeUsage.EdmType, EnumType) If type Is Nothing Then Return String.Empty End If Return ", " & MultiSchemaEscape(typeUsage, code) & ")" End Function Private Function BeginCastToUnderlyingType(ByVal typeUsage As TypeUsage, ByVal code As CodeGenerationTools) As String Dim type As EnumType = TryCast(typeUsage.EdmType, EnumType) If type Is Nothing Then Return String.Empty End If Return "CType(" End Function Private Function EndCastToUnderlyingType(ByVal typeUsage As TypeUsage, ByVal code As CodeGenerationTools) As String Dim ef As MetadataTools = New MetadataTools(Me) Dim type As EnumType = TryCast(typeUsage.EdmType, EnumType) If type Is Nothing Then Return String.Empty End If Dim clrType As String = code.Escape(type.UnderlyingType.ClrEquivalentType, fullyQualifySystemTypes := False) If ef.IsNullable(typeUsage) Then clrType = String.Format(CultureInfo.InvariantCulture, "Nullable(Of {0})", clrType) End If Return ", " & clrType & ")" End Function Private Function GetSourceSchemaTypes(Of T As GlobalItem)() As IEnumerable(Of T) If Path.GetExtension(SourceCsdlPath) <> ".edmx" Then Return ItemCollection.GetItems(Of T)().Where(Function(e) e.MetadataProperties.Any(Function(mp) mp.Name = "SchemaSource" AndAlso DirectCast(mp.Value, String) = SourceCsdlPath)) Else Return ItemCollection.GetItems(Of T)() End If End Function Private Function EndName(ByVal association As AssociationType, ByVal index As Integer) As String Return association.AssociationEndMembers(index).Name End Function Private Function EndMultiplicity(ByVal association As AssociationType, ByVal index As Integer, ByVal code As CodeGenerationTools) As String Return code.CreateLiteral(association.AssociationEndMembers(index).RelationshipMultiplicity) End Function Private Function EscapeEndTypeName(ByVal association As AssociationType, ByVal index As Integer, ByVal code As CodeGenerationTools) As String Dim entity As EntityType = association.AssociationEndMembers(index).GetEntityType() Return code.CreateFullName(code.EscapeNamespace(GetObjectNamespace(entity.NamespaceName)), code.Escape(entity)) End Function Private Function GetObjectNamespace(ByVal csdlNamespaceName As String) As String Dim objectNamespace As String = Nothing If EdmToObjectNamespaceMap.TryGetValue(csdlNamespaceName, objectNamespace) Then Return objectNamespace End If Return csdlNamespaceName End Function Private Sub UpdateObjectNamespaceMap(objectNamespace As String) If Not objectNamespace = ModelNamespace AndAlso Not EdmToObjectNamespaceMap.ContainsKey(ModelNamespace) EdmToObjectNamespaceMap.Add(ModelNamespace, objectNamespace) End If End Sub Private Shared Function FixParameterName(ByVal name As String, ByVal code As CodeGenerationTools) As String ' ' If StringComparer.OrdinalIgnoreCase.Equals(name, "id") Then ' Return "id" End If Return code.CamelCase(name) End Function Private Function BaseTypeName(ByVal entity As EntityType, ByVal code As CodeGenerationTools) As String Return If(entity.BaseType Is Nothing, "EntityObject", MultiSchemaEscape(entity.BaseType, code)) End Function Private Function IncludePropertyInFactoryMethod(ByVal factoryType As StructuralType, ByVal edmProperty As EdmProperty) As Boolean If edmProperty.Nullable Then Return False End If If edmProperty.DefaultValue IsNot Nothing Then Return False End If If (Accessibility.ForReadOnlyProperty(edmProperty) <> "Public" AndAlso Accessibility.ForWriteOnlyProperty(edmProperty) <> "Public") OrElse (factoryType IsNot edmProperty.DeclaringType AndAlso Accessibility.ForWriteOnlyProperty(edmProperty) = "Private") Then ' Return False End If Return True End Function Private Class FactoryMethodParameter Public Source As EdmProperty Public RawParameterName As String Public ParameterName As String Public ParameterType As String Public ParameterComment As String Public IsComplexType As Boolean Public Shared Function CreateParameters(ByVal properties As IEnumerable(Of EdmProperty), ByVal unique As UniqueIdentifierService, ByVal multiSchemaEscape As Func(Of TypeUsage, CodeGenerationTools, String), ByVal code As CodeGenerationTools) As IEnumerable(Of FactoryMethodParameter) Dim parameters As New List(Of FactoryMethodParameter)() For Each edmProperty As EdmProperty In properties Dim parameter As New FactoryMethodParameter() parameter.Source = edmProperty parameter.IsComplexType = TypeOf edmProperty.TypeUsage.EdmType Is ComplexType parameter.RawParameterName = unique.AdjustIdentifier(FixParameterName(edmProperty.Name, code)) parameter.ParameterName = code.Escape(parameter.RawParameterName) parameter.ParameterType = multiSchemaEscape(edmProperty.TypeUsage, code) parameter.ParameterComment = String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_CommentFactoryMethodParam"), edmProperty.Name) parameters.Add(parameter) Next Return parameters End Function End Class Private Property DefaultSummaryComment() As String Private Function SummaryComment(ByVal item As MetadataItem) As String If item.Documentation IsNot Nothing AndAlso item.Documentation.Summary IsNot Nothing Then Return PrefixLinesOfMultilineComment(XMLCOMMENT_START & " ", XmlEntityize(item.Documentation.Summary)) End If If DefaultSummaryComment IsNot Nothing Then Return DefaultSummaryComment End If Return String.Empty End Function Private Function LongDescriptionCommentElement(ByVal item As MetadataItem, ByVal indentLevel As Integer) As String If item.Documentation IsNot Nothing AndAlso Not String.IsNullOrEmpty(item.Documentation.LongDescription) Then Dim comment As String = Environment.NewLine Dim lineStart As String = CodeRegion.GetIndent(indentLevel) + XMLCOMMENT_START & " " comment += (lineStart & "") + Environment.NewLine comment += lineStart + PrefixLinesOfMultilineComment(lineStart, XmlEntityize(item.Documentation.LongDescription)) + Environment.NewLine comment += lineStart & "" Return comment End If Return String.Empty End Function Private Function PrefixLinesOfMultilineComment(ByVal prefix As String, ByVal comment As String) As String Return comment.Replace(Environment.NewLine, Environment.NewLine + prefix) End Function Private Function ParameterComments(ByVal parameters As IEnumerable(Of Tuple(Of String, String)), ByVal indentLevel As Integer) As String Dim builder As New System.Text.StringBuilder() For Each parameter As Tuple(Of String, String) In parameters builder.AppendLine() builder.Append(CodeRegion.GetIndent(indentLevel)) builder.Append(XMLCOMMENT_START) builder.Append(String.Format(CultureInfo.InvariantCulture, " {1}", parameter.Item1, parameter.Item2)) Next Return builder.ToString() End Function Private Function XmlEntityize(ByVal text As String) As String If String.IsNullOrEmpty(text) Then Return String.Empty End If text = text.Replace("&", "&") text = text.Replace("<", "<").Replace(">", ">") Dim id As String = Guid.NewGuid().ToString() text = text.Replace(Environment.NewLine, id) text = text.Replace(vbCr, " ").Replace(vbLf, " ") text = text.Replace(id, Environment.NewLine) Return text.Replace("'", "'").Replace("""", """) End Function Const XMLCOMMENT_START As String = "'''" Private Function GetProperties(ByVal type As StructuralType) As IEnumerable(Of EdmProperty) If type.BuiltInTypeKind = BuiltInTypeKind.EntityType Then Return DirectCast(type, EntityType).Properties Else Return DirectCast(type, ComplexType).Properties End If End Function Protected Sub VerifyGetterAndSetterAccessibilityCompatability(ByVal member As EdmMember) Dim rawGetterAccessibility As String = Accessibility.ForReadOnlyProperty(member) Dim rawSetterAccessibility As String = Accessibility.ForWriteOnlyProperty(member) If (rawGetterAccessibility = "Friend" AndAlso rawSetterAccessibility = "Protected") OrElse (rawGetterAccessibility = "Protected" AndAlso rawSetterAccessibility = "Friend") Then Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6033", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("GeneratedPropertyAccessibilityConflict"), member.Name, rawGetterAccessibility, rawSetterAccessibility))) End If End Sub Private Sub VerifyEntityTypeAndSetAccessibilityCompatability(ByVal entitySet As EntitySet) Dim typeAccess As String = Accessibility.ForType(entitySet.ElementType) Dim setAccess As String = Accessibility.ForReadOnlyProperty(entitySet) If typeAccess = "Friend" AndAlso (setAccess = "Public" OrElse setAccess = "Protected") Then Errors.Add(New System.CodeDom.Compiler.CompilerError(SourceCsdlPath, -1, -1, "6036", String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("EntityTypeAndSetAccessibilityConflict"), entitySet.ElementType.Name, typeAccess, entitySet.Name, setAccess))) End If End Sub Private Sub DefineMetadata() TemplateMetadata(MetadataConstants.TT_TEMPLATE_NAME) = "VBCodeGen" TemplateMetadata(MetadataConstants.TT_TEMPLATE_VERSION) = "5.0" TemplateMetadata(MetadataConstants.TT_MINIMUM_ENTITY_FRAMEWORK_VERSION) = "5.0" End Sub Private NotInheritable Class UniqueIdentifierService Private ReadOnly _knownIdentifiers As HashSet(Of String) = New HashSet(Of string)(StringComparer.OrdinalIgnoreCase) ''' ''' ''' ''' Public Function AdjustIdentifier(identifier As String) As String ' Dim numberOfConflicts As Int32 = 0 Dim adjustedIdentifier As String = identifier While Not _knownIdentifiers.Add(adjustedIdentifier) numberOfConflicts += 1 adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture) End While Return adjustedIdentifier End Function End Class ' Copyright (c) Microsoft Corporation. All rights reserved. Public Shared TemplateMetadata As New Dictionary(Of String, String)() ''' ''' Responsible for helping to create source code that is ''' correctly formated and functional ''' Public Class CodeGenerationTools Private ReadOnly _textTransformation As DynamicTextTransformation Private ReadOnly _code As VBCodeProvider Private ReadOnly _ef As MetadataTools ''' ''' Initializes a new CodeGenerationTools object with the TextTransformation (T4 generated class) ''' that is currently running. ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) _code = New VBCodeProvider() _ef = New MetadataTools(_textTransformation) FullyQualifySystemTypes = False CamelCaseFields = True End Sub ''' ''' When true, all types that are not being generated ''' are fully qualified to keep them from conflicting with ''' types that are being generated. Useful when you have ''' something like a type being generated named System. ''' ''' Default is false. ''' Private _FullyQualifySystemTypes As Boolean Public Property FullyQualifySystemTypes() As Boolean Get Return _FullyQualifySystemTypes End Get Set(ByVal value As Boolean) _FullyQualifySystemTypes = value End Set End Property ''' ''' When true, the field names are Camel Cased, ''' otherwise they will preserve the case they ''' start with. ''' ''' Default is true. ''' Private _CamelCaseFields As Boolean Public Property CamelCaseFields() As Boolean Get Return _CamelCaseFields End Get Set(ByVal value As Boolean) _CamelCaseFields = value End Set End Property ''' ''' Returns the NamespaceName suggested by VS if running inside VS. Otherwise, returns ''' null. ''' Public Function VsNamespaceSuggestion() As String Dim suggestion As String = _textTransformation.Host.ResolveParameterValue("directiveId", "namespaceDirectiveProcessor", "namespaceHint") If String.IsNullOrEmpty(suggestion) Then Return Nothing End If Return suggestion End Function ''' ''' Returns a string that is safe for use as an identifier in C#. ''' Keywords are escaped. ''' Public Function Escape(ByVal name As String) As String If name Is Nothing Then Return Nothing End If Return _code.CreateEscapedIdentifier(name) End Function ''' ''' Returns the name of the TypeUsage's EdmType that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal typeUsage As TypeUsage) As String If typeUsage Is Nothing Then Return Nothing End If If TypeOf typeUsage.EdmType Is ComplexType OrElse TypeOf typeUsage.EdmType Is EntityType Then Return Escape(typeUsage.EdmType.Name) ElseIf TypeOf typeUsage.EdmType Is SimpleType Then Dim clrType As Type = _ef.UnderlyingClrType(typeUsage.EdmType) Dim typeName As String = If(TypeOf typeUsage.EdmType Is EnumType, Escape(typeUsage.EdmType.Name), Escape(clrType)) If clrType.IsValueType AndAlso _ef.IsNullable(typeUsage) Then Return String.Format(CultureInfo.InvariantCulture, "Nullable(Of {0})", typeName) End If Return typeName ElseIf TypeOf typeUsage.EdmType Is CollectionType Then Return String.Format(CultureInfo.InvariantCulture, "ICollection(Of {0})", Escape(DirectCast(typeUsage.EdmType, CollectionType).TypeUsage)) End If Throw New ArgumentException("typeUsage") End Function ''' ''' Returns the name of the EdmMember that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return Escape(member.Name) End Function ''' ''' Returns the name of the EdmType that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal type As EdmType) As String If type Is Nothing Then Return Nothing End If Return Escape(type.Name) End Function ''' ''' Returns the name of the EdmFunction that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal edmFunction As EdmFunction) As String If edmFunction Is Nothing Then Return Nothing End If Return Escape(edmFunction.Name) End Function ''' ''' Returns the name of the EnumMember that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal member As EnumMember) As String If member Is Nothing Then Return Nothing End If Return Escape(member.Name) End Function ''' ''' Returns the name of the EntityContainer that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal container As EntityContainer) As String If container Is Nothing Then Return Nothing End If Return Escape(container.Name) End Function ''' ''' Returns the name of the EntitySet that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal edmSet As EntitySet) As String If edmSet Is Nothing Then Return Nothing End If Return Escape(edmSet.Name) End Function ''' ''' Returns the name of the StructuralType that is safe for ''' use as an identifier. ''' Public Function Escape(ByVal type As StructuralType) As String If type Is Nothing Then Return Nothing End If Return Escape(type.Name) End Function ''' ''' Returns the NamespaceName with each segment safe to ''' use as an identifier. ''' Public Function EscapeNamespace(ByVal namespaceName As String) As String If String.IsNullOrEmpty(namespaceName) Then Return namespaceName End If Dim parts As String() = namespaceName.Split("."c) namespaceName = String.Empty For Each part As String In parts If namespaceName <> String.Empty Then namespaceName += "." End If namespaceName += Escape(part) Next Return namespaceName End Function ''' ''' Returns the name of the EdmMember formatted for ''' use as a field identifier. ''' ''' This method changes behavior based on the CamelCaseFields ''' setting. ''' Public Function FieldName(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return FieldName(member.Name) End Function ''' ''' Returns the name of the EntitySet formatted for ''' use as a field identifier. ''' ''' This method changes behavior based on the CamelCaseFields ''' setting. ''' Public Function FieldName(ByVal edmSet As EntitySet) As String If edmSet Is Nothing Then Return Nothing End If Return FieldName(edmSet.Name) End Function Private Function FieldName(ByVal name As String) As String If CamelCaseFields Then Return "_" & CamelCase(name) Else Return "_" & name End If End Function ''' ''' Returns the name of the Type object formatted for ''' use in source code. ''' ''' This method changes behavior based on the FullyQualifySystemTypes ''' setting. ''' Public Function Escape(ByVal clrType As Type) As String Return Escape(clrType, FullyQualifySystemTypes) End Function ''' ''' Returns the name of the Type object formatted for ''' use in source code. ''' Public Function Escape(ByVal clrType As Type, ByVal fullyQualifySystemTypes As Boolean) As String If clrType Is Nothing Then Return Nothing End If Dim typeName As String If fullyQualifySystemTypes Then If(Not clrType.IsArray) Then typeName = clrType.FullName Else typeName = clrType.GetElementType().FullName & "()" End If typeName = "Global." & typeName Else typeName = _code.GetTypeOutput(New CodeTypeReference(clrType)) End If Return typeName End Function ''' ''' Returns the abstract option if the entity is Abstract, otherwise returns String.Empty ''' Public Function MustInheritOption(entity As EntityType) As String If entity.Abstract Then Return "MustInherit" End If Return String.Empty End Function ''' ''' Returns the passed in identifier with the first letter changed to lowercase ''' Public Function CamelCase(ByVal identifier As String) As String If String.IsNullOrEmpty(identifier) Then Return identifier End If If identifier.Length = 1 Then Return identifier(0).ToString(CultureInfo.InvariantCulture).ToLowerInvariant() End If Return identifier(0).ToString(CultureInfo.InvariantCulture).ToLowerInvariant() + identifier.Substring(1) End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with a single space concatenated on the end. ''' Public Function SpaceAfter(ByVal value As String) As String Return StringAfter(value, " ") End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with a single space concatenated on the end. ''' Public Function SpaceBefore(ByVal value As String) As String Return StringBefore(" ", value) End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with append concatenated on the end. ''' Public Function StringAfter(ByVal value As String, ByVal append As String) As String If String.IsNullOrEmpty(value) Then Return String.Empty End If Return value + append End Function ''' ''' If the value parameter is null or empty an empty string is returned, ''' otherwise it retuns value with prepend concatenated on the front. ''' Public Function StringBefore(ByVal prepend As String, ByVal value As String) As String If String.IsNullOrEmpty(value) Then Return String.Empty End If Return prepend + value End Function ''' ''' Returns false and shows an error if the supplied type names aren't case-insensitively unique, ''' otherwise returns true. ''' Public Function VerifyCaseInsensitiveTypeUniqueness(types As IEnumerable(Of String), ByVal sourceFile As String) As Boolean Return VerifyCaseInsensitiveUniqueness(types, _ Function(t) String.Format(CultureInfo.CurrentCulture, GetResourceString("Template_CaseInsensitiveTypeConflict"), t), sourceFile) End Function ''' ''' Returns false and shows an error if the supplied entity set names aren't case-insensitively unique, ''' otherwise returns true. ''' Public Function VerifyCaseInsensitiveEntitySetUniqueness(entitySets As IEnumerable(Of String), ByVal entityContainerName As String, ByVal sourceFile As String) As Boolean Return VerifyCaseInsensitiveUniqueness(entitySets, Function(e) String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_CaseInsensitiveEntitySetConflict"), entityContainerName, e), sourceFile) End Function ''' ''' Returns false and shows an error if the supplied type members names aren't case-insensitively unique, ''' otherwise returns true. ''' Public Function VerifyCaseInsensitiveMemberUniqueness(members As IEnumerable(Of String), ByVal declaringType As String, ByVal sourceFile As String) As Boolean Return VerifyCaseInsensitiveUniqueness(members, _ Function(m) String.Format(CultureInfo.CurrentCulture, _ GetResourceString("Template_CaseInsensitiveMemberConflict"), declaringType, m), sourceFile) End Function ''' ''' Returns false and shows an error if the supplied strings aren't case-insensitively unique, ''' otherwise returns true. ''' Private Function VerifyCaseInsensitiveUniqueness(items As IEnumerable(Of String), formatMessage As Func(Of String, String), ByVal sourceFile As String) As Boolean Dim hash As HashSet(Of String) = New HashSet(Of String)(StringComparer.InvariantCultureIgnoreCase) For Each item As String in items If Not hash.Add(item) Then _textTransformation.Errors.Add(New System.CodeDom.Compiler.CompilerError(sourceFile, -1, -1, 6023, formatMessage(item))) Return False End If Next Return True End Function ''' ''' Returns the names of the items in the supplied collection that correspond to O-Space types. ''' Public Function GetAllGlobalItems(ByVal itemCollection As EdmItemCollection) As IEnumerable(Of String) Return itemCollection.GetItems(Of GlobalItem)() _ .Where(Function(i) TypeOf i Is EntityType OrElse TypeOf i Is ComplexType OrElse TypeOf i Is EnumType OrElse TypeOf i is EntityContainer) _ .Select(Function(g) GetGlobalItemName(g)) End Function ''' ''' Returns the name of the supplied GlobalItem. ''' Private Function GetGlobalItemName(item As GlobalItem) As String If TypeOf item Is EdmType Then Return CType(item, EdmType).Name Else Return CType(item, EntityContainer).Name End If End Function ''' ''' Returns the names of the members of the supplied EdmType. ''' Public Function GetAllDeclaredMembers(edmType As EdmType) As IEnumerable(Of String) Dim entity As EntityType = TryCast(edmType, EntityType) If Not entity Is Nothing Then Dim declaredMembers As IEnumerable(Of EdmMember) = entity.Members.Where(Function(m) m.DeclaringType Is entity) Dim decalredNavigationProperties As IEnumerable(Of NavigationProperty) = entity.NavigationProperties.Where(Function(n) n.DeclaringType Is entity) Return declaredMembers.Union(decalredNavigationProperties.Cast(Of EdmMember)()).Select(Function(m) m.Name) End If Dim structural As StructuralType = TryCast(edmType, StructuralType) If Not structural Is Nothing Then Return structural.Members.Where(Function(m) m.DeclaringType Is structural).Select(Function(m) m.Name) End If Dim enumType As EnumType = TryCast(edmType, EnumType) If Not enumType Is Nothing Then Return enumType.Members.Select(Function(m) m.Name) End If Return Enumerable.Empty(Of String)() End Function ''' ''' Retuns as full of a name as possible, if a namespace is provided ''' the namespace and name are combined with a period, otherwise just ''' the name is returned. ''' Public Function CreateFullName(ByVal namespaceName As String, ByVal name As String) As String If String.IsNullOrEmpty(namespaceName) Then Return name End If Return (namespaceName & ".") + name End Function ''' ''' Retuns a literal representing the supplied value. ''' Public Function CreateLiteral(ByVal value As Object) As String If value Is Nothing Then Return String.Empty End If Dim type As Type = value.GetType() If type.IsEnum Then Return (type.FullName & ".") + value.ToString() End If If type Is GetType(Guid) Then Return String.Format(CultureInfo.InvariantCulture, "New Guid(""{0}"")", DirectCast(value, Guid).ToString("D", CultureInfo.InvariantCulture)) ElseIf type Is GetType(DateTime) Then Return String.Format(CultureInfo.InvariantCulture, "New DateTime({0}, DateTimeKind.Unspecified)", DirectCast(value, DateTime).Ticks) ElseIf type Is GetType(Byte()) Then Dim arrayInit As String = String.Join(", ", DirectCast(value, Byte()).Select(Function(b) b.ToString(CultureInfo.InvariantCulture)).ToArray()) Return String.Format(CultureInfo.InvariantCulture, "New Byte() {{{0}}}", arrayInit) ElseIf type Is GetType(DateTimeOffset) Then Dim dto As DateTimeOffset = DirectCast(value, DateTimeOffset) Return String.Format(CultureInfo.InvariantCulture, "New DateTimeOffset({0}, New TimeSpan({1}))", dto.Ticks, dto.Offset.Ticks) ElseIf type Is GetType(Decimal) Then Return String.Format(CultureInfo.InvariantCulture, "{0}D", DirectCast(value, Decimal).ToString(CultureInfo.InvariantCulture)) ElseIf type Is GetType(TimeSpan) Then Return String.Format(CultureInfo.InvariantCulture, "New TimeSpan({0})", DirectCast(value, TimeSpan).Ticks) End If Dim expression As CodePrimitiveExpression = New CodePrimitiveExpression(value) Dim writer As StringWriter = New StringWriter() Dim code As VBCodeProvider = New VBCodeProvider() code.GenerateCodeFromExpression(expression, writer, New CodeGeneratorOptions()) Return writer.ToString() End Function ''' ''' Returns a resource string from the System.Data.Entity.Design assembly. ''' Public Shared Function GetResourceString(resourceName As String, Optional culture As CultureInfo = Nothing) As String If _resourceManager Is Nothing Then _resourceManager = New System.Resources.ResourceManager("System.Data.Entity.Design", GetType(System.Data.Entity.Design.MetadataItemCollectionFactory).Assembly) End If Return _resourceManager.GetString(resourceName, culture) End Function Shared Private _resourceManager As System.Resources.ResourceManager Private Const ExternalTypeNameAttributeName As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName" ''' ''' Gets the entity, complex, or enum types for which code should be generated from the given item collection. ''' Any types for which an ExternalTypeName annotation has been applied in the conceptual model ''' metadata (CSDL) are filtered out of the returned list. ''' ''' The type of item to return. ''' The item collection to look in. ''' The items to generate. Public Function GetItemsToGenerate(Of T As GlobalItem)(itemCollection As ItemCollection) As IEnumerable(Of T) Return itemCollection.GetItems(Of T)().Where(Function(i) Not i.MetadataProperties.Any(Function(p) p.Name = ExternalTypeNameAttributeName)) End Function ''' ''' Returns the escaped type name to use for the given usage of an o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type usage to get a name for. ''' The type name to use. Public Function GetTypeName(typeUsage As TypeUsage) As String Return If(typeUsage Is Nothing, Nothing, GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace := Nothing)) End Function ''' ''' Returns the escaped type name to use for the given o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type to get a name for. ''' The type name to use. Public Function GetTypeName(edmType As EdmType) As String Return GetTypeName(edmType, isNullable := Nothing, modelNamespace := Nothing) End Function ''' ''' Returns the escaped type name to use for the given usage of an o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type usage to get a name for. ''' If not null and the type's namespace does not match this namespace, then a ''' fully qualified name will be returned. ''' The type name to use. Public Function GetTypeName(typeUsage As TypeUsage, modelNamespace As String) As String Return If(typeUsage Is Nothing, Nothing, GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace)) End Function ''' ''' Returns the escaped type name to use for the given o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type to get a name for. ''' If not null and the type's namespace does not match this namespace, then a ''' fully qualified name will be returned. ''' The type name to use. Public Function GetTypeName(edmType As EdmType, modelNamespace As String) As String Return GetTypeName(edmType, isNullable := Nothing, modelNamespace := modelNamespace) End Function ''' ''' Returns the escaped type name to use for the given o-space type. This might be ''' an external type name if the ExternalTypeName annotation has been specified in the ''' conceptual model metadata (CSDL). ''' ''' The o-space type to get a name for. ''' Set this to true for nullable usage of this type. ''' If not null and the type's namespace does not match this namespace, then a ''' fully qualified name will be returned. ''' The type name to use. Private Function GetTypeName(edmType As EdmType, isNullable As System.Nullable(Of Boolean), modelNamespace As String) As String If edmType Is Nothing Then Return Nothing End If Dim collectionType = TryCast(edmType, CollectionType) If collectionType IsNot Nothing Then Return String.Format(CultureInfo.InvariantCulture, "ICollection( Of {0})", GetTypeName(collectionType.TypeUsage, modelNamespace)) End If Dim typeName = If(Escape(edmType.MetadataProperties.Where(Function(p) p.Name = ExternalTypeNameAttributeName).[Select](Function(p) DirectCast(p.Value, String)).FirstOrDefault()), (If(modelNamespace IsNot Nothing AndAlso edmType.NamespaceName <> modelNamespace, CreateFullName(EscapeNamespace(edmType.NamespaceName), Escape(edmType)), Escape(edmType)))) If TypeOf edmType Is StructuralType Then Return typeName End If If TypeOf edmType Is SimpleType Then Dim clrType = _ef.UnderlyingClrType(edmType) If Not (TypeOf edmType Is EnumType) Then typeName = Escape(clrType) End If Return If(clrType.IsValueType AndAlso isNullable = True, String.Format(CultureInfo.InvariantCulture, "Nullable(Of {0})", typeName), typeName) End If Throw New ArgumentException("typeUsage") End Function End Class ''' ''' Responsible for making the Entity Framework Metadata more ''' accessible for code generation. ''' Public Class MetadataTools Private ReadOnly _textTransformation As DynamicTextTransformation ''' ''' Initializes an MetadataTools Instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) End Sub ''' ''' This method returns the underlying CLR type of the O-space type corresponding to the supplied ''' Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. ''' Public Function ClrType(typeUsage As TypeUsage) As Type Return UnderlyingClrType(typeUsage.EdmType) End Function ''' ''' This method returns the underlying CLR type of given the O-space type. ''' Note that for an enum type this means that the type backing the enum will be returned, not the enum type itself. ''' Public Function UnderlyingClrType(edmType As EdmType) As Type Dim primitiveType = TryCast(edmType, PrimitiveType) If primitiveType IsNot Nothing Then Return primitiveType.ClrEquivalentType End If Dim enumType = TryCast(edmType, EnumType) If enumType IsNot Nothing Then Return enumType.UnderlyingType.ClrEquivalentType End If Return GetType(Object) End Function ''' ''' True if the EdmProperty is a key of its DeclaringType, False otherwise. ''' Public Function IsKey(ByVal edmProp As EdmProperty) As Boolean If edmProp IsNot Nothing AndAlso edmProp.DeclaringType.BuiltInTypeKind = BuiltInTypeKind.EntityType Then Return DirectCast(edmProp.DeclaringType, EntityType).KeyMembers.Contains(edmProp) End If Return False End Function ''' ''' True if the EdmProperty TypeUsage is Nullable, False otherwise. ''' Public Function IsNullable(ByVal edmProp As EdmProperty) As Boolean Return edmProp IsNot Nothing AndAlso IsNullable(edmProp.TypeUsage) End Function ''' ''' True if the TypeUsage is Nullable, False otherwise. ''' Public Function IsNullable(ByVal typeUsage As TypeUsage) As Boolean Dim nullableFacet As Facet = Nothing If typeUsage IsNot Nothing AndAlso typeUsage.Facets.TryGetValue("Nullable", True, nullableFacet) Then Return CBool(nullableFacet.Value) End If Return False End Function ''' ''' If the passed in TypeUsage represents a collection this method returns final element ''' type of the collection, otherwise it returns the value passed in. ''' Public Function GetElementType(ByVal typeUsage As TypeUsage) As TypeUsage If typeUsage Is Nothing Then Return Nothing End If If TypeOf typeUsage.EdmType Is CollectionType Then Return GetElementType(DirectCast(typeUsage.EdmType, CollectionType).TypeUsage) Else Return typeUsage End If End Function ''' ''' Returns the NavigationProperty that is the other end of the same association set if it is ''' available, otherwise it returns null. ''' Public Function Inverse(ByVal navProperty As NavigationProperty) As NavigationProperty If navProperty Is Nothing Then Return Nothing End If Dim toEntity As EntityType = navProperty.ToEndMember.GetEntityType() Return toEntity.NavigationProperties.SingleOrDefault(Function(n) n.RelationshipType Is navProperty.RelationshipType AndAlso n IsNot navProperty) End Function ''' ''' Given a property on the dependent end of a referential constraint, returns the corresponding property on the principal end. ''' Requires: The association has a referential constraint, and the specified dependentProperty is one of the properties on the dependent end. ''' Public Function GetCorrespondingPrincipalProperty(ByVal navProperty As NavigationProperty, ByVal dependentProperty As EdmProperty) As EdmProperty If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If If dependentProperty Is Nothing Then Throw New ArgumentNullException("dependentProperty") End If Dim fromProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetPrincipalProperties(navProperty) Dim toProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetDependentProperties(navProperty) Return fromProperties(toProperties.IndexOf(dependentProperty)) End Function ''' ''' Given a property on the principal end of a referential constraint, returns the corresponding property on the dependent end. ''' Requires: The association has a referential constraint, and the specified principalProperty is one of the properties on the principal end. ''' Public Function GetCorrespondingDependentProperty(ByVal navProperty As NavigationProperty, ByVal principalProperty As EdmProperty) As EdmProperty If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If If principalProperty Is Nothing Then Throw New ArgumentNullException("principalProperty") End If Dim fromProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetPrincipalProperties(navProperty) Dim toProperties As ReadOnlyMetadataCollection(Of EdmProperty) = GetDependentProperties(navProperty) Return toProperties(fromProperties.IndexOf(principalProperty)) End Function ''' ''' Gets the collection of properties that are on the principal end of a referential constraint for the specified navigation property. ''' Requires: The association has a referential constraint. ''' Public Function GetPrincipalProperties(ByVal navProperty As NavigationProperty) As ReadOnlyMetadataCollection(Of EdmProperty) If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If Return DirectCast(navProperty.RelationshipType, AssociationType).ReferentialConstraints(0).FromProperties End Function ''' ''' Gets the collection of properties that are on the dependent end of a referential constraint for the specified navigation property. ''' Requires: The association has a referential constraint. ''' Public Function GetDependentProperties(ByVal navProperty As NavigationProperty) As ReadOnlyMetadataCollection(Of EdmProperty) If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If Return DirectCast(navProperty.RelationshipType, AssociationType).ReferentialConstraints(0).ToProperties End Function ''' ''' True if this entity type requires the HandleCascadeDelete method defined and the method has ''' not been defined on any base type ''' Public Function NeedsHandleCascadeDeleteMethod(itemCollection As ItemCollection, entity As EntityType) As Boolean Dim needsMethod As Boolean = ContainsCascadeDeleteAssociation(itemCollection, entity) ' Check to make sure no base types have already declared this method Dim baseType As EntityType = TryCast(entity.BaseType, EntityType) While needsMethod AndAlso baseType IsNot Nothing needsMethod = Not ContainsCascadeDeleteAssociation(itemCollection, baseType) baseType = TryCast(baseType.BaseType, EntityType) End While Return needsMethod End Function ''' ''' True if this entity type participates in any relationships where the other end has an OnDelete ''' cascade delete defined, or if it is the dependent in any identifying relationships ''' Private Function ContainsCascadeDeleteAssociation(itemCollection As ItemCollection, entity As EntityType) As Boolean Return itemCollection.GetItems(Of AssociationType)().Where(Function(a) DirectCast(a.AssociationEndMembers(0).TypeUsage.EdmType, RefType).ElementType Is entity AndAlso IsCascadeDeletePrincipal(a.AssociationEndMembers(1)) OrElse DirectCast(a.AssociationEndMembers(1).TypeUsage.EdmType, RefType).ElementType Is entity AndAlso IsCascadeDeletePrincipal(a.AssociationEndMembers(0))).Any() End Function ''' ''' True if the source end of the specified navigation property is the principal in an identifying relationship. ''' or if the source end has cascade delete defined. ''' Public Function IsCascadeDeletePrincipal(ByVal navProperty As NavigationProperty) As Boolean If navProperty Is Nothing Then Throw New ArgumentNullException("navProperty") End If Return IsCascadeDeletePrincipal(DirectCast(navProperty.FromEndMember, AssociationEndMember)) End Function ''' ''' True if the specified association end is the principal in an identifying relationship. ''' or if the association end has cascade delete defined. ''' Public Function IsCascadeDeletePrincipal(ByVal associationEnd As AssociationEndMember) As Boolean If associationEnd Is Nothing Then Throw New ArgumentNullException("associationEnd") End If Return associationEnd.DeleteBehavior = OperationAction.Cascade OrElse IsPrincipalEndOfIdentifyingRelationship(associationEnd) End Function ''' ''' True if the specified association end is the principal end in an identifying relationship. ''' In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. ''' Public Function IsPrincipalEndOfIdentifyingRelationship(ByVal associationEnd As AssociationEndMember) As Boolean If associationEnd Is Nothing Then Throw New ArgumentNullException("associationEnd") End If Dim refConstraint As ReferentialConstraint = DirectCast(associationEnd.DeclaringType, AssociationType).ReferentialConstraints.Where(Function(rc) rc.FromRole Is associationEnd).SingleOrDefault() If refConstraint IsNot Nothing Then Dim entity As EntityType = refConstraint.ToRole.GetEntityType() Return Not refConstraint.ToProperties.Where(Function(tp) Not entity.KeyMembers.Contains(tp)).Any() End If Return False End Function ''' ''' True if the specified association type is an identifying relationship. ''' In order to be an identifying relationship, the association must have a referential constraint where all of the dependent properties are part of the dependent type's primary key. ''' Public Function IsIdentifyingRelationship(ByVal association As AssociationType) As Boolean If association Is Nothing Then Throw New ArgumentNullException("association") End If Return IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers(0)) OrElse IsPrincipalEndOfIdentifyingRelationship(association.AssociationEndMembers(1)) End Function ''' ''' requires: firstType is not null ''' effects: if secondType is among the base types of the firstType, return true, ''' otherwise returns false. ''' when firstType is same as the secondType, return false. ''' Public Function IsSubtypeOf(ByVal firstType As EdmType, ByVal secondType As EdmType) As Boolean If secondType Is Nothing Then Return False End If ' walk up firstType hierarchy list Dim t As EdmType = firstType.BaseType While t IsNot Nothing If t.Equals(secondType) Then Return True End If t = t.BaseType End While Return False End Function ''' ''' Returns the subtype of the EntityType in the current itemCollection ''' Public Function GetSubtypesOf(ByVal type As EntityType, ByVal itemCollection As ItemCollection, ByVal includeAbstractTypes As Boolean) As IEnumerable(Of EntityType) Dim subTypes As List(Of EntityType) = New List(Of EntityType) If type IsNot Nothing Then Dim typesInCollection As IEnumerable(Of EntityType) = itemCollection.GetItems(Of EntityType)() For Each typeInCollection As EntityType In typesInCollection If type.Equals(typeInCollection) = False AndAlso Me.IsSubtypeOf(typeInCollection, type) Then If includeAbstractTypes OrElse Not typeInCollection.Abstract Then subTypes.Add(typeInCollection) End If End If Next End If Return subTypes End Function Public Shared Function TryGetStringMetadataPropertySetting(ByVal item As MetadataItem, ByVal propertyName As String, ByRef value As String) As Boolean Dim [property] As MetadataProperty = item.MetadataProperties.FirstOrDefault(Function(p) p.Name = propertyName) If [property] IsNot Nothing Then value = DirectCast([property].Value, String) End If Return value IsNot Nothing End Function End Class ''' ''' Responsible for loading an EdmItemCollection from a .edmx file or .csdl files ''' Public Class MetadataLoader Private ReadOnly _textTransformation As DynamicTextTransformation ''' ''' Initializes an MetadataLoader Instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) End Sub ''' ''' Load the metadata for Edm, Store, and Mapping collections and register them ''' with a new MetadataWorkspace, returns false if any of the parts can't be ''' created, some of the ItemCollections may be registered and usable even if false is ''' returned ''' Public Function TryLoadAllMetadata(ByVal inputFile As String, ByRef metadataWorkspace As MetadataWorkspace) As Boolean metadataWorkspace = New MetadataWorkspace() Dim edmItemCollection As EdmItemCollection = CreateEdmItemCollection(inputFile) metadataWorkspace.RegisterItemCollection(edmItemCollection) Dim storeItemCollection As StoreItemCollection = Nothing If TryCreateStoreItemCollection(inputFile, storeItemCollection) Then Dim storageMappingItemCollection As StorageMappingItemCollection = Nothing If TryCreateStorageMappingItemCollection(inputFile, edmItemCollection, storeItemCollection, storageMappingItemCollection) Then metadataWorkspace.RegisterItemCollection(storeItemCollection) metadataWorkspace.RegisterItemCollection(storageMappingItemCollection) Return True End If End If Return False End Function ''' ''' Create an EdmItemCollection loaded with the metadata provided ''' Public Function CreateEdmItemCollection(ByVal sourcePath As String, ByVal ParamArray referenceSchemas As String()) As EdmItemCollection Dim edmItemCollection As EdmItemCollection = Nothing If TryCreateEdmItemCollection(sourcePath, referenceSchemas, edmItemCollection) Then Return edmItemCollection End If Return New EdmItemCollection() End Function ''' ''' Attempts to create a EdmItemCollection from the specified metadata file ''' Public Function TryCreateEdmItemCollection(ByVal sourcePath As String, ByRef edmItemCollection As EdmItemCollection) As Boolean Return TryCreateEdmItemCollection(sourcePath, Nothing, edmItemCollection) End Function ''' ''' Attempts to create a EdmItemCollection from the specified metadata file ''' Public Function TryCreateEdmItemCollection(ByVal sourcePath As String, ByVal referenceSchemas As String(), ByRef edmItemCollection As EdmItemCollection) As Boolean edmItemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If If referenceSchemas Is Nothing Then referenceSchemas = New String(-1) {} End If Dim itemCollection As ItemCollection = Nothing sourcePath = _textTransformation.Host.ResolvePath(sourcePath) Dim collectionBuilder As New EdmItemCollectionBuilder(_textTransformation, referenceSchemas.Select(Function(s) _textTransformation.Host.ResolvePath(s)).Where(Function(s) s <> sourcePath)) If collectionBuilder.TryCreateItemCollection(sourcePath, itemCollection) Then edmItemCollection = DirectCast(itemCollection, EdmItemCollection) End If Return edmItemCollection IsNot Nothing End Function ''' ''' Attempts to create a StoreItemCollection from the specified metadata file ''' Public Function TryCreateStoreItemCollection(ByVal sourcePath As String, ByRef storeItemCollection As StoreItemCollection) As Boolean storeItemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If Dim itemCollection As ItemCollection = Nothing Dim collectionBuilder As New StoreItemCollectionBuilder(_textTransformation) If collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), itemCollection) Then storeItemCollection = DirectCast(itemCollection, StoreItemCollection) End If Return storeItemCollection IsNot Nothing End Function ''' ''' Attempts to create a StorageMappingItemCollection from the specified metadata file, EdmItemCollection, and StoreItemCollection ''' Public Function TryCreateStorageMappingItemCollection(ByVal sourcePath As String, ByVal edmItemCollection As EdmItemCollection, ByVal storeItemCollection As StoreItemCollection, ByRef storageMappingItemCollection As StorageMappingItemCollection) As Boolean storageMappingItemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If If edmItemCollection Is Nothing Then Throw New ArgumentNullException("edmItemCollection") End If If storeItemCollection Is Nothing Then Throw New ArgumentNullException("storeItemCollection") End If Dim itemCollection As ItemCollection = Nothing Dim collectionBuilder As New StorageMappingItemCollectionBuilder(_textTransformation, edmItemCollection, storeItemCollection) If collectionBuilder.TryCreateItemCollection(_textTransformation.Host.ResolvePath(sourcePath), itemCollection) Then storageMappingItemCollection = DirectCast(itemCollection, StorageMappingItemCollection) End If Return storageMappingItemCollection IsNot Nothing End Function ''' ''' Gets the Model Namespace from the provided schema file. ''' Public Function GetModelNamespace(ByVal sourcePath As String) As String If Not ValidateInputPath(sourcePath, _textTransformation) Then Return String.Empty End If Dim builder As New EdmItemCollectionBuilder(_textTransformation) Dim model As XElement = Nothing If builder.TryLoadRootElement(_textTransformation.Host.ResolvePath(sourcePath), model) Then Dim attribute As XAttribute = model.Attribute("Namespace") If attribute IsNot Nothing Then Return attribute.Value End If End If Return String.Empty End Function ''' ''' Returns true if the specified file path is valid ''' Private Shared Function ValidateInputPath(sourcePath As String, textTransformation As DynamicTextTransformation) As Boolean If String.IsNullOrEmpty(sourcePath) Then Throw New ArgumentException("sourcePath") End If If sourcePath = "$edmxInputFile$" Then textTransformation.Errors.Add(New CompilerError(If(textTransformation.Host.TemplateFile, CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate")), -1, -1, String.Empty, _ CodeGenerationTools.GetResourceString("Template_ReplaceVsItemTemplateToken"))) Return False End If Return True End Function ''' ''' base class for ItemCollectionBuilder classes that ''' load the specific types of metadata ''' Private MustInherit Class ItemCollectionBuilder Private ReadOnly _textTransformation As DynamicTextTransformation Private ReadOnly _fileExtension As String Private ReadOnly _edmxSectionName As String Private ReadOnly _rootElementName As String ''' ''' FileExtension for individual (non-edmx) metadata file for this ''' specific ItemCollection type ''' Public ReadOnly Property FileExtension() As String Get Return _fileExtension End Get End Property ''' ''' The name of the XmlElement in the .edmx element ''' to find this ItemCollection's metadata ''' Public ReadOnly Property EdmxSectionName() As String Get Return _edmxSectionName End Get End Property ''' ''' The name of the root element of this ItemCollection's metadata ''' Public ReadOnly Property RootElementName() As String Get Return _rootElementName End Get End Property ''' ''' Method to build the appropriate ItemCollection ''' Protected MustOverride Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection ''' ''' Ctor to setup the ItemCollectionBuilder members ''' Protected Sub New(ByVal textTransformation As DynamicTextTransformation, ByVal fileExtension As String, ByVal edmxSectionName As String, ByVal rootElementName As String) _textTransformation = textTransformation _fileExtension = fileExtension _edmxSectionName = edmxSectionName _rootElementName = rootElementName End Sub ''' ''' Selects a namespace from the supplied constants. ''' Protected MustOverride Function GetNamespace(ByVal constants As SchemaConstants) As String ''' ''' Try to create an ItemCollection loaded with the metadata provided ''' Public Function TryCreateItemCollection(ByVal sourcePath As String, ByRef itemCollection As ItemCollection) As Boolean itemCollection = Nothing If Not ValidateInputPath(sourcePath, _textTransformation) Then Return False End If Dim schemaElement As XElement = Nothing If TryLoadRootElement(sourcePath, schemaElement) Then Dim readers As New List(Of XmlReader)() Try readers.Add(schemaElement.CreateReader()) Dim errors As IList(Of EdmSchemaError) = Nothing Dim tempItemCollection As ItemCollection = CreateItemCollection(readers, errors) If ProcessErrors(errors, sourcePath) Then Return False End If itemCollection = tempItemCollection Return True Finally For Each reader As XmlReader In readers DirectCast(reader, IDisposable).Dispose() Next End Try End If Return False End Function ''' ''' Tries to load the root element from the metadata file provided ''' Public Function TryLoadRootElement(ByVal sourcePath As String, ByRef schemaElement As XElement) As Boolean schemaElement = Nothing Dim extension As String = Path.GetExtension(sourcePath) If extension.Equals(".edmx", StringComparison.InvariantCultureIgnoreCase) Then Return TryLoadRootElementFromEdmx(sourcePath, schemaElement) ElseIf extension.Equals(FileExtension, StringComparison.InvariantCultureIgnoreCase) Then ' load from single metadata file (.csdl, .ssdl, or .msl) schemaElement = XElement.Load(sourcePath, LoadOptions.SetBaseUri Or LoadOptions.SetLineInfo) Return True End If Return False End Function ''' ''' Tries to load the root element from the provided edmxDocument ''' Private Function TryLoadRootElementFromEdmx(ByVal edmxDocument As XElement, ByVal schemaConstants As SchemaConstants, ByVal sectionName As String, ByVal rootElementName As String, ByRef rootElement As XElement) As Boolean rootElement = Nothing Dim edmxNs As XNamespace = schemaConstants.EdmxNamespace Dim sectionNs As XNamespace = GetNamespace(schemaConstants) Dim runtime As XElement = edmxDocument.Element(edmxNs + "Runtime") If runtime Is Nothing Then Return False End If Dim section As XElement = runtime.Element(edmxNs + sectionName) If section Is Nothing Then Return False End If Dim templateVersion As String = Nothing If Not TemplateMetadata.TryGetValue(MetadataConstants.TT_TEMPLATE_VERSION, templateVersion) Then templateVersion = MetadataConstants.DEFAULT_TEMPLATE_VERSION End If If schemaConstants.MinimumTemplateVersion > New Version(templateVersion) Then _textTransformation.Errors.Add(New CompilerError(If(_textTransformation.Host.TemplateFile, CodeGenerationTools.GetResourceString("Template_CurrentlyRunningTemplate")), -1, -1, String.Empty, _ CodeGenerationTools.GetResourceString("Template_UnsupportedSchema")) With { _ .IsWarning = True _ }) End If rootElement = section.Element(sectionNs + rootElementName) Return rootElement IsNot Nothing End Function ''' ''' Tries to load the root element from the provided .edmx metadata file ''' Private Function TryLoadRootElementFromEdmx(ByVal edmxPath As String, ByRef rootElement As XElement) As Boolean rootElement = Nothing Dim element As XElement = XElement.Load(edmxPath, LoadOptions.SetBaseUri Or LoadOptions.SetLineInfo) Return TryLoadRootElementFromEdmx(element, MetadataConstants.V3_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, rootElement) OrElse TryLoadRootElementFromEdmx(element, MetadataConstants.V2_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, rootElement) OrElse TryLoadRootElementFromEdmx(element, MetadataConstants.V1_SCHEMA_CONSTANTS, EdmxSectionName, RootElementName, rootElement) End Function ''' ''' Takes an Enumerable of EdmSchemaErrors, and adds them ''' to the errors collection of the template class ''' Private Function ProcessErrors(ByVal errors As IEnumerable(Of EdmSchemaError), ByVal sourceFilePath As String) As Boolean Dim foundErrors As Boolean = False For Each schemaError As EdmSchemaError In errors Dim newError As New CompilerError(schemaError.SchemaLocation, schemaError.Line, schemaError.Column, schemaError.ErrorCode.ToString(CultureInfo.InvariantCulture), schemaError.Message) newError.IsWarning = schemaError.Severity = EdmSchemaErrorSeverity.Warning foundErrors = foundErrors Or schemaError.Severity = EdmSchemaErrorSeverity.Error If schemaError.SchemaLocation Is Nothing Then newError.FileName = sourceFilePath End If _textTransformation.Errors.Add(newError) Next Return foundErrors End Function End Class ''' ''' Builder class for creating a StorageMappingItemCollection ''' Private Class StorageMappingItemCollectionBuilder Inherits ItemCollectionBuilder Private ReadOnly _edmItemCollection As EdmItemCollection Private ReadOnly _storeItemCollection As StoreItemCollection Public Sub New(ByVal textTransformation As DynamicTextTransformation, ByVal edmItemCollection As EdmItemCollection, ByVal storeItemCollection As StoreItemCollection) MyBase.New(textTransformation, MetadataConstants.MSL_EXTENSION, MetadataConstants.MSL_EDMX_SECTION_NAME, MetadataConstants.MSL_ROOT_ELEMENT_NAME) _edmItemCollection = edmItemCollection _storeItemCollection = storeItemCollection End Sub Protected Overloads Overrides Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection Return MetadataItemCollectionFactory.CreateStorageMappingItemCollection(_edmItemCollection, _storeItemCollection, readers, errors) End Function ''' ''' Selects a namespace from the supplied constants. ''' Protected Overrides Function GetNamespace(ByVal constants As SchemaConstants) As String Return constants.MslNamespace End Function End Class ''' ''' Builder class for creating a StoreItemCollection ''' Private Class StoreItemCollectionBuilder Inherits ItemCollectionBuilder Public Sub New(ByVal textTransformation As DynamicTextTransformation) MyBase.New(textTransformation, MetadataConstants.SSDL_EXTENSION, MetadataConstants.SSDL_EDMX_SECTION_NAME, MetadataConstants.SSDL_ROOT_ELEMENT_NAME) End Sub Protected Overloads Overrides Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection Return MetadataItemCollectionFactory.CreateStoreItemCollection(readers, errors) End Function ''' ''' Selects a namespace from the supplied constants. ''' Protected Overrides Function GetNamespace(ByVal constants As SchemaConstants) As String Return constants.SsdlNamespace End Function End Class ''' ''' Builder class for creating a EdmItemCollection ''' Private Class EdmItemCollectionBuilder Inherits ItemCollectionBuilder Private _referenceSchemas As New List(Of String)() Public Sub New(ByVal textTransformation As DynamicTextTransformation) MyBase.New(textTransformation, MetadataConstants.CSDL_EXTENSION, MetadataConstants.CSDL_EDMX_SECTION_NAME, MetadataConstants.CSDL_ROOT_ELEMENT_NAME) End Sub Public Sub New(ByVal textTransformation As DynamicTextTransformation, ByVal referenceSchemas As IEnumerable(Of String)) Me.New(textTransformation) _referenceSchemas.AddRange(referenceSchemas) End Sub Protected Overloads Overrides Function CreateItemCollection(ByVal readers As IEnumerable(Of XmlReader), ByRef errors As IList(Of EdmSchemaError)) As ItemCollection Dim ownedReaders As New List(Of XmlReader)() Dim allReaders As New List(Of XmlReader)() Try allReaders.AddRange(readers) For Each path As String In _referenceSchemas.Distinct() Dim reference As XElement = Nothing If TryLoadRootElement(path, reference) Then Dim reader As XmlReader = reference.CreateReader() allReaders.Add(reader) ownedReaders.Add(reader) End If Next Return MetadataItemCollectionFactory.CreateEdmItemCollection(allReaders, errors) Finally For Each reader As XmlReader In ownedReaders DirectCast(reader, IDisposable).Dispose() Next End Try End Function ''' ''' Selects a namespace from the supplied constants. ''' Protected Overrides Function GetNamespace(ByVal constants As SchemaConstants) As String Return constants.CsdlNamespace End Function End Class End Class ''' ''' Responsible for encapsulating the retrieval and translation of the CodeGeneration ''' annotations in the EntityFramework Metadata to a form that is useful in code generation. ''' Public Class Accessibility Private Sub New() End Sub Private Const GETTER_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:GetterAccess" Private Const SETTER_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:SetterAccess" Private Const TYPE_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:TypeAccess" Private Const METHOD_ACCESS As String = "http://schemas.microsoft.com/ado/2006/04/codegeneration:MethodAccess" Private Const ACCESS_PROTECTED As String = "Protected" Private Const ACCESS_INTERNAL As String = "Internal" Private Const ACCESS_PRIVATE As String = "Private" Private Shared ReadOnly AccessibilityRankIdLookup As New Dictionary(Of String, Integer)() From _ { _ { "Private", 1}, _ { "Friend", 2}, _ { "Protected", 3}, _ { "Public", 4} _ } ''' ''' Gets the accessibility that should be applied to a type being generated from the provided GlobalItem. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForType(ByVal item As GlobalItem) As String If item Is Nothing Then Return Nothing End If Return GetAccessibility(item, TYPE_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the property level for a property being ''' generated from the provided EdmMember. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForProperty(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Dim getterAccess As String = Nothing Dim setterAccess As String = Nothing Dim propertyAccess As String = Nothing CalculatePropertyAccessibility(member, propertyAccess, getterAccess, setterAccess) Return propertyAccess End Function ''' ''' Gets the accessibility that should be applied at the property level for a Read-Only property being ''' generated from the provided EdmMember. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForReadOnlyProperty(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return GetAccessibility(member, GETTER_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the property level for a property being ''' generated from the provided EntitySet. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForReadOnlyProperty(ByVal edmSet As EntitySet) As String If edmSet Is Nothing Then Return Nothing End If Return GetAccessibility(edmSet, GETTER_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the property level for a Write-Only property being ''' generated from the provided EdmMember. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForWriteOnlyProperty(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Return GetAccessibility(member, SETTER_ACCESS) End Function ''' ''' Gets the accessibility that should be applied at the get level for a property being ''' generated from the provided EdmMember. ''' ''' defaults to empty if no annotation is found or the accessibility is the same as the property level. ''' Public Shared Function ForGetter(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Dim getterAccess As String = Nothing Dim setterAccess As String = Nothing Dim propertyAccess As String = Nothing CalculatePropertyAccessibility(member, propertyAccess, getterAccess, setterAccess) Return getterAccess End Function ''' ''' Gets the accessibility that should be applied at the set level for a property being ''' generated from the provided EdmMember. ''' ''' defaults to empty if no annotation is found or the accessibility is the same as the property level. ''' Public Shared Function ForSetter(ByVal member As EdmMember) As String If member Is Nothing Then Return Nothing End If Dim getterAccess As String = Nothing Dim setterAccess As String = Nothing Dim propertyAccess As String = Nothing CalculatePropertyAccessibility(member, propertyAccess, getterAccess, setterAccess) Return setterAccess End Function ''' ''' Gets the accessibility that should be applied to a method being generated from the provided EdmFunction. ''' ''' defaults to public if no annotation is found. ''' Public Shared Function ForMethod(ByVal edmFunction As EdmFunction) As String If edmFunction Is Nothing Then Return Nothing End If Return GetAccessibility(edmFunction, METHOD_ACCESS) End Function Private Shared Sub CalculatePropertyAccessibility(ByVal item As MetadataItem, ByRef propertyAccessibility As String, ByRef getterAccessibility As String, ByRef setterAccessibility As String) getterAccessibility = GetAccessibility(item, GETTER_ACCESS) Dim getterRank As Integer = AccessibilityRankIdLookup(getterAccessibility) setterAccessibility = GetAccessibility(item, SETTER_ACCESS) Dim setterRank As Integer = AccessibilityRankIdLookup(setterAccessibility) Dim propertyRank As Integer = Math.Max(getterRank, setterRank) If setterRank = propertyRank Then setterAccessibility = String.Empty End If If getterRank = propertyRank Then getterAccessibility = String.Empty End If propertyAccessibility = AccessibilityRankIdLookup.Where(Function(v) v.Value = propertyRank).Select(Function(v) v.Key).Single() End Sub Private Shared Function GetAccessibility(ByVal item As MetadataItem, ByVal name As String) As String Dim accessibility As String = Nothing If MetadataTools.TryGetStringMetadataPropertySetting(item, name, accessibility) Then Return TranslateUserAccessibilityToCSharpAccessibility(accessibility) End If Return "Public" End Function Private Shared Function TranslateUserAccessibilityToCSharpAccessibility(ByVal userAccessibility As String) As String If userAccessibility = ACCESS_PROTECTED Then Return "Protected" ElseIf userAccessibility = ACCESS_INTERNAL Then Return "Friend" ElseIf userAccessibility = ACCESS_PRIVATE Then Return "Private" Else ' default to public Return "Public" End If End Function End Class ''' ''' Responsible for creating source code regions in code when the loop inside ''' actually produces something. ''' Public Class CodeRegion Private Const STANDARD_INDENT_LENGTH As Integer = 4 Private ReadOnly _textTransformation As DynamicTextTransformation Private _beforeRegionLength As Integer Private _emptyRegionLength As Integer Private _regionIndentLevel As Integer = -1 ''' ''' Initializes an CodeRegion instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Public Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) End Sub ''' ''' Initializes an CodeRegion instance with the ''' TextTransformation (T4 generated class) that is currently running, ''' and the indent level to start the first region at. ''' Public Sub New(ByVal textTransformation As Object, ByVal firstIndentLevel As Integer) Me.New(textTransformation) If firstIndentLevel < 0 Then Throw New ArgumentException("firstIndentLevel") End If _regionIndentLevel = firstIndentLevel - 1 End Sub ''' ''' Starts the begining of a region ''' Public Sub Begin(ByVal regionName As String) If regionName Is Nothing Then Throw New ArgumentNullException("regionName") End If Begin(regionName, 1) End Sub ''' ''' Start the begining of a region, indented ''' the numbers of levels specified ''' Public Sub Begin(ByVal regionName As String, ByVal levelsToIncreaseIndent As Integer) If regionName Is Nothing Then Throw New ArgumentNullException("regionName") End If _beforeRegionLength = _textTransformation.GenerationEnvironment.Length _regionIndentLevel += levelsToIncreaseIndent _textTransformation.Write(GetIndent(_regionIndentLevel)) _textTransformation.WriteLine("#Region """ + regionName + """") _emptyRegionLength = _textTransformation.GenerationEnvironment.Length End Sub ''' ''' Ends a region, or totaly removes it if nothing ''' was generted since the begining of the region. ''' Public Sub [End]() [End](1) End Sub ''' ''' Ends a region, or totaly removes it if nothing ''' was generted since the begining of the region, also outdents ''' the number of levels specified. ''' Public Sub [End](ByVal levelsToDecrease As Integer) Dim indentLevel As Integer = _regionIndentLevel _regionIndentLevel -= levelsToDecrease If _emptyRegionLength = _textTransformation.GenerationEnvironment.Length Then _textTransformation.GenerationEnvironment.Length = _beforeRegionLength Else _textTransformation.WriteLine(String.Empty) _textTransformation.Write(GetIndent(indentLevel)) _textTransformation.WriteLine("#End Region") _textTransformation.WriteLine(String.Empty) End If End Sub ''' ''' Gets the current indent level that the next end region statement will be written ''' at ''' Public ReadOnly Property CurrentIndentLevel() As Integer Get Return _regionIndentLevel End Get End Property ''' ''' Get a string of spaces equivelent to the number of indents ''' desired. ''' Public Shared Function GetIndent(ByVal indentLevel As Integer) As String If indentLevel < 0 Then Throw New ArgumentException("indentLevel") End If Return String.Empty.PadLeft(indentLevel * STANDARD_INDENT_LENGTH) End Function End Class ''' ''' Responsible for collecting together the actual method parameters ''' and the parameters that need to be sent to the Execute method. ''' Public Class FunctionImportParameter Private _Source As FunctionParameter Public Property Source() As FunctionParameter Get Return _Source End Get Set(ByVal value As FunctionParameter) _Source = value End Set End Property Private _RawFunctionParameterName As String Public Property RawFunctionParameterName() As String Get Return _RawFunctionParameterName End Get Set(ByVal value As String) _RawFunctionParameterName = value End Set End Property Private _FunctionParameterName As String Public Property FunctionParameterName() As String Get Return _FunctionParameterName End Get Set(ByVal value As String) _FunctionParameterName = value End Set End Property Private _FunctionParameterType As String Public Property FunctionParameterType() As String Get Return _FunctionParameterType End Get Set(ByVal value As String) _FunctionParameterType = value End Set End Property Private _LocalVariableName As String Public Property LocalVariableName() As String Get Return _LocalVariableName End Get Set(ByVal value As String) _LocalVariableName = value End Set End Property Private _RawClrTypeName As String Public Property RawClrTypeName() As String Get Return _RawClrTypeName End Get Set(ByVal value As String) _RawClrTypeName = value End Set End Property Private _ExecuteParameterName As String Public Property ExecuteParameterName() As String Get Return _ExecuteParameterName End Get Set(ByVal value As String) _ExecuteParameterName = value End Set End Property Private _EsqlParameterName As String Public Property EsqlParameterName() As String Get Return _EsqlParameterName End Get Set(ByVal value As String) _EsqlParameterName = value End Set End Property Private _NeedsLocalVariable As Boolean Public Property NeedsLocalVariable() As Boolean Get Return _NeedsLocalVariable End Get Set(ByVal value As Boolean) _NeedsLocalVariable = value End Set End Property Private _IsNullableOfT As Boolean Public Property IsNullableOfT() As Boolean Get Return _IsNullableOfT End Get Set(ByVal value As Boolean) _IsNullableOfT = value End Set End Property ''' ''' Creates a set of FunctionImportParameter objects from the parameters passed in. ''' Public Shared Function Create(ByVal parameters As IEnumerable(Of FunctionParameter), ByVal code As CodeGenerationTools, ByVal ef As MetadataTools) As IEnumerable(Of FunctionImportParameter) If parameters Is Nothing Then Throw New ArgumentNullException("parameters") End If If code Is Nothing Then Throw New ArgumentNullException("code") End If If ef Is Nothing Then Throw New ArgumentNullException("ef") End If Dim unique As New UniqueIdentifierService() Dim importParameters As New List(Of FunctionImportParameter)() For Each parameter As FunctionParameter In parameters Dim importParameter As New FunctionImportParameter() importParameter.Source = parameter importParameter.RawFunctionParameterName = unique.AdjustIdentifier(code.CamelCase(parameter.Name)) importParameter.FunctionParameterName = code.Escape(importParameter.RawFunctionParameterName) If parameter.Mode = ParameterMode.In Then Dim typeUsage As TypeUsage = parameter.TypeUsage importParameter.NeedsLocalVariable = True importParameter.FunctionParameterType = code.GetTypeName(typeUsage) importParameter.EsqlParameterName = parameter.Name Dim clrType As Type = ef.UnderlyingClrType(parameter.TypeUsage.EdmType) importParameter.RawClrTypeName = If(TypeOf typeUsage.EdmType Is EnumType, code.GetTypeName(typeUsage.EdmType), code.Escape(clrType)) importParameter.IsNullableOfT = clrType.IsValueType Else importParameter.NeedsLocalVariable = False importParameter.FunctionParameterType = "ObjectParameter" importParameter.ExecuteParameterName = importParameter.FunctionParameterName End If importParameters.Add(importParameter) Next ' we save the local parameter uniquification for a second pass to make the visible parameters ' as pretty and sensible as possible For i As Integer = 0 To importParameters.Count - 1 Dim importParameter As FunctionImportParameter = importParameters(i) If importParameter.NeedsLocalVariable Then importParameter.LocalVariableName = unique.AdjustIdentifier(importParameter.RawFunctionParameterName & "Parameter") importParameter.ExecuteParameterName = importParameter.LocalVariableName End If Next Return importParameters End Function ' ' Class to create unique variables within the same scope ' Private NotInheritable Class UniqueIdentifierService Private ReadOnly _knownIdentifiers As HashSet(Of String) Public Sub New() _knownIdentifiers = New HashSet(Of String)(StringComparer.OrdinalIgnoreCase) End Sub ''' ''' Given an identifier, makes it unique within the scope by adding ''' a suffix (1, 2, 3, ...), and returns the adjusted identifier. ''' Public Function AdjustIdentifier(ByVal identifier As String) As String ' find a unique name by adding suffix as necessary Dim numberOfConflicts As Integer = 0 Dim adjustedIdentifier As String = identifier While Not _knownIdentifiers.Add(adjustedIdentifier) numberOfConflicts += 1 adjustedIdentifier = identifier + numberOfConflicts.ToString(CultureInfo.InvariantCulture) End While Return adjustedIdentifier End Function End Class End Class ''' ''' Responsible for marking the various sections of the generation, ''' so they can be split up into separate files ''' Public Class EntityFrameworkTemplateFileManager ''' ''' Creates the VsEntityFrameworkTemplateFileManager if VS is detected, otherwise ''' creates the file system version. ''' Public Shared Function Create(ByVal textTransformation As Object) As EntityFrameworkTemplateFileManager Dim transformation As DynamicTextTransformation = DynamicTextTransformation.Create(textTransformation) Dim host As IDynamicHost = transformation.Host #If Not PREPROCESSED_TEMPLATE Then Dim hostServiceProvider = host.AsIServiceProvider() If hostServiceProvider IsNot Nothing Then Dim dte = DirectCast(hostServiceProvider.GetService(GetType(EnvDTE.DTE)), EnvDTE.DTE) If dte IsNot Nothing Then Return New VsEntityFrameworkTemplateFileManager(transformation) End If End If #End If Return New EntityFrameworkTemplateFileManager(transformation) End Function Private NotInheritable Class Block Public Name As String Public Start As Integer, Length As Integer End Class Private ReadOnly files As New List(Of Block)() Private ReadOnly footer As New Block() Private ReadOnly header As New Block() Private ReadOnly _textTransformation As DynamicTextTransformation ' reference to the GenerationEnvironment StringBuilder on the ' TextTransformation object Private ReadOnly _generationEnvironment As StringBuilder Private m_currentBlock As Block ''' ''' Initializes an EntityFrameworkTemplateFileManager Instance with the ''' TextTransformation (T4 generated class) that is currently running ''' Private Sub New(ByVal textTransformation As Object) If textTransformation Is Nothing Then Throw New ArgumentNullException("textTransformation") End If _textTransformation = DynamicTextTransformation.Create(textTransformation) _generationEnvironment = _textTransformation.GenerationEnvironment End Sub ''' ''' Marks the end of the last file if there was one, and starts a new ''' and marks this point in generation as a new file. ''' Public Sub StartNewFile(ByVal name As String) If name Is Nothing Then Throw New ArgumentNullException("name") End If CurrentBlock = New Block() With { .Name = name } End Sub Public Sub StartFooter() CurrentBlock = footer End Sub Public Sub StartHeader() CurrentBlock = header End Sub Public Sub EndBlock() If CurrentBlock Is Nothing Then Exit Sub End If CurrentBlock.Length = _generationEnvironment.Length - CurrentBlock.Start If CurrentBlock IsNot header AndAlso CurrentBlock IsNot footer Then files.Add(CurrentBlock) End If m_currentBlock = Nothing End Sub ''' ''' Produce the template output files. ''' Public Overridable Function Process(Optional split As Boolean = True) As IEnumerable(Of String) Dim generatedFileNames As List(Of String) = New List(Of String)() If split Then EndBlock() Dim headerText As String = _generationEnvironment.ToString(header.Start, header.Length) Dim footerText As String = _generationEnvironment.ToString(footer.Start, footer.Length) Dim outputPath As String = Path.GetDirectoryName(_textTransformation.Host.TemplateFile) files.Reverse() For Each block As Block In files Dim fileName As String = Path.Combine(outputPath, block.Name) Dim content = headerText + _generationEnvironment.ToString(block.Start, block.Length) + footerText generatedFileNames.Add(fileName) CreateFile(fileName, content) _generationEnvironment.Remove(block.Start, block.Length) Next End If Return generatedFileNames End Function Protected Overridable Sub CreateFile(ByVal fileName As String, ByVal content As String) If IsFileContentDifferent(fileName, content) Then File.WriteAllText(fileName, content) End If End Sub Protected Function IsFileContentDifferent(ByVal fileName As String, ByVal newContent As String) As Boolean Return Not (File.Exists(fileName) AndAlso File.ReadAllText(fileName) = newContent) End Function Private Property CurrentBlock() As Block Get Return m_currentBlock End Get Set(ByVal value As Block) If CurrentBlock IsNot Nothing Then EndBlock() End If If value IsNot Nothing Then value.Start = _generationEnvironment.Length End If m_currentBlock = value End Set End Property #If Not PREPROCESSED_TEMPLATE Then Private NotInheritable Class VsEntityFrameworkTemplateFileManager Inherits EntityFrameworkTemplateFileManager Private templateProjectItem As EnvDTE.ProjectItem Private dte As EnvDTE.DTE Private checkOutAction As Action(Of String) Private projectSyncAction As Action(Of IEnumerable(Of String)) ''' ''' Creates an instance of the VsEntityFrameworkTemplateFileManager class with the IDynamicHost instance ''' Public Sub New(ByVal textTemplating As Object) MyBase.New(textTemplating) Dim hostServiceProvider = _textTransformation.Host.AsIServiceProvider() If hostServiceProvider Is Nothing Then Throw New ArgumentNullException("Could not obtain hostServiceProvider") End If dte = DirectCast(hostServiceProvider.GetService(GetType(EnvDTE.DTE)), EnvDTE.DTE) If dte Is Nothing Then Throw New ArgumentNullException("Could not obtain DTE from host") End If templateProjectItem = dte.Solution.FindProjectItem(_textTransformation.Host.TemplateFile) checkOutAction = Function(fileName) dte.SourceControl.CheckOutItem(fileName) projectSyncAction = Sub(keepFileNames) ProjectSync(templateProjectItem, keepFileNames) End Sub Public Overloads Overrides Function Process(Optional split As Boolean = True) As IEnumerable(Of String) If templateProjectItem.ProjectItems Is Nothing Then Return New List(Of String) End If Dim generatedFileNames As IEnumerable(Of String) = MyBase.Process(split) projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, Nothing, Nothing)) Return generatedFileNames End Function Protected Overloads Overrides Sub CreateFile(ByVal fileName As String, ByVal content As String) If IsFileContentDifferent(fileName, content) Then CheckoutFileIfRequired(fileName) File.WriteAllText(fileName, content) End If End Sub Private Shared Sub ProjectSync(ByVal templateProjectItem As EnvDTE.ProjectItem, ByVal keepFileNames As IEnumerable(Of String)) Dim keepFileNameSet = New HashSet(Of String)(keepFileNames) Dim projectFiles = New Dictionary(Of String, EnvDTE.ProjectItem)() Dim originalOutput = Path.GetFileNameWithoutExtension(templateProjectItem.FileNames(0)) For Each projectItem As EnvDTE.ProjectItem In templateProjectItem.ProjectItems projectFiles.Add(projectItem.FileNames(0), projectItem) Next ' Remove unused items from the project For Each pair As KeyValuePair(Of String, EnvDTE.ProjectItem) In projectFiles If Not keepFileNames.Contains(pair.Key) _ AndAlso Not (Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalOutput + ".") Then pair.Value.Delete() End If Next ' Add missing files to the project For Each fileName As String In keepFileNameSet If Not projectFiles.ContainsKey(fileName) Then templateProjectItem.ProjectItems.AddFromFile(fileName) End If Next End Sub Private Sub CheckoutFileIfRequired(ByVal fileName As String) If dte.SourceControl Is Nothing OrElse Not dte.SourceControl.IsItemUnderSCC(fileName) OrElse dte.SourceControl.IsItemCheckedOut(fileName) Then Exit Sub End If ' run on worker thread to prevent T4 calling back into VS checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, Nothing, Nothing)) End Sub End Class #End If End Class ''' ''' Responsible creating an instance that can be passed ''' to helper classes that need to access the TextTransformation ''' members. It accesses member by name and signature rather than ''' by type. This is necessary when the ''' template is being used in Preprocessed mode ''' and there is no common known type that can be ''' passed instead ''' Public Class DynamicTextTransformation Private _instance As Object Private _dynamicHost As IDynamicHost Private ReadOnly _write As MethodInfo Private ReadOnly _writeLine As MethodInfo Private ReadOnly _generationEnvironment As PropertyInfo Private ReadOnly _errors As PropertyInfo Private ReadOnly _host As PropertyInfo ''' ''' Creates an instance of the DynamicTextTransformation class around the passed in ''' TextTransformation shapped instance passed in, or if the passed in instance ''' already is a DynamicTextTransformation, it casts it and sends it back. ''' Public Shared Function Create(ByVal instance As Object) As DynamicTextTransformation If instance Is Nothing Then Throw New ArgumentNullException("instance") End If Dim textTransformation As DynamicTextTransformation = TryCast(instance, DynamicTextTransformation) If textTransformation IsNot Nothing Then Return textTransformation End If Return New DynamicTextTransformation(instance) End Function Private Sub New(ByVal instance As Object) _instance = instance Dim type As Type = _instance.GetType() _write = type.GetMethod("Write", New Type() {GetType(String)}) _writeLine = type.GetMethod("WriteLine", New Type() {GetType(String)}) _generationEnvironment = type.GetProperty("GenerationEnvironment", BindingFlags.Instance Or BindingFlags.NonPublic) _host = type.GetProperty("Host") _errors = type.GetProperty("Errors") End Sub ''' ''' Gets the value of the wrapped TextTranformation instance's GenerationEnvironment property ''' Public ReadOnly Property GenerationEnvironment() As StringBuilder Get Return DirectCast(_generationEnvironment.GetValue(_instance, Nothing), StringBuilder) End Get End Property ''' ''' Gets the value of the wrapped TextTranformation instance's Errors property ''' Public ReadOnly Property Errors() As System.CodeDom.Compiler.CompilerErrorCollection Get Return DirectCast(_errors.GetValue(_instance, Nothing), System.CodeDom.Compiler.CompilerErrorCollection) End Get End Property ''' ''' Calls the wrapped TextTranformation instance's Write method. ''' Public Sub Write(ByVal text As String) _write.Invoke(_instance, New Object() {text}) End Sub ''' ''' Calls the wrapped TextTranformation instance's WriteLine method. ''' Public Sub WriteLine(ByVal text As String) _writeLine.Invoke(_instance, New Object() {text}) End Sub ''' ''' Gets the value of the wrapped TextTranformation instance's Host property ''' if available (shows up when hostspecific is set to true in the template directive) and returns ''' the appropriate implementation of IDynamicHost ''' Public ReadOnly Property Host() As IDynamicHost Get If _dynamicHost Is Nothing Then If _host Is Nothing Then _dynamicHost = New NullHost() Else _dynamicHost = New DynamicHost(_host.GetValue(_instance, Nothing)) End If End If Return _dynamicHost End Get End Property End Class ''' ''' Reponsible for abstracting the use of Host between times ''' when it is available and not ''' Public Interface IDynamicHost ''' ''' An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue ''' Function ResolveParameterValue(ByVal id As String, ByVal name As String, ByVal otherName As String) As String ''' ''' An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath ''' Function ResolvePath(ByVal path As String) As String ''' ''' An abstracted call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile ''' ReadOnly Property TemplateFile() As String ''' ''' Returns the Host instance cast as an IServiceProvider ''' Function AsIServiceProvider() As IServiceProvider End Interface ''' ''' Reponsible for implementing the IDynamicHost as a dynamic ''' shape wrapper over the Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost interface ''' rather than type dependent wrapper. We don't use the ''' interface type so that the code can be run in preprocessed mode ''' on a .net framework only installed machine. ''' Public Class DynamicHost Implements IDynamicHost Private ReadOnly _instance As Object Private ReadOnly _resolveParameterValue As MethodInfo Private ReadOnly _resolvePath As MethodInfo Private ReadOnly _templateFile As PropertyInfo ''' ''' Creates an instance of the DynamicHost class around the passed in ''' Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost shapped instance passed in. ''' Public Sub New(ByVal instance As Object) _instance = instance Dim type As Type = _instance.GetType() _resolveParameterValue = type.GetMethod("ResolveParameterValue", New Type() {GetType(String), GetType(String), GetType(String)}) _resolvePath = type.GetMethod("ResolvePath", New Type() {GetType(String)}) _templateFile = type.GetProperty("TemplateFile") End Sub ''' ''' A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue ''' Public Function ResolveParameterValue(ByVal id As String, ByVal name As String, ByVal otherName As String) As String Implements IDynamicHost.ResolveParameterValue Return DirectCast(_resolveParameterValue.Invoke(_instance, New Object() {id, name, otherName}), String) End Function ''' ''' A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath ''' Public Function ResolvePath(ByVal path As String) As String Implements IDynamicHost.ResolvePath Return DirectCast(_resolvePath.Invoke(_instance, New Object() {path}), String) End Function ''' ''' A call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile ''' Public ReadOnly Property TemplateFile() As String Implements IDynamicHost.TemplateFile Get Return DirectCast(_templateFile.GetValue(_instance, Nothing), String) End Get End Property ''' ''' Returns the Host instance cast as an IServiceProvider ''' Public Function AsIServiceProvider() As IServiceProvider Implements IDynamicHost.AsIServiceProvider Return TryCast(_instance, IServiceProvider) End Function End Class ''' ''' Reponsible for implementing the IDynamicHost when the ''' Host property is not available on the TextTemplating type. The Host ''' property only exists when the hostspecific attribute of the template ''' directive is set to true. ''' Public Class NullHost Implements IDynamicHost ''' ''' An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolveParameterValue ''' that simply retuns null. ''' Public Function ResolveParameterValue(ByVal id As String, ByVal name As String, ByVal otherName As String) As String Implements IDynamicHost.ResolveParameterValue Return Nothing End Function ''' ''' An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost ResolvePath ''' that simply retuns the path passed in. ''' Public Function ResolvePath(ByVal path As String) As String Implements IDynamicHost.ResolvePath Return path End Function ''' ''' An abstraction of the call to Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost TemplateFile ''' that returns null. ''' Public ReadOnly Property TemplateFile() As String Implements IDynamicHost.TemplateFile Get Return Nothing End Get End Property ''' ''' Returns null. ''' Public Function AsIServiceProvider() As IServiceProvider Implements IDynamicHost.AsIServiceProvider Return Nothing End Function End Class ''' ''' Responsible for encapsulating the constants defined in Metadata ''' Public NotInheritable Class MetadataConstants Private Sub New() End Sub Public Const CSDL_EXTENSION As String = ".csdl" Public Const CSDL_EDMX_SECTION_NAME As String = "ConceptualModels" Public Const CSDL_ROOT_ELEMENT_NAME As String = "Schema" Public Const EDM_ANNOTATION_09_02 As String = "http://schemas.microsoft.com/ado/2009/02/edm/annotation" Public Const SSDL_EXTENSION As String = ".ssdl" Public Const SSDL_EDMX_SECTION_NAME As String = "StorageModels" Public Const SSDL_ROOT_ELEMENT_NAME As String = "Schema" Public Const MSL_EXTENSION As String = ".msl" Public Const MSL_EDMX_SECTION_NAME As String = "Mappings" Public Const MSL_ROOT_ELEMENT_NAME As String = "Mapping" Public Const TT_TEMPLATE_NAME As String = "TemplateName" Public Const TT_TEMPLATE_VERSION As String = "TemplateVersion" Public Const TT_MINIMUM_ENTITY_FRAMEWORK_VERSION As String = "MinimumEntityFrameworkVersion" Public Const DEFAULT_TEMPLATE_VERSION As String = "4.0" Public Shared ReadOnly V1_SCHEMA_CONSTANTS As New SchemaConstants( "http://schemas.microsoft.com/ado/2007/06/edmx", "http://schemas.microsoft.com/ado/2006/04/edm", "http://schemas.microsoft.com/ado/2006/04/edm/ssdl", "urn:schemas-microsoft-com:windows:storage:mapping:CS", New Version("3.5")) Public Shared ReadOnly V2_SCHEMA_CONSTANTS As New SchemaConstants( "http://schemas.microsoft.com/ado/2008/10/edmx", "http://schemas.microsoft.com/ado/2008/09/edm", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl", "http://schemas.microsoft.com/ado/2008/09/mapping/cs", New Version("4.0")) Public Shared ReadOnly V3_SCHEMA_CONSTANTS As New SchemaConstants( "http://schemas.microsoft.com/ado/2009/11/edmx", "http://schemas.microsoft.com/ado/2009/11/edm", "http://schemas.microsoft.com/ado/2009/11/edm/ssdl", "http://schemas.microsoft.com/ado/2009/11/mapping/cs", New Version("5.0")) End Class Public Structure SchemaConstants Public Sub New(ByVal edmxNamespace As String, ByVal csdlNamespace As String, ByVal ssdlNamespace As String, ByVal mslNamespace As String, ByVal minimumTemplateVersion As Version) Me.EdmxNamespace = edmxNamespace Me.CsdlNamespace = csdlNamespace Me.SsdlNamespace = ssdlNamespace Me.MslNamespace = mslNamespace Me.MinimumTemplateVersion = minimumTemplateVersion End Sub Public Property EdmxNamespace() As String Get Return m_EdmxNamespace End Get Private Set m_EdmxNamespace = Value End Set End Property Private m_EdmxNamespace As String Public Property CsdlNamespace() As String Get Return m_CsdlNamespace End Get Private Set m_CsdlNamespace = Value End Set End Property Private m_CsdlNamespace As String Public Property SsdlNamespace() As String Get Return m_SsdlNamespace End Get Private Set m_SsdlNamespace = Value End Set End Property Private m_SsdlNamespace As String Public Property MslNamespace() As String Get Return m_MslNamespace End Get Private Set m_MslNamespace = Value End Set End Property Private m_MslNamespace As String Public Property MinimumTemplateVersion() As Version Get Return m_MinimumTemplateVersion End Get Private Set m_MinimumTemplateVersion = Value End Set End Property Private m_MinimumTemplateVersion As Version End Structure End Class #Region "Base class" ''' '''Base class for this transformation ''' _ Public Class VBCodeGenTemplateV50Base #Region "Fields" Private generationEnvironmentField As Global.System.Text.StringBuilder Private errorsField As Global.System.CodeDom.Compiler.CompilerErrorCollection Private indentLengthsField As Global.System.Collections.Generic.List(Of Integer) Private currentIndentField As String = "" Private endsWithNewline As Boolean Private sessionField As Global.System.Collections.Generic.IDictionary(Of String, Object) #End Region #Region "Properties" ''' '''The string builder that generation-time code is using to assemble generated output ''' Protected Property GenerationEnvironment() As System.Text.StringBuilder Get If (Me.generationEnvironmentField Is Nothing) Then Me.generationEnvironmentField = New Global.System.Text.StringBuilder() End If Return Me.generationEnvironmentField End Get Set Me.generationEnvironmentField = value End Set End Property ''' '''The error collection for the generation process ''' Public ReadOnly Property Errors() As System.CodeDom.Compiler.CompilerErrorCollection Get If (Me.errorsField Is Nothing) Then Me.errorsField = New Global.System.CodeDom.Compiler.CompilerErrorCollection() End If Return Me.errorsField End Get End Property ''' '''A list of the lengths of each indent that was added with PushIndent ''' Private ReadOnly Property indentLengths() As System.Collections.Generic.List(Of Integer) Get If (Me.indentLengthsField Is Nothing) Then Me.indentLengthsField = New Global.System.Collections.Generic.List(Of Integer)() End If Return Me.indentLengthsField End Get End Property ''' '''Gets the current indent we use when adding lines to the output ''' Public ReadOnly Property CurrentIndent() As String Get Return Me.currentIndentField End Get End Property ''' '''Current transformation session ''' Public Overridable Property Session() As Global.System.Collections.Generic.IDictionary(Of String, Object) Get Return Me.sessionField End Get Set Me.sessionField = value End Set End Property #End Region #Region "Transform-time helpers" ''' '''Write text directly into the generated output ''' Public Overloads Sub Write(ByVal textToAppend As String) If String.IsNullOrEmpty(textToAppend) Then Return End If 'If we're starting off, or if the previous text ended with a newline, 'we have to append the current indent first. If ((Me.GenerationEnvironment.Length = 0) _ OrElse Me.endsWithNewline) Then Me.GenerationEnvironment.Append(Me.currentIndentField) Me.endsWithNewline = false End If 'Check if the current text ends with a newline If textToAppend.EndsWith(Global.System.Environment.NewLine, Global.System.StringComparison.CurrentCulture) Then Me.endsWithNewline = true End If 'This is an optimization. If the current indent is "", then we don't have to do any 'of the more complex stuff further down. If (Me.currentIndentField.Length = 0) Then Me.GenerationEnvironment.Append(textToAppend) Return End If 'Everywhere there is a newline in the text, add an indent after it textToAppend = textToAppend.Replace(Global.System.Environment.NewLine, (Global.System.Environment.NewLine + Me.currentIndentField)) 'If the text ends with a newline, then we should strip off the indent added at the very end 'because the appropriate indent will be added when the next time Write() is called If Me.endsWithNewline Then Me.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - Me.currentIndentField.Length)) Else Me.GenerationEnvironment.Append(textToAppend) End If End Sub ''' '''Write text directly into the generated output ''' Public Overloads Sub WriteLine(ByVal textToAppend As String) Me.Write(textToAppend) Me.GenerationEnvironment.AppendLine Me.endsWithNewline = true End Sub ''' '''Write formatted text directly into the generated output ''' Public Overloads Sub Write(ByVal format As String, ByVal args() As Object) Me.Write(String.Format(Global.System.Globalization.CultureInfo.CurrentCulture, format, args)) End Sub ''' '''Write formatted text directly into the generated output ''' Public Overloads Sub WriteLine(ByVal format As String, ByVal args() As Object) Me.WriteLine(String.Format(Global.System.Globalization.CultureInfo.CurrentCulture, format, args)) End Sub ''' '''Raise an error ''' Public Sub [Error](ByVal message As String) Dim [error] As System.CodeDom.Compiler.CompilerError = New Global.System.CodeDom.Compiler.CompilerError() [error].ErrorText = message Me.Errors.Add([error]) End Sub ''' '''Raise a warning ''' Public Sub Warning(ByVal message As String) Dim [error] As System.CodeDom.Compiler.CompilerError = New Global.System.CodeDom.Compiler.CompilerError() [error].ErrorText = message [error].IsWarning = true Me.Errors.Add([error]) End Sub ''' '''Increase the indent ''' Public Sub PushIndent(ByVal indent As String) If (indent = Nothing) Then Throw New Global.System.ArgumentNullException("indent") End If Me.currentIndentField = (Me.currentIndentField + indent) Me.indentLengths.Add(indent.Length) End Sub ''' '''Remove the last indent that was added with PushIndent ''' Public Function PopIndent() As String Dim returnValue As String = "" If (Me.indentLengths.Count > 0) Then Dim indentLength As Integer = Me.indentLengths((Me.indentLengths.Count - 1)) Me.indentLengths.RemoveAt((Me.indentLengths.Count - 1)) If (indentLength > 0) Then returnValue = Me.currentIndentField.Substring((Me.currentIndentField.Length - indentLength)) Me.currentIndentField = Me.currentIndentField.Remove((Me.currentIndentField.Length - indentLength)) End If End If Return returnValue End Function ''' '''Remove any indentation ''' Public Sub ClearIndent() Me.indentLengths.Clear Me.currentIndentField = "" End Sub #End Region #Region "ToString Helpers" ''' '''Utility class to produce culture-oriented representation of an object as a string. ''' Public Class ToStringInstanceHelper Private formatProviderField As System.IFormatProvider = Global.System.Globalization.CultureInfo.InvariantCulture ''' '''Gets or sets format provider to be used by ToStringWithCulture method. ''' Public Property FormatProvider() As System.IFormatProvider Get Return Me.formatProviderField End Get Set If (Not (value) Is Nothing) Then Me.formatProviderField = value End If End Set End Property ''' '''This is called from the compile/run appdomain to convert objects within an expression block to a string ''' Public Function ToStringWithCulture(ByVal objectToConvert As Object) As String If (objectToConvert Is Nothing) Then Throw New Global.System.ArgumentNullException("objectToConvert") End If Dim t As System.Type = objectToConvert.GetType Dim method As System.Reflection.MethodInfo = t.GetMethod("ToString", New System.Type() {GetType(System.IFormatProvider)}) If (method Is Nothing) Then Return objectToConvert.ToString Else Return CType(method.Invoke(objectToConvert, New Object() {Me.formatProviderField }),String) End If End Function End Class Private toStringHelperField As ToStringInstanceHelper = New ToStringInstanceHelper() ''' '''Helper to produce culture-oriented representation of an object as a string ''' Public ReadOnly Property ToStringHelper() As ToStringInstanceHelper Get Return Me.toStringHelperField End Get End Property #End Region End Class #End Region End Namespace DHIaVH H~uFHNHNH'HFH ^WVSH HH HH :HHHHH@`PLHHHNHH [^_WVH(H kHH>u(H HHHHHE3'HH(^_D3H( GH@H(WVUSH(HHFHu 3H([]^_HHHE3HH@HP(HH^3~^HcHLHtHH;Lt3Ht8y~/3A\HH*9HQLH;?H9 vLH0H EA.H )HH:LH0H EAH kHHLZHk0H LEAHHH@PHEHPHMHYH kLL~INHUNINHAMu HHIIN#IbKHMF0HMHy(u=H HH 3HHKHUHJ(HHMHI(ytHMHI8I w3ɅuaH~u*H ?HHVHqHNHdH HL4MHVHEH]vLH.H CA;H FH HHE3H]LH.H CAHMHyt HMHY H ]HHMH I4L1HMHIL74MHHHL(H9.H CAnHMHE3vH YL3ɉL$ IHAAPLuH 'HHI8H  LLy3MIHLuLH-H YBAH nHH fHKHsLDHU-H BAzH 3HHLH)-H AAFH3sLH-H AAH˺LHMHy}H LH LH LbHP IL$IOIvINIiHUHJIXLHR,H @A_HUHRHLELHH@`PH}8HMHEHH@HPHM3E3HEHH@XP8H  HHHU:H}HMHy(u=H HH l3HHOHUHJ(H~HMHy(H~u*H HHVHRHNHEHvHMHI8Y HMHI HH@PP(HHMHHH|҉T$ HULDH9 G HHe[^_A\A^A_]UAWAVATWVSH0Hi(Hl$(HLHMAb@HH0[^_A\A^A_]UAWAVATWVSH0Hi(Hl$(HLHMA@HXH0[^_A\A^A_]UAWAVATWVSH0Hi(Hl$(HLHMA?HH0[^_A\A^A_]UAWAVATWVSH0Hi(Hl$(HLHMA~?HH0[^_A\A^A_]UAWAVATWVSH0Hi(Hl$(HLHMA2?HzH0[^_A\A^A_]UAWAVATWVSH0Hi(Hl$(HH}tHMHEHH@HH}tHMHEHH@PPH}t>LH(H =AHMCHML9 H}tHMHEHH@@P8H0[^_A\A^A_]UVH8Hl$@HeHMHUHMyPtHe^]HMHqHMHEHH@@P(LHL(HA9 He^]UVH8Hi(Hl$(Hm@HMHEHH@@P H %pHHH@@HHMHEHH@@P(HHwLHHMHEHH@@P(HD$ HHMAA=H[H8^]AWAVAUATWVUSHXHH|$0 3HHHPtHX[]^_A\A]A^A_HN8HYXH `"HtHHHS33HT$@HD$HL$PH HL$@eH\$HHHH@@P(HHG3HHH@@P(LHHH@@P(HIA9 HHH@@P(HJHHN8HH@HPLHHH@@P(L3ɉL$8L$0HL$0HL$ HO LL$8I;Lw@L H GLMPDl$8D$0D$,AD$(AD$,HtHIL$IHZAD$ AD$$IL$IEl$(\$,A\$,II9 &HHH@@P(HHHHL$@tHX[]^_A\A]A^A_AVWVUSH@HH|$(3HHH~Pt H@[]^_A^H $HعtHHKHW0 HR33HT$(HD$0L$8HHL$(%Hl$0HHEH@@P LH I9t HLIIH@@P(HHtuH 2,HIIH@@P(HHLHHM IDžDž HO(HL$ HLͺA9IIH@@P(HHcHHL$()H@[]^_A^WVUSH(HHH s]HHKHEHwLb#HHHH "HHHHMHH HMH #HLHH([]^_HWVSH HHH 4HHKHH~pu=H HH H J HHOoHNpHbH ]HHvpHOHAH HOH g"HLHH Y"HHtz~H F"HH [^_H3H [^_WVH(II&7HtP0@4H(^_H(^_AVWVUSH IIH\$p6HH HLMtsI=HHL`9 XtQIHHLF9 >H0IHHL+9 #@4H []^_A^Ht E0E4H []^_A^DHA8@ DHAHWVUSH(HH~uxH HH wHH oyHbvHP HMMHKH@HOH3HNH&HFH([]^_AVWVUSH@HHAAH CLHv@AF(AF,HHINIHfD$ D$(3HL$0I΋DE3~HIH99 H@[]^_A^HAWAVWVUSH8AIHi@H SLHHH@@P LAF(AF,HэHINIID$ D$(Ht$0I΋DE3HIH9 H8[]^_A^A_HAVWVUSH@HHAAH LHv@AF(AF,H/HINrIHD$ D$(H$H|$0I΋DE3(HIH9 H@[]^_A^HUAWAVAUATWVSHXH$3HEHEHEIHN LMLEHU0E3L~@HHH@@P LHv H LHNPHL$ ML$(ML$0H|$8IIDEoII9 !He[^_A\A]A^A_]UAWAVATWVSHPH$3HEHEHHAEHN LMLEHU02L~@Hv H O LHNPUDEHL$ T$(DD$03HL$8IHDEII9 nHe[^_A\A^A_]UAWAVATWVSHPH$3HEHEHHAEHMHL$ HN LMHU0LE81L~@Hv H HLHNPUDEHL$ T$(DD$03HL$8IHDEII9 He[^_A\A^A_]WVH8HH|$ 3HHQ@ 3ɋBE3HT$ LD$(L$0D$4H/ HL$ t!HT$(z$uH HL$ su3H8^_øH8^_WVH(HH (BHGGHOHHH(^_WVH83HD$(HD$0HHHV@HϐHLF8Hty҅tH HLHOHHI3HD$(LPHT$(9 H8^_WVSH03HD$ HD$(HHAHV@Hϐ7HLF8Hty҅tH HkLHOHHIHD$ LPHT$ 9 H0[^_DHtHT$ztIH HHL$HHWVSH03HD$ HD$(HHHHH@@P usHHH@HPHHHPu)HHHHH@HPHHO9 dH0[^_HHHHH@HPHHO9 ;H0[^_H^@HO HH@PP(HH|tH^8?HV@HϐHLF8Hty҅tHHLIHOHHI3HD$ HPHT$ 9 H0[^_DHI HH@PH@(HVH HHN HH@PP(HHHe,H ^HVH03HD$(HHI8HIHILD$(H9 t HD$(H0^HH0^WVH(HH~(u9H HH 3HHOHN(HHF(H(^_DHA0DAPDyPtøDHI8HF9 HDHI8HF9 HWVSH HH HHHOHH HOH ^HHHE3HNHH :HHOH|H UHOH lHHHE3zHNHEH @HHOH(H HOH HHHE3HNHH HHOHH HOH HHHE3HN HH [^_DHIH9 HWVH(HH pbHHHG,HH(^_WVSH HIH ,HHH?C,H7HȋHL9 HH [^_H83HD$(HI3LD$(IA@HT$(9 H8H83HD$(HIALD$(IA@HT$(9 |H8WVH(H2Jt$H XJHHHAu H 4&HDG,HHSHH(^_VH03HD$ HH H HNLD$ IAPHT$ 9 H0^VH03HD$ HH rH aHNLD$ IAPHT$ 9 wH0^VH03HD$ HH *H HNLD$ IAPHT$ 9 'H0^VH03HD$ HH H HNLD$ IAPHT$ 9 H0^LIHHMLH+HLIHHMLHs+HWVH83HD$(HD$0HIHI HH"HH~HHT$(HHrHT$(9 H8^_WVH83HD$(HD$0HHrLD$(IAPHT$()HH9 HȋHL9 HH8^_DHIH9 HWVUSH(HHH }HH HHC,HHHNH9 GHЋMHLg9 _HH([]^_H(LLMHH)H(WVH(3HD$ HH ~HHpu3H uHHOpHL$ HN9 HL$ HHGpH(^_WVH(3HD$ HH !~fHHxu3H ]HHOxHL$ HN9 /HL$ HHGxH(^_WVH(3HD$ HH }HHu6H 4HHHL$ HN9 HL$ HHH(^_WVH(3HD$ HH 1}vHHu6H zHHHL$ HN9 9HL$ HHH(^_WVHHHH|$03HHH |HHucH H HHzHNHL$(HHL$@LD$(LL$0IAQIHT$09 wHL$@HaHHH^_VH HH |NHP`HN9 6H ^VH HH {HPhHN9 H ^VH03HD$ HH H HHwHNLD$ IAPHT$ 9 H0^WVH(3HD$ HH !{fHHu6H HHHL$ HN9 )HL$ H HH(^_WVH(3HD$ HH zHHu6H $HHHL$ HN9 HL$ HHH(^_VH03HD$(H %zjHHN`HL$(H HL$(H+HNhHL$(H HL$(HH0^WVSfHIIHNHNHHu HzHHHN[^_UAWAVAUATWVSHHH$3HEHEHeHH~HO HH@PP(HHϐ7HH _HHHHNHLH9 HLI3HH0H3k;HHgHHE3VH~HuyH LH LH LbHP IL${IOInINIaHOITHOHIHL9 H~HHI8y uXH0H LHM$HM"LI3 HHHM9 D?HH HH-^qHͺTLIPH1HOkH \HOH Q[LIOHCIOH6HM3HH >#HH {HIPHHKH HKH LIOHIOHHMǺH )>LH HIPHHIOnH oIOH T^HHOHFHOI9HLǺHH =#LH !{LIPHҞIL$H IL$H HHOIHOIHLǺHͺHHXHH []^_A\A^A_VH HH )o3HHNLH ^Dw3AWAVATWVUSH@HH|$(3HHHIDN(H3ҋI3Ht$(HD$0T$8L$LI3E3HN IHN IV|GH~ u+H >dLI3E3HN I>HN IV9 LxH zR$LH m3BHIOH~ u+H 7>LI3E3`HN IHN IVDMAYII9 [HL$(HON(t$uIHHLvH@[]^_A\A^A_Ë$DHHL,H@[]^_A\A^A_HHӐH@[]^_A\A^A_WVH(HHHHHH@hP HHH@HP8HuH(^_AWAVAUATWVUSHH3HD$@HD$0HHI3E3E3E3E3Eu3L$<HD$(HȺ+HHHD$ Ht>HqHHL$ t3͋D$H JHD$ LMHMLMغHHMqH ƊHMN!.肧HHHH HHKHO HvLJLJWH=MMHMLg9 _HHMHU8H ~HFHNHU HuHMHL$ HM HL$(D$0HMHL$8HMHULELMXHDJTH HKpHȐ`H}.ZLHHHOHEHe^_]HEHe^_]UWVHPHi@Hl$@HLEHHM؉HUHUHUHP^_]UWVHPHi@Hl$@HHHΐYt!LEHֹHHM{襥H[HP^_]UWVHPHi@Hl$@HH}tHML9 HP^_]UWVHPHi@Hl$@HHML9 HP^_]UWVHPHi@Hl$@HLE HHMňHEHEHIHP^_]UWVHPHi@Hl$@HHmHP^_]UWVSHHHl$`HH}й3HHeHMHULM(IH HHHH Ҭ|HH3E3HuHHHH@HPHEHHH@HPHH ALHUHT$ HHME3ILHUHRHMH=H.HMHUHHMHULHUЋRT$ HUHRH *E3HMLܖ9 ԖHH HHHÜGP[HH '(/lH`HuGH m;HHMHHL$ HHLLMԇHHU(LE8He[^_]ù3ƢHȐ趆HH ޅHHH/H袢UWVSH8Hi(Hl$(Hm`}@t HM)H8[^_]AVWVUSH@HIH iHHHH@@P LE(E,H'HHM,HIЅ3ɉL$ L$(Ht$0H͋LAHH@[]^_A^AVWVUSH@HIH ɄHHHH@@P LE(E,HI'HHMHI03ɉL$ L$(Ht$0H͋LAMHH@[]^_A^WVUSH8HH |.HHHH@@P HC(C,H&HHKHH3ɉL$ L$(Ht$0HˋAE3HH8[]^_WVH8HH|$ 3H΋ 3ɋBE3HT$ LD$(L$0D$4HHL$ ht%HT$(z$THާHL$ CuH8^_H(LHL$0HQHtHT$ HBHHT$0HD$ PH(H(LHL$0HQHtHT$ HBHHT$0HD$ PH(AVWVUSH HHHHHt$HK(3ҐKuHK(FHHH@@P t3ugHH H9Mt HHHM0nHHH$H9tHH[HHH@HPHUHHHHHH9 sIOI1sHO I$sHO IL9 HML9 yHHe[^_A\A^A_]UAWAVATWVSH0Hi Hl$ Hm`H}tHMLD9 CHHNE3tCHFH ^D3DAUWVSH8Hl$PHeHHHHH CDHHtUHL^T9 VTH CHNHCHVHL2TE39 'T~He[^_]3ɉNH A lCHNHBHLS9 SHEHMLS9 St5HMLS9 SHΐHMLS9 SuHHe[^_]ùEUWVSH(Hi Hl$ HmPH}tHMLpS9 hSH([^_]WVH(H} )EH B rBHNHA3FFH(^_VH HH yAHHNA3FFH ^AVWVUSH HHHH@@P H3Hv0Ht`H-HMA E3DLDHHMPAHHHH@@P HH@HHv0HuHH []^_A^WVH(IHBHH(^_WVH(HHLHH _~3H(^_WVH(Ht FH(^_WVSH HH :a@HH {H AHHAHO H-@LJHH@LJWHH [^_WVSH HHH 4:?HHJHH@HK H?ǃHH?ǃWHH [^_WVH(HH 9r?HHHH@HO HE?LJLJWHH(^_WVH(HH h9?HHHH?HO H>LJLJWHH(^_WVH(HH 9>HHHAHH(^_WVH(HH 8>HH6?HO Ha>LJLJWHH(^_WVSH HHH 8.>HH>HK H >HK0H>ǃǃWHH [^_WVH(HH 7=HH>HO H=LJLJ HH(^_WVSH HHH c~=HH2>HK H]=HK0HP=ǃǃ+HH [^_WVSH IHH b=HH=HK H2H}3HL.@9 &@HEHML@9 @tdHML@9 @HG؅tN1HHM1HHH@@HHM1HML?9 ?uHHMHEHH@@HHe[^_]HUWVSH8Hi(Hl$(Hm`H}tHMLr?9 j?H8[^_]UH0Hl$0HeLS?9 K?HEHMLD?9 9 >H0]H(HH@@P H(H(HH@@P H(H(HH@@P H(H(HH@@P H(WVSH HHHtHH;4Rt3Hu 3H [^_H /W,HXHuHۅt$H/؅tXH [^_øH [^_H(HH@@P H(VH03HD$(H B+HHHL$(H &,HL$(H+HHL$(H }&+HL$(Ha+HHL$(H ^&+HL$(H:+H HL$(H ?&+HL$(H+H(HL$(H &j+HL$(H*H0HL$(H &C+HL$(H*H0^VH0H %*H3ɉL$ HκAE3..HH0^VH0f. zt Wf.z!uH %Z*HH0^f.ݮz8u6H R%$*H3ɉL$ HκAE3-HH0^f.z!uH %)HH0^H %)HH0^WVH(H $)H3ɉL$ HκE3E3 -H 1%v)HHHK)H t$F)H3ɉL$ HκE3E3,HH)H :$ )H3ɉL$ HκE3E3,HH(H(^_WVSfHIAHN(HNH(^[^_WVSH0HHHVH N(HtHH; Mt3H΢HЉT$ LHE3c@E@DH0[^_AWAVWVUSH(HHHVH M](HtHH; VMt3HHE3HHVH UM'(HHtHMH; Mt3HtHH; Mt3Lp0H :'LH J'HyHII)'LHILWHNHI8I9 DMGHHtIWHHHu H([]^_A^A_MG0HHӐMG HHMG(HHH9 *HȋHL89 8MGHHИMGHHHH([]^_A^A_HFCAWAVATWVUSH HHIH !T&HH*HNHI0H9 HVH K|&HtHH; uKt3HP0L5fILfM&HMH%H %LH !1&HI&HMXI%E@`H %LHP)LIOHx%H)fHIOd%A $IIL+79 #7H9 (HȋHL79  7H Z $%HH(HNHI0H9 HVH zJL%HtHH; EJt3HP0ILeM$HKH$H $HH %HH%HKXH$C@`H'(HȋHLH69 @6H~H(u9H  H$HH 3f$HHK!$HO(H$H(HHHVH IS$HtHH; LIt3Hh0H #LH ]L!ILhdMH#LIH#HIA [HI9 5$H~H(u9H ; m#HH #3#HHKF#HO(H9#H(HHNHYHH  HHK9 !HHVH E HtHH; Et3Hh0H E LIyHIHHIHAF@PH RLH LLl$ IP IL$IOIINIINHHINHHNHI0I9 sAF@PH*#HȋIL[19 S1H([]^_A\A]A^A_LI9 AD$H LIOIIMǺH\LIκH DLLZMIHMH #HHM(HHM0IHHLy+9 q+H lHHȍHCH LLINH4H /HHK(HHK0I HHL+9 *H nHH,HK(HHHL*9 *H []^_A\A^A_HVH %>HtHH; =t3HH(HI0HtHH;=>t3HRHH =H;HNHIHHH >HHbLH3$H mHLXMHHLH THHK(HHHL)9 )H []^_A\A^A_H HH΋HK(HqHHL)9 z)H []^_A\A^A_AWAVWVUSH(HIHZ`J@LvI~(u9H LH Ÿ3-HIOIN(IMv(HLHVH H<HtHH;Ht3HHtHH9tHH HHiH(^_HHtH H9t H3@H(^_WVSH H3H3HH@PP0HH3uH3Ґ(@H3HH@PP8HH3uH3Ґ @H [^_WVSH H3H3HH@XPHH37uH3Ґ@H3HH@XPHH3uH3Ґu @H [^_VH HHHH@XP0t3HHH@XP0tHHH@XP0H ^3H ^WVH(HHHH@XPtEHHH@XPt0@tHHH@XPH(^_øH(^_3H(^_DHgHD3WVUSH(HHt~t HH([]^_Ë~uS^ {8HH` 3A~HȋH` tH([]^_Ãvk^ {HH` 3A/HȋH` %HDGHκXHHTH([]^_@ WVH(HtoHH=Q.LHHH@Ht HH(^_HHfH(^_HVH HH ɎHyvHIHHH ^H WVH(HH xHHyv'HIHXHHHGH(^_H4 VH H _H;psHcHDH ^HfH %H HHHfH %H HHHfH %H HHHfH %H HzHWVSH HHHHH@@P t 3H [^_HH ;H9 t HH؋CXH [^_VH HDFE~[Af~ .uJAHκHH HfB.HAE3H ^H RHfB.HAE3OH ^fHfH +H HJHVH03HD$(HAE3LD$(LD$(Hʋcu3H0^H|$(u H0^HH9D$(H0^WVUSHhHH|$(3HHI3H H H HL$(WAHT$(3ɉL$0RT$4HT$8WoD$(D$HoD$8D$XHHL$Ht7HL$XHHiHHD9 u!HOHL$Hu3Hh[]^_HHHh[]^_WVH(3HD$ H ,YHL)MH3L)MHκL)MHκL)MHκH BHHH\HH)HEHHL$ _HL$ H%H(^_WVHIHNHNH^_DHAWVUSH(HPH(HHc؋ːP;~Ha(HHbΐ؋ϐ;~H([]^_DH (HHbHDH'HHrbHDHD(HHRbHDH'HH2bHDH (HHbHDt0t`u3øøøWVH(3HD$ 9 HH \'H H'H HLL$ HE3HH@`P t$HL$ 9 HHH@@HaH(^_WVSH03HD$(H`9 bHH &H HHLL$(HE3HH@`P t$HL$(9 +HHH@@H`H0[^_VH HH&HHu0HJ%HHu$HC%HHu!H ^øPH ^ø0H ^ø`H ^Dt0t Pt !H&HH$HH$HH$HWVH(ΐ;H(^_VH HH%HHuHZ$HHt3H ^øH ^WVSH HH / HH ?A+HHOHHN HH HHOHHN(HH HH HHO|HN0HoH [^_AWAVWVUSH(HHIIH a CLH qs]L8INIHN IH ! LINIHN(IH LH HINHN0IHNHHNHHNHzH([]^_A^A_DHADHADHADHI!DHA DHA(DHA0WVSH HHI9 HHOH9 HH2HHHPtHOH9 HNHHOH9 yHNHH [^_WVUSH(HHAI9 ,H|HNH9 *HHHHEHPt&HNH9 HOHeH([]^_HNH9 HOH?H([]^_HNH9 Hu'H /HHLŐJHHH*u%H HHLŐHHHHHHOHH([]^_WVUSH(HHAHL$pI9 +Hu)H ZHHL9 HHH,u'H j,HHL9 {HHHHHHNHH([]^_WVH(HHAu)H HHL9 HHH-Au'H HHL9 HHHHH(^_WVH(HII9 )HHHRHNHEH(^_WVH(HHH =HHL9 VH(^_WVH(HHH HHL9 H(^_DHDHAWVSfHIAHNHNH^[^_WVH(HH[H~HVH GHHH&9 H(^_HWVUSH8HHVH HH=BHX=HVH HH#HX=0H~HVH HkHL!MHH07HHVH ~PHH8HH@HPHHVH \.Hl$ HH0HL$(HHAA9 &H8[]^_HVH HHW=0HVH HH1HW=H~HVH H9HLoMHH06HHVH ^HH8HH@HPHHVH jHIUH HtHH; t3HP0IE3LH IH$HHH,H$HMIH}tL} H lL9H 1H$HHIL$HHȋHLf9 ^IUH 3HtHH; t3HH0#HLCH-IUH HtHH; t3HH(HI0HH@@P H "4HH BDNHHM HIIUH zLLMtIH; BtE3H IW0H$HHHH$YHNHIH:LUH fHMDEDD$ E3DD$(HD$hL3E3`Hl$hH NH$H w9HD$8HD$`H "HD$PbHP HD$PHHHD$`HHHT$PH$HHHT$`H HD$XHHIH HL|$XIOH$HHIwHL$8H9L$HHIUH LMtIMH; tE3H %H$Mm0H J HD$HH HD$@bHP HD$@HHHD$HHHHT$@H$HH HT$HH$HHIH$HHIrH mLIM(H$PIM0ICMHIL9 H|H$H  HHHHN(IMHHL9 H9 zHȋHLs9 kH[]^_A\A]A^A_H(HQH HH hH(DAWVH(HHH9  t 3H(^_HHt 3H(^_HHHZ@=`tHHH@@=`uAHWH N0HH  H;F8t#HHH?=Pu 3H(^_øH(^_WVUSH(HHIIHtDHHHH@@Pu0EH9 HȋHL9 H([]^_Ht"H9 HȋHL9 H([]^_WVH(HH @H9HHOHNHH HH HHO|HN HoH jHH HHO?HN(H2H(^_WVUSH(HHIH h Ha&HHMHNHH 5HH -/HHMHN HH HH HHMgHN(HZHNHMHNH@H([]^_DHADHADHIDHADHA DHA(WVHIHNHNH^_DHAH@0VH HqHQH HHH1 9 H ^HUWVSH8Hl$PHeHMHULE IH~HM Hy u_H CHH HعbHP HKHOHHU HJ HHM Hy HJHH9 DHMHU HEHH@@H@0He[^_]HUWVSH8Hi(Hl$(HmPHHMHHMHHt$ HAA9  HH8[^_]UAVWVSHPHl$pHH}ȹ3HHeHMHUIMI3ɋBE3HULEЉM؉EHHMt[H}H HH9 QLHHAIHL29 *HHMAuHe[^_A^]UAVWVSH0Hi(Hl$(HmpHHMHHMHHt$ HAA9 HH0[^_A^]UWVH0Hl$@HeHMHUIHt,~~&I9 WHHKHH9 eHe^_]UWVH0Hi(Hl$(Hm@HHMHHM.HHt$ HAA9 'HH0^_]H(HQH jH(WVH(HVD‰FDHQH W9H9 ljFDH(^_WVSH HutHtHH }HHL3LHNHWH RHH3E3HNH,H ^x2HHHuHH THHHHKHZHSHHƼHHNH [^_WVUSH(HIutHtHH iHHL38HNHCH >HH3E3HNHHNH H([]^_H(HIDAAH(AVWVUSH HHI3HFHHH HPLOHFHHH HPL{H` jL3eHI)LHNIO}HNIAAHtHNHMAIH []^_A^DE3HA>HDHIHػ9 HWVSfHIAHNHNH^[^_DH>HWVSH HHHVH HtHH;t3HPHHE3>HH9 ٽHȋHL9 HVH YHHtH H; ot3HRHzDtIHtHH;Rt3HPHHA>HH_HȋHL9 xH [^_UAWAVAUATWVSHH$3HEHEHpHMHUDE DE EHMHU>HEHUHRH yHHtHH; t3H HHHLME34H}HMHIHI8H9 5H HHHu} t2HMHIHI0HU9 :HMHIHI0HU9 bIHMHIHI0HUHRLEM@0LD$ LELM9 HMHIHI0HU9 HMHIHI0HU9 HUHRH ZHtHH;st3HUHRHHUHRH O!HtHH;:t3Hp0HHMHI} HtH H .ZH HH;HUHJHZHUHRH HtHH; t3HH8HUHzt HUHR HYHLEM@AAxPtAAq;HUHrHUHRH R$HHtHH;:t3HI0HtHH;#t3HP8HR8LEIxt LEM@ L#YMHHUHRH HtHH; t3HH8HH@HPHMHyt HMHI H XH HD$ HL$(HHAA9 FHMHyt2HMHIHUHH@@PuHUHRHMHIHHUHJHHUHMA@HMHU:HEHUr@HUHRH ƵHtHH; t3H/ ΋HUB@HMHyH(u9H !HH V3?HHKHO(HH(HMHyt HMHQ H}WHHMh9HHUHRH 6HtHH;!t3HVHH/DD$ HHDΐ訤HMHyH(u9H "THH V3rHHK-HO(H H(HMHyt HMHQ HVHHM8HHUHRH i;HtHH;Tt3HHH /D3҉T$ HHDΐݣHMyDHMHI(Ht#y~HEHp`&HH9 8H ZHHMHEH;Ht.H L/LINHϱINI±H SHL3MHItHOHHMHI8HH@HPHHMLq`H KmLLIOHOAG IOH:H LH LH  HEHHHILE3H ްHHUHR0HKILúаILƺH HHHMH {HHO(HcIL3uH PHHIMNAIHL9 uH HLMHHUʲH}H _HHULr`HK(HɯHK0HAIHL9 HMHMH HH ȫHHHHOcH u[H WHH =GLbDHP INHKIHO HH_ HMLqHM3HI9 HЋ HL9 HMHIHYH H H HHnHKLEIAPHU9 HH ĪvL赸LINHUINIHH ٨CHLMHIHOHHMHI8HH@HPHHMLq`H ѩLҸIOHխAG IOHH I&LH LH GHEHHHxILE3H dHHUHR0HKGILúVILƺEH  HHHMH HHO(HIL3H 4֬HHIMԱAIHL9 HMHI Ht#y~HEHpX;HH9 MH oHHUHzXHN(HUNHHLW9 OHEHe[^_A\A]A^A_]UAWAVAUATWVSH8Hi0Hl$0HHHM蕶HHM0H9 H4HHt$ HAA9 HOH8[^_A\A]A^A_]UAWAVAUATWVSH8Hi0Hl$0HHHMHHM+0H9 8HHHt$ HAA9 (HH8[^_A\A]A^A_]WVSH@HH|$(3HHHAHVX HR33HT$(HD$0L$8HHL$(Vt7HL$0H9q8uHI0HD9 Eu HHL$(u3H@[^_øH@[^_VH HHQH HtHH; t3HH8HH@HPHHHLH?H ^HH(HQH xJHtHH;ct3H(WVUSH(HHAHnH.HH9 t*LFIHHDL.MH|HLh.Du(LFIHHDLMHLHL8H([]^_VH HI(HQ0HHtH DH9t YHHFPH ^AVWVUSH03HD$ HD$(HHH ϨH؃~DtHgHHKHYHHKH{ u[H ޤHH nxLbuHP INLHMI?HK H2Hk LwH)-HI9 +HЋMHL#9 HOHyHH H HHHOLD$ IAPHT$ 9 HH HLHMHHMIH zHLMHH1HKHLHN8HH@HPHH HH ס!LINH HM3H HHV0HOݦHLǺH 5ǦHHHLHH0[]^_A^WVSfHHIH;HHNnHNHaHNHT[^_AVWVUSHpHH|$(3HHH9 eHVH cHHtHH; t3H HHW(HCvHNHIH9 HHVH &HHtHMH; t3H –LIHLj'HNHI8I9 /"I~t9INHHH@@Pu$HHIVDLQ9 I3HHHNHIH9 HЋHL$9 HVH Y;HtLL; t3HP(MNHLd'HVH !HtHH;t3HSH{HVH ҤHtLL; St3HP(MN(HL&HHW*HHk*HVH HtHH;t3HP0 HR33HT$XHD$`L$hHDHL$XyH|$`HHH@@P uzHH H9Mt HHHH*HHFHȋHL9 HH)HHHȋHL9 HHL$XΣUHVH }HtHH;t3HP0 HR33HT$@HD$HL$PH?HL$@tttH|$HHHH@@P uGHH H9 t HHH5)HHIHȋHLʵ9 µHHL$@uHVH HtHH;4t3HP8 HR33HT$(HD$0L$8HHL$(tZH|$0HH't/HH(HHHȋHL"9 H[HL$(PuHVH !HtLL; t3HP(MN HLL$H wHH ]gLbdHP IN;HNI.HHLy9 qHHp[]^_A^VH HH&H9 Ht H ^3H ^WVH(H3HVPH R̥HtNHVPH <HH(Hy0HHH@@P u#HH RH9t HHHFPHx0HH(^_WVH(HH^H~HVH yHtHH; t3HH9 HH%H(^_HAWAVATWVUSH@HH|$(3HHHVH ( HtHH;t3HP0 HR33HT$(HD$0L$8HHL$(H|$0HHH@@P HH H9 t H~HHS8HHtHH9t HZHH=HHOL5IH:=`t=0ɅHnL{8ILMtH I9 $t LMd$8IHHtH|H9t HHHHL{0IHLHMIHH s%HHm@C(C,H@HHKHHC C$3HKC(C,HH9 pH HL$(>=H@[]^_A\A^A_DuA`tA03øAWAVATWVUSH03HD$ HD$(HHH +HHGC@`HHVH vXLMtIH; tE3H ܜLH H IV(IOHMHIL9 HHVH LMtIH; ^tE3H dLIV(IOKMHIL9 HVH HHtH H; t3HJ(HtHH;t3HP(+HHSHHH#LMH LLIO(IHIL 9 H9 >HȋHL9 H ЗjHHC@`HnH FLHMH9 INH"HHINH͞HȋILv9 nHI~tMv H =L1H ˚LIOIMHIL+9 #HHVH LMtIH; atE3H gLIV(IONMHILέ9 ƭHVH HtHH; t3HH((HHS3HHH!LMH iۙLIO(IÙHILN9 FH]HȋHL69 .H HHC@`HNHiHMH DH H*HLHMHAH z4LHHT$ L2DzHT$ 9 IL$HHHIL$HHȋILz9 rHI|$tMt$ H ];L1H ۔LIOIMHIL-9 %HHVH ۽LMtIH; ;tE3H ALIV(IO(MHILЫ9 ȫHVH }_HtHH; t3HH(HHS HHHHMH CLIN(HHILP9 HH7HȋHL89 0H0[]^_A\A^A_WVUSH(HHH s=HHHVHKH $HH DnHH*HKXHC@`H9 HȋHL9 H~H(u9H zHH b83ʖHHKHO(HxH(HVH ÖHHtH H; At3H >HHHHHK(LFUHHA 9HHH9 H([]^_HAVWVUSH HHH )ەHC@PH ĕHH LbHP INHMI{HKHnHNHI0H9 KC@PHo0H 7VHyHIHHKHHnHW8HHtH H9tAHH9 LLFIHHDLMHHHKHHHH []^_A^fUAWAVAUATWVSHhH$HeHMHUH 5gHHHuHMHIHI0H9 (HHHM|ЃV@HUHR0HN HMADHMAEHMHI`9 җH H1H H HMH H LMHUHR0HEHMHyHMHQ8HHtH H9tғHH9 HEHUHRHJHHKHLLM;HUHJHH:HMHq0H 48HyHIHҒHEH HHMLHULEHHuHMHIHI8H9 H~HMHqHMЗHHHH@@PHMHq0H~HMHy u_H UHH ;EHعbBHP HKHOH HUHJ HHMHy HHH9 HMHI Ht#y~HEHpXrHH9 HMHqXH 4HݛHOHHOHUrH KmHؐLHKHOC HKH;H ķHH !L`INHINHUH ^LH ~KLILE3H LIMIIMHUA|$twI} uaH ،LH hrHEbnHP HEHHAIOHU3IM I&IM I9 WH }LH LIL$HUIM3H >ЏLIIMƔH 'LIO(IIO0IHM3H ׋yLIHLwHIL(9  HMHqXH ъ;HzHOHHOHUH  HHK(HHHLâ9 HUHRHMHEHe[^_A\A]A^A_]HUHr0HUHRH HtHH;xt3HP(HHH uoHHHH3UAWAVAUATWVSH8Hi(Hl$(HHHM轘HHMhH9 MHHHt$ HAA9 HH8[^_A\A]A^A_]UAWAVAUATWVSH8Hi(Hl$(HHHM8HHMH9 ȒHHHt$ HAA9 PHH8[^_A\A]A^A_]AWAVATWVUSH HHH ]'HHӐHOHI0H9 HV8HHtHH9t H-HHH"ȃK@H H HV0~HKHH HHHV8HHtH zH9tHH9 yHMHTHV8HHtH AH9t HHO8HMHHۏHȋHL9 H HH %OHH HKXHƋH /HHuLH LH FLHV0IL$vIM3HMHtH H .H)H KL3IT$IL$H+IMĺ:H HLMHHMAH wHHO(HъIHL9 HSHHH []^_A\A^A_AWAVATWVUSH`HH|$(3HHHH cHHHNHI0H9 ,HW8HK.HgHHsȃK@HN@iPH +NLMHMuJH 2LI@H]IL$H?IT$IHIMH {LI̋MQ HH5HHHEH@@P u#LH =I9t HLINPHi0HNH9 EHLFIHHDLMHHLHKXHHSHH ѮLH HINH iLHW8IOIIFHWX HR33HT$HHD$PL$XHHL$Ht*LL$PHHM@HHL$HΈuHWX HR33HT$0HD$8L$@HHL$0H|$8HAIIL.9 &H O!LIOH H 2HHT$PHMHNLaHH EHIL$9 ՅLH (LH ^HW0HD$@HHILD$@3HNHAHHD$ H ~kHD$8HL$ HII9 ZLD$8IHH8ILD$8EH  HD$0HIMqHM HiqHHHM0UqH>HHMMvHQHHH@@P0HEHMLɄ9 HML9 HHHtHTH9t HpHHMHH@HP(HHH@HPHEHMLi9 aHMLV9 NHHHtH H9t 1pHHHH@@P(HHHA9 ^p HHH@@P0HHHA9 .pHMHEHH@HP(HHH@HPHEHML9 HML9 HHHtH H9t `oHHHH@@P(HHHA9 ouHML.9 &uHHH@@P0HM0H6oHHML9 قxHHML9 HHe[^_A\A^A_]UAWAVATWVSH0Hi Hl$ HH}tHML9 }H0[^_A\A^A_]UAWAVATWVSH0Hi Hl$ HH hHUnHtHL79 /H0[^_A\A^A_]UAWAVATWVSH0Hi Hl$ HH hHU0nHtHL9 H0[^_A\A^A_]UAWAVATWVSH0Hi Hl$ HH ,hHUmHtHL9 H0[^_A\A^A_]UAWAVATWVSH0Hl$`HeHHH lHHrrHHrH˺rH klLH clLH [lLIIrIOIdlII8rIHAIHP8HIIH@XP3HMHHMrHEIHUIH@pPHHe[^_A\A^A_]UAWAVATWVSH0Hi Hl$ Hm`H}tHMHEHH@XP H0[^_A\A^A_]AWAVWVUSH(H H1H H9H HH H)H - $rkLILzIHkIOHkIOHkIOHkHH2HH:HHHH*ILzIHbkIOHUkIOHHkIOH;kHtH2HrH:HpHHnH*ILzIHjIOHjIOHjIOHjIH'H6jH([]^_A^A_H(E3LD$ E3zH(WVUSH(HHIILլMHH (LìMHH (H|$ HHLE3H([]^_AWAVATWVUSH0HHIILoMHH J|(LEMHH xb(L3MHH ^H(LHHiiHHH ʝ4oD@A<A=LpLH:H!iHHH YhLMpMuJH hLIhH<IL$uhHIT$IpIYhMH 'HiLHl$ IHLH0[]^_A\A^A_AVWVUSH HHIILt$pLMHH y&HHk<Ht5HHHː&H˺C1HH h<MtJHyHIΐ&IκC>HIg<HW(Ig<HNH1gHu3H HPmHHN gHN(HfHN0IfH ^f3HPHN@HfHHH []^_A^HDHADHA8DHA@H@WVSH HHH l^nfHHKHVfHO@HIfH [^_DAQDQQVH HH /fHxHNHeHHH ^HWVH(HHHݨHHiHNHHeHHH(^_HUWVSH8Hl$PHeHHHHHϐ$H~tWH pjeHHfkH˺pkHH|kHEHHU{HEHe[^_]ùHȐeHH _dHHHNgHUWVSH(Hi Hl$ HmPH}tHML>y9 6yH([^_]WVH(HHLMHH #H~9HHHH(^_HUWVSH8Hl$PHeHHHJHHϐf#H~H dHHjH˺jHH(jHEH YcHHVHHT$ HV LFLNHHHUHEHe[^_]ùcHȐSdHH ]{cHHHeH?UWVSH8Hi(Hl$(HmPH}tHMLw9 wH8[^_]WVUSH(HHL+MHH "H^H78H YbHHVHHT$ HV LFLHHHH([]^_UAWAVWVSHH$0HH(,3HHHMHMHytHM3HAHMHA HMHA8H X>bHH"H8H |bHH L3|bHH@hH8HJHaHMyQHMHqHH /aH`HgH H dbHH څaHH8HZG(G,HHHOTaHHaD$ D$(3HL$0HϺAE3 bHHLu9 uH8HA H `HH vx aHHN`HMH8H `HHUHR0HAfH0HUHRHR0 HR33HUHEȉMHHM`H}HHH@@P  HH H9 t Ha`HH W `HH8Lq0H _LH I`IOH_HOI_HOH_AIHLA:aHHM`-3ɋV3HuHEMUCHHH@@P H%|HMyQujHHVH9t HHm_HW8HHtH :H9tO_HHtHH9tHH/_HHUu)HH H9 t H_HHb_H}H ^HH8LrC(C,H!HHKd^HH_C C$3HKC(C,IHLr9 rHMHM _t*LEHMH8H#HM^uH ]HH n}p}]HHHHH _}a}]HH ل]LIHLcHNIl]H(HMH8$HLq9 qH H Lq9 qH Lq9 qHH8HJ0HV9 mbLFHMH8HHH0HI0HQHHtHH9t H\HHHH@HP(HVH(bH L(q9  qKH H(Lq9  qHHLp9 pHLp9 pHHMH8LuUHMH8LHH0HI0HQHHtH H9t H[HHHH@HP(HLXp9 Pp\HH8HI8Hq@H8Hy0H(u*H Q[HHKH9[HO(H,[LG(VHd]H8HI8HI@3ҋAE3HMLEUEHMH[tkLEHMH8HH0HI0HQHHtHH9t HZHHHH@HP(HMHgy[uHMHqHH ./sZH`H\H xZH zx7ZHH}`HvH zTZHHNLn 9 nH3E3K`HGH YHLHڜHHL#`H YHH TyVyYHHNsYHHZH0H_HMAPHMH8L0H8HIH8HI8HqH~(u*H iYHHOHXHN(HXHV(HRJ<3E3HpLxEMH#Hp6_tjHxHHH@@P8H8HIHQHHtHH9t HXHHHH@HP(HHp^uH8HI8Hq H~(u*H XHHOHXHN(HWHV(HRJ<3E3HXL`hlHOHXJ^tjH`HHH@@P8H8HIHQHHtH~H9t HWHHHH@HP(H~HX]uH8HI8HI@3ҋAE3H@LHPTH@HXHHHNHQ8HHtH ~H9t"WHHtH{H9tHHWHHH@@P8H8HyHNHQ8HHtH }H9tVHHtH w{H9t HVHHWHHtH}H9t HVHHHH@HP(H@HW H0H0HH@@P8H8HIHQHHtHG}H9t HVHH0HH@HP(HUHJH0UH8HR8HMHI UH8HRHMHI8fUH8H@He[^_A^A_]He[^_A^A_]UAWAVWVSHHHi8Hl$8H0H tH Li9 iHH[^_A^A_]UAWAVWVSHHHi8Hl$8H0HtHLi9 iHH[^_A^A_]UAWAVWVSHHHi8Hl$8H0HHΐ$t,HΐHHt$ H8AsAF8qHHH[^_A^A_]AWAVAUATWVUSH(HyP|HSHHVHHT$ HV LFLNHHHHH0[^_HUAWAVAUATWVSHH$HHD3HH(HLMH{t4HKyt*HsHH [/RHhHXtHe[^_A\A]A^A_]HsH YeRLM$MuJH Fy8RLI$hH@IMRHqIUI$IQMH ĆHRHLf9 fHHLf9 fHLf9 fLH <_QHHNHvQIXHHIM8IF HHC(HHHE3bHH ,C&QHH3HNHPH xPMEXLHHHHPH pHHNH HLFWHH VHIEXM$HMH xrPLI$hHLPIHEPH&pLPIPI$LPIPLPHH HVM$HxMucH wOLI$hHPLXIHOHoLXIPI$LXIOLXH HVLH HxVHH }wTHHIIUHR@R(HHaHH gsOHMnF(F,HHHNNHHOF 3ɉN$3HNF(F,IHLc9 cHLc9 cHkIUIUHILLHHHH@@P8INHQHHtHuH9t HgNHHHH@HP(HTHHHH@@P8H uMH@HHTHC0H3H@ANHH@HK(HHH BuMHpH 1u{MHHHhHL@ATHpLh3VMHpHpHxEHEHHEHH tLH`HH8H0HH@HH`H8L0LLL$ AbSH`H`HH@@P8IO8HQHHtH)tH9t HLHH`HH@HP(IN8HqHH t2LHHOILHOH` LHH9 LOHHe[^_A\A]A^A_]IRUAWAVAUATWVSH8Hi(Hl$(HHtHL`9 `H8[^_A\A]A^A_]WVUSH(HIHN0C"HHE3肏HHN(9 RHH r;KHHwPDHLHQHH([]^_AWAVWVUSHXHH|$( 3HHHIIH rJLH jjJHINJH <JLI39HʍHHFJHH_C! HHE3胎HIOHAA%OH9  QHP33HT$@HD$HL$PHKpHL$@Jt6LD$HHHMHIJHpHL$@bJuH nIHLF(HHAP3AN3Lt$(HD$0T$8L$HHK@HV0HyuHIHH@@P0HH_ HʺC HHE3蔄HH d\@L3HL$ Hl$(IHE3E3+GHO8HIHMAAIH0[]^_A^AWAVAUATWVUSHXHH|$ 3HHHIHO8HILD$PH9 @tHD$PHX[]^_A\A]A^A_H rg?HH __?HHMq?H *el?Ls^?HINC?H D1>?LI3HK@HV8HyuHIHH@@P8HLgHʺCRA $IHE3LIOIAACH DHP33HT$8HD$@L$HHdHL$8&?Ll$@HBIU0LL$0HE3HH@`P D$,u{QuHO(LD$ I9 R?u5HHMMLHI>|$,t IU0I>H:dHL$8>aH b=LH[(H 8=IH=IILADHIDIIDHO8HIHMA?IHX[]^_A\A]A^A_AWAVWVUSH(HHIIHN0C HHE3HHHN(9 CLH gb=LIHMCLF(HIHM8HIHMAc>IH([]^_A^A_AWAVWVUSH(HHIH9 @HH-HUHH@`PH c[HW` HR33HT$(HD$0L$8H^HL$(|7Hl$0HHLMLHN8HI8HMAN8IN`HQHHtH^H9t H6HIHH@HP(HP^HL$(6yHN8HI0HMA7IHH[]^_A^A_WVUSH(HIIHV8HJ(HW89 7HHV8HJHW(9 7HHM0H ]5HHHLLHL$(uHHH@HPH@[]^_A^WVSH HHHN0٫HHN8HI0HS(HR0ht?3 HK8HIL/9 w/H;t(HK8HILi/9 a/;HH [^_HK@HILI/9 A/H [^_WVUSH(HHIILO Ly]MH3HH@HPHXHLC0H HHLLvHHH@HH@H([]^_HAVWVUSH HHIILK L\MH3HH@HPHW8HHtH=H9t HHHx\L0HH@HPLIH HHLLHHH@HH@H []^_A^HWVSH@HH|$(3HHHILN LI\MH3HH@HPH[HLC0HHS8HHtHHHD$ D$(3HL$0HκE3E3H$HH$H HH3xH tH$H HH$HHH$H$3H$H$$;Cr yHK$;A$HcHTIMM@PAP(3H$3ɉ$IIHRPRIIH@PPHE3L$L$L$H9 BH$HD$xHD$pH ;HD$hHL$xHT$pHD$`HL$hHT$x#H ^HD$XHHT$`HL$XHL$XHH@@P0HL$hHI8HHL$h33H$HH$H$H$xI E3H W7HH$IIHRPR uIIH@PPH$IIHRHH$H }H$IIHRHR8HH$L$FHD$PL$A@(A@,HӔHL$IHH$HT$PH$B |3ɉJ$3HJB(B,HIIH@HP8HȺpHHE35H$H IH$HH$L$D$x*H$H$E3H 5HH$IIHRPRuIIH@PPH$$ulIIHRHH$H 7H$IIHRHR8HL$$A@H$L$DH$jIIHRHH$H }H$IIHRHR8HL$$A@H$L$DH$H u'@(@,HHH$HHH$H$H$B u3ɉJ$3HJB(B,H$H^H$$щ$;S}IMM@PA IIHRHHȺfHHMHE3s3HMt%H HHM38H 3H3H$AMv0IIH@@P8H$IIH@HHL$H-t 3H$IIH@HHH$IL$ IIH@HPȸH$8JIIH@HPȸH$@JIIH@HP(ȸH$HJIIH@HP ȸH$PJH$ H$H$(H HLH$H$HHIMAH$HD$ `HHH@@P8HHL$7Et$HMXH9 HĨ[]^_A\A]A^A_HM@HHĨ[]^_A\A]A^A_ WVSH03HD$(ILD$(HH9 ttDHt$(EHH {HHH.LHH7HH0[^_3H0[^_UWVH@Hl$P3HEHEHeHMHUH H HMH [HH vHHN1HuHMHIHUHR9 ŎHL[9 SHEHMLL9 DHML99 1HHHtH H9t HH9 HHHUu@H}tHMyuHMHULEȀHMH}HMHHML9 FH<H}tHMyuHMHULEWHe^_]UWVH0Hi Hl$ HmPH}tHML(9  H0^_]UAWAVAUATWVSHH$HH}3HHhHUHI~w {LNAyIYLMLL$ LMHHULuHe[^_A\A]A^A_]LuH ËeLMMuJH LIH2IL$H IT$IIMIH3H}H HH eLH9 wH=HAG(AG,H܋HIOIHD$ D$(3HL$0IϺE3E3HM3HM HMHLHe[^_A\A]A^A_]H LI3GlLwHH T/HXMu HAE IDEtHMH1~DHMH}DEuAE33EH9 tMLd$ ML$(HHULEE}HEAELuMMuaH ԾLIHLpIHHLpIPILpIiLpIH|tE3Ld$ 3ɉL$(HHULEE8}HEHMLqHCHAIE39+HH  LD$ LG0IHE3LuIHUIHUH HH HHKH]HMHL$ Ht$(H\$0HHUMLM|ЉUP5HUHM|H 7HH}F(F,HÈHHNHHD$ D$(3HL$0HκE3E3HMHz3ɉM}HMHqMMuHH PHIHHOuHHWIHZLH HHL9 HEHML9 HML9 HHMHqxH eLMMuHH HIHfHKHHSIHLH HHL9 HxHxL9 HxL9 HHK8HW8HH@@PtHHHH@@PuHxL9 uHMHq8H 'HLC8HH:HG(G,HVHHOHH=G 3ɉO$3HOG(G,HMH3ɉMH H̃}tHML9 H}tHMHIHU9 ru3H@[^_ø3H@[^_WVSH@HH|$ 3HH H3ҋAE3HL$(LD$0T$8D$zHH 3H@[]^_A\A^A_WVUSH(HHH SB]HHNHW9 yHHKH2H sHKD$ HHLLmH([]^_WVUSH(HHH AHHNHW9 ByHHKHH HKD$ HHLLemH([]^_WVUSH(HHH sA}HHNHW9 xHHKHRH HKD$ HHLLlH([]^_UAVWVSHH$HH0,3HH HULM(IHMWAH eHH wHHOH8H VHHHOoH0HL69 .H(H(L!9 H(L 9 HHHtH AH9 t NHHUHDE09 oEEoEEoE`oEpoE@oEPH LI~H`WQKHIH@衷uiH8ytHM0L$ 3HL$(HE(HHH HUL8L0PH8mH0`oEEoEEH8HH[tHHH0vH(L9 oHHH8yt.M0L$ 3HL$(HE(HHH HUL8L0PHe[^_A^]UAVWVSH@Hi0Hl$0HH(tH(L9 H@[^_A^]UAWAVWVSHH$HHpZ3HH`HMHULE I]0H HHHHHM L39 |HHUD9 rH}8u4H fHH |~HHN;Hu83ɉMHHIL 9 CH  HHM L9 HoEEoEEHMHIxoEhoExohoxH-HMHULE LoEoEHHHD$(HHD$ zhH K%LI~HuHH GHI#HF(F,H}sHHNHHdF r3ɉN$3HNF(F,HM8H9 =EH tLI~Hu3-'HH HHIt#HF(F,HrHHNHHF }3ɉN$3HNF(F,HM8H9 EHMHULE oEoELM8LL$ LMLL$(LfHxHHyuH 3HHRH LEH HnHpHHyHpqHLAHxMuCH HHOHH$HWHHJHLH "HqHL9 HhHhL9 H eHHhLl9 dHNH7HUHJHHVHR(HR0M?tHhL#9 u\H HH  HHOH}8H HHOHLLGLHU H ZHH "HH9 LHHLH XLHLIHU HAG(AG,HoHIOIHAG 3AO$3IOAG(AG,HM8IH 3:Lȉ\$ HM8HL$(HMHULE c H HHpqHHytlHHIL{9 s;~LHHRH ULpHH HHJHEH3HAEHp3ۅeHcLt}H LHM L39 H9 tHIH!LAG(AG,HnHIOaIIAG 3AO$3IOAG(AG,HM8I9 H fLHM L:39 0H9 ́HI LAG(AG,HwmHIOII^AG 3AO$3IOAG(AG,HM8I9 3;HMHqHM L39 H9 I}HЋHE3hHH .0HHMHY0HLqH  HHHHLAHxtHxHMt HIHHH@@P8}t}oEHoEXHMHI`oH(oX8o(o8HLAHMHIhoHoXooHLAoEoEHMHI`ooooHLAHMHIhooooHLA HMHI8HHMHI@HrHMHLE8imHe[^_A^A_]UAWAVWVSH8Hi0Hl$0HHhtHhL9 H8[^_A^A_]WVUSHHH|$0"3HHHIH$HLV39 LHH$D$9 }Hu0H HH HHMHHLo$D$0o$D$@Hl$ L$LL$(LL$0]HH &`HHHE3HHH@@P8o$D$po$$HoD$pD$Po$D$`oD$PD$0oD$`D$@HT$0LAHHHHL 9 uHN@HYHHLRkHĸ[]^_UAWAVAUATWVSHhH$HH:3HHLIIL}0Lu8H h"HH xzHL 9 HHL9 HL9 L3ɉMIMXH(IHIHNhHH@HPu'IwHLMLEI9 iWIMXH(IHIHNhHH@HPum}u2IwHIzHIvLHH<0IQwHIezHIvLHHH$IvHI0zHHHH LHHE3HHH| HN;A_HcHRH|33Ʌ IMXHHIHHIHHIhHH@HPHO(y8I|qHO(HI@HM;E|3MɅu0ITqLG(M@HLE;EE3DEEEDCHpIYsH THIqH@FHO(HI@HH HH8HO(HIHHH HɼH0H ݻH(IoH H(HzHp~xrHH HH H|$ H(H|$(H@H H L8L0kHF(F,H]HHN&HHʻF v3ɉN$3HNF(F,IH9 I6I nHHL[9 SHO(HAHH(H \HIVoHBHE3PLHHE3Ot t =H=HHHػ| HN;ANHcHRHD3H3HHIMXL8ILIIHHIhHH@HPHHH(y8ImHHJ(HI@HM;E|3MɅu7ImLMA(M@HLE;EE3DEEEDCHPIpH gHIEmHFHHH(HI@H(H H(HLIH(HIHH H H HH HIkHHHzHP5/)HH JHHH|$ HH|$(HHHLL" HF(F,HZHHNݷHHF v3ɉN$3HNF(F,IH9 [I6IjHHL9 SHHJ(HyHB(HH ^HIkHBHE3LHHE3¸ tHHH| HN;A HcHRH|33ɅIMXH0IHH_I^HHIhHH@HPiHO(y8[IhjHO(HI@HM;E|3MɅu0I@jLG(M@HLE;EE3DEEEDCH0ImH NHIiHxFHO(HI@HH HHpHO(HIHHH HuHhH H`IhHXH`HzH0*$HH ?HHXH|$ H`H|$(HxH H LpLh HF(F,HWHHNҴHHvF v3ɉN$3HNF(F,IH9 PI6IgHHL9 HHO(HAHPH(H ZHHIBhHHBHE3LHHPE3IMXHPIHIHOhHH@HPuhIht[H гHH ˳H GHE3iLIH(HQHA'IMXHXIHIHOhHH@HPucI}htVH 4HH r/H GHE3ͻLIH(HQHAIfHLmH~(u2H DzHHHHHN(HHv(H 7HHI6H qLIHҺIѺIIEH@@P0HHN8H/H *LIHL(HIHHHe[^_A\A]A^A_]UAWAVAUATWVSH8Hi0Hl$0HHtHLB9 :H8[^_A\A]A^A_]AWAVWVUSH83HD$0HD$(HHIIL$E3HL9 HAL9 H9 d}HAL9 H9 dHLL$(LD$0H9 _VtAHKHHT$0!t.HALs9 kH9 cHH9 JAHL-9 %A;=~IH3II>H8[]^_A^A_AWAVATWVUSH`HH|$(3HHIHN8y(HLGHHuH`[]^_A\A^A_HV8 3ɋB4E3HT$HLD$PL$XD$\HHL$H=Hl$PHN H9 ILHL$(WAHNhLD$(H9 1pHL$(HHiLyIH YLH sHIL$-Ht)H H HHL[HIH hH HHM2HIAIZHPHHtHH9t HHI9 HIL2FH{HL$HXH`[]^_A\A^A_UWVSHXHl$pHH}й3HHeLE HHH -HHH]H ΣH3HL$ HHE3E3\9H]NPKQH O/HxHKHH9H4Bt 3He[^_]HUHR8HMHU HRPHMH HHPHuH ]WHHSHHU9 ,HEHMHU29HMHEHH@XP HHM3E3HEHH@XP8H OH1H HH3H3HT$ HULE39 HEH HH HHNzHHU%H hHLE M@PHUHR8HLIHMHLHPHHEHe[^_]UWVSH8Hi(Hl$(HmpH}tHML9 H8[^_]UWVSH8Hi(Hl$(HmpH}tHML9 |H8[^_]UWVSH8Hi(Hl$(HmpHMLZ9 RH8[^_]AWAVATWVUSH`HH|$8 3HHHIHLHH B4LILź20INH HV0IHHV8LMtH I9t -LMvXH ѪLINL9 IгHV8LMtH I9t ڪLIVX HR33HT$HHD$PL$XHHL$HtcLt$PIHtH H9 t IHMv0HMRHL$8L1HAIHT$8pHIHL$HuI!LHILH ҩLIMǺ-βIL$HIL$ IH HD$ HHMAHOHI9 H HH9 HHH@@P HHH@HP8HNPHH`[]^_A\A^A_AVWVUSHHAILt$PHHHN ըHNHȨ@n(HNHHNI[]^_A^UAWAVATWVSHPH$HHIMH yLI3E3H [LH uHIL$/Ld$ 3HL$(HL$0Lt$8Lu0Lt$@HHLM@He[^_A\A^A_]UAWAVWVSHhH$HH}3HHeHMHULE LM(Hu8H}@H]PH ҞLHUz(AEH2HIN eINHUWE~(INHU(EINHUH7LuIHU .@H\$ IHU LLCH HAHIALHFHM,HMHHL9 HEHML9 t7HML9 HHMBHMLe9 ]uH/LHHMHMHHL79 /HEHML(9  tLHML9 HHN@HU ht HMH?HMLܽ9 ԽuHHM0y_H :ԥH{H` HH |HHxHϺHϺHϺHHHH h*HHUz(AEHHHK HKHDs(HKHU(ܤHKHUHΤHU03ɋBE3HULEȉMЉEHHMt"HUH=HHMuHHH@XP(HO=HHMHEHH@HP8HMHEHH@HPHe[^_A^A_]UAWAVWVSH8Hi(Hl$(HH}tHML9 H8[^_A^A_]UAWAVWVSH8Hi(Hl$(HH}tHML9 ػH8[^_A^A_]WVH(HH@xPHHH@@HL(FMHHYHD$ H=HDNHE3 }LEMHHHD$ H=HDNHE3Ǥ}HH(^_WVH(HH=0HϺHϺܢHH4yH(^_WVH(HHHH0=HHH@@P @yHH bH9 t HHHH;H(^_Ht@$ZyHH H9 t HWHHH;H(^_HHH H9 t H)HHHTH;`ukHMHqHMHI(HyHH H+tLLH3E3HH@HP HHHHH@PP HHH@HP(wHMHqHMHI(HyHLH HtH;HUHR0HMHHL3E3HH@HP HHHH@PP HHH@HP(HAHMHe[^_]UWVSH(Hi Hl$ HH}tHML9 H([^_]WVH(HH=xHHt HH(^_HH(^_WVH(MtOAx8uHHr0Ht?IxH z7HpH;t)H;u3HHHH@@Pt H(^_3H(^_VH Hy(HV(HJHH.uYHV(HJHHu=HV(HJHHu!HV(HJHHڊH ^øH ^HV(HJHHu!HV(HJH;HH ^øH ^WVH8HH pZHHHA$iHH 37HD$ 3HL$(HHE3E3HH@XP HH uH8^_VH HHH;u7HH@@H{hH` HH9 H ^HHH@@HH ^HDy(tHR0H$HHB0WVH(HH$HHHH@@P u HG8H(^_HHH%H(^_HWVH(HHHHH@@P tHH(^_HvHHtHN@HW tHH(^_AWAVATWVUSH HHIIHN~(uLHNLM3HH@HPH.HHNL9 HHLMHN9 l~(txHnH )/ЇHhHtNHnLML M H3HEH@HP HuHHHEH@PP HHEH@HP(~(uXHt'҅uH~HHNL9 Ht'{҅uHZHHNL9 H$3ۋo~WL58HcHHTLLzLfIIE3I$H@HP III$H@PP II$H@HP(;H []^_A\A^A_UAWAVWVSHHHl$pHH}3HHeHMHLEIHLM3E3HH@HPHUHJHHLF(9 HMy(HHH=HHH@`PHMHYL5IL=+I2tM6M7H5HHHH@`PH9 "HHMHL M HM3HH@HP HHHH@PP HHH@HP(HV0 HR33HUHEȉMHyHMH}HHH@@P t0 kHH FH9 t H(HHMS!%HH H9 t HHHM HHM+uH~8H L&uHLMuHH seHHHHK@HHSHH%LH HHL9 xHEHMLq9 it7HMLb9 ZHHM HML:9 2uHHHMHIHH@HPHe[^_A^A_]HHH@@P HKHUAWAVWVSH(Hi Hl$ HmpH}tHMLÛ9 H([^_A^A_]WVUSH8HH|$ 3HHHHNLSM3E3HH@HPHNHHLG09 OH^HW8HHtH ЩH9tHHtH H9 t HȂHH H)H*LHH9 HW` HR33HT$ HD$(L$0HHL$ t$HT$(HyHHL$ uHNHH@HPH8[]^_WVH(HHHNLIM3E3HH@HPHNLG8HHM@09 /HNLG(HHM@09 HNHH@HH@H(^_HWVUSH(3HD$ HHHNLM3E3HH@HPHNHHLG09 H^HW8HHtH H9tBH H)HHLHH9 cHHgHFHH,HLL$ E3HH@`P tMHL$ 9 Ht;HNL3E3HH@HPHNHWPHH@PP HNHH@HPḦ́HHHLL$ E3HH@`P tGHL$ 9 Ht5H^HL$ Hi(HL$ HHH@@LHH9 kHZHHHHLL$ E3HH@`P tGHL$ 9 2Ht5H~HL$ HY(HL$ HHH@@LHH9 HNHH@HPH([]^_UAWAVWVSHHHl$p3HEHEHeHH9 HH uHLMuHH H~LHH=IN~HnIVHI~MH XHgHL%9 HEHML9 HML9 LIN(HULEȐMtwH~H]L}Mv0IHtHH;t3Ht HIHH@@LHML3HH@HP HIHH@PP HHH@HP(HMLX9 PBHHe[^_A^A_]I9UAWAVWVSH(Hi Hl$ HmpH}tHML 9 H([^_A^A_]WVUSH(H33HHH@@P u-HH H9 t HW}HHKPHq0H HHHH@@P uLF8H~@LF8HuIHHH|HHtL{|H` H o|HHL3|HHLL|HHH([]^_VH03HD$(H5Hκ|H A5|HHL$(Hκ|Hz vHRhHL$({H0^覘DHADHI{WVSH HHH {HH {HKHd{HNHW{HNHJ{H [^_DHADHAAWAVATWVUSH@HIIL$L~A;r IO;ysrHcHTLLfOу+A;|$r ՁIIL$;ys.LcNDHl$ Lt$(HLzH@[]^_A\A^A_0AVWVUSH HIIHl$pLt$xHκUHHzH3>HHO8IDM3A}t H3H@8@@u HG8@@AH []^_A^WVSH HHV8HHtH ߠH9tyHHtH H9 t HyHHKxHIL-39 #HHN`HIL39 HH8H;K(u3Ҹ@t. 3@t HN`HIL9 ܑH [^_HN`HILʑ9 ‘H [^_WVH83HD$0HD$(HLFAxLD$(HT$0HHHT$0LD$(vtVHL$0H|$(tH3Ʌt.HHT$0LD$(tHHT$0LD$(t 3H8^_øH8^_WVSH HIH xHHKHwH wHH@HNHwH HNH HLHH [^_HVH IHtHHH ^H3H ^WVH8HH|$ 3HHQ@ HR33HT$ HD$(L$0HsHL$ wt'HL$(9 ytHLHL$ wu3H8^_øH8^_AWAVATWVUSH HHIH 2vHH rtvHLILܔvL8H vLIIM|HMIZvHHHHHMy(HNHQ8HHtH"H9t HdvH9 q{HHL֎9 Ύ;H []^_A\A^A_WVH8HH|$ 3HHHQ@ HR33HT$ HD$(L$0HЛHL$ vt+HL$(HQ0HN,vHHL$ uuH8^_WVUSH(HIHJ0HI(HQ0HHtH GH9 t \uHH[PHNHQ8HHtH H9Mt 0uHH;ufHO0HI(HQ0HHtH H9t uHHPHNHQ8HHtH H9t tHH;H([]^_3H([]^_WVUSH(HHIHn}w e{HMyHIHQ8HHtH >H9tStHHtH H9Mt H5tHHMxHIL39 HHEtHv~w zHNyvsHIHQ8HHtH H9tsHHtH vH9t HsHHNxHIL.39 $HHsH([]^_DHADHIsDHIrDHIHuHHH@@H@8HDHIHuHHH@@H@0HIfHIHt(zDtHHH@@H@8HHHH@@H@0HVH0H tmFrH3ɉL$ HκAE3uHH0^WVH(HHHHOwtHHHHHHH HHH  rHHH@`PHHHH@PH@(H(^_HH kqqH@<3HHzH+WVH8HH|$ 3HHH qHH3E3zHΐ(HzHWLHT$ HzHD$(H8^_WVH8HH|$ 3HHH pHH3E35zHΐ<(H8zHLHT$ HzHD$(H8^_DAuy u EDÃu >=WVH8HH|$ 3HHH ToHH3E3uyHΐ|(HyHWLHT$ HVyHD$(H8^_Dtt HHHHHHWVSH HH /LoHHXHuHۅt$Hr؅tHHH [^_H`HuH@@t%Hvr@tHHH [^_HHH [^_WVSH HH W/nHHXHuHۅt$Hr؅tHHH [^_H`HuH@@t%Hq@tHǰHH [^_HհHH [^_WVSH HH /mHHXHuHۅt$HUq؅tH/HH [^_H`HuH@@t%Hq@tHHH [^_HHH [^_VH HH />mHH LH~pH ^HWVH(HHHHHPu8HHH@@P(t&HHHPtHHH@@P(uHHHPuFHHH@@P8HHHlt"HHH@HHHHg H(^_H3H3H(^_WVH(HHHHHlu3HHHluJHǮHHkluaH /kHXHPlH(^_H } /kH`H"lH(^_H O /kHhHkH(^_3H3H(^_WVUSH(3HD$ H5 Hκ/DkHHXHL$ Hκ%'kHHHL$ HjH`HHjHhHHjHpHjHxHjH "kHLH3jL`HκjLhHκ|jHHLjH([]^_WVH(HH 2jHH3E3kHNH jH jHH3E3vkHNHiH riHH3E3KkHNHiH OiHH3E3 kHN HiH ,iHH3E3jHN(H`iH [iHH3E3jHN0H5iH 0iHH3E3jHN8H iH {iHH  iHHOhHN@HhH hHH hHHOhHNHHhH(^_WVSH HHIHNHchLFHHC HNHFhH [^_UAVWVSH@Hl$`3HEHeHMHULE H5 Hκ/hHHκngHL0MuHH gHH(HHKgHHSH0HgLH KHJhHH8HuHH 4fgLH(HGINAgH"IVH8I&gIH gLD$ IHLE3pIL9 HEHML9 tSHML9 HM H3gLE MHMHUHE!HML}9 uuHHHEHe[^_A^]H5Hκ/ZfH`HM fLE MHMHUH#He[^_A^]HHlIlUAVWVSH0Hi(Hl$(Hm`Hʐ 6u躂H:H0[^_A^]UAVWVSH0Hi(Hl$(Hm`H}tHML~9 ~H0[^_A^]DHIHH@`H@(HDHIHH@XH@ HDHADHADHL$HILD$M@HHAWAVAUATWVUSH8HHH e eHHq0H-Hͺ9dLMHͺndHLXMuHH ^dLH(H;IM[dHDIUHXI@dMH vdLMI36dD$ H|$(Ll$0HIMLH8[]^_A\A]A^A_AWAVAUATWVUSH8HHH {dcHHa/H-rHͺ9cLMHͺncHLxMuHH NpcLH(H:IMKcH`bLH(H9IM;bH4IUHI bMH VbLMI3bD$ H|$(Ll$0HIMLH8[]^_A\A]A^A_AWAVAUATWVUSH8HHH kcaHHI/H-RHͺ9aLMHͺn|aHLMuHH .PaLH(H8IM+aH,IUHIaMH FsaLMI3aMIͺ`D$ H|$(Ll$0HIMLH8[]^_A\A]A^A_DHIH(h9 HDHAUAWAVWVSHXH$3HEHEHeHHMIH -`LHIHU8gL|$ L}@L|$(HHDM0E3HEHMк9 iHEHN0HH@@P H 2`HHMHEHH@pP t9HMHHEHH@pHN(H9 fiHMHEHH@pP uHOiHINH AVHEHHVHEHe[^_A^A_]UAWAVWVSH8Hi0Hl$0HH}tHML x9 xH8[^_A^A_]UAWAVWVSH8Hi0Hl$0HH}tHMLw9 wH8[^_A^A_]AWAVAUATWVUSHHH|$h3HHIAH$9 XhLIκIH@PP I3IH@PPu_Ht4{u& aHHL>^HIIH@PIHIH@PIHĈ[]^_A\A]A^A_H X]LL%pI $HHu3E3HDJD$ IE3aL$3A}n$HcITHT$PH RXd]I $HHu3E3HDJD$ HD$8HE3`HD$8HD$HH X]I $HHu3E3HDJD$ HD$0HE3g`HD$0HD$@H3ҋIE3H|$hLD$pT$xL$|HL$hH]tPLL$pAq t/Ay$uIHT$HLD$PIHT$@LD$PHL$hHV]uHD$HPHD$HPAWAWt7_HI_HHI_^HI_HHIx_HL$HHH@@HI^_HHIK_HD$@PHD$@PAWAWt7^HI_H*HI_`^HI^HHI^HL$@HH@@HI^HHI^$A9MH U [HHHu3E3HDJD$ HE3]^AGAGtO]HHI^HrHH6^]HH$^IIH@@HH ^Ht,{uS]HH]HH]HHH@@HIIH@PIHĈ[]^_A\A]A^A_AVWVUSH0HHIIH TYLH H HHu3E3HDJD$ IE3>]LOLL$ L nM HILLOLL$ L TM HILLOHuHu H3Ʌt L M LL$ L M HILrVVtHHH\HHH\IIH@@HHl\HHHHX\H0[]^_A^HAVWVUSH HHIILt$pMVVtHeHH\HH[H&HH[HH[H/HH[H9 (bHHH@@P8ع{!XH` HH(\L3\HHWHHHZ[H WHHaHHHH@HP8HIHH@`PHaHH9 aH []^_A^VH H 9aWHHH8H/WHH)HWHHHWHH HVHHHVHHHVHHޝHVHHϝHVHHHwVH ^AWAVWVUSH(HHH GYVHH _wawsVHHK.VHNH!VHH˺z$VHLMuHH F|ULHHi-IOUHvIWHIUMH GULI3MgHNIUH {UHH3E3VHN H_UH XZUHH3E3VHN(H4UH 5/UHH3E3VHN0H UH UHH "v$vUHHjUHN8HTH ~THH uuTHH.UHN@HTH jTHH3E3UHNHHfTH ~aTHH uu{THHM6THNXH)TH :$THH3E3_HN`HSH _SHH3E3/HNhHSH SSHH˺#SHHH͐&HNpHSH SSHHH͐HNxHpSH kSHH3E3_HHBSHH2SH([]^_A^A_WVH(HH jSHGbSGHOHRHH(^_WVHhHH|$(3HHIxoD$HoBD$XoD$HD$(oD$XD$8HT$(8Hh^_H(HIx9 菩H(VH HHN(9 SHHN HS9 H ^HWVSHHH|$ 3HHHIHO`oD$`oFD$poD$`D$ oD$pD$0HT$ LABJHOhoD$@oFD$PHoD$@D$ oD$PD$0LD$ AHĀ[^_WVH(Hq`H~(u*H /JQHHOH2QHN(H%QHF(H(^_AWAVWVUSHHH|$83HHHHM`oD$8oCD$HHT$89 qBtHĘ[]^_A^A_oD$xoC$HMxoD$xD$8o$D$HHT$89 脧t3HĘ[]^_A^A_HMpoD$8oCD$HHT$89 HH xPLH ,LPLIHPPPHH )tOHI'HF(F,H_HHNOHHFPD$ D$(3HL$0HκtAE3XPIL3zOHM3HMpoD$XoCD$hoD$XD$8oD$hD$HHT$8辌3HĘ[]^_A^A_WVSH@HH|$ 3HHIHIhLD$ 9 ~HHt$ OO|OHHH@[^_WVHhHH|$(3HHoD$HoBD$XoD$HD$(oD$XD$8HT$(AFHh^_H(H9 ?H(AVWVUSH0HHIILvPHHHHLMLH|$ HIE39 W@tTHH Y/MHhH9 W}%H@Xtu3H3H0[]^_A^ËH0[]^_A^UVH8Hl$@HeHMLEILEIpPL܂H]qHDMHHHLe9 eHEHMLe9 etUHMLe9 eHHPtHMLe9 euHV@HMHeLHHEHHe^]UVH(Hi Hl$ Hm@H}tHML\e9 TeH(^]DHHWVUSH(HHIHL%e9 eHuH AKHHOHHHM|(HOHH9 EMHȋQLMH([]^_H pHKHuH pbKHHH#SHHOHHLALH([]^_WVSH0HL$(HHHHQ0HHCHu H>KHHא"t!H tHIHKHHΐ H0[^_WVUSHxHH|$03HHL$pHHL$0WAA A0H HHR0HHBH\$0S$BIT5H@HwHHHxBBBHH@HHA;\$HcHI| HGBHOH:B] AHMD;q8PHe[^_A\A]A^A_]H ffH}BLMu KHMDi8HMHq3E;~sHcHk0HTz ]}KM 3LMWAAAII HXHLHohoBxIG(HMohEoxEIHuH1A}H@HPHxHu]AWAQAKAHLPI̋@] HX}A;He[^_A\A]A^A_]ùSJ\UAWAVAUATWVSH(Hi Hl$ H9JHH([^_A\A]A^A_]DHHD3WVSH HHHIА |7HV;BsEHcHk0Ht H]@W@Q@HHH [^_WCHH [^_\WVH(HIHΐ[ |5HV;BsAHcHk0Ht ???HH(^_WG3H(^_[AWAVAUATWVUSHXHL$PHHHPH~H^H.HHQ0L2M^0MuHj?LHH9 A؁HNÙyDAD;yIcDlEHND;iIcHk09\ucLFLD$@HND;iHD$HLLLL$8HM^8MucH>LLD$@LL$8IIL9 AHD$Hu>EHND;aWDlEc3HX[]^_A\A]A^A_LD$@LL$8E}5HNHVLEHE; MDEP D;yMcFT5HVHDIE;McMk0LE;MDEX F\A@N@AH E;3HLIWAA@Dn@FDF<HX[]^_A\A]A^A_AWAVAUATWVUSHXHL$PHAH f=H3DuE~HcDD;L>IHQ0L"ID$@Hu H0=HȋH ^4HNHL43HVz~H;HsYLcBD9JHHQ0HHB@Hu H4Hȋ4HNH3F@H(^_PAWAVAUATWVUSH8HL$0HHHx H~H^H.HHQ0L2M^0MuHj4LHH9 A؁HNLÙyA;P% HcE|EHND;y IcLk0B9\!uOLnHND;y JD!HD$(HM^8MuYH3LHD$(IHL9 Au9HFD;x F| EyH8[]^_A\A]A^A_HD$(AH8[]^_A\A]A^A_AWAVWVUSH(HL$ HHH@ HyHDF1HHHx[]^_WVSH@HH<$3HHH$W@@ @0HH $A9 >IM_pMuHȃ<&LHUH9 AHUoEhoExohHoxXHMoH(oX8L(AHL=9 =AHHe[^_A^A_]ù.UAWAVWVSH(Hi Hl$ HHtHL=9 =H([^_A^A_]DE3HHWVH(HL$ HI~ HHHu,H HQ0HHBxHu HQ$Hq.HHNH#H(^_DL3H'HDE3H HD3E3HHWVSH HHIH /6#HhHn%t*H 6#HHHLCHH [^_H Q6"HHHLHH [^_AWAVATWVUSH0HIHN"H^H '"HHHH@PP8LH /:t"LMHH*H G"HMH3?"Hl$ H|$(HIMAHNH!HN9 +HNH!H0[]^_A\A^A_WVH(HHNHH@pP @tCH~ u)HHH@@P(H dF!HN Hq!HNHV HH@p3HF H(^_VH HH&HNHH@PHNHH@HH@ H ^HWVH(HHHHH@PP t }HHH@PPHH)hHH-!u0HhHH!uH hHH u 3H(^_3H(^_WVUSHHHH|$(3HHHHHH@@P0HHHH@@P8HHL$(WAHHH@HLD$ HL$(HLŐ5HHt$(   HHHH[]^_WVH(HL$ HHHF*u!HOH tHIHQ H(^_3H(^_DVH H :AHHHfHHHfHH ^VH HH)u%HHIH;t HHxFH ^3H ^WVUSH(HHIIHt'H>)uHHH@@HH3HHt(H )uHHH@@HNH3HNHt)H(uHHEH@@HNH3HF|$p~H([]^_WVUSH(HHH HH}HHHːH([]^_WVSH`HH|$ 3HoD$@oAD$PoD$ oBD$0H lFHH{Ht$ HHHL$@PH`[^_DHDHADHADAWVSH HHHHtH H9 t3HtcHH9tHH 4HNHHqHYIHHHt"HWHtHWHu 3H [^_øH [^_WVH(H3HHtHH@@PHNHt HH@@P3HNHt HH@@P3H(^_WVSH HH=OHH>tHHZHH~t6HHuH1UHH-HHVHHH~t6HHuHTHHHHVHHHH [^_DH9uHyu Hy3WVHHHH|$ 3HHL$@HHHHQ0HHBHu Hw{HH֐tCHH9tHH HoD$ oFD$0HHT$ H HH^_WVUSHxHH|$03HHL$pHHL$0WAA A0H HHR0HHBH\$0SHHHx[]^_WVHhHH|$ 3HHL$`HHHHQ0HHBHu H[vHH֐?tjHH9tHH HoD$@oFD$PoD$@D$ oD$PD$0HHT$ Hh^_3Hh^_UWVHH$HH}3HHeHMHMHULE H}HMH HQ0H2HF Hu HvHHU A"HUH !H9 tHUH HMHoEoAEHNtHIoEEoEEHU LHMoEEoEEHUAHe^_]ù!UWVH0Hi Hl$ HHMH HI0H1HNtHIHHM G!HH0^_]UWVH0Hi Hl$ HH THHM!H`H0^_]H(HHH H9t3HH(UWVHH$HH}3HHeHMHMHULE H}HMH HQ0H2HF Hu HtHHU A HUH 1H9 tHUH !HMHoEoAEHNtHIoEEoEEHU LHMoEEoEEHUE3ɐHe^_]ùUWVH0Hi Hl$ HHMH HI0H1HNtHIHHM ZHH0^_]UWVH0Hi Hl$ HH %gHHM"H`H0^_]WVHHHH|$ 3HHL$@HHHHQ0HHBHu Hq{HHאtcHH9tHH HoD$ oGD$0HHT$ X|HV;BsHcHk0HDHH^_3HH^_0DHlHDHTHD3D3VH HH~0uH zHHN0E3THF0H ^D3WVUSHxHH|$03HHL$pHHL$0WAA A0H HHR0HHBH\$0SMcMk0JL!9YuRLFHoD$`oAD$poD$@oGD$PILD$@HT$`LT&9 L&u3EHFD;pF| Ep3HĀ[]^_A\A^A_E}-HFHVD;zJL"Q ;hLcBT'HVHD;psiIcLk0D;zs\JL"Q BTAF@A HWAHFD;xs(3JT D~@FDF<HĀ[]^_A\A^A_(AWAVAUATWVUSHXHH|$03HHL$PHAH 5P H3DuE~HcDD;HHQ0HHB8Hu Hjp Hȋ LHNDF8DD$ E3DD$(M3E3Wto3ۃ~8~gEoA;HcHk0ILytALHVHoD$0oAD$@HHT$0L]$9 U$%AD$;^8|E3~8~?EoE;sbIcHk0ILA|A;sGHc‹DA HcDdAD;f8|HNH HNIz HX[]^_A\A]A^A_.'VH HN8HE3HH ^HAWAVWVUSHHH|$83HH$HLHL$H9 >H$uHĸ[]^_A^A_H QHH$9 HPHH$9 H$H PL1H r LIH9 HH Q; HNHF H g3 HNH" 3LvA~~I;hHcDA9nL6IHQ0H*HE8Hu Hg HȋX HNHF@IH$HE(Hu Hjg H OL9HLIH9 HIHE(Hu H*gC HH HHu 3DsE~xHcH HLHHRHHoD$`oBD$pHL$(oD$`D$8oD$pD$HHHT$8LD$(MA@D;3HF~<HH9 Hĸ[]^_A^A_O$AWAVAUATWVUSHHH|$H3HHHIAH{u H3HKoD$hoFD$xHT$hL 9 ~ DAHKAƙyDE3D;yNMcFlEHKD;i/McIk0HD$@HLD9quRLCHoD$hoAD$xoD$HoFD$XILD$HHT$hL9 uUAHKD;iHD$@DlEeKD~rDk@HCD;hIcHk0DC@ɉKD@t <HSD;jSHD$@HLHCHHMHIX9 3HHL ZH LfHQXH(HHUWVH0Hl$@HeHMHUHRXH0HM{HHHtH iH9t HHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 qH9 ^HHMHIX9 SHHL,YH? LfHQXH0H!HUWVH0Hl$@HeHMHUHRXH8HMHHH; FtH =HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 tHHLMXH`WVSH HH^XH [LH8AxHH#H [^_HUWVH0Hl$@HeHMHUHRXH@HMHHHtH H9t 6HHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 ~HHMHIX9 sHHLLWH_LfHQXH@HAHUWVH0Hl$@HeHMHUHRXHHHMHHHtH H9t VHHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 HHLlVHLfHQXHHHaHUWVH0Hl$@HeHMHUHRXHPHMHHH; tH HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 1H9 HHMHIX9 HHLUHWVSH HH^XH LHPAxHHcH [^_HDHQXHHIHDHQXHH)HDHQXHH HDHQXHHHDHQXHHHDHQXH HHDHQXH(HHDHQXH0HiHDHQXH8HIHDHQXH@H)HVH HHHVHHtH H9tQHNXHH ^DHAXUWVH0Hl$@HeHMHUHRXHHM;HHHtH )H9t HHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 YH9 HHMHIX9 HHLRHLfHQXHHHUWVH0Hl$@HeHMHUHRXHHM[HHHtH IH9t HHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 >HHMHIX9 3HHL RHLfHQXHHHUWVH0Hl$@HeHMHUHRXHHM{HHHtH iH9t HHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 ɞH9 ^HHMHIX9 SHHL,QH?LfHQXHH!HUWVH0Hl$@HeHMHUHRXHHMHHHtH H9t 6HHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 ~HHMHIX9 sHHLLPH_LfHQXHHAHUWVH0Hl$@HeHMHUHRXH HMHHH; tH HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 9H9 HHMHIX9 HHLlOHWVSH HH^XH {LH AxHHCH [^_HUWVH0Hl$@HeHMHUHRXH(HMHHHtH H9t VHHHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 QH9 HHMHIX9 HHLlNHLfHQXH(HaHUWVH0Hl$@HeHMHUHRXH0HMHHH; tH }HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 HHLMHWVSH HH^XH LH0AxHHcH [^_HUWVH0Hl$@HeHMHUHRXH8HMHHH; tH }HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 HHLLHWVSH HH^XH LH8AxHHcH [^_HUWVH0Hl$@HeHMHUHRXH@HMHHH; tH }HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 HHLKHWVSH HH^XH LH@AxHHcH [^_HUWVH0Hl$@HeHMHUHRXHHHMHHH; tH }HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 ҘH9 HHMHIX9 HHLJHWVSH HH^XH LHHAxHHcH [^_HUWVH0Hl$@HeHMHUHRXHPHMHHH; tH HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 HHLIHWVSH HH^XH LHPAxHHcH [^_HUWVH0Hl$@HeHMHUHRXHXHMHHH; tH HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 HHLHHWVSH HH^XH LHXAxHHcH [^_HUWVH0Hl$@HeHMHUHRXH`HMHHH; tH HFHe^_]UWVH0Hi Hl$ Hm@HHMHIX9 H9 HHMHIX9 HHLGHWVSH HH^XH LH`AxHHcH [^_HDHQXHHIHDHQXHH)HDHQXH(H HDHQXH0HHDHQXH@HHDHQXH8HHDHQXHHHHDHQXHPHiHDHQXHXHIHWVSH HH={HHVXHHu HHHVXHHu>HHluHHHHHHHHHH.uHsHHoHHHHWHHH [^_AVWVUSHPHH|$03HHHAHVXHHHHVXHHLHVXHL$0WAHHLȉ|$ HL$0HMƐ>HHt$0HHHP[]^_A^H(HIL@9 8%H(DHIHRHH@@H@HWVSHHH|$0p3HHHIHuH@@.HtHHӐF(;C(t 3H[^_H$WAA H$3ɉ$K4$H$WAo$$o$$o$$H$*FZo$$o$$o$D$Po$D$`HHT$P2-H$EuH$WAA H$3ɉ$K4$H$WAo$$po$$o$$H$p'EWo$$Po$$`HL$pWAA Ht$p3ɉL$xN4L$|H$WAoD$p$ o$$0o$$@H$ ~Do$0$o$@$Ho$PD$Po$`D$`o$D$0o$D$@LD$0HT$PL9 uH$ Cj&H$pCH[^_3@H[^_WVSH H~(H ԠTHDHHE3HH [^_UAWAVATWVSHHl$ HH}&3HHeHH vHEHHA~(3ɉHL9 HEHML9 t!HU`HML9 DžHM.3HH tuH H9MtH[^_A\A^A_]ËF,3PPDAd\AƺHLMtIIH jjIuH L|$ HH ALxDp@L9H QALH LIL$IEt$M3ɉHL9 HEHML9 HU@HMLy9 qoE@E oEPE0HHU ؅|,Iϋ9 ]u.IϋV@uHML9 hHMHH sH H9MtH[^_A\A^A_]UAWAVATWVSH0Hi Hl$ Hm H}tHMLt9 lH0[^_A\A^A_]UAWAVATWVSH0Hi Hl$ Hm H}tHML79 /H0[^_A\A^A_]AWAVATWVUSH`HH|$ 3HHHIHoD$@oFD$PHT$@2HKǙyDLǙyA;PHcALDyEHKLAPD;nIcL$C9|uSLCJLoD$@oAD$PoD$ oFD$0ILD$ HT$@L29 *uDHCD;xF|EoC0|6DHCD;`IcH DC0BD}3H`[]^_A\A^A_ËK,HC;HuHːxHKǙyDC,DC,HCHЋJD;sxIcLHHHN09 `H0HHHHN09 :H@HHHHN09 H8H̚HmHHN09 HHHHHHN09 ȥHPHHaHHN09 HXHZHCHHN09 |H`H4H ^WVH(HH HHHHCLHH(^_H(H NH(VH HHϤHHHĤHH*WH ^HVH HHHHWH ^HDHDHDHDHDHDH DH(DH0DH8DH@DHHDHPDHI(HH@@H@0HVH H <HHfHH ^WVSH0HH wyHH /HH LD$ HHE3-HHHN0L H HH HH T&LD$ HHE3ĢHHHN0LH HH mHH LD$ HHE3[HH#HN0L;H <>HH HH TLD$ HHE3HHHN0LҡH ՖHH HH LD$ HHE3HHQHN0LiH jlHH JHH LD$ HHE3 H HHN0L H HH HH GLD$ HHE3H(HHN0L(H HH HH ގLD$ HHE3NH0HHN0L0.H /1HH HH -GLD$ HHE3H8HHN0L8şH ƾȔHH HH ޔLD$ HHE3|H@HDHN0L@\H ]_HH ]HH uLD$ HHE3HHHۓHN0LHH HH HH  LD$ HHE3HPHrHN0LPH0[^_VH HHAHHN09 jHH"H#HHN09 DHHHHHN09 HH֒HHHN09 HHHHHN09 ҝHHHHHN09 H HdHHHN09 H(H>HoHHN09 `H0HHHHN09 :H8HH+HHN09 H@H̑H HHN09 HHHHHHN09 ȜHPHH ^WVH(HH (bHHH>HH(^_H(H H(H(HfmH(VH A H;B4Lm3AHWAH ^WVSH HN[mH@,;KmH ̌HHH{e_YHHH [^_WVSfHHqH3-'HH[^_WVSH HًC H;B4mSH ;Q,}(HADD;@*mMcOB|}*JK͋A,CHCW@3H [^_HA;PlHcHHtH{{HCH [^_DWVHHHH3FG4F HWF^_AVWVUSH HIIًl$pDt$xDlHNHNHHNHn Dv$H []^_A^WVSfHIIHNȎHNHHNHF 3F$[^_DHADHADHADA DA$WVH(H5/Hκ*=HHHlH HH]HHHNHݍHH?HƍHH0HH H!HH(HHH0HHjH8HHSH@HHH %/JHHpHoH `HHpHHG(G,H%HHO҂HHvD$ D$(3HL$0HϺE3E3HHGHH8[]^_UAWAVAUATWVSH)$H$3HEHEHHLE LM(HHH]0Lw0H |1LH |!LH |LbHPHP IMށIL$IЁIOIÁL}H {LH p#*LIILeIOIL9 LgHȥHHHHL9 HEHML9 xHMLm9 eHHAH BLHHH@@P(HHAG(AG,Hi#HIOIHPAG '3AO$3IOAG(AG,HILϛ9 ǛHW0Lz(HW8Lb(AFPHHH ){;HHuE3LEID$ H`HHE3IHXAFPGHPH`HHR@HHP(H{H` HHHXSHEH yzHHIH%HLEHH RyDD@,HHHiHHHHH H yH@IHH y~HH x~LPIP HHH~HHHH~H@HHHw~H@HHH_~H hxZ~L@IQD@,HH{H@HHH~H@HEH x ~H8HHHH}HEHHH8L;9 3HMHy umH x}HH w}LPIP HHH}HHHHh}HUHJ HS}HMHI HUL9 HM?Hx?HpHxB@`H x}H0AvPH=H(SHhH ex|MLxH(HHH0|H(HHHx|H :w|H HHIh|H wc|LIO(H(G|IO0H 6|H w1|M LpHHHH0|HHHHp{H v{HHHI{H ;w{LIL$(H{IL$0H{H 'w{M(LhHHHH0c{HHHHhK{H uF{HHHH*{H v%{HHO(H {HO0HzH vzM0L`HHHH0zHHHH`zH ^uzHHHHhzH uzHHH(HczHHH0HKzH uFzM8LXHHHH0zHHHHXzH ItyN8+NDHHH tyHHHHyH /uyHHH(HyHHH0HyHp9 :~HȋIL۔9 ӔHp~HȋIL9 Hp}HȋHL9 Hp}HȋHL9 {Hp}HȋHLc9 [Hxn|HȋHpLC9 ;HxH9HMzHȋHxL9 HML9 +HfHMyHxtHHHH@@P03~$HM HU(LEA9HM HE HH@HP($He[^_A\A]A^A_]UAWAVAUATWVSHH)t$0Hi(Hl$(HH}tHMLV9 N(t$0HH[^_A\A]A^A_]WVH8HH|$ 3HHHV0HR0 HR33HT$ HD$(L$0HHL$ wtTHL$(Hy0HHHu HHHt Hx 3҅uH@HL$ uwu3H8^_øH8^_WVHxHH|$(3HHH vHH3E3 x3HL$(WAHQ Ht$(VH `\HLMuHH 7[HHH<:HM[H=}HUHH[LH HbuAGh1HMH?IH8[]^_A^A_WVUSH(HH dON[HH $>[HH3E3\HKH[HOH [t v9wH([]^_DAVH t v9QH ^DHAAWAVWVUSH(LHIIH$L=IH%HHH2fLMHH pHHHfIHH N,ZLAGIOHZH$IHMLHH([]^_A^A_HAWAVATWVUSH03HD$(HHIILD$(HHLH liYLMMuJH ӃYLIHB8IL$_YHzIT$IICYMH AIZHH NdtIH0[]^_A\A^A_HL$(HL$ HHLLLH ԎIdHH ɎYH0[]^_A\A^A_AVWVUSH0HHIIH+HHOdH(HH"HH*MH8^_HHzt H8^_3H8^_UAVWVSH@Hl$`3HEHeHHI3HH "sDLLI3RIHE39  XHEHHULiHEHHEHe[^_A^]UAVWVSH0Hi Hl$ Hm`H}tHMLh9 hH0[^_A^]UAVWVSH0Hi Hl$ Hm`HH pKHH}WHֹgHHLH}H\H0[^_A^]WVUSH8HHIH Pp*KHH @iBiDKHHMJHHLuHHKHH8[]^_H>H /JHH`HPtH`HKHHpPH nuJHHpH:HG(G,HHHO5JHHJD$ D$(3HL$0HϺE3E3JHHJHH8[]^_UAWAVAUATWVSHXH$3HEHeHUHIIL}0Lu8H nILH ggIHIL$xILeH 5/zIHXMu HAE ILDEH |m.ILH |H IHAF(AF,HHINHIHID$ D$(3HL$0IκAE3IHMI]IHE"IHLET u HEH CzHL3ɉL$ I̺AE3LHuE3HIKDEtHHULMOI֐OHHKHSLEE3HH@`PHK HSME3HH@`PHOLAHK0HSE3HH@`PH5HHːiHxtHHHH@@P03H IYGLAFH qkGLHːHH }OSLIOI7GH hIOH m}IMMLHURHMMIHːH9 StHEmH~u*H @GHHVHFHNHFHNHMHMHHEHH@XPH'HEHe[^_A\A]A^A_]He[^_A\A]A^A_]UAWAVAUATWVSHHHi8Hl$8HH}tHMLc9 bHH[^_A\A]A^A_]UAWAVAUATWVSHHHi8Hl$8HHHMFHOHH[^_A\A]A^A_]UAWAVAUATWVSHHHi8Hl$8HHHMMFHHH[^_A\A]A^A_]UAWAVAUATWVSHHHi8Hl$8HJHHMEHHH[^_A\A]A^A_]UAWAVAUATWVSHHHi8Hl$8HHHMEH_HH[^_A\A]A^A_]UAWAVAUATWVSHHHi8Hl$8HHHM]EHHH[^_A\A]A^A_]UAWAVAUATWVSHHHi8Hl$8HHHΐt!LEHֹ#HHMD aHHH[^_A\A]A^A_]WVH8H ShDHH CH DHF(F,HHHNCHHiDD$ D$(3HL$0HκAE3{DHH8^_UAWAVWVSHHHl$p3HEHeHLIIH B-TCLSI5HFHE3EԀ~u+E-CHعNHH;CHEH]Hu"H ccCL IILIIL:H~H viBHL8MuDH lBLHHtINnBHdIVH8ISBMH axHIuOH~u*H ;XBLHVIBHNI BHvHMNHHHH@XPH}HHEHe[^_A^A_]UAWAVWVSH(Hi Hl$ Hmp}t$H}tHMȺMt HMMH([^_A^A_]UWVSH8Hl$PHeHHH ZhTAHHPGHH9 ZMHEHMHE3HEHH@hP8H He[^_]UWVSH(Hi Hl$ HmPH}tHML]9 ]H([^_]UAWAVAUATWVSHHH$3HEHH^~(uAE3L~LLLMIϺLt~ ut~$un{\@H` H e@LLFI39@LFIϺ'@HHHM?H؉}}L~Df H )d?LN$L|$ Dd$(L$03HL$8IHDE@IHe[^_A\A]A^A_]H c?H}F(F,HHHN]?HH@D$ D$(3HL$0H΋EE3@HHe[^_A\A]A^A_]WVH(H 2?HHunL8HrH A>H c8>HH>L‡MHHH4LHH tJHHJH(^_HWVH(H 2`>HHunL7HqH ^AB>H 7=>HH=L"MH HHLHH #t JHHJH(^_HWVH(H k2=HHunL,7H=qH A=H 7=HHI=LMHHHLHH ss]IHHWIH(^_HWVH(H 2=HHunL|6HpH >A:HHH@`PHHH@pP LH˺ :H ZdL:HHH@`PHHH@pP LH˺9H `:HHH@`PHHH@pP LH˺9H c9HHH@`PHHH@pP LH˺a9HH9 EH l^9HHLE3/9L2HoH A9HMHLHEHH@XPHHN9 Du&H"EHHU HH@HH@(He[^_]HHVH nDHH 2H9H @i8L@MurH b\8HH iW8HHu H>HK8H YHKH i8H@H7LH pnHLLDHH 17HHH%:HTUWVSH(Hi Hl$ Hm`HMLtT9 lTH([^_]UWVSH(Hi Hl$ Hm`H}tHMLCT9 ;TH([^_]DWVUSH8HHN7HN6HH gHH ]a3m73HT$(HD$ HHAtE39 JCHNH6H &HH L07HH a373HT$0Hl$ HD$(HHAtE3BHNHi6H HH `6HH `363HT$0Hl$ HD$(HHAtE3BHN H 6H ~HH 2f6HH L`3\63HT$0Hl$ HD$(HHAtE3>BHN(H5H *HH Z 6HH _363HT$0Hl$ HD$(HHAtE3AHN0HU5H8[]^_H(HL$0HA(HHT$0HRE3HH@`HHHtH 1H9tM5H(LfHL$HA HHT$HRE3HH@`H@HH(HL$0HAHHT$0HRE3HH@`HHHtH .H9t4H(LfHL$HAHHT$HRE3HH@`H@HLfHL$HA0HHT$HRE3HH@`H@HUWVH@Hl$PHeHMHMHqHMHyH X3U4HD$ 3HL$(HHE3E3HH@XP HHHtH A-H9t 3HHuHEHe^_]UWVH@Hi0Hl$0HmPHH9 ?Hu H?HH '0Q3HH?HHH@@P HH?H3?HMOHH?HMHH9 ?HHHEH?H@^_]VH H|H q/2HxH4t+H s72HHHHH ^H H7Z2HiHHHH ^H /:2HxHr4t+H 6 2HxHHLHH ^H 61H-HH!HH ^DHADHI1DHADHIa1WVUSH(HL$ HH>HHQ0HHCHu Hm 2H1HH3E32HNH0HHCHu H1H0HH3E3K2HNH0H([]^_UWVSHXHl$pHH}ȹ3HHeHMHMHHMH9 =HHU9  =bH}HH1HHMHIHLA1HMHIH1}HMHIHLA1HMH HQ0H:HW HuH(0HHMW7eH He[^_]UWVSH(Hi Hl$ HmpHMH HQ0H:Hw(HuHԑT0HHM֐H([^_]H(HI0| H(3H(H(HI0| H(3H(WVH(HHHHHH@@P tHNH9 q0H(^_3H(^_WVH(HHHHHH@@P(tHNH9 10H(^_3H(^_WVSH HHIHNHLA/HNH/}HNHLA/H [^_DHHDHHWVH(HH{-H` HB2HHH}H(^_HWVH(HH{-H` H1HHH5H(^_HWVH(HH{J-H` H1HHHH(^_HWVH(HH{,H` HR1HHHH(^_HAWAVWVUSH(HH Q-HL vMH3,LvMHϺ,LuMHϺg,LuMHϺO,LuMHϺ7,LuMHϺ,LuMHϺ,HNpH+H QK@,HL~uMH3+LquMHϺ+LauMHϺ+LQuMHϺ+LAuMHϺp+L1uMHϺX+L!uMHϺ@+LuMHϺ(+LuMHϺ+LtMHϺ *LtMHϺ *LtMHϺ *LtMHϺ *LtMHϺ *LtMHϺ*LtMHϺh*LtMHϺP*LqtMHϺ8*LatMHϺ *LQtMHϺ*LAtMHϺ)L1tMHϺ)L!tMHϺ)LtMHϺ)LtMHϺ)LsMHϺx)LsMHϺ`)LsMHϺH)LsMHϺ0)LsMHϺ)LsMHϺ)LsMHϺ(LsMHϺ (LqsMHϺ!(LasMHϺ"(LQsMHϺ#(LAsMHϺ$p(L1sMHϺ%X(L!sMHϺ&@(LsMHϺ'((LsMHϺ((LrMHϺ)'LrMHϺ*'LrMHϺ+'LrMHϺ,'LrMHϺ-'LrMHϺ.'LrMHϺ/h'LrMHϺ0P'LqrMHϺ18'LarMHϺ2 'LQrMHϺ3'LArMHϺ4&L1rMHϺ5&L!rMHϺ6&LrMHϺ7&LrMHϺ8&LqMHϺ9x&LqMHϺ:`&LqMHϺ;H&LqMHϺ<0&LqMHϺ=&LqMHϺ>&LqMHϺ?%LqMHϺ@%LqqMHϺA%LaqMHϺB%LQqMHϺC%LAqMHϺDp%L1qMHϺEX%L!qMHϺF@%LqMHϺG(%LqMHϺH%LpMHϺI$LpMHϺJ$HNxH$H I$HH3E3&HpLHpHHA&HLHA&LH{pHHA%H-jpLEHgpHHA%HULHA%L5@pMH>pHHA%ILHAw%HH#H xI#HB#LIHO#HoHH3$HoHH $HoHH $HoHH#HoHH#HoHH#HoHH#HoHH#HoHH#HtoHH#HioHHu#H^oHHb#HSoHHO#HHoHH<#H=oHH)#H2oHH#H'oHH#HoHH"HoHH"HoHH"HnHH"HnHH"HnHH"HnHH~"HnHHk"HnHHX"HnHHE"HnHH2"HnHH"HnHH "HnHH!HnHH!HwnHH!HlnHH!HanHH!HVnHH!HKnHH!H@nHHt!H5nHHa!H*nHHN!HnHH;!HnHH(!H nHH!HmHH!HmHH HmHH HmHH HmHH HmHH HmHH HmHH} HmHHj HmHHW HmHHD HmHH1 HzmHH HomHH HdmHHHYmHHHNmHHHCmHHH8mHHH-mHHH"mHHHmHHsH mHH`HmHHMHHH fCHH3E3LlMHlHHALlMHlHHALlMHlHHALlMHlHHAL|lMHzlHHA`LilMHglHHA=LVlMHTlHHALClMHAlHHAL0lMH.lHHALlMHlHHAL lMHlHHALkMHkHHAkLkMHkHHAHLkMHkHHA%LkMHkHHALkMHkHHALkMHkHHALkMHkHHALrkMHpkHHAvL_kMH]kHHASLLkMHJkHHA0L9kMH7kHHA L&kMH$kHHALkMHkHHALkMHjHHALjMHjHHALjMHjHHA^LjMHjHHA;LjMHjHHALjMHjHHALjMHjHHAL{jMHyjHHALhjMHfjHHALUjMHSjHHAiLBjMH@jHHAFL/jMH-jHHA#LjMHjHHAL jMHjHHALiMHiHHALiMHiHHALiMHiHHAtLiMHiHHAQLiMHiHHA.LiMHiHHA LiMHiHHALqiMHoiHHAL^iMH\iHHALKiMHIiHHAL8iMH6iHHA\L%iMH#iHHA9HHH b<|HH3E3LhMHhHHALhMHhHHALhMHhHHALhMHhHHALhMHhHHA\LhMHhHHA9LrhMHphHHAL_hMH]hHHALLhMHJhHHAL9hMH7hHHAL&hMH$hHHALhMHhHHAgLhMHgHHADLgMHgHHA!LgMHgHHALgMHgHHALgMHgHHALgMHgHHALgMHgHHArL{gMHygHHAOLhgMHfgHHA,LUgMHSgHHA LBgMH@gHHAL/gMH-gHHALgMHgHHAL gMHgHHA}LfMHfHHAZLfMHfHHA7LfMHfHHAHH\H =8WHH3E3LfMHfHHAL|fMHzfHHALifMHgfHHA}LVfMHTfHHAZLCfMHAfHHA7L0fMH.fHHALfMHfHHAL fMHfHHALeMHeHHALeMHeHHALeMHeHHAeLeMHeHHABLeMHeHHALeMHeHHALeMHeHHALreMHpeHHAL_eMH]eHHALLeMHJeHHApL9eMH7eHHAML&eMH$eHHA*LeMHeHHALeMHdHHALdMHdHHALdMHdHHAHHH 4HH3E3PLdMHdHHAMLdMHdHHA*LsdMHqdHHAL`dMH^dHHALMdMHKdHHAL:dMH8dHHAL'dMH%dHHA{LdMHdHHAXLdMHcHHA5LcMHcHHALcMHcHHALcMHcHHALcMHcHHALcMHcHHALcMHcHHAcL|cMHzcHHA@LicMHgcHHALVcMHTcHHALCcMHAcHHAL0cMH.cHHALcMHcHHAL cMHcHHAnLbMHbHHAKLbMHbHHA(LbMHbHHALbMHbHHA LbMHbHHA LbMHbHHA LbMHbHHAy LrbMHpbHHAV L_bMH]bHHA3 LLbMHJbHHA L9bMH7bHHA L&bMH$bHHA LbMHbHHA LbMHaHHA LaMHaHHAa LaMHaHHA> LaMHaHHA LaMHaHHA LaMHaHHA LaMHaHHA L{aMHyaHHA LhaMHfaHHAl LUaMHRHHAI L:aMH8aHHA& L'aMH%aHHA LaMHaHHA LaMH`HHA L`MH`HHA L`MH`HHAw L`MH`HHAT L`MH`HHA1 L`MH`HHA L`MH`HHA L|`MHz`HHA Li`MHg`HHA LV`MHT`HHA LC`MHA`HHA_ L0`MH.`HHA< L`MH`HHA L `MH`HHAL_MH_HHAL_MH_HHAL_MH_HHAL_MH_HHAjL_MH_HHAGL_MH_HHA$L_MH_HHALr_MHp_HHALWYMHUYHHAL<_MH:_HHAL)_MH'_HHAuL_MH_HHARL_MH_HHA/L^MH^HHA L^MH^HHAL^MH^HHAL^MH^HHAL^MH^HHAL^MH^HHA]L~^MH|^HHA:Lk^MHi^HHALX^MHV^HHALE^MHC^HHAL2^MH0^HHAL^MH^HHAL ^MH ^HHAhL]MH]HHAEL]MH]HHA"L]MH]HHAL]MH]HHAL]MH]HHAL]MH]HHAL]MH]HHAsLt]MHr]HHAPLa]MH_]HHA-LN]MHL]HHA L;]ILHAL']ILHAL]ILHAL\ILHAL\ILHA~L\ILHAbL\ILHAFL\ILHA*L\ILHAL\ILHALs\MHq\HHAL`\MH^\HHALM\MHK\HHAL:\MH8\HHAfL'\MH%\HHACL\MH\HHA L\MH[HHAHHEH %@HIHO(HLHHHLHHH MHHIHHUHHLHH{HHoHHH $HH3E3LPMHPHHALgPMHePHHALZMHZHHALZMHZHHALZMHZHHALZMHZHHA_LZMHZHHA<L}ZMH{ZHHALjZMHhZHHALWZMHLHHALXMHHHMMuHH =LIHH^IOHIWIIMLL$(LL$ LNHHӐtHL$0HT$(NH 2tLHUIO[H=HIH=HIMMuHH r$HIHHHKHHSIHLLL$(LL$ LNHIאtHL$0HT$(HNXHHH@@P t'Hl$0HNXHHH@@P0HHGH +mHHUHKTHHKH&HLNA9 )tHSHL$0aHKH&HLNA9 t.Lt$0HSRHKA9 HIHSHL$0H8[]^_A\A]A^A_WVUSH8HIHHH HPHHt~ɅuH3l3wu HH8[]^_H K]H؋HcHLMu3E3DJL$ HE3vqo {"H` HDFHϺHHaHHH@@HH8[]^_HHH8[]^_sWVSH HIHκ 9 cXDH3:HHDFD+HH [^_DHtzɅuH3HH3VH HHκHtCxɅu5HκHHtHP%HHt3H ^øH ^WVH(HHL"MHH ~HWpLGHuzHWH9 HH9 uH$HLOHE3u;Hx{H` HrLH HOt H(^_3H(^_WVH(HHHHt?~~9H{H` HHH9 9t H(^_3H(^_WVSH HHIL#MHH \F}L#MHH B,}HOHHH@@P(SHOHHH@@P HOHLH9 H [^_HVH HHQ#HLIHA9 iu0VHAiHH#HH-H ^HHH ^WVUSH(HHIH *HHMHHMHH HHNHH HNH vHLH!H([]^_HWVSH HIH\$`3H HM͇t&HOH HWHHH [^_3H [^_DHADHI1WVH(HL!MHH {HHH@HPHHHU͜H лHȞHH(^_DDUWVSH8Hl$P3HEHeHHIHoHEH҇LHH9 YHEHMHEHH@`Pt,HMHEHH@`P HMHEHH@`PuHHCHe[^_]UWVSH(Hi Hl$ HmPH}tHML9 H([^_]UWVSH(Hi Hl$ HmPH}tHML9 wH([^_]VH xH9 uHH HHA9 tDFAHκHLMHHH9 HHH ^DDUAWAVWVSHhH$HH}3HHeHHH HHNHtHHйH]HUHT$ HULELMHMCH}qH}%H}HN:HH Z$HHL[M9 ѺHHHHH:LHHH|HLHyHH]HHHHLEMHHLEM{HHLELhH >H*H3ɉL$ 3HL$(HE3E3:HH HζH3ɉL$ 3HL$(HE3E3HH bHl~H3ɉL$ 3HL$(HE3E3HcHHe[^_A^A_]UAWAVWVSH8Hi0Hl$0HHMLB9 :H8[^_A^A_]UVH8Hl$@HeIM9 HEHHUAHHe^]UVH(Hi Hl$ Hm@H}tHML9 H(^]DDUAWAVWVSHhH$HH}3HHeHMHULHH ATHMHI@HH@HP8H{HH` HrHHHWtH dֵHH3zH GHHκz3HMHMHIHHH )XL1H OqLI3CI3HT$ HME39 @HEH ű_HH` H|H]JH JHP/HILHHULE9 YzHEHML9 HMHEHH@HPH HHMHEHH@@HH mHH eoLblHP INCHKI6HNH)HN8HHMHULKHHNH}HML9 33HMHML9 HEHML9 HML9 HH_Dw(H uLO,L$ 3HL$(IHLEzL}IHML`9 Xt1HMHIDLHUHMHbHe[^_A^A_]HHHMUAWAVWVSH8Hi0Hl$0HHML9 H8[^_A^A_]UAWAVWVSH8Hi0Hl$0HH}tHML9 H8[^_A^A_]UAWAVWVSH8Hi0Hl$0HH}tHML9 yH8[^_A^A_]WVH(HH @HHϺE3>HH:t H S/HXH(^_H HHϺAHHt H SS/H`H(^_H 3S/xHhH(^_DDWVH(HHHNBLHHHb}H(^_HDDWVH(HHHNLHHH}H(^_HDDHBHH;ADVH HHHH@@P8HHVưH ^VH HVFH ^UHHl$HeHMHE@tu HHe]UHH)H,$HmHE@H]UAWAVATWVSH0Hl$`HeHMHMIHEHpt3SHMAH~ Hpu=H gHH HHKXH3GGHVHO1HHH(^_DHHVH H |HH NNH@H٬H ^DDHH$HWVHIHNHNH~^_VH H $fHH NTaHPH9H ^DWVSH HIHtH H9t IIHH WHCHKHիHKHȫHH [^_WVSH HIHtH H9t I٫HH כHCHKHeHKHXHH [^_WVSH HIHtH H9t IiHH HHHHKHKHHKHتHH [^_WVSH HIHtH H9t IHH wHHKHyHKHlHH [^_VH H \VHH LVQHXH)H ^DDHH!HVH H 4HH KYHhHH ^DDu t 3WVSH HrXH KYPHLxMuHH $HHhH=HKHHSHxHLH HH H [^_H3H [^_H( HH(DHB0DHB0H(H9 0H(H(H9 H(DDHL$HILD$M@H4HDWVH(HH HHVHHH(^_DDHAVH H <HH HϋDDAD+եHNHF H([]^_F N(in(H~GD$$H G+D$$;>3H([]^_DHAVH H vHHڪH=DHAWVH(H~ u~$;u 3ɉN HH +H3G gG$HVHOHH(^_DH {HVH HV('F,H ^DWVSH HF(t3H [^_F(H~HN Hd3ɉN0N0;OHN F0;AHcH|H d6HHHHKHH#fHNHF(H [^_F(N0N0HF 9H{3HF 3H [^_DHAVH H HHH]DHAWVH(H~(u~,;u 3ɉN(HH 5H3G(G,HVHOHH(^_DHyHVH H HH D`HHH ^DDz$Dz$VH H vHH ,DeqHHIH ^DDHHP9 HDHHQ9 HWVSH HrxH CeHLMuHH }HHHHKHsHSHHLH HHH [^_HDHB@DHB@DHBDHHq9 HDDHIHR0LH'HVHHH#LH HhHLPMuHH HH(HAxHKזHȹHSHPHLH zHHH([]^_HDLTMH RHۣHDLMH 2HHHfHHHHWVUSH(HH 7n+HH`HuHH HH(HPwHMڕHӸHUH`HHH H3ɉL$ HHLE3lLhMuHH IHH(HvHN^H_HVHhHCLH HHLpMuHH HH(HvHKHHSHpHܔLH HH(H([]^_HDLtMH rHHDLH(HQ zvHR H NHH(HH(HI yvHI(HH(HH(HI yvHI8H~H(H赫H(HI yvHI0HNH(H腫H(HI yvHI@HH(HUD3H(HI yv$HQHHHtH H9tH(H(HI yvHIHH֘H(HժH(HI yv$HQPHHtH vH9t#H(蓪H(HI yvHIPHfH(HeH(HI y v$HQXHHtH H9tH(#H(HI y vHIXHH(HDHdHDHRHI DH<5HDHRHI ͌WVH(Hq H աHHHH qKHOH~HH(^_D H(HQ zvHRH >HH(HH(HQ zvHRH HoH(HΨH(HQ zvHR H ޚH?H(H螨H(HQ zvHR(H HH(HnH(HI yvHI0HH(HEH(HI yvHI@HޚH(HH(HI yvHI8HH(HH(HI yvHIHH~H(H赧H(HI yvHIPHNH(H腧H(HI y v$HQXHHtH &H9tӊH(CH(HI y vHIXHH(HH(HI y v$HQ`HHtH H9tcH(ӦH(HI y vHI`HH(H襦H(HI y v$HQhHHtH FH9tH(cH(HI y vHIhH6H(H5DHHDHADDHI!WVH(HH xHHVHO HH(^_DHIWVH(HH HHVHO HH(^_H(3E3H(VH H FHH )uAHHH ^DDDz$VH H \ƇHH |)xHHH ^DDHVH H DfHH )zaHH9H ^DHfL,MHHH9 HVH HVGFH ^UHHl$HeHMHE@Pvutu HH(He]UHH)H,$HmHE@H]UHH)H,$HmHE@H]UAWAVWVSH(Hl$PHeHMHMIHEH@t 3{HMAHpHH~(u*H ǰHHOHхHN(HąHV(HRr<33HMLq MI)I_AAwHMAIHh IV 3z3HMLq8MIمI_AwAHMAIH*tKIVHMHIHMAyHMAHMLq8IHu߅uHMA3WAINHMLq IH:0HE@3WAIFHe[^_A^A_]UAWAVWVSH(Hi Hl$ HmPHM`H([^_A^A_]DADADHAVH H HHjH͠DHAWVH(H~u~ ;u3ɉN/H .H3GGHVHOHHH(^_DH_HDH(HIHI@HIL9 H(WVSH HHHdH SU/HHH`HHKH HCH [^_HAVWVUSH0HL$(HHIHdHoLuMuHH5LLEMuHH$LHIHHE3E3H0[]^_A^HDH(ՁHHH@@P0HH9 H(HH(H LNHH(AWAVAUATWVUSH(HIA+$DpEE;|fDcE;IcHHH }LHD3HD$ I}HNHBHIHL$ duAE;}H([]^_A\A]A^A_AH([]^_A\A]A^A_AWAVAUATWVUSH(HIED$EE;}fDcE;IcHHH |ˀLHD3HD$ I}H{uHIHL$ cuAE;|H([]^_A\A]A^A_AH([]^_A\A]A^A_H(Hʐ2dH(WVUSH(HIH C|HH}ڀԀHHHː.cH([]^_H(3HD$ H !#HHL$ ]HL$ HH(DWVSHHH|$ 3HHHIH;uHĀ[^_HtHu 3HĀ[^_HH [{H9 t3HHH A{H9 t3HH*{H9tHH {HoD$`oFD$pHzH9tHH zpoD$`D$@oD$pD$PHoD$ oGD$0HHT$@LD$ HH@@P HĀ[^_ù3HĀ[^_WVHHHH|$(3HHHHu 3HH^_HH 0zH9 t3HtOHzH9tHH z~HoD$(oFD$8HHT$(HH@@P(HH^_ù3HH^_AWAVWVUSHhHH|$(3HHHIA+$hED;|bDHE;sxIcHHToD$HoBD$XoD$(oFD$8HT$HLD$(HH@@P uAD;}Hh[]^_A^A_AHh[]^_A^A_蔙AWAVWVUSHhHH|$(3HHHIA$ED;}bDHE;sxIcHHToD$HoBD$XoD$(oFD$8HT$HLD$(HH@@P uAD;|Hh[]^_A^A_AHh[]^_A^A_ǘWVUSH(H xK|HHHtH xH9t |HH dw|H;u-H x{HHH OH9t {HH {HHHHt^H B{HHHtH*xH9t H|{HHHHHtH ΓH9t S{HHHHP(HHHPHH t3{H;HHHPxHPHHtH }wH9t zHH xwzHH ȤzHHL3lzHHHHP HHHHt^H zHHHtHvH9t HFzHHrHHHtH H9t zHHHHP H4H3XHHHH pyHHHtHHvH9t HyHHƆHHHtH H9t qyH$H |yHHHtHuH9t H~H5z+HEH@P8+PD;~ $HMH HQ0HHBHu HwHHwHHtHMDHvUHe[^_A\A^A_]HH fH}wHHu LEM@AX8MpE3~:EfE;sMcMk0C||֍rODHAvAD;|He[^_A\A^A_]ù'UAWAVATWVSH0Hi Hl$ Hm`HH0[^_A\A^A_]AWAVATWVUSH0HL$(HH~HHHR0HHB_<3E3Hu HkvHzuLMgI $HuMt$Al$A\$IH0[]^_A\A^A_AWAVATWVUSH0HL$(HH~HHHR0HHB_<3E3Hu HuHtLMgI $HVuMt$Al$A\$IH0[]^_A\A^A_DHIH;9 HDHHH(3H(DHρHDDHAP8+PDAWAVWVUSH(HHAHV|9~} zN+HCP8+PD;~ }LCAX8IhE3~7D}E;UMcMk0B||׍zNDHysAD;|H([]^_A^A_WVUSHHQz<33HsHn^~H[]^_H(HbUHIrH(DHIHH@@H@HVH HH asHu3H ^HVH;PH ^WVHHH|$((3HH3HHL$HWAA HT$H3ɉL$PJ4L$THL$XWAoD$H$oD$X$oD$h$H$tmo$D$xo$$HNoD$xD$(o$D$8HT$(L 9 %3H$DuH^_IfLAHHHoHH(VH HH +oHB|HA| tH oHH9 1|H ^DDDDA;DH(mHHH@@P0HH{9 H(HH(H \NnHH(AWAVATWVUSH HAA+$XA;|XDvA;stLcBLH mLN|A|$H mAHHIHH@@Pu;}H []^_A\A^A_ËH []^_A\A^A_AWAVATWVUSH HAA$A;}XDvA;stLcBLH lLN|A|$H lAHHIHH@@Pu;|H []^_A\A^A_ËH []^_A\A^A_TVH H rtlpHHH@@PH ^WVSH AH =?lH؉{H *,lpHHHH@@PH [^_H(3HD$ H %lHHL$  MHL$ HkH(DWVSH HHIH;u H [^_HtHu 3H [^_HH pH9 t3HtoHH ZH9 t3HtYHGH9tHH 8kvH(H9tHH kDGHˋHH@@H@ H [^_H*u3H [^_WVH(HHHu 3H(^_HH H9 t3Ht6HH9tHH LkVHHH@@H@(H(^_Ht3H(^_AWAVWVUSH(HHAA+$hED;|,DE;sEIc֋THDHH@@P uAD;}ظH([]^_A^A_AH([]^_A^A_讆AVWVUSH HHAAl$pED;}sHtEE҅#9oɅt%Ic֋THDHH@@P uCAD;|)D;wsAIc֋THDHH@@P uAD;|׸H []^_A^AH []^_A^WVUSH(H {iHHHtH eH9t >iHH dNiH;u-H ehHHH H9t iHH iHHHHt^H rhHHHtHZeH9t HhHHuHHHtH >H9t hHHHHP(HHHPHH bchH;HHHPxHPHHtH dH9t hHH dhHH hHHL3gHHHHP HHHHt^H DgHHHtH$dH9t HvgHHtHHHtH H9t MgHHHHP HdtHctXHFHHH  gHHHtHxcH9t HfHHsHHHtH \H9t fH$H JfHHHtHcH9t HlfHHsHHHtH H9t CfHH NfHHHtHbH9t HfHH:sHHHtH H9t eHkH eHHHtHabH9t HeHHrHHHtH EH9t eHH 0eHHH([]^_߁H(H %1eHH(H(H(WVSH0HHAHtHgGOL$ 3ɉL$(HLD3gH0[^_DAWVSH HH΋yt2H %WdHHKH?dC{HH [^_H &PdHH [^_H(H(WVSH0HHAHtHfeFOL$ 3ɉL$(HLD3fH0[^_DAWVSH HH΋yt2H ݁gcHHKHOcC{HH [^_H '`cHH [^_WVH8HT$0HIHJHIHuHH cHHLƐH8^_WVSH0HIAHtHeEOL$ 3ɉL$(HLD3eH0[^_DAWVSH0HT$(HHHxH΋YtGHOHuHH^?cH&bHHOHbG_HH0[^_HOHuHHbHbHH0[^_WVH8HT$0HIHJHIHuHHbHHLƐH8^_WVSH0HIAHtHjduDOL$ 3ɉL$(HLD33dH0[^_DAWVSH0HT$(HHHxH΋YtGHOHuHHaH`HHOH`G_HH0[^_HOHuHHaHaHH0[^_WVH8HT$0HIHJHIHuHHkZaHHLmH8^_WVSH0HIAHtHceCOL$ 3ɉL$(HLD3bH0[^_DAWVSH0HT$(HHHxH΋YtGHOHuHH`H_HHOHn_G_HH0[^_HOHuHHwX`HW`HH0[^_VH HBDIE3HvH ^HWVUSH(HAAHBBO;B'C+;CH p%^H\$ HDDHH@@P0H([]^_VH H&CDIE3H ^WVUSH(HHAAHCLCO;ACC+;CH #$^H\$ HLDHH@@P0H([]^_WVSH0HL$(HIHC_HQHBHu H^\$ HHLE3ɐH0[^_WVUSH8HL$0HIA$HNC{CW;pCC+;CHQHBHu H\^HȐl$ HHLDHH@@P0H8[]^_WVSH0HL$(HIHC_HQHBHu H]\$ HHLE3ɐH0[^_WVUSH8HL$0HIA$HfCCW;CC+;CHQHBHu H\]HȐl$ HHLDHH@@P0H8[]^_WVSH0HL$(HIHC_HQHBHu H\\$ HHLE3*iH0[^_WVUSH8HL$0HIA$H~CCW;CC+;CHQHBHu H\\Hhl$ HHLDHH@@P0H8[]^_VH H xZH3HNFFH X&ZHHyZH ^DDAWVH(HH @BZHHΐGHH(^_VH A4C;AiCHI;ACHcDH ^DAQ;}A;3WVHAHNYF~^_VH H wYH3HNFFH ('YHHIYH ^DDAWVH(HH 8UYHHWHΐ HH(^_WVSH HڋAB;ABHQ;BBHcHHtHYY|YHHH [^_DAQ;}A;3WVHAHN[XF~^_DH(WHHH@@P0HHe9 H(HWVH(HL$ HHHHQ0HRHBHu HbXHH"XHH(^_AWAVAUATWVUSHHHL$@LHIA+$DxIH@0L`EE;I $HSD;IcHHtHt$(tHI@WHH|$0HHWWWWHI $tHIWHD$ HxHt$(WWWWHHL$ HT$0du"AE;GHH[]^_A\A]A^A_AHH[]^_A\A]A^A_PsAWAVAUATWVUSHHHL$@LHIED$IH@0L`EE;I $HSD;IcHHtHt$(tHIVHH|$0HHVVVVHI $tHIUHD$ HxHt$(VVVVHHL$ HT$0_cu"AE;GHH[]^_A\A]A^A_AHH[]^_A\A]A^A_#rWVUSH(HL$ HHH HI0HIH HtHI#UHH}UUUUHHbH([]^_AWAVWVUSH8HL$0HHIHMHI0LqIHtHITLInUhUbU\UHItHIxTLI~H8U2U,U&UHIIbH8[]^_A^A_VH03HD$ HL$(HH3UHHL$ H6HL$ HSH0^DAVWVUSHHH|$ 3HH$HHIH;uHĠ[]^_A^HtHu3HĠ[]^_A^H HI0H H)HDAEtHIHH9 t3HHEtHIHH9 t3HHEtHIHEtHRH9t HHSHoD$poF$HN H$HEtHIEtHmH9t HH[SoD$pD$Ho$D$XH$HL$hHoD$ oGD$0HO HL$@HHT$HLD$ HH@@P HĠ[]^_A^ùf\3HĠ[]^_A^WVHXHH|$( 3HHL$PHHHu 3HX^_HHI0H H HыƒtHRLI9tE3Mt]HхtHRtHIH9t HGRHoD$(oFD$8HN HL$HHHT$(HH@@P(HX^_ù[3HX^_AWAVWVUSHxHH|$(3HHHIA+$hED;|xDHE;IcHHToD$PoBD$`LB LD$poD$(oFD$8HV HT$HHT$PLD$(HH@@P uAD;}Hx[]^_A^A_AHx[]^_A^A_mAWAVWVUSHxHH|$(3HHHIA$ED;}xDHE;IcHHToD$PoBD$`LB LD$poD$(oFD$8HV HT$HHT$PLD$(HH@@P uAD;|Hx[]^_A^A_AHx[]^_A^A_AlAWAVWVUSH(HL$ HHN0H9HtHIOHHHtH !LH9 t vOHH JOH;u*H L OHHH9ut H?OHHOHuHHtOH5OHHHHt[H yOHHHtHKH9t HNHH[HHHtH9ut HNHHHHP(HHHPHH :HNH;HHHPxHPHHtH JH9Mt *NHH J:NLH x-NLIL3MIIIHP HHHHt[H lxMHHHtHLJH9t HMHHZHHHtH9ut HxMHHHHP HZHZDpAAHHxHH w2MHHHtHIH9t HLHHZHHHtH9ut HLH3H uwLHHHtHEIH9t HLHHYHHHtH9ut HqLHH "w|LHHHtHHH9t HtHHH@@HH7NHHH$NHNHoD$(oFD$8HL$(HHMHϺ]IWH(XHHOIOh+ KKHHHHJHHH^_WVSfHHqHJJJHH[^_DHWVHIHI1JHwJqJkJH^_DH(IHHH@@P0HHV9 H(HWVH(HL$ HHHHQ0HRHBHu HIHHbIHH(^_AWAVAUATWVUSHHHL$@LHIA+$DxIH@0L`EE;I $HSD;IcHHtHt$(tHIHHH|$0HH;I5I/I)IHI $tHIDHHD$ HxHt$(IHHHHHL$ HT$0Uu"AE;GHH[]^_A\A]A^A_AHH[]^_A\A]A^A_dAWAVAUATWVUSHHHL$@LHIED$IH@0L`EE;I $HSD;IcHHtHt$(tHISGHH|$0HHHHHGHI $tHIGHD$ HxHt$(GGGGHHL$ HT$0Tu"AE;GHH[]^_A\A]A^A_AHH[]^_A\A]A^A_ccWVUSH(HL$ HHH HI0HIH HtHIcFHH}&G GGGHHTH([]^_AWAVWVUSH8HL$0HHIHMHI0LqIHtHIELIFFFFHItHIELI~HxFrFlFfFHIIHSH8[]^_A^A_VH03HD$ HL$(HHsFHHL$ H)HL$ H4EH0^DAVWVUSHHH|$ 3HH$HHIH;uHĠ[]^_A^HtHu3HĠ[]^_A^H HI0H H)HDAEtHIHH9 t3HHEtHIHH9 t3HHEtHIHEtHRH9t HHDHoD$poF$HN H$HEtHIEtHmH9t HHDoD$pD$Ho$D$XH$HL$hHoD$ oGD$0HO HL$@HHT$HLD$ HH@@P HĠ[]^_A^ùM3HĠ[]^_A^WVHXHH|$( 3HHL$PHHHu 3HX^_HHI0H H HыƒtHRLI9tE3Mt]HхtHRtHIH9t HCHoD$(oFD$8HN HL$HHHT$(HH@@P(HX^_ùL3HX^_AWAVWVUSHxHH|$(3HHHIA+$hED;|xDHE;IcHHToD$PoBD$`LB LD$poD$(oFD$8HV HT$HHT$PLD$(HH@@P uAD;}Hx[]^_A^A_AHx[]^_A^A_^^AWAVWVUSHxHH|$(3HHHIA$ED;}xDHE;IcHHToD$PoBD$`LB LD$poD$(oFD$8HV HT$HHT$PLD$(HH@@P uAD;|Hx[]^_A^A_AHx[]^_A^A_]AWAVWVUSH(HL$ HHN0H9HtHI@HHHtH a=H9 t @HH <@H;u*H B=L@HHH9ut H@HHOHuHH@Hu@HHHHt[H jR@HHHtHMHHHtH9ut H?HHHHP(HHHPHH z9?H;HHHPxHPHHtH HH LHHHtH9ut H>HHHHP HKHKDpAAHHxHH ir>HHHtH:H9t H2>HH^KHHHtH9ut H >H3H h>HHHtH:H9t H=HHKHHHtH9ut H=HH bh=HHHtH*:H9t H|=HHJHHHtH9ut HV=H}H ha=HHHtH9H9t H!=HHMJHHHtH9ut HtHHH@@HH/?HϺ]HHhIHHOIOh+ tHHH@@HHU;HHHB;HNHNH1HYHiH b7LM~IH8IOH7IOH7IIH@@HH:HϺ]6DHEHHOIOh+ 88HHHH7HH([]^_A^A_WVSfHHqH777H[^_DHWVHIHI!7Hg7a7[7^_H(HL$0|$0u &LDD$4H(P@$3D$L$$H$HVH H>uHHH ^H t`5NHHHH@@HH ^HVH H>u3H ^H ,`5NHHHH@@H@H ^HWVH(HH>uHH(^_Hu 3H(^_H _\5NHHHHH@@H@H(^_HD9uËADAVH H>u &BFH ^DDQUWVSHXHl$pHH} 3HHeHMHIHMHY 3ɉM؉MHMغaBHHUЋE؉E܉BHUMBHMHIoEHUL9 4BȉMH EHe[^_]UWVSH(Hi Hl$ HmpHMHI9 AH([^_]VH03HD$(ILD$(t$HL$(9 AHH!4H0^3HH0^UAWAVATWVSH`H$HH}3HHeHMHMHHMHHHQ0L2IFHu HD4H 3LIOHU3MgI3HHMAo$EHULEHMHq3ɉMMHM@HHUEEBHU@HMHIAo$EHULE9 @HIFHu HA3HP2HHNI82H UHNHIF Hu HS3H2HHOH1H}HMHII$ED$LMHEHD@HUMA?HHM9 ?He[^_A\A^A_]UAWAVATWVSH0Hi Hl$ HHMHI9 ?H0[^_A\A^A_]WVSH0HL$(HIHHHN(1HH{2H1HHL3>?HNH0H -0HG@GDGMH Q1HH HHO(HNH0H0[^_DH(0HHH@@P0HH=9 H(HWVH(HL$ HHHHQ0HRHBHu H0HHb0HH(^_AWAVAUATWVUSHHHL$@LHIA+$DxIH@0L`EE;I $HSD;IcHRHtHt$(tHI/HH|$0HH;050HI $tHIP/HD$ HxHt$( 00HHL$ HT$0tHHH@@HHS%H˺].H/HHKIKh+ "HHHHz!HHH[]^_DHWVSfHHqH"HH[^_WVUSHIH{I!HHH![]^_WVSH@3HD$(HL$8HHHHQ0HHCHu H~!HHא{tEH HыƒtHRtHIH9t HF!HoD$(HHT$( H@[^_WVUSHhHH|$0 3HHL$`HHL$0WAA H HHR0HHBH\$0SIHQ0L"ID$HHu HHȋiLHNDF8DD$ E3DD$(M3E33ۃ~8EEA;HcHIL yHL$HLFLD$@HL LL$8DQDT$dIM\$8MuH҈.LLD$@L\$hIHL$PLL$8L DT$dDQILHT$P9 LD$hA%HT$HB;^8K3ۃ~8~IO0L!H~u H3jHNLIM\$8MuH LIL$IHD$hH(DpLHT$h9 H$DAHNAřyE3D$HN;A$HcDLEHND;ID$IcHHLD9iH$LVLT$PHLL\$HQT$|II|$@HuH HLT$PLHL$hH\$HHT$|QHL$XH)DqIHT$hLD$X9 H$unD$AD$HND$D;IMcIFL E~D^@HN;YHcHLN@ND$t HVD$D;JIcHHL H FLHwIH9I6IHMHMHHH8[]^_A^A_VH HNH;HtHHH@@HHHdKHHvH & pHHH@@HH]HϺ]HHHOIOh+ HHHHHH(^_DADHWVHAHI~^_UWVSHXHl$pHH} 3HHeHMHIHMHY 3ɉM؉MHMغHHUЋE؉E܉BHUHMHIoEHUL9 ȉMH EHe[^_]UWVSH(Hi Hl$ HmpHMHI9 |H([^_]VH03HD$(ILD$(Nt$HL$(9 HHH0^3HH0^UAWAVATWVSH`H$HH}3HHeHMHMHHMHHHQ0L2IFHu HYHLIOHUMgIRLHMAo$EHULEoHMHq3ɉMMHM.HHUEEBHU:HMHIAo$EHULE9 fHIFHu HYHHHNIH -HNHIF Hu HXHHHOHwH}HMHII$MD$LMHEHL@HUMAHHM9 He[^_A\A^A_]UAWAVATWVSH0Hi Hl$ HHMHI9 "H0[^_A\A^A_]WVSH0HL$(HIHHJHNHHWHHHL3HNHqH rlHG@GDGMH HH HHO(HNHH0[^_UH@Hl$@3HEHEHeHMHEHxuHEH@He]3E}tHUHMHMHIHuHMHIHM9HMHAHHEPHUHJHnHM3HAHMHIHMH HEHe]UH0Hi Hl$ Hm@}t HMH0]DHIH83HD$(HD$0HQHBHoD$(HHH HT$(PH8DDWVH(HL$ HHH3HOGGHyHHMH(^_DDAWVH(HL$ HHHI0H H tHIHHWHΐHH(^_WVSH HڋAg;AHQ;BHcHHtHhb\VHHH [^_DAQ;}A;3WVHAHN;F~^_WVSH H~ t HI89N u 96HH HHH{HHH [^_VH H~ t HI89N u 96HFHH ^AVWVUSH@HHڃ~ t HI89N u :96HNHHH96HH O)LHI~HHH ~HKIqHH@[]^_A^VH HNH;H>>=>> >8>>???h??P@?@x@@@@@A!A8ApAAAAAApB0BBBCC1CHChCxCCCCCCCDDD@D`DDDEE EPFXFPEpEEEEEFFFFFFFhGpG(GGGGGGGHH@HXHhHHHHHHHH I@IIIIIIJ0JPJpJJJXKK@LHLKKKKLPLLLLL8MXMxMMMMMN8NXNxNNNNNO8OXOxOLOLOOLLMP PPPXPPPPPPPQ8QXQxQQQQQR8RXRxRRRHSXShSRpSxSSSSSSSSSSSSSSSS`TpTTTTTTTTTTTTTTTTTTU(T(U8UUUUUU0V8V`VVVVV@WHWWpWWWWWWXX(X8XXhX@{YXXXXXXXYPYHY@Y8Y0YY(Y`ZXZYPZHZ@Z8Z0Z(Z ZZZZZZZZZZZH[8[([[[Z[[[[[x[p[[[[[[[[P\H\@\8\0\(\x\ \phPȗ@hș@@Xh0\\\\\\\H]@]8]0](] ]]]]]]]x]p]@^8^0^(^ ^^]^p^^^^___^^^^______8___(` ````P`x` a```aaaa`a(b bbbbbbibPbbbbPc8c ccdPdcccccHdddddddxd@eeeeiiiieihiPi8iee ieihhehhhxh`hHh0hhhggegegegpgXg@g(ggffffffeexeifPf8f ffePjjj@jj0j j`jjpkhkkkk`kXkPkHk@k8k0k(k kHl8l(lllpl`mXmlllPmlHm@m8m0m(m mmmmmmmn9n0nn`nonnnohoQo8oooooHp@p8p0p(p ppqqppppppppqqqqqxqpqhq`qXqPqHq@q8qXrPrrHr@r8r0r(r rrrrrqrrrrrrrsssssssxspshs`sXsPsHsttsss@tuttttttthtxuhuXuHu8uuvvuuu8vvvvvv`vY2`Y4#020`pYr3B`pY4rbYBYD! B0P`pYus0oB0&~QRCI!ۯ5qVq/j-B伷j2`Y#0Y "Y``YY  2 0 P`pYk2AC& 0 `pPY PVD<-Oz v a0\mq"B03?MTKT[Kvku~* <֪ Ϸ:fC'0O?UK%{50k9p eIѲ[m1YW"GRɾ^-y{R'f0%@}BC??}901-2յN_?m6ɭsk3vOTN6''"X Q0׽^䪼59K+Q_|*^g?CZCKqq:;/Vm:6z4m Vo~P*u{a:m^MMM B 0 ` p PYB0P`pYx   20P`pY2@3x&Ŭ[~3zw{wB0P`pY :3x82 0 P`pY4j1]Ck2 0 P`pYX^ Fn!n"n#s<;]ãA` )),&2`Y"0Y0r 0 P`pYP@.pdagl:-m:a(8>B`pYpCZ x  0 P ` pYp_.D!*+ҪˏB|RWS6 2߿珓7y b 0 P ` pYPW74NbF[}x$s~!D o߽y20`pYeX B0P`pY0˞F+b0`pPY@B}$MaeN+,T[es2~Kpe8ݪe`zl\jͰj\gQFQB0`pPY  20P`pY5$ Jn)P%Ϯm   r0`pPY@L؁,"uT cӲRmٖ-* [l`/9 2j]FŻ;`%bqNK  R0`pPY  r0`pPY@Dҁ,"ͪu2 ,T[es-e8ݪep3z02,ep B0P`pY]@I@Ɯ$j) 7/rB5e5i5_a&B`pYa@BY!   R0P`pYyt-B0P`pY2@AEba7XümYB`pYdDV1B`pY*-+Y D20`pY/@F(vlVni B`pY$~t;n܎B0P`pY:"@ 0ر~rv;Nux/Rn ~gE+ռ/WTC@`_moS Yj"==I޹l2z y z(Z܆ɩذl*2u˺e;Ni ΎhdBZZTcm NPl9M&&``pPY0`pPY PfpA=H* Rc(Rl: (bMNo]+'o?S :DG|SRQT1{n_+*%p9;lw:z?H,ҋ*F]ܠ?#1O,eg $E.V33 f 'q|RFFF b0`pPY  r0P`pYp<b0P`pYH+b`pY9b#Ĝ0#BYP#.  20P`pY;@ ,~DT,]CPa1pZJ)~)ZBYd%FB`pYi ڋ, B 0 P ` pYi8H  20P`pYr#$8Z{[#2 0 P`pYd ţ01HP - \̠2&u縁nq[5.tsi Ätew1 n.>5@e_S%*S*HDccv;|FcnZ"TEX*P\-^b5a[_.g2{|`ldhX :j,Mc;Qw1ʛ1BB`pYECi1`Y h"Ul2 0 P`pY7gB0y Ò5צTC&2`YI "˳2`Y@eo   B0P`pYU ?&YgqǟjF-?9dc@4O|<jv65Ymw}q %"3 {Ͳl \G"T"i uG+܎؂lBmRSݱ||sLi6$v>}ZKlV=źfԻOvǿѝıuMYV-Pv*[>nӴkNofjlZS( iK iٞȄfêB4UߪnX\Qًܱe2ڲ c^ R/}蔂") '5Z Նk\O|+[{RVU?6XaN346V贈rZK-6$@w:~ϭ?.v(rhdBa]9vվjpN,&ɕ nhШ$22`Y (/i r  R0P`pY:SNDC'S2 0 P`pYЊiR02 0 P`pY!ҫLF0  20P`pY8)v(r&O̘ߍ!Z{X{B0P`pY`8ar+D]`~B0P`pY1azh~BY#B0P`pYM20`pYĈ!S,<BYT"2`YepB0P`pYdf 20`pYa8B`pYth<_p20`pYdg [B0P`pY0h+Qeŀ20`pYп@/ l,A-| pC!O-Mp3xA'nQ85zRU5o BYD(BB`pY1K0BF~Jru b0P`pYPi7\g2`YE02`YC> R0`pYG7l  B0P`pY%a0P`pYb0`pPY `8ZXT"\eΙr $Cxuu5R0`pYHEF&wx >5  R0P`pYg#e2`Y`"02`YdC: Yb0`pPY@.@)P,*ydpKf^Y,382U]F*[ޡ:^.#0j_gw) =nB`pYD0 2`YP#0  20P`pYd8z;ٳB`pYdۯB`pYTn1` B`pY@d+20`pY$gT 20`pYfR B`pYePB`pYBY HB`pYDP120`pYE>20`pYTf B`pYeR@B`pY`b420`pYf g20`pYTE>20`pY$g B`pYcBY! B`pYt5OڴlThQKM HR20`pYE0 Y D  B0P`pYarD2 0 P`pY1@s.cR0`pYĪh , BY"&0`pPY@d C)Py"${>ò³ldQV-}= 9I8r/cӽ ʝQuW_^~5[QBűI,}Ӑ72X㷌}eo2UqC̋RPY[ hj (ijvNSqQRPYBY!20`pYH@dŀR`Y 1!CȪR`YCQ< R`YtiB`pYx -0`pYR0`pYԆb  B0P`pY`:@DLBe ۺ}[l_CmYmۖe2 0 P`pY~^b Bu%L>oO 1W$ d*$YW%J8 ߝ]i;1@"9O$B0P`pYJ `LB`pY4h:NŀBYd#  B0P`pY032DG9a320`pY>EQu DDneK7 'B"B0P`pYɈYB`pYDO120`pYE.2`YTDְY2`YDְ0P`pYD]xp<0IcY|RjJl3t{  0 ` p PY  `8b@2H  `0dB@ 0@ :ſXK7d!o$BX+2~gPEI0g!5ɾ[ΉzhCpau<oɴZ=RT,vE~QY7C9VwhZ9VT?&rn2{ 0c,[Y?z|-ï@.>/v]fv8?|z߹=>~W_#\|OxHNOOof`eew>5]655Y.6&/}JQ/"_e7y@AGS8%:[9w/G""~kɶF*( wnV_TGVE '+m G'SU9p?m{Tt 7-eKeZx#˫1hg[\W@ ?D8ZǦ9Nی0hs{H Eaa{\4Q L2~#7WJnURRFtl)oi9w[h#s[ޗsܦ됩hv>l^[ժ]dU6[b{liiCƯmvͷ`s{:M_=-Y!AlM@ N+*D"" KWh y弌n^ p_ⷍ Uq"qy׀埖EmpY6{ ݆]򟩪Uվ.SrɷOs N#UKi2S`p9ѱɩL{PT!ZBVH7=fuEH3|aj{vױ c{/nS{5wUΝKKɴD P Y#|U;k vqyJcU*SW=1Ie^նdۆ+zj5Qrz :]S-ͮS_ #blJYbJHfmIEssڍ>պKm{1& jd=y?Kܒ{ɧ7܀sh\b۞F=nWVeBoY֋-9WVlNVYYp+2 0 P`pY4ZXA:"Yo-$;+QF'Ҏ!L4M:a6!  B0P`pYЍqR{u8|2`YDa20`pYx3  b0P`pY1C1u>BG&lD1{1  b0P`pYV~x 5`$jR>5r6p"P@c1~K)~J!2`YtBQ7 B`pYCY h20`pYe" BY!B`pYd$aBY!Y DY B`pYPzb `PYh D 4 .j]שSB`PY`pPY@8^pF f>nzVmںn101YPB`pYTDV12`YCP: BY!  0 `pPY@P$ \jzIB0 8 B9` nɫ"rNG4=Sp 8emsAB@?:H ۻI|kdJR hӯ|nYNk*bw}91AI/>6^4oEyrfy _|-N`ڦ-펚fGB`pY#^1`b0`pPY~ P*~lsڞ*'UG6AbXFooc̄f643*B`pY )J, b0`pPY P VU4 e21~Яo]W9bGEdwM-խt?5W`ME9'(B0P`pY0: k TLV !0`pPYppGL<p16P :v=((  0( #xgXË:tERDK4,BT4jT+s@Ꚃsn!? bx2aN FI=B[Kz_p+02޷.ߕªabeY%D9/Q~Kt< wRR^G%U  {gHu;jy͎ݴ-s5I(nI98n8~U{^ 5P8x%u_R/y`1 GćOmGKJK `הi UIid7pZ2L+w>epK^<~}B# c=d,`3<ĺn`skpj~y/_ӯ`GL뤤lxw( w׻?wp?tv*$'!nӸc**0yo-Eq? ̂g/pEu)"_`AN}ML@?^t]DHDe4VQQ9^pܖV VɭeJ998Mfus1SuulETVh7϶gPӡw8}& tNzYZ߽t "XNgt}11i52-=8džˮmIuQofbkKvmUG>R*(8]=5I \on 83R+,|=tnmynr ;4}pe/:Y~{ pAg uճ+BCH.g+Ӕʐ=}ڤjg[V5С .""""*  0`pPY B 0 P ` pYЍq2U8R0`pY E. 9 0 ` p PY PЂ]$@eQ +#0 B `0 `0xa0 Ae0 #xCC_ i>HɧBfA 9]ra}ԕ5Gk pq#R;w׻+ /es!s%\NJQn.;s7W/똅f2MguV)! w}|;]O9e2}@s~Cľ ?D0{}a6Ce8}"X?|ҲyBa\}"<u?bb8ANWlmmzB9n6m \\!+D߼w{wnش~f]YWkվZY׬5՚u*K/4jBUN!Pq^ߣ *Zؼ<ğ#RٳGB 0 ;WREJ(Q7[&lAKM[B0QFw4#AF攌t@FCğx\:iuY<JTBxK|VDx.*#\ARB0P`pYtxL:c{  0P`pYD<NIj.iί; T(x+ A  0P`pY_A8iTꩪ,ND5euf݄7p*PHY{Zkkb`pYiJifD`pYiZ8(0P`pYP9EKjІ($ r0`pYS@2{02ɪR5o +@ B`pY0 th1  R0P`pYt *[8Zs=  0 P ` pYtZ"dW@騸sRM;%M6`D Q($44<<<==??};33  B0P`pYT11Bã88   B0P`pY41$ lۻQ84Mu}ye  0 P ` pY[!(cMXřmY+єN>;$;/s  B<- m[oA  0P`pYtV(ĔaG#*VS.=ANA 4M<<]}AB0P`pY!!C 0 P`pYPB C,Iq!ȥ # 6S/OhC&@x|>p   B0P`pY?̡Q[}u *5i b 0 P ` pYTCWl-d =QO1` 4(Р XqǍ_?~#2`Y0B`pYeWB0P`pYpI92}  20P`pY3Uʙ:.EZ!yb`pYQ0(  b0P`pYFm  20P`pY0# ?> &N^gnfB2`YB9 Y D2 0 P`pYd5a7ŀnB0P`pY0ѡ:st620`pY4@  TeYl-"QB`pYTE[120`pYtE)?  0`pPY PlE0%M )(Yr .00l mj !3*&$54E<5Ր[ubV dVb;`◚QKtzj􀟬}D;Nuz_ХN^$.m]+m3oۖ"߲n-j8DTm%2\[ &naRtrʠNW"߾Xoy]&! W^Pov^3i>R>8dfgf&t&3۳d/s2fw\vl^1;{^W3`cXX  0 ` p PY  `jG`+^ g ^P4e, `0 CM12K[%]6s1V٥!K9a3ӀIp^P( u8;68gɫCgu^o:`w-vv%Ozg)gZS&^{RO#"`8Wè!VStܼTT68`duul Cv FǵhvaƨɅW}"J*ȃIޗG+(\yͩ+^췼ʻ*R9ݗї>~?׽T]ʏf{  +F^MKYzdz.?ݛ]k lL6&@9E{H02`YКY020`pY@ZT<@HrPYg lv@p ijvNuH  0P`pYd9c;^wbJ`6p*P($ X+ޫ  0P`pY2EʚF¤ Pc&n  =b"Y ! 0 ` p PY@|EEde5( #`0`P A#G&K=~3Z%".r$hy\rkb zjjkpnE"q@t6ii -B-2*7j)-e%o\47+ŕ@  U 0 P ` pY@,%1t^;$&҉=J1.KwJtr"}x_/w |2s  0 ` p PYpP%a!d~ 2bdrERF@Ata0 P(XCaa`)<"d)qIiHUX8Kjٍ=V/2 554Qh@ ;U۶k? |t[plІ!@ sl'@}v=n[1M*J@{F-*:dld62Ɔ3E-m[m 7Yn&@7f"3fov̐} ܒs$oc7Z}q ݔJn g[r'qk;x}IuwK~yI&`~e2B]!ZV6C|wkg$v&; CsBsy mg スjȅwݷzzK mR],EE0ɫۼ ?ڡ/q ڊ(=uaCJo 77Tq+fBu71]4nfh6 @`S`Z65eD6ɮdF#6>}7܎7vg ~s-d? fj  0 ` p PY  0 P`pY 5˛DXv'֦dPH Bۅb0P`pYpy{M΄ "Pr0`pYqC|A@@$r0`pYqC|A@@$2 0 P`pY 2{<5v0ڇ   0 P ` pY)!If)矌H".TS^X$ܷ zao8^[er^ \ )w+ǖwK囔~ -1zyyxkn˴ɭ6X5]_K@P5 㾏B׮ p7Rޫ}\m;FJi p _ 6։)T4/'&ۿIf:L#p2oPZS),dxQ%$jZ9rOtI'ËooJھNEv9hw+y;]0EysB<jRdhj$"s0Z^y###yKM}}D=S=]zA2ԃq|Bpf OrrZ9  0P`pY0<@7 C3xdӵ37@(BP(7 M 0 ` p PY  `d`  13yA4YFy Ĺ`0 `0 `0 `0 `0 CX4a0( 0$@'Ҁ?oD*3r)JR2; pC=(]HtAySwi1\mf{)s4rG{ …b87N!nc8gyiV޲< S=2 v ?U5Ä6J-V-11iuL1&^P;߾*<0"*dTvf1BRLea0-wY9. <0*IRgPSO#d s}uV8W!kKTz\.+B?Rkf)$5}]g` ^LI ps1nO.0`N*G(7x"c )]0L, dHrr r}?M\0E"97ON+-----*0޷X#75xlr˻JNnhcH@xMșs2={gzSu7xr?[ pu2Q?]@:ЌVdYD &_x`D@3YĎO43xX+t @?AxvLjA4% ;O=Ws(+`' " d_biIe" 3cI'*[KKD *6J< Z%*r-qZ%˪9*U<0'8! .an@ Yl 6r]b3-X`J5b+B7R0īsx ~&"^] loQU o)A{[3DDb d',fX97gR1*.aD Vbï6d<*>0<>ښh;˻oY޹Cn-f ܀/dfd0ZEȨ%g 0* ";"0@ ī{NTg[tf>Qx`%UsxlNdU] `U"T k3B<c#`VBZ87cu c8`%Uqc%Pkؔ6W īxzOeyJIfnV  b0P`pY3 BPM > 0 P`pY=D)g5m]̦k6`  Fz^k50`pPY  PPs- Gx&Pq CHA4IX̣Uf_u{;i'`iݴ^ר544ThlkzհP\xOjalN{۵njn8J߲e֜<7ԫzúXXw;Օu}Eîheh|:y=ig7y>2/*u%&;II(έVe߻Y+@ vB`pYDP1B`pYD_12 0 P`pY=WCʚEnۗpYջw! xyi   0`pPY@^jE@0e42(x%F4ĤSL`M22OS^CzКm[{GuޫFrYN*yn9^gó3Ct]o9BIr1nϭ%x }KI{i(6^FǬߨ}}{W͢pb$ {:X1x\Z^2wKX-  B0`pPYb0P`pY2K|Qd&lg"B`pYg(B0P`pYQ@hcJ@Il1"ꭽs3   0`pPY@8QHd41(&@0h=g'].ŅjU욖јux{|Tfps[AKХ|btUkb]3ۗ[vS}BJttb8=DrB0P`pYReh^R`Y`ɘtQ20`pYE>r 0 P`pY+*F  20P`pYPh*AdSQ20`pYtYA".b`pY˱IRC0( 20`pY:G0 ~pj}]/Էۂ'2`Y"0b`pYhGXn"P2 0 P`pY05"3x"uZf- 4`b`pYhJcufDB0P`pYj=B0P`pY4@K3c ͈Y+, Y+p.B`pY03=.(b`pYdIOl DP/YY+Ha20`pYjB282`Y HX"KfB`pY` :[,B`pYa:.B0P`pY03d]t dmB`pYp; &DYҩ`RU 20`pY0$a  r0`pPY  PJY,v#6@`#!u<@ *7G fl夁d߰;4fBx߄@F.A5 ֹ韨䖖*%Q8p:V]dR)I" z J>Ck5 ~TTl*6Y3Wqy̭+^kŶb[ |6Y DY 4X b 0 P ` pY1@%Ő-we1h/? b 0 P ` pY2%Ő-wes'eJ 0 O_~Y D  0`pPY  `\A4)Mkc@@q  aSpcz n5 uڬShnq7+(P+Pড[G#KmVi:.̦:vNKi7:[!H  0 P ` pYt@Pa (bQ .N~Dt$OnUhKaKv4moS̗-#!7~67h  B `V`F@V` p/x||llldOdOdOdOd`Ơ ʠ ʠ ʠJJ@  R0P`pYP5@%"˞Nn<9scxJ)!  20P`pY 4Js^ʬϡǓ57=syΝ32`Y/  B0P`pY`u)hcg\B*[? YL?MUdǕᎩN!0402p080808088088080808080891804`pY&WUPH BY!2`Y"0  0`pYLmkְ B!Q(80P`pY@Q*OHuZm B!Q(c{kr0`pY%"P(`pY&`UPH BY!  R0P`pY )[ܘb`PY @ pPh4"EZflgunCXd6ݵW9A&Y ~B0P`pY R˛,}nR0`pYa6ˎb="0P`pYal`#!9 h R0`pYa>ˎb="`pPYꀰgS&J>}F0 0"#XBگh_ ׯƱ :*9pCXOG BY!"j`pPYꀰgS&>}F0 0"#f7گh_q,;V{>k'nsXB0P`pYabd|+_Y D  0 ` p PYJ`1LЃ= ydy ErH`Da0`084Agj:6t:SZn< &5uGPP#Jgr71=ɍPBrOKw.[Z͕^  'UѪV\ïWny7t`QQ([*20`pYGw B`pYFs   0 P ` pYa46]BD/DRF (@# ɲSpx |/11yzpeӘ fʹ&_$rgorc.ZիUeW(h!3BT  0 P ` pYa8:BҺ" `%@!T Q-~Ȁ?;%g!&{,!yԿ?O{l*:>u:'O Jyڲ[vw<#papѸ2`Y"0  0 P`pYaF`& I P0d@(B esO`_tr9\*7L`3؂]\%ؕIU;uHBYA'NJTn8c$kյ8ϵNĆWJ5/܀(vt;J  0 P ` pYaF"U֕ H f /B4YnN7 b3dFA<_c:3)J]jB`pYaS `PDEF;wMZ&n b 0 P ` pYa46DB$&)p<~duKLL3JcfJ) q *[T2,2   B0P`pYa ub&"\'M4x"cGr0`pY b @P(  0 P ` pYL+ .L4@.4 'BP(\&0P`pYdMSD!IFAԁB!Q(\ Nϰ?8陜20`pY3S4BWYL  0`pY2@# =&+#BP B  0`pY1# :zQB!Q($ F  `pY)bBPH BYp!BY@! 20`pYfLB`pYa3 7YB`pY"Q1`0`pPYB& `Xp@0p?X`P Ac0X+w rM8LdH.0=YIV, nUY ~B`pYa= JMk"pY ^ Y 8Y 820`pY b;vR 0 P`pYrJۃ|mh}B`pYȂa82`YPCP7 B`pYQ +>0P`pY0qMPBAB`pYA$ D6 2`Y$2`Y D0 B0P`pY +̰UB0P`pYD`,0`pYIQ‹@(20`pY "3< B`pYPeZrX20`pY)ّ{,֠Y`pYaP.+4(~`pYad^+>(B/  `pPY—[& A,.hsn4 0a0( H1C }4H?xPSe5rQ(ȤU} oXBY#7  `pPY—[& @,.hsn4 0a0( H1C }4H?xRyM/fK%HLۜiS5M`pYac.+4(  0 ` p PYJ`1Lփ= d{ ErH`Da0- `ph@ ĖsZ r)-ȻcIi 2H޸5BaZ4KکPݥBr'Uλyyy+♟]##D-Ŗb;e~冏[ 2znW[)2`YC? B`pYPEi  0 P`pYQqT*VE҅,!(BFmı LyE=uS7fQDXdmCbs'D   0 P ` pYafX]PQ "Vhq2P($2ВJg!vFv9eml@{W=mug0P`pYaG\&P!`H!7j H uPh F_Sgݍix4r&Tn ܒ V;Γ1䘕H|JfևLJ!P0'%`6~o&M[͵఼:4]\MUVlԞbnGoB"xuʰ  0 P ` pY۬RThJrAd] BA#$fHKZߪTJjm &t!)4 d˂k#P:zVhk9A-riՒmΚV4uKJJz$I"}LYwJi\WJ  R0P`pYaq@Eͥf g&T33w?  0 P ` pYL+ .5@.4 'BP(\&b0P`pYa}M= $  -Yj2"9Zd 58  0P`pYa GV2iuDPH B_  0P`pYaze;:"P(D _  `pY`)bBPh 2`YcPC0`pPYB& PXp@D#`p O/Qx]-'߄q"QJa.6 6Z<ZB`pYep2`Y0D0 R`pPYZ eA: P@F:|6wIr_{?8|Jvy'Y ~ R`pPYZ EA: P@F3|wIܽ͂ݭ 8820`pY&A R`pPYZ eA: P@F3|wI\)Նs HHY  ^20`pYt:YڒS̄E.  0P`pYщʋM  6BY "Y    >0`pYw@D=M_%ů B DH DH B!(B"Q($ DPpIm20`pYC\1 % 0 `pPYNJ !@&(@&)l4*ͪ" F 0H`P A#+ sn>Qd.))qhyL55]^ttuv_MK,{9@2@Fff Xѷq( 0 P`pYJPaT,x^ERe] B!#VVmG:8tRg/|G$|f.kl]̚R5{Keق{% 0`pPYBX x@ɡhVEF=0( "0JM%я ޿u^)դ-?CSۺ@^[ndV̎vGq/B㳭`|vQ_q<ёжj[pT  `pYP3SE~F DPH D  0P`pYIPTE`QHIFDPH S]áyy%d% jDj% 0`pPYBZ x@ihRE@ Aa0dCFG:v\wեvu&8,Ho)1(7F/k8;fëA4TV:=0`pYi-0 QI BL~{6``s2  `pYP1&7gTPH$ DH `pPY@R%8GOYC`zzr(զk%ZԐ$YTV  B0P`pY) 0 P`pY*RTc?xZEua`"P($ 補C *$ cn(H&*nFʹn{B#^G+GGDZxK#<% "J 0 P`pY J 0Y /<!M DpH|c]^qk[_L.ۃpr2`YǁZ{:B`pY0ePo2`YC9   0 P ` pYIA. 52TJȀ HT6%Y  R0`pY0@J+ $  `pPY@PcAE'8vlƓ`Ұ00L|||JuGXXX:>HT6֠R0`pY1@eA $20`pYjC E ` n> ˅efyNj׍vU\ Ket+R0`pY0@"ɘ;# $R0`pY*G?$20`pYlQ84CQZK^rݻ>ѧi[, m&Uj`pPY@R1 PVEOYC`FH|N{]/lדOq83vWXw4D 20`pYw@4CQCnk+J?TTb<{ܾkT`pPY@R]4$5a0( Z^Q}7~԰IlB_6in4B2qB`pYGw BY0! 0P`pY<"aj,@Vfnm[L:"&b"B0P`pY2@"H1RvΟD&30`pYD)`B@PR0`pY B @P 0 P`pYJQQTC8xVE҅,(BF LiFg룵מi)JJvk%7\I߈oF7c5Y    0P`pYIQTaQHIFDPH EiFg[S-6YdK%2`YPD0 B`pYƱV  0 P`pY *GeC a{e{ЇɭDh+8[Ho.##G920`pY0!F8, vmݽgط-@B`pY(&2`Y@$aB`pY (`Kj2`Y ("KbV2`Y`C8 2`Y0"0YR0`pY= @ rC&f t#DZ P=Q'F XR5Mr;^7B*,YOrԦ^]ka?{3tKtKtKtKtKtKtK72`Y0RiBnUtr |ѕxX\:'`pYP  20P`pY1;0`pY B`pY54Y  r0`pPY @8U2) Q;2Q9ٽv7vo![eޥ׵lFhC]`F&t< B0P`pYDJDC  R0P`pYdIr lLDC޽Z20`pY0aBStF>A"r0`pYi@`g @B`pYDIݐuE"  0`pPY@P4" #0 etg79~*/;g:Gi/y/.Nm*,Ot&s&p}ׅuJ2gJJڥJc7hW1KvuTѾYuy.[Yt20`pYٸ-B`pY@E].B0P`pYY"e5DU$Gv2`Y0"ϰb0P`pY16*FbFe n~ h5 0 ` p PY P8c~ ,>M2{EuP`0 `0 `0 `0 `0 0: P@ B Z90F,nt&Ua笶Es7V\<}R͚fyFƛK庅iG!? ݷR.Yᭊ; x5waAj8L+/]Q2H;za' &\_Փ UpE#:FD'UC 3)F]<A 0$sv.< Tg _a5] o'sV{V;x`iVU *O~3 23u 0:`Li{:7޵ĩv-+=d`:7[au;^ίifT@/|^߳'>O<u0LcT{2(ʔZ5@PL2}HGb(Z@lNZ?& o̒cfqiv "О<)2,оvDݗ!?MhOGL| Ʌ&j0q o(2^'@o_^o5 L5= G(9^ڍUBq 8]}]:]Ck vО.wͲ̦V{le!p `_yz߼kh}=NqZ+p(Jڈ/`a@?  0 P ` pY@WC#: \$DD⒝/9MxS =KwUu.zas^L#Bp"CYLtS!b/颗p_%yu^5`DP@Ph`hlflflfl&l&llnl&lnlxhhhBhnhnvhv(RhVhrh~kV(B``H b 0 ` p PY@8\E@aPq DYhȦ(Q9n)I!B&AmfN};,*QKv..Ycd#wMhlrr_S,ue] i7w?ϙ>ĆU"1aXzK|ߜjA: Ggl'%^SRm霒)ϱald(6ܞJ?wWQJ Q绊 }x2W\ S؂z/#ȕ=,Uv]kdk*#ӹuz22?2WWyjo7g @i[e7 NMM*5^999ĪsӭQUuҥ+$(  B0P`pYh*K<5V8@Eq\u52`Y$#B0P`pY4xiҲ;oB`pYtte.t:B`pYe۱  B0P`pY8@(hB*VFo;!@mOmO  B0P`pY$=@ *tD ŦZZvc4RC԰lp>qDd20`pYC{A*  B0P`pY:I+߰<sFb0P`pY20`pYdV\  R0P`pY$EF5  b0P`pY;SZtU3qfE[Xgӯ?&|R\*  B0P`pY̑)[8>R 0 P`pY2@ÈWز}4p*  R0P`pYDAq:  B0P`pY1@"HTqy4 0 `pPY ``_; Z^&( a̡ƠЧԞ>Tj4GD<:/KT**~_,.F;%$((~GUE%tJ ?8gVS۳ٝ;p#5&BѷB(.d3‡P~WqmH:_$:q+)~yW]ǵ֞kN_8`AAAbb`pY("  0`pPY @ӽT&0A#8Ia7`3C$}nՄZ}Vm~amՖt^/ H%X,^6{4dk745N8&34/:A+WD:<`mb&Ab0`pPYS eh:@F@%yfYzt WA  0 ` p PY:Jp9cQ[ٕؑB`pYU ZA $Y# .Yod3k;m۶P۱=SmH0`pPY@L@2AeѴ6@@a0h A(;$szY ~+MbS c="^oy=>d^=+Nmoma8G6|vacq|ro^oc%~zdZgumfmqf֧b4saRvJa;6(V]%qa0QJpYoҳ=[}s96a~@*^-q]u AG@ru{W1ҸO7~~'BYD%!Y ~rcDr`pPY  `0 : :`=,Fk~K"B$]`|m Y˩OGu c3. s^ᳺmֆr`pPY2`Y01,ƎN|NaB0P`pYaRdv/*&0`pPY܀Ok5I 0A@ô%ofKv}:WoiզcqZJk!uMĄ [gBY`"B`pYD[ 20`pYe' Y DB`pY@DV1`B`pYDDV1`  B0P`pY X2_c4L' ߂{d3 |? _;#K& SW, ߅ƒc2 [óo8_{> !@E,#M(hK&&s;!(P`(V>(NT*֊ta!Y -nth^/  !(c1X1㚡g@4F6W!بl6v΍}q 9Xޡy="A6!pA$i@Ff#֑G"&)J% j7O' "I`S) S"Y`W+ Тji[&.6 "|) `V0N8 %ǀd2` e6πh4fD Y#l6~ |i@q8\5眣i@u:w#)y=h~F?Ɵ$avAޠI(j C K$(*!En9H&$$K&6J>a鴤\j/AfLV<$n*8Nn@PT3%IaRy@jR U^U^jY%VՕ*~EaiXV0bg*Z&[%۪n6\>0ԥjwAf^V%*`nH-bs=&!ad``2k&g&D+!ViδxEU뫁ֆk&gڶmxkAo'+ơr.]2Ρt.(RFvFu'avx^@)kzvo'|vIاk~p?ƟO& vAP#H< WA0I'& υCٰph;GMD2"I&aNſbgѹ^0ٌFbs;JG#QA!7>@c1Fc1c1c1c1c1c1c1c1c1c1cp9s9s9s9s9s9s9s9s9s9s9s9s9s9s9S9s9s9s9r9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s9s91c1c1c1c1c1c1c1c1c1c1c1c1a1c1c1c1ac0#0#0c4H#4H#c kFiFi20`pY2a =o20`pY02+L=o20`pYg b 0 P ` pYO`A%B.P9ȃA`K U^xl0Gȑ\ Ә0O(Q!0]JTXsW}eZ][ĵ\-!^N!*4#>*K%UpZ'z2hbivjkÚ>n/F $ײ4?c4I۴V5`Oi6sWǧG֗ۯ* R`@4`4jԸ13g0ƍf̙3Yfq 3fΜ9s@`ƍ3̘9s 3qƍ3̘9s̙3gqƍ3̘9s̙3g fذaÆ 0 b 0 P ` pYww ,&u7"Kb`PY: tXǥ ]Z99  0`pPY `P)C=x $Iiv+m P(lpy|e5q0Xe.}0~PYR 0 `pPY@MR(#F(MQ)`$OeOtu6}Rl##RH-(H:o WPP,NAt"YY : 2`YpbQWB`pYeWP2`YC9 20`pY4F&[120`pY4G&[120`pYE&[1Y 20`pY_;`"E@Jﱴ;6(  B0`pPY@L`Rȣ4(BLPK0K(x*3Vn-ʺ&G)mls[) {6{P3njss;M6nq„ ͦah=bTBY"20`pY`Ac<  R0P`pYA\W`nQ(`GUQj絳۪"Qٔ *JBYBBY" B 0 P ` pY lO< B 0 P ` pYkL<BYC*  0`pY`4#GkB!Q($ /`pYpj_g  0P`pYL5BPp  0P`pYPL5BPpB0P`pYԐ/ SX $1a<KҖHf4ANvS hIT*Tbq a, Zڦ8y3BY!Y DR 0 `pPYȀpVb"ct&`(Vx %)Δ[Xval³?.wfvؼvvAiynS۔R 0 P`pYaAҍQE Y BYp!  B0P`pY_$H@E _EdHPPQQ0P`pYBY"(2`Y`#0  `pY1<[8gTPH$ DH Y h"2`Y"02`Y#ݰ2`Y4dmX2`Y0CX:,2`YJ`Y2`YडtL80<Y2 0 P`pY)K= ]2 0 P`pY3= ]2`YB20`pYdo 20`pYh @,xϤZR-^'^xB`pY=c@` *  B0P`pYGI~1`  20P`pYk]ŀBY! R0`pY r\, 20`pY4F0b`pYA& DWR0`pYAJˎpa2`Y-+X 1^}wO B0P`pYp5)l] 3plϦUBA2`YѸN00B0P`pY5)ma"*Wpt(OVOe@ -@R0`pYAFˮne@ b0P`pYA]LCd26>7 5+Zg2$@2`YD0B`pYBUX H2`Y`B4uY`pY 20`pY*tfB`pYa' DW8  0 P ` pYa(1ܙNU`U(!!  0 P ` pYa(1ЁU`U(!!B0P`pYa4[5D  b0P`pYaXg&ʀkR`Y!!P%  0P`pYa G X6N}7( B( o`pYah qfB!a  0P`pYMjְ  DPp  0P`pYMjְ  DPp  B0P`pY! I UDV22rEGԪfek^C͜6=.u(1c13"BY! `pYD:aZu8@ i[4`pY `pYD:{u8@ i[40P`pYBYeN!B`pY`"kc$-2`YD0 B0P`pY; 2|g(^ȑP3w  B0P`pY1%]Mۿ k B 0`pY`pYBYP"Y2`Y"C8 c^%2`YC c^B`pY.c4h&~W2`Y"װ0`pPYk hb <IօQ^ޙJr//PYYY٬Vնc3 R`YDDV  0 `pPYp†"90ZIօG00h8C`owg@(R+ZHie0+( tYO0?Ft\jtV7Ϸ[E_cűqߣhl960R0`pYaiˎn$/ '   0 P ` pYa(195MU`U(!!  0 P ` pYa(1!U`U(!!B0P`pYa.MZ5D  b0P`pYaLa&ʀk  0P`pYa G Ne{ B B&`pYac`*o@!a  0P`pY@L5D  0P`pYL5DB`pY!% 6B`pYa" D*Wh20`pY`C5v0P`pY!0]Q"Ox)"kPd&I0`pY0P`pYr0`pYaKҎp+@0P`pYa``#q9 hr0`pYaXҎp*+@0`pPYԀ  3E0PEF06=~8+\0 q^%n3i]8CB1BY!$0`pPYԀ  3E0PEF06=~8+\0 ke XrQ1+or0`pYab׎z$+@  0 ` p PY` @ 0He..2/ c 0ZDž)-NȻcIi 2Xθm]Cv89E 1Ay'%%%q) S2'&AYb DZr*dd$i  0 P ` pYaFjŀu)RU*5'f``t"  0 P ` pYaf)" `%@!*`J2Ȁ?;%g!";@|+ֿf:GqAi2c*@8*^*[^  0 P ` pYaF8GP H(#2 B(4pHsEؙiLfXēĈp3I,~~E*=R׸*{R2eJTG5T)Fiv;j::NkKB%7Z<ٸPPϩ  0 P ` pYaBF8a`< B2" B6 n BAJfה̆5)r1wC  rb9nn}p$t뷵mjx #9Ot*LϲL{9 ְU#꿫ŕ*}GH4ӯW"5[7~)#Pn)+~i  0 P ` pYaF^€8P"H5IF` Hd2 !~wrvI*YJQ>$e$kտ[2 ds=~R0`pY(  0 P ` pYך @$ .4  <^c ?G%nj4͵  0P`pYaxZJ+:"  0P`pYadZB+:"P+Y0$Iue$BP(`רeg u?6 0`pY b 0 ` p PY@Dg-,:`]0`FFf$ Li6tal)׋jZr\;N.>//UsĪx0P`pYab`#a8 H   0 P ` pY׊ *@$򉓬  Hp?CE2KR\}OR0`pY`B @P`pYp&WUPH B`pYNKxСY|kWIx(=_/  b0P`pY@I/ESeyd  0P`pY! G Ld tdy4$BQ(0P`pY * +AK>Iue$BP(`רeg u?6 2`Y#ݰ20`pYE'ڰ b0P`pY\[ VM# hh%rC~D$*u;xADxADxAD:Xp&K˱Apa0L:}hh4dd&؅AH6K` GpAC&c0Cw@]ĝ2- ݐL&is>\ J<!JNpe 1KA mT ? 0$I2 GAp, p!SABnI;BV 6 U)RdN0~7DNǽ9R((U*>MxЁIL_STUB_ReversePInvoke`AD0ADH,ADrADAD@2AD,ADҷAD1AD1AD2ADrAD sADsADrADAD3AD,ADҷAD1AD1AD2AD(@(qADAD7ADP-ADӷAD(7ADh7ADAqADIqAD(@(qADAD7AD.ADӷAD(7AD7AD rADAD89AD.ADҷAD1AD1AD2AD(rADADADADADtADtAD0uADP?#`nADADADbAD=ADADH؜AD&AD @q pADAD(AD(AD=ADY380ADADADIADpAD3ADQADѡADpAD ADhAD#qADADADADrADADtADtAD0uAD?9AD1ADpAD qADAADADADADADpADqqAD qADADADAD@&AD!`nADADADpADX?ADxٜADADЙADpADAD8ADpAD0VAD!qADWADc `nADADADcqAD?AD?ADADAD?ADAD#`nADADADpAD0@ADADxADP AD0{qADADPADH?AD0=ADADtADtAD0uADP/?3AD !pADADAD+qAD0AADAD#qADADADAD@kADADtADtAD0uAD? !pADAD8AD+qADxBADADADX˜ADPADpAD#ADAD@\ADX(ADpADADADADȺg1h 1AD`MADADADpADADoADxCADPAD@ADaADpADAD̜AD`ADpADCAD9mADAD# `nADAD0ADcqADxDAD`DADADADDAD"!qADAADADxV#qADADPADADADADtADtAD0uAD?`nADADAD{qADEADpEAD`AD%ADAD`@ADPADpADM`nADADpAD#rAD(FAD+AD0FAD `ADza!`nADADADpADFADxٜADADAD(@#S(qADADAD;ADFADӷADADADADc`nADADHADpAD0GADADxADVhAD!qADNAD{qADADADH@ADݷADADtADtAD0uADX(?c `nADADXADcqADGADGADADADGAD. AD(# pADADAD;rADHADADADADhADXADADpAD+ADAD؉ADfADpADAD kqADADAD@ADoADADtADtAD0uAD?#`nADADADpADhJADADADADADAD(@#F(qADAD AD3qADKADӷAD(7ADAD KADhrAD9mAD'AD9ADAADpADhADADADpAD8AD#`nADAD ADKADKADAD AD`'ADHSAD͜ADpADAD(@cE(qADAD ADrADLADӷAD8 ADx ADLADrADPAD@ADaADpADqqAD qADڜAD(AD` AD#`nADAD ADpADXMADAD AD`MADɘAD@AD-AD额ADADpADAD٥AD)ADpADADGADЙADpADq`nADADADPADHNAD"ADuADpADHAD`ADpADCAD4AD !pADADAD+qADNAD(ADADa`nADADHADpADNADxٜADADhADyADADaADpADqAD qADADqADIqADqAD ADHSAD͜ADpADqqAD qADADxADAD@`ADqADaADpADX4ADADAD@ADaADpAD qAD(ADc`nADADADpADPADADxADAD;qADADADAADp ADADtADtAD0uAD0Y?AD؉ADfADpADqqAD qAD`ADADXAD(;qADADHADPAADADADtADtAD0uADy?ADXRAD%ADAADADpADADAD!ADpADpADADADADSADI80AD@AD1ADpAD`MAD( pADADADkrADSADADADADADAD`'ADAD !pADAD@AD+qADSADPADAD%ADMADHADpADqqAD qADADADAD`'ADIADQADѡADpADqqAD qADYADaADp!ADHADHAD8ADpAD(ַAD AD ADQADpADADq`nADADP$AD@ADUAD@$ADhvAD@AD`MADHADADpADADMADHADpADADP&ADADAD ADpADqqAD qADADADiADVADADpAD#O`nADAD0(ADCrADVADVAD@(ADAD(ADqADqADrADrADrADADADpADPADADGADЙADpADqqAD qADpɜADAD8*ADa`nADAD*ADpAD@XADxٜADAD !pADAD*AD+qADXAD*ADXAD9mAD)AD(# pADAD+ADKrADXYAD8YAD*AD+ADIADnADpADX4AD #a `nADAD(AD{rADHWADPWAD(+AD(AD  rADAD+ADBAD@ZADh+AD+ADrAD`nADAD+AD(CADx+AD  rADADx,ADCAD@ZAD8,AD,AD``nADAD,ADCAD+AD0`nADAD,AD0DAD+AD(0aADAD,ADDAD+AD 8ADAD-ADDAD(]AD\AD,AD-ADP-AD-AD AD\ADX(ADpADqqAD qADAD8МADAD`nADAD-AD8EAD+AD0`nADAD-ADEAD0+AD`nADAD.ADEAD+AD `nADAD(.AD@FAD+AD0 `nADAD8.ADFAD+AD( `nADAD.ADXAD_AD_ADP.AD.ADh`y$ADvADpADpADpAD qADADCT6c 1CA`nADAD /ADFAD@+ADC`nADAD@/ADHGAD+AD&`nADADX/ADGAD+AD 8cADADh/ADGADx/AD `nADAD/ADPHADh+AD`nADAD/ADHAD8+AD 0aADAD/ADIAD/AD@"sADAD 0ADXIAD+AD VpADADX0ADJAD80AD(aADADh0ADpJADx0AD HeADAD0ADJAD0AD( pdADAD0AD KAD1AD1AD( HeADAD1ADxKADX1AD1AD8$sADAD1ADKAD+AD aADAD2AD(LAD1AD(E`nADAD 2ADLAD+AD(cADAD02ADLAD@2AD( HeADAD2AD0MADp2AD( pdADAD2ADMAD2AD3AD`nADAD 3ADMAD+AD`nADAD03AD8NADX+AD(!`nADADH3ADNAD phADX3ADnADIqAD)sAD#sADAD3ADNADHxhAD3AD3AD4AD%%`nADAD(4AD@OAD+AD`'`nADAD84ADOAD+AD0D`nADADH4ADOAD+ADHY`nADAD`4ADHPAD+AD`1`nADADp4ADPAD+AD8B`nADAD4ADPADp+AD(x`nADAD4ADPQAD+AD2`nADAD4ADQAD+AD0`nADAD4ADRAD+ADXw`nADAD4ADXRADh+AD(:`nADAD4ADRAD +ADc`nADAD5ADSAD+ADqADoADPmADADADADpADqAD qAD$ADHADIqADqADh~ADAD8ADpADqAD qADxGADPADIqADqAD6AD P& `nADAD5ADADmADmAD7ADP7AD7AD7AD5ADX00;`nADAD8AD`SADphAD8AD8ADX8AD0epADAD9ADSAD9ADXADAD0=ADTAD+ADXh@XADAD@=AD UAD+AD@ADip08p@ lhADjADpADIqADqADx.AD AD@`nADADP=ADAD(sADPsAD?AD>AD>ADp>AD0X1p?, 覝ADAD@?ADxUADtADx@AD8@AD?AD?ADx?ADX?AD wAD1sADnADnAD9sADAsADIsADIqADADpADC(`=, 覝ADADAADUADtADAAD`AAD@ADAAD@AD8AADHwAD@ pADADBADXADvADAD0BADpBAD@AD0)`nADADBADVAD+AD+`nADADBAD WAD+AD,`nADADBADxWADp+AD-`nADADCADWAD+AD.`nADADCAD(XAD+AD 3`nADAD CADXAD+AD@i`nADAD8CADXAD+AD  4`nADADDADPADpyAD`HCADqADqAD8yADCAD 4`nADADCADxADyADHCAD 5yADADDAD0YADPzAD(DADCAD(6 P{ADADDADYAD8zADhDADDAD8ַAD9`nADADDADYAD+AD8`nADADDAD8ZADDADF`nADAD0EADZADx+AD0GADADEADZADEADHEADEAD0HADADhFAD@[ADFADxFAD@FAD0IADAD`GAD[ADPFADFAD8GAD0JADADHAD[ADpGADGADGADL`nADAD(HADH\ADP+ADM`nADADHHAD\AD+AD @N `nADADHAD\ADP~ADXHADHADADpADADnADpADCd7C41a0bO`nADADHADP]AD+ADoAD(AD`AD T`nADADHADADxAD+AD  T`nADADHADADHAD+ADPADqADqADU`nADADIAD]AD+ADW`nADAD8IAD^ADP+ADZ`nADADHIADX^AD8+AD [`nADADhIAD^AD+AD\`nADADIAD_AD+AD]`nADADIAD`_ADX+AD^`nADADIAD_AD8+AD8_ `nADAD(JAD`AD ADIADIAD1ADpAD!ADnADpAD)ADpAD1ADnADpAD@` `nADAD8JADh`AD`8AD`JADHJADa`nADADJAD`AD+ADf`nADADJADaADx+AD g`nADADJADpaAD8+ADh`nADADJADaAD+ADj`nADAD KAD bAD+ADk`nADAD8KADxbAD+ADl`nADADHKADbADx+ADm`nADADhKAD(cAD8+AD n`nADADKADcAD+ADo`nADADKADcAD+AD0pHoADADKAD0dADphADHLADLADKAD0qHoADADLADdADphADMADLADLADr`nADADMADdADHXMADsADADMAD8eADMADtADADMADeADMADPu& (ADADOADeADOADADNADNADNAD OADHNADADADIADpADqAD qADADADIqADqADv`nADADpOAD@fAD@+ADy`nADADOADfAD+AD{`nADADOADfAD+ADAADpADIADnADpAD8 X| `nADADOADHgADȊADOADPAD}`nADAD(PADgADp+AD@AD@AD{ `ADADPADHAD苸ADADHPADPADq `nADADQADADADADPADPAD0H=AD#!qADUAD@AD  `nADADXQAD`ADAD许ADXRADRADIoADqADAD(QADAD)ADpAD qADADADADpAD qADADRAD`nADADHSADADADADSAD(@AD@AD( pADADSADADXAD@ADXSADSADjhpAD ADADTADADADЏADTADSAD8@!qADMADIqADCppADpAD{ ADAD`TADADADADTADpTADaADpADpAD!qADMAD `nADADTAD0AD(ADADTADpTAD=AD%pADpADADnADpAD  `nADAD0UADAD8AD@ADXUADPUAD x=AD&@AD  `nADADUADADADADUADUADxI8>AD' { 8ADAD@VAD ADAD(ADVADPVADxADADAD!qADh4AD$ `nADADhVADP ADؓAD(ADVADPVAD)H>ADADADADqADoADAD8!pADADVADAD蓸ADWAD 8ypADADVAD ADADWAD { ADAD8WAD ADxAD8ADPWADXADqpADAD`ADb $ `nADADWAD@ AD0AD8ADWADXADx>ADpADAD!qADpAD8!pADAD XADrADAD0XAD#AD8!pADADXADrADؗAD0XADoADiAD 8ypADADpXAD ADȗAD0XAD AD8AD`nADADXAD ADHADXAD!>AD$PADmAD(09pADAD0YAD ADؘADXXADADqADўADPYAD0!pADAD@YAD{ADADYAD9bpADADYADADADؿZADADAD(`nADADpZADCAD`AD ZAD@ZADhAD((`nADADZADADpADȿZADa!qADqAD(; XADAD@[ADAD0[ADADZADZADyAD,? `nADAD[ADADADADp[AD[ADp(?ADADADXAD, ? `nADAD[ADADXADAD[AD0\ADh?ADiADnADpAD((9pADADx\ADADAD8\ADAhADADqADADkppGpAh8J&.:\c܁(=!AD1AD)ADpADqAD qADADɡADIqADqAD(P?& `nADAD^AD0AD`ADAD(^AD]AD]ADX]AD(]AD9( (@? pADAD_ADADhAD@ADh^AD^ADiADnADpADqADpADADqADءADADqAD(? `nADAD _ADADСAD许AD_AD@_ADP h8AD((? pADAD_ADAD袸ADAD`AD`ADVpYءAD ADADpAD qADAD(? `nADADH`ADXADADAD`ADh`AD 8ADqAD8ADɥADnADpAD(0? pADAD`ADADADAD0aAD(aADUػAD( u`nADADaADAD@ADػaADADqAD((v`nADADaADH ADXADaADAD( 9pADAD0bAD ADЦAD`aADئADqADٙADpbAD !pADAD@bADADADPbAD`ADbAD(`nADADbAD#ADADcAD((`nADAD@cADp"ADADX cAD)qADqAD( u`nADADcAD"AD(ADp`cADI)qADqADADAD((v`nADADcAD$AD8ADcAD$  `nADADdADx$ADXAD`ADcADcAD(BADAD9ADnADpAD8ADPADnADpADqAD( P# pADAD`dADAD@ADADpdADdADHdAD(  P pADAD8dAD`%ADADADpdADdADh9ADnADpADqADic98ADqADoADHeAD  `nADAD(eAD(&AD0ADADeADfADHH  `nADADpgAD&ADADADfAD gADa hAD ADgADhADjADpAD qAD AD`ADnADpADC$5`bAD$  `nADADhADx'ADADȭAD8hADxhADQBADqADoADAD(iADi8 d8ppf(dqADQqADpAD qADpAD  `nADADhAD8(ADAD许ADiADhiADXع9 ( pADADpjAD(ADADADiAD(jAD(J((# pADAD`jADADAD88ADiAD(jAD#ADpADnADpADADjAD-ADnADpADqAD( P# pADADjADADаADذADjADjADjADGG > % AU> >GUUGU> U>UG*>UEUB%UG%U %G)G * E) )G ) ) ) )  ) )  )    )) /5V<]L=,[AcW'aEmIMOÔp1>T@T>ې|@>2@T>@>ܓ@T><8x?0(>?P?Pp>>\ǙXX?@>n q@8?>>@8>>@H>>= ?8? ?@8>>?8??@8?>>??8???@8?>>>+?Ԕ1#W!{@8?>>>Ic,00 6AH@H>>?tș?t24@H>>6@H>>8@H>>)@  ;ٔ./ߔ?4?45GOaG{?͔BŔȔei U!I{_ S?s9o+WGsKE)i 3I7gQ;3y I+Qc3oW EGy5y3iŔqL???L?L![@qWoH??L@>>? ;G5)K(<͔( +[gu}mt?0?00 3@>(|3iGWG;T5mEUC>!7O_sݔٔܔڔ?H?H?H?H,H@>$??۔eeJęP@>\Xlhvz?? ŔՐd_ːG?YsD̔lՔfyfH   @>>mד@>>ܔF1 @>>n 5=/?H?d@?uĐWӓ]>??@>͐ٔ?֐ ?l H@H>H@H>8@H>6H%]}`>5M Jmyp?|~3@H>><@H>>/AAȔB0AAAǔAɔ<ؔP71<$ɔ;; =PƐpgRt|EX6^ ޓo>?`0jC??Ԑ?dT?@T>ݙ??<@d>???:??@?@T?@?@@T>>pt? ? T? ? -C?`?`?p?p+>>?pg>|2pp``?`?`E?|ɔ#,?|1? ”G>.=4ȐE???>>??|?|ɔ"P?8?8P?8?8@P>>p??P???`?`v$6bJ >ZNH?? ^> r?@?@?0@>ΐ? ?`w|32$sǔ0>?4?<UcKd@>@T>?pJX@>b@>~o3??? ?0>>??????d>>ؔ ??2?\?\?Xt>>>y8Ԑ?X ?@@ >~@>pߔ0?L?@>>͔DԔ=?4?4vG?0 >yVjz<F^p0BPTXbxeX?\?\Ffz#?\,Xd???dH?@H>?z@H>?){|TlH?@?@H??H?8?8H? ? H??H??H???`?`lll\?l?l@\>>ll?? _Iyyyyyyzzzz)z9pƔz=zA%-t? H?@?8H??@H?4T?@T?0?`0>??H;769}y@>>\̛%P{ {RP?@>>\Δ~{PP  @>>\  L@L>PllDD>??L     G@??ה֙?3!E1X[66`r0BRdx0@r  DZ>Z???o4QR?< t{??Zh>`$/@>̐??~>”ʔ?ߓ >Ka@k@ Bp@Ð|?>> 4ΐH@H>>#@>>mPP@@AAAA%A/A7ACAUAcAoAAAAAAABB BB-B=BSBeBwBBBBBBBBCCC%C3CCCOCaCkCuCCCCCCCCCCDD DD%DDDDDDDDDDEEE)E;EOE_EiEsEEEEEEEEEFEFFF!F%F+F3F9FAFKFQFWF]FeFmFwFFFFFFFFGG GGG)G1G;GGGQG_GiGsGGGGGGGGGGGH HH/HEHOHYHiHwHHHHHHHHHHIII+I5IGIcISIIuIIIIIIIIJJJ9J+JWJGJqJkJJ{JJJJJJKKK#KK7K/KMKCKaKWK{KmKKKKKKKKLKLLL1L#LOLALyL_LLLLLLLLMMM1MMOMCMoM[MMMMMMMMNMNNN5N)NONCNiN]NNyNNNNNNNNOOO-OOMOAOiO]OOyOOOOOOPP PCP1PiPSPP}PPPPQPQQQ9Q'Q]QIQQoQQQQQQRRR%RRAR/RaRQRRoRRRRRRS+SSYSASSsSSSSSSTST#TTGT7TeTYTTsTTTTTTTTTTUUU=U-U[UOUwUiUUUUUUUUVVV/VVQVEVoVaVVVVVVVVWW W3W%WWWEWyWmWWWWWWWWXX X5X)XQXEXmXaXX}XXXXXXYXY3Y#YSYEYqYcYYYYYYYYZZZ)ZZGZ9ZiZWZZ}ZZZZZZ[Z['[[9[[[[[[[[\\ \5\!\U\I\m\a\\y\\\\\\]\]5]%]S]C]w]a]]]]]]]]^^^;^%^e^O^^y^^^^^^___3__W_E_y_g________`_`5`'`M`A`e`W``q````````aaa1aaSaCaoaaaa{aaaaaaab bb%b3bAb]bObybmbbbbbbbbc bc-ccWcEc}ckccccccdcdd/d#dId=dcdWddqddddede'eeKe;eme]eeeeeeeef ef'ffCf7f]fQfwfkffffffffffg fg3ggogSgggghghGh/hyhahhhhihiAi)isi[iiiijij1jj_jIjjwjjjjkkkEk/ksk]kkkkkkl+llYlCllqllllmlm1mm[mGmmqmmmmnmn-nnWnCnnmnnnnnno)ooSo?o}oioooooop%ppOp;pypeppppppq)q qiqIqqqqrrr9rqrUrrrrsrsGs-sysasssstst3tt_tIttuttttutu-uuUuAu}uiuuuuuuvv v;v-v[vMvwvmvvvvv͔.vӓ@>vvvvw www%w-w5w?wGwOwUw[wawiwqwywwwwwwwwwwŔwwwwwwwwwwxx xxx)x5x?xGxQx[xexsx}xxxxxxxxxxxxyyyyy'y/y7y?yGyOǔeyWyoywyyyy `Ӕ a Zbh x8 dǔ a?PĐ?p2<FNTZdnx?\?N>>?N>V>Vϐ??T????<?<?<>АP֐Thd`l TAPTT`>>TTL>>@L>>PXpshXfؔeȔLh>h@H>>=@?>>D|??@H>>8H?@H>>*  L   L@L>P@H>>1P@H>>6CDE@H>>>=@?>>>D|@H>>>8@H>>>TPŔ<dP>b+S[ZjaCIMOp! 1t0tY1;20(?0d?P?P(?Pp?P?P!4Za0aa0, *(Q,,q0,,,?a0,#q,p0z ,-./'\\0Z0Z(0Z80ZH0ZX0Zhx0Z 0Z0Z)0Z90ZI0ZY0Zi0Zy0Z 0Z*0Z:0ZJ0ZZ0Zj0Zz0Z 0Z0Z+0Z;0ZK0Z[k0Z{0Z 0Z,0Z<0ZL0Z\0Zl0Z|0Z 0Z0Z-0Z=M]0Zm}0Z.0Z>0ZN0Z^0Zn0Z~0Z0Z0Z/0Z?0ZO0Z_o0Z(0Z80ZH0ZXhx )9IYiy *:JZjz 0Z+0Z;0ZK0Z[[????[0jL ["?L$8Y+Wl0K|0Z T-@l= 0K]a0Zy.0Z\i0Za9^a0Aa5i0Z8<\P|g\gPg=g|P=P-z[=?l=Z0mJz jz0ZK /FFa0lll0ln|0D2 0l,!0F9!??=0lA=0lF+#M0,,E]0^a0ll   {mq>}.0ll ^n}}@YY"ly ?H?H?d?d>yzӢn0Z0, i ix].[;/ i"9$l ?l?lvx8? Ԣp'J0-99)Z$a0- ^pW㕣,X*L?pnl 00*O/a0z00z&nj #۰nmyF䳔*].y #jyy:L\*zi*k=24o?42`@(?`=0Zo?`=!0|}0@i??4?4?L?L????MBF~!BJ>=AH+?p?po?pC+?pDgdJ?`?`^0 Ym9TXe?|?|n0+|>n AnǶ~CTJ~ѵ?LHTõ-8'~?̴kYE?F??./!L9ɒj/ a0KZm_0 0Y8Y{\H\öY9YHL\#zY\Y 0) 0 \w@J@ilyxLM }a3JXz9i==x 0m=EdJ4=X;SK?p?p^-0 *9T_mOM0? ?0??4 Òo9*;Loo/ a0<:Jy#do(?p4j5 \9j;-іN;??t?\?X$s?\?X 3<9MYJz_\\>?L?LZ!Yi?$zY\?0?0ht\0JI;lp)G0ඐHiY{\ْyZ0Y]|.|\0Y\)~0Y@\@k[Y0Y\p yY[=09\@ wY,<>);uI\?0ZJNzm0ۓ\%0@jY\Hz?Y\ǰY(?\YaZJKH*?>4 : 0\ ~D D{D0kD?`?`?`?`-(?lL?l?l.ġJġJġJġJє=[T~ѓX-Y\1an]? ? L?@L?@L?0L?0?`?`8 ]/4z0a02dnnı=/_a@M8@M8[[*MI@MX 0MX @M:M JLnZ?p?L@xL}%0x2}3h7O(?g?8!4;ya03D?<mQP}㥖y 0^0^Zj=0^ıNb?}0\YX}0Yc}Yn]zy|  ?8?B Y@8OBY_[QYj/8_B[I0k:%a 8oB4;~YY~?+??0 +*z0[8,(9+i}09  .N%n%[ؑߑ?0j*0jgZ|z?mmmݡ8o0*mߡ870*mIPYk*[ L $az<\ii ,Z)j{y.txY*X0zxB?pn\lnđN?őN?J?*M,V|@\H@\X@ɴ*M,ʹ*M,Ѵ*M,Z@\j@\a9)jhh??lX* >>+`>>;@h^-?=@h@hX ~{ >K@8?>>K @?>>D~?>>?>>KH>>{ɓj@L>>Q]X>>X*H@`>>h+ K@H>>K@H>>>@H>>6K '@H>>8K @H>>&>@H>>#N@H>>2$ ^K K@H>>;n>ne @H>>7Knn^K >><>>L@H>>+.@H>>~+@>>m/T>>\@>>mx P>>l@8?>>>O@?>>>D~?>>>?>>>|OH>>>ɓj>>L?<<>>????>>?4?4?? ? >>??>>>H>>H>>?d??,??<?@?@?@?@????????>>???\?\???L?`?`??>>H>>H>>H>>H>>H>>? ? ? ?@?8?@?8>>>>?4??8?8?8?@?8?@?8?@?8?@?8?l?l?`?`?`?`H>?H>??H?H?@?@?@?@?@?@?@?@????X?<???@??@??@??@??@Ȑ??@?>>  ld>PH?H??? ?? ?L?L?L?L???8>?ؐ????8?>>?d?d?d?dL>>>>>???>>   ?@?@?@???@HT>>HT>>HT>>HT>>>>><?l????ؐ?ؐ?4?? ?4?4???????l?l?l???H?H?H?`?`???????? ?? ?? >HP>>HP>>HP>>HP>>? ??>> H>?H>???????>>>8?>>>XX?lL>?0>>>>???????`?`?`?`8>>>?̐?0>>?????`@>@>@>@>@>>>@>>.>>\>\>@>@>>L>>D<>@>@>>@>@>>@>@>>@>@>>@>@>>@>@>>@>@>>2>>.> >>D>>>@>@>>>@>>@>n @>>@>>J>>@>>@>>>>J>>@>>@>>@>>@ >}@>>@>>@>>@>>Ñ@>>‘s>>>(>0>>>><@T>>p8  ?t?t??H????"&&(**.13ABBDGGIKKPZ]_`bdfk     !# (()++-02267779:<@DGHK PSTUY[]^aabddehijjmnpstx{|~        % *--02468:;<<=>? CDDEFGHIKNPRRRS WZ[\_abe iklmnpqrtttux ~~~~   `@X`@     `@з`@ `@иPLQh~`@ ~9@,   `@0`@ X  X@``|````A`@W`@   Pp8@q8@0r8@ s8J5`@5` @5`5\`   2p`0@P4@@68@0<@ F (H8\     !0@"0@#\0 2p ` 0@P 4@@ 68@0 <@ F   (P @ \( 5(5`@5` @5`5\`x1<0@h1 j0@88w8v9x9y*x9z6Hh9{RX9|xH9} 89~((9209(89 @X9.H989(99@1`91h8p8x88&8`8>8888X89B(9 @989N@8 H8rP9v@9t99 :P: @:"0::@p:`:P:@:~(0:t0:p:@`:@P:@:@;L0;d ;";  ;z(:40(;a;a;ax;Fh; ;2;; ;;;<`<P<t@<.0< < <x(`<P<<=P>@>:0>b >h>x >>x>?.@@(@@AAAxxA1AxA0AAAz xA(hAR0XA(8HA@8AH(A2IxAhAXA0HAAn`A`xA`hAP`XA ` HA! `(8A"p`0A7xA8>hA9VXA:,HA; 8A<z((A=0A>8A?@@@2HHA 8A(AAhA0@zaHA8AZ(AxAAA0aXA1a`A2ahA31ppA41x`A5|1AJ0A0Av0A0pA0 `AN0(PA00@A080A0@AlpAm`AnPAo@Apl0Aq  ArAsdAt@u@v@w AE`AFH`AGx`@H`@IH` @JX`(@K`0@L`8@M`@@NB`H@O`Pp@PX`@Q`P@Rh@@Sp0@T x @U<@VA2AA0@pA4@`A68@PA<@@AF0A A A(AxAypAzpA{d`A|PA}A\A]0A^A_@C2CB0@B4@B68@B<@BFBB B(C`PC*PDDxD  @hD$@XD (@HD8D,@(D:DDDdDDDpD `D(PDd0@DB80D@ DHDPDXXE^DD\DhDDD DN(D0pDf8`D@PDHD$D%@D& @D'FHE 8E 0(E E @E@@E10E1 E1E,1E~1Dt1 D1(D10D`18D1@D|1HD 1PD!$1D"@D#@D$@D%@hEBv@XECtHED8EE(EFEGhEkXElHEm<8En(Eo( Ept(hEPLXEQFR\FSFTFUb FVT(FW0xFX8hFY @XFZHHF[P8F\X(F] `F^hF_pE`nxEa`EbTEc0EdEeEfEgxEhhEiXEjFkpH`H ` I@IdIH@H`H@`Ia@PIaH J@`J`hJaPJaXJ$a`J#ahJ$$apJ%axJ&aJ'axJ(ahJ)aXJ*aJ+`J,`J-`8K.r`pK/a`K0aK1@K2dK3H@K4pK5``K6 @L7 @L8dK9H$@K:jK;`K<@K=@(@K>aK?$aK@$aL`aLaaKbaKcaKdaKeaKfaKgaKhJ`KiR`0Lj*`hLqaXLr$aHLsa 8Lta((Lua0Lva8Lwa@@Lx`@xLyaHhLzaPXL{aXHL|a`8L}ah(L~apLaxLaKaKaKaKaKaKaKaKaxKahKaXKaHKa8Ka(KaKaKaJaJaJaJa Kz`hK`XK `Ka(K$a0pK$a8`Ka@PKaH@KaP0KaX Ka`KahKapJaxJaJaJaJaJaJaJapJaK@MaxMahMaMaM$aMaMaPN@@Nd0NH@ N`N@N@0`NJ`OVO5PhQ4XQ4@HQ4 @8Q4H@RVS0S0@S0f @xS0 1T0T0@S0f @S0 1TVPV@V\WVXX\8Yt.1YY\ZJZK\0@[U[Vtx[W"`\V@]00]0@ ]0f @]0 1]]\x`2h`X`0@H`4@8`68@(`<@`F`_ _(`5`5@x`5 @h` 5FX` 5@a5pbt8`bu8@Pbv8@@bw8b 5cp8cq8@cr8 @cs8J8d~(dd`d`ee\@fUxfVthfW"f~fg`g`g0g0@g0f @g0 1Hi58i5@(i5 @i 5Fi 5@i5hj 5hk0Xk0@Hk0f @8k0 1@l 5lt8lu8@lv8@lw8Ho58o5@(o5 @o 5Fo 5@ot8ou8@ov8 @ow8@pp80pq8@ pr8@ps8Jpp8pq8@pr8 @ps8JH5H5H5I5I5H )/HS-KHH=HKH ).H KHH^=HKH #.HHk/H~K̹1H ]).HHH1HKKH (_.HH HH7HKH )/.HHHHH}HH T!HHHE30H>H(Is(H !H;}>HHB+Hu>H9(H a!HS-E>HH/H=>H 1S!H >HH/H >I'I'I'I'̹+̹ +̹*̹*Ho'Ic'HY'IO'IE'H;'I1'H''I'H'I 'I&H&H&H&I&H&I&H&I&H&I&H&I&Hy&Io&He&I[&IQ&H Hy]B`·`AaH ,X`j@Xx  4V` ,X(N, 1; $$$$$$$$.X` ,X` ,X:рȐR`0,X@#4lа< ` #T`Aae01*BGh ,Xp  ,X  p]` ,X` ,X`AC$x ,X@"bC"8  ,XPx BALD,Tp4 ƚPH,X` ,X` ,X` EHHHHHH(!+X`*8, ,X` ,X` ,X` ,X` ,X` ,X` ,X` ,X`` ,X` ,X` ,X` ,X` ,X` ,X`<0pu'&&> ,Hl V ,X < s@"@,L @Cˀ  G!!!!!` (X`@/X` b[` ,X` ,h"< 9!/Xq ,X` ,X` ,XЈ5 ,XE^ )dQ ,8J!!! (X`C0 ,h| .X` ,X` ,X`>PaAHh, ,X` ,X` ,X(DDDDDDDDDD4(111qAbBH(\ !B<DB` 4D "!a8 &*Zp@1` ,XPp#@HHHHH(TF@T` 4E `A@$d ,XP&*Ld< ,X` ,X` V܂&*LDDX` ,X` ,hH  """"""""""""""6Pp"""""""""""""""ac5E '*Zp0A B!( F S`G!p ALL\ !!!@.* @- = pj+d F-pY &W * 0h `g+0 :p3$+pA Cw޺@O,+a `M `3.PW 4Xp r҅<2} b6z}/ lp(2@ v^0| d P1BP "-Bb lXk% -k PH.'# 3`{ \H3*d@̊n30 T7-l@k 3B >/$4 ĐC1 X42O0K0hh@1,@ vr ss t`htгt0t@uuPw ww`wp-w 0w?(xDXxExUxP]x`xyдy 0y`y@y y`yz({PX{{ 0|b`|i } lP}pmh}Ps}w@~p~~H0@ `@p p@p&`P* ,؂/ PM8 [h]a0}p@PX0pЄЄppP00HЌ`xpPP؅000 080P0h0(X0PHx ؈8$0')@ 002P7?hC(X 0`x`>  @PTVȏpZw(0X`ppH`x> 0> X1>X2>3><4><  < X< X< < << (^e 7C] CCCLx= }(e   yY yY VEN^V# VVV#V# ^^^g}#E#]]4e#}# ##]###]#]4]##  A A b^\&P\ 1j ?; ???HvP !t ttt};4\\3=\:0\&LT\!^ \ h\+F\P\ !" ;;= ; ;= =   U hv vvvl. e8` ^  }; eE` eE eE 888A   )&p 8*6E6E   ***7 666?hv vvvfsM::E  :  :  &x xxx [ f fffo:E5oz 5 EEEO zzz xbm bbbl lllyu uuu~0QL-6 L  QQQZ ---6 666?)w6 www !66 666?"c  x6qEMq 6qq  6ztz 6zz  %` x5Q555x2Q222Gi $x|x$xx !u| u!uuJl PXPXPXPXPXPXPXPXOWPXPXPXPXPXPXPXPXPXOWOWOWOWPXPXPXp$$i T+ TTT^H ?  [.h mT H/ w  Vu VVV_E5 5 5 5 > M MMMV" 0>0e 00e  4 Wk't#1#1 kkkt2HwlQ0lQc1lQc2lQ3lQS4lQSEw0wc1wc2w3wS4wSE HHHQP B[m [[[dg}F  }}} yBTO K-  dAW AAAJ!/?t ///8hvDV]  vvv  ##2S ###,00Hi&9i Hii 0009 999B6wl # MnMMMJnJJJ09|] ]]]f6w=: l & :  6w9XXi8GM)cu"g9BNN2C^C~C2CCCDADyDDDD,EyEEEFFF GG"HlHHHHHHIIaIIIIIJJQww2kNN 2Yo8LEEj   0  b 7Nx&/2NcJJJ!K_KKLL'MMM1NqN@P=PPPPPPGNxNxQQRRRR4RE8RRRRRRRRhRYYYYP__``5`W`u``N`*a{*``bbNNl~~~Q\}))))Љ H*E*p@@EEEEEEEEEEEE@@AAA:2NQ2j2Q2j2Q2j2Q2j2Q2j2Q2Q2j2~22Q2j2Q2j2Q222222222222@@EEEEEEEEEEE@@ AxAA:2NQ2j2Q2j2Q2j2Q2j2Q22Q2j2 Hhȋ(HhȌ(Hh @` H #4L_RhxYt Џk,R6\{G| 0@`pА 0XБ Hp(Pxȓ(PxȔ@h0XȖ8`ؗ0Ppؘ Hpș(Xkdd9}N!d{*Hdddd{*d{* 0@B*eNcNzeE[cBeNcNzeP{*dd H b ~   !!** +NN +C+j++!d`p)eddde{*e{*fQ/Q",H0It/aHNƷX]}}}}θ))=QQ_))m> 9hk~'Q((F(Fxl(F((((F(OL``j~$9Nȡ2NQp"?\1LLN!VuNNNxNNN9LءNxNNNDVQNN%N(0@pX0< m0m Ps`#HH  R@,H,HD p pwhvPB(=5-sH|8T=%YN`!t!0" E?$XGL#Nh]F&^'h`$gq(*p +0rGȹ!xD  p'H)8H`%*'PDd`d ,n"-. !5"U PQT ! ##{  A`9!)YL )G`Y!6" %!5" !5M<:6bRI" i <'B=$'$}%N2 V Fi9CpLDp镑ZHspLV`i)! #!$bi C`;D`!52&U PQC!5 Y! #i)   @B`d!y U P[|I2B)Y;"Y YH )R b,0 B,Vp,sP,i,F`!=#WB'#&!IR[$/ ]$&O"%*"~ H '@#M"JkҶ @!Kl/9!N%M%}%]nh@'' X y!knh0 K y!k+-0$K y!koir!'+ r$=#:"^$ICS c Ip=ڕyIIp= ֳDS o>9SsS0o>Sj)7#rYj #zzBS z)5FS n5L)2b9 ~N‘(> >&R B-V`-Fp40nFpl )4b9 ?j*^$mJ )T DLF`LVpꗗ}:Li^B`^Rpjii!i#  J iiT`i[ j)5!Y ,%9" YYTpYA`e0u iK!I##yk :| T dIDIiW I:`zo‘$J#ٕ: 9$y yU eZ0 EZIT ’(iZf`Z^ ^)Pꕕ5!5r E5!5B EY !9##٣YjB 9[!j#٤y V fjFj Spjf0jpP+!J#y JJ tJLMm!j#y )V fj0 Fj Spj0̠Lli!]#jJj^")U e]Е0 E] SB`]up]P0]ci!M#jJ)}$)T dMД0 DM SдB`MQpMd0Mwi>!M#{j)&IT dMД0 Д1 DMZ Sд1M<֔+ה[Ӕ ii!+# \&rR +!# )D`!"  P` Cp!^" T dKP`KAp^<c0Iz!5#YU P PQ R  y‘g ,!#*Y  ") Q A>R`uk,h kGpb06!5Et!<  A`I)!y# R "yyP`Y !##M&)!99R %E!5U PQT M9!" jY{N! {Y! {Y!!)A` "K@P `>nɖ5nɖi/)nILi_)5nY?[ YphIu^v oƐVp;5hylIoːi)9Đf0 P!Y#YYuuC`J\i6¦ $'!&m>(i[”|R )V Fi-Tp0 ?fPdK Ppl] 1H !z!z"='YB !Z#hI )Q aVpF`1. S62G6lm0R&:R &"&"K" 9&%8R 9"IP @ PpFiG`dPSpA`QpG`Pp| 6H !N!z"='\B 9!z#kL YV flFln?Y)0la`lAp1)0YSL7 lې3A7 =|*2H z!o'z":b":%=" 9!z!L- R b,Bp,n~zp,c`x S,)S91R&!]zR ;"$'#:!+'^8) lR :$k%x ?R%m#Z | | i"Q aG`~W0ِj{jj. ap 0 F`۴bp۴M+MK + + + 0rPdpONO ) 0epvPC`ozoK z 0ߠwP߰D`z) 0z;@`) 0)mC` ) 0 zD`}) 0}zڷD`9i!# 2 !E`@`d!: U P\ 0’$ "#& R.'k"x" 9!# P @ lVpi@`pJ^>z1#'!"#yM" m".B?" _Ґ)B&Zҕl^H¤zR iQ ab`*R0yնa`m*f`b@N"I!8YjR!~"y"]# y² lB ! hy,Or :'yEU e^^S`^spĐi339SISᕹdSAS MSi20! #,    @ *e0 H?0Ҷ"J\#]@%R&&O8R&j"; z!^X[$ ";"!y , "9!;B !zK&y !z+±Xr!: N? !zK'y !k @P `dSK5K4K{^Sw`0MSi4Ց6ISn<Si7(5ES )Si3bSH:Sm? SAiSnZ3"ky@ &*"${}JҤ,M !%)#JCS c>0 1 23>:X.)SX5>PSiyS9S K*`84 7 >1j!*#** B*P`*@0*bpy!Y#YY  y)!+#K,#rK++"9i! #i9   G { y$m%!&m!n¥*{-8¶iZIP @ X|)*8E`i쒐\ Pr`0 Tp)!5#| ) EDj 4#~"j lm II@`F`IPpVp ;962%'%Z#'%jj FLŔ\>>ik!#XlzN S c:P0:@`V0Xʠ|O’#] M"m' '9r'J"!]"! "_9[<Ҡm2 y n2" &;!=$ "K% H j=2% "l '\R"}$ R!i#:$/!" X2& : }█" ''|# #N y!;"]> Y@P `  S 10גi,9}}}0!5 U P PK! #|y P ` @ cG` -u0Y|!^./$)T dJDJ*E0JepJr`ږ;mɑ }IOh$Y#:!"   Y!n9W g|0 G|a``|Cp|ޕX7 |USy !i#99J#[ iillNSp{k6X+l ]/'˰.'(I*h'+'I'"x \.$h&i%:!"J0%YV flF[ p\ّpّpl.ƶRSli4bSv! #-  @`9j! &I[2  A9} {[i12%$9%:JRz- $"J k Ǒ~Ñ_YkzY4ROt£ #[; . $ "'JJ-y\e0JQ`JAp*K! #o{# /%  8:a0Z:spI !i# %ii*=S`9z!i#=Z/, iiGpi.S` !5–%=*!yzR; !kn& ">/ )#)""YV fi6dp,B`p0epY B F z{95"% zR; # N2 "U eYeDp?u0?;lu0Ye`f!{Z EDw!' D`y !# IB ':2  AL@`^Zc0!)#)G`lH Zz) !'#!%' G`-YzY<lY= %'#%L IP ` `p @`=S0=*ףB`bpv0@`ki6$ "#& R.#%iiD`iLF`pP_]+r#XH'IH-H HlHhHk$ !9#~i zi91'#$#|}">BO '@`}U[yI5#$ Z}’8)|2%!YY.nJ0b9" L_z" & C`I! ##9*b" E`j 2 !*] 2&)K!y#YyD`i! #*  B }j:2$iZ#yL#'Y “MX &I!Z$* ++ B+Dp+P`+c0+j90$ & k#9.“hb   @ B` Vp a0jj7ғ(" 9'#yyaYsPyUpI! # ZRK2-  E`)! ##[[B  D`5!5" Eo!*!$J<'O2#HR#{'j$z k$z" $I!Z& W Gzd0zB`Tphx0*i !% Z! '99Tp9^Y! $#" D`*95" R"%!.N R#YB` g0 Mאz)Z!#*2 # A K:9!{9"r:IIC`I[PpI!#d"rIU`YS`!ɗ'))i!Y# YY@pYS`!#'@` !#K)2 C` !#/)2 E`i!Y##YYE`Y-!)#)) B)>!w! # @`!#@`i!Y#YY@`Y: !#/0 E` i!Y#_)0 YYE`Y- !)#)*!"r:IIC`ITpSpf!5E%kJI“';zr[$_: 'jE`PpzYzi92"$&+ "LB R k" )b0)/Pp4!i E; 7a"k#B)"#B+"kB"' %yyV dpyD` ^F`LM4a$$ "k #R "MB" &'9T dJbpJ *uPJA`9{qPy{gp:9 2"’!:Z±$: )B`ME` I!5¢%U PQKQK 2R&qrҖ'j%; '"'%)%;"#"+#% R#Z$yzR#y"ZBR b.0 .ES .eSRRR Sɐ) IpBY y3 Sɠyۖ2[SCS =6! IIG`I+9)!5#) EC|J9—$ Y;Rk2" Y<%"9U eZC`=YU0Z yiy[yly}+)9b#9)ҡ'JL!Jo9r"F&zM* ’& j z K>!J)r%:#+hn]Mj `ڔXntSɑnTS{i6!zI#y'%b!*' XEPz$ ?I$ Zb#-I!-+'- % K!i#+I V fiFiT iiG`izYy!Y#$#"YYHj,2">#h ' R B*G`*Wp 0,ylkQpK7Ҵ"$OH? M'ҡm"("|zz Gz`0zQpzIL KI1y! M! }j! !" Ac0YiTp !)#O 0 )@` ! #>  D`4! E6!5E!| V ` `a*a*e->Ґ":ji; #;"$Y?${'y 9!Z9 9T dK]\OpKSSpS]4CS |7z4%zZ_J-\z&x[ ~l[z'N/ T DJ~Wp E` Tp Pp\!M"" )R b*Bbp*+֤y PM@`Ms0Mfpk0~,m ~> ,'&j#"j'nL$^ &nO|~&8 i!>    @ b` 4RS 0# :Rz² li># #x’yj’k<=>R', &,i#I# #|¢n¢H IP ` 0 @ e0 qP i Qp @`SpB` My5! I, lO<ВoH *  9U eZ`0]tPZB`lLK K-K^Y*!:#i0 :: C:  lI7!/- =  )W gz`0}tPzD`zSp@`rPUpi!5!m}R !Ekm96Ҳ' Hz".# y"9V fkBpEp̕ ] P/~ L 0k )!~ bL" I!5U PQJ !9#99)K!!9, !Y#99[K!#Y^ !5J 'E !6| "FY !#JH m" h4!j E;}9“"}ҒH§ i '2 "YU EZP`Z@pMu04Zs0es0a_s0es0;;I1"Z:2=Bzy|2=Rҗ(0 q _~ii!+#-)N>++T`+-*! # )§"h0    @ K?Z* 6Ғ"[Е<0 kk FkKMi!i# )mii FiK@pw!#E`6!5E[}I7!^Z&% o( {l2 9W gz0 GzV0zrPz0N zi|=y0".MZ & ${ R# "'N9P ` ]]ni]iiB0@0@0ii!Y# iYY@pYT`w!F`9i!Y#[)ҢYYD`YoY!5"Yy$6!5EY!5": %yYж%["Zz"%L" 9&&>±8+" &,2 ŐyL P=.i6I F`MepJ* !Y<Ym%ii FiB`ifp !5 U PQW ; 93"%jJ" YnHR$ ! S c://:+ /if!5U P!* U P PQT E e!5r U Pyy!Y##n&YY>I!$;l$'ɓMHZlM$±(((""j[Lm"/Ґ# #=;0[# l%J[zomڒo]J'|M[)% J#J|[XoKڒM~]( zMB ! K0k ! .0N @P `I`oiirSʱǒeSؕ25ٕɖڒڒ3|)S͗Jy`2)5ȔءȔk( SۑDS L 9S˱k}S9j!i" R LL DLA`LQpLa0! #  W`i !MZB % 'Q ac0{G`{+F`u6!m El i4"j{"xOlk .M T DKW`.x-`0J !#K0 C` !59!#k$F`9Z! #]+'   @ ]S` n!5U PQV 6!6F!* U PQT i!5 U P PQW u 6!5E)9!! )z U PQDP Y!##[z$A`6!5Ey! #b!)L  G`7!5b Eڑl4* @!+"|%K%+#\'+ +!+"OzOL.X:|?9'"%;"!;"$;"{ y!k;r{&HYR!* |R$*#":Rz&:DT dO0 OF`Ǔ5O 5qSbSy.S鑮3I*0:`\2JΓ7Jޤ0O{ SɐΔ6[5!*J#!K-"jO"y y!;% i [[i/zc0wz=S^:4')<')?:!)%)!)%)!o')#)')#)'o%z' I!!: U PQ Q K!!z= T dJDJNA0JOg`+<) ]!i"&] x"R b+Bʒ]>?o]/ 'J R=YR!J;¦]NO8 i&]'iS c;0 C;Sp;aPpm? Lz H J 9i!Y#[)'YYT`Y[! #{N ({ o()![%9 YK Y!K )$j# )M#%Yn' *@DS m Ip?d`j4Őh78Ipkf`OY:`\2\˓0]9j`k5i`kL7k*4Ő_X5jj3#JKj"8 ::F:R`@Q`i!Y#mYYA`YoM##Nl |x"Z|"jzk\=/ZKy'³k="<;{ z&o9*8 Y' n/ '?'!&!$)|% Q  C0S?y)`y,9py\Y+Y+ibOY`IYImVfl[ S!#ii Fi(<>Y4!; ٓ:N¦([Z[n2 IDT dMMe0MwPMVpۖIkmɓmim 1}' "| j!  'y'y'+ +$AQ gPpP-Ji–~ÑW`gpYi!!!rMR [[ E[W`I*!!mҒ:    @ R` bpZJ 7&j|{":!ʦ< {{lɓNvp{U`l 6r9r: J"j : )&9&|#kҦNOhR#?#m! $~ FkiJj~:9 7JQp5)l)!6!r9F:L 3!"}"K$S c:B0:Sp:c` jWp=  R + ml%"?$8MNҶkk K#yEU eеd`]K׵D0ĔY0y) ەIn PX{ {,Ik!%}.H2 P ` @ Z=jj Z#ڕ)yjB%ZZ EZf`ZT0ZBp>j;M"{";" '\ғ?8K¦ ±HKL=2 "9EU e.I?iI.ՕD0]{.i]=.y [91 [y=X%J%K' *ӑR`K+ii!#z+ ,! qW`{ =} 3 [2{8ғ*l K$l%*'9:;2 9CS c;O ,;pP=f02I =@p=S`[)l>y ) "ZlO_R%) Y"Y% UZuCZcpZ;'`D0* PI%`$`* o'ҒZKLk2$ #Hh&M·2 *AQ aS`;C0+|xU`ʗupIyxU`Yۓ y>Yi!< "  C`!F`)j!'* A/ 9j+ ;k%y]o%Y$Y#y :: s:.N!ʗ)    @ [Ǡx!)U e[0 E]iFpLd`L} P >!I0%Y%YIGW gz0 1 zS0za`zrpzʕ0ˠP7Yi!j)"   @ >*3Җ!.;"n!B{"&$)"I"x;'ҥ(2 y"IS C:C`:SpƑo `uOo9oc0r yc04! El[ 3"!9i i•& )["'im’H’*2 Y"::ѦH 0mfp:G`:V rpy !%YN# )S c;0 C;RP;gp;t0;i;C`Ii!ly&I[IIFpI^z5$;-#"y#j$JJ]:):Ml;lX \\•E`\ \!n#99"  |&KN@^I[Lh{L= #,[!\M^(YK\#'N$j $ O8O; >OZK.H;,&[&"9M)~0 9!+ N? 9!+|0"I?(J$I 9!+ #IFV fLדiS~5LZ*`=9YSᶘAS sSyj!y%L *ykkUpk\88Pp!I#l IIQpIK\-i*;'I& %K0 9 .!z}0)U e[>y~4Ű/Jy IJ~0B4ʐ[_5b%tB¦&KKr<$K.rr! !I#*% !N)h" L=?ұ* p" #&ҳ?p%)$I% ' &}&I' { }B"&nb! /8 b! "Z;r&:$|] *EU eg0^Dp^R`L9<9`-)ٗ< I :'&I'I'Y% a`Ė{l:9!5R') %) U PKz6%9[}M^#%"BoxYy)#." n ooUC0 pcS !n#^ 2*bJ"_>R~ҔHP"I+j"| J ɦ>ҳ9* |2!>&K&J$ #J! Yk r"+ nOH,$Z% #\MNO8 ."nx"$*;#Z=Z&zh![ '"\o&Y.#&y9 ZI"%FV fnnd`ҔI˶/Yj 疸r0j9RP)f`M)喸BzILf`LIL۔Y c`,[)[ L)ŊlkKkܣ7 _zɴr0=>Y` [F֩^y`L* ׻n 0=/iL~9ٗYL(F0)Y ! y#% qQ`9]2!}il >Nh$B&*&)${l#/$B"*"r#:!R Bo064^5rSˢ!#9±!"%|",  *!; O"(YjR" % R#y#M%H ³{жM¶_ {@!Y"Y#/z,]Y&${%;&'{ k#} +"Y8R"J{b\#'#j* Jm$*8%"#)z&#':o GW g)5))+c`8+t0n5吺YmiYY=̖Ijymv0ߖb`ߖFpijJSʱMzp/{0/0}JjS˓ʠ4YOiS0{ iS0߶SSi|*Sˡޣ3!~" FV fn0 na`nw0nVpnjk j"  ,"% U e\C`\<S0?:cpZi6":" .rn"%kk&j i!k#{/~#&kk&j! ,! n2 yiFV fl0 1 lp0lUple`l>Upf`鳕INJ#L!]" i,mnR l"+{" l"h" ";@P `0 1 2~̦i`^ip^Yi) XIl IePY`)  ip`) M|b<$^R y':&)@P iʓ  g0 B`ʣ?89)y!+  ii8hy;5#} pҦ'#k  "m&Y$Y"J% %Y&#k"j'm#Y j yEU e_0 _c`.S8ؔJS4_K SsSVS)S3ˣ+!6!N{r<"$,Җh\% jy%I!kr }~j8 k% $<"k +" Z@' |! [\!*+,<9'Yjr rK"o! $J::> & h''‘Yob'"#Z=!8 i!K&)"j!+hV h hh C1 p`ySh? 0h? 0JS> ISϓ7̱i<>;;+0-͵hZ6ƺAS ũ2Δ64֜TSk S[9{*Rj%#{. Y+< Y@P `0 1 | L-~ *Y0PN!1!m !_%LR|;!N!Yl¤Jki l##³+Z"<hh# ' *;&\#zNR",'ݒi\±%k"&ҕ ɓ&?" JY"in#-m{$lz(R9RZ" %!m"zҢ"ݥi ¦#٠& ;#&"+|#+ Ң#i¦$!N!;%N^%y'Z"Jr ! )%j: =Q   C1 8Y;Yv0iyVMII   I y`zY-y*p-j -lILy`=ېYoY y`HiH Q:ړ3:2K>942!+'#m%‘<R%) IDT dMД0 Д1 \)״ ִ Ӵ մl״-m 0$y[R  y |HY*z'_'y'+#9@P `РQ ,BpHI i~Gp~|6!y$}<#!*%9$:;#/X"!i"*#Lr :']r!: O( IFV fWpmB`mbS-9S8dS80ISH27[)3)Z:- mjҥ{i" CS cXyh דQ`*l 7$Y;B,!Y )W gz0 Gz aPzB`zn Y-!,#k9+ )R b,0 B,pƒ SmƒǒN٥ Z@j% -%^!z#j")!z"%^"z# "Y"z"_hijo&+#"#Z$$*$*";r&:$Kr':%xW x xx C1 x)C3xICxxx6D`ܱ}YSxaS^٤0VSwSxX9Sxy SɐܔH*`GS ii!6"(Ґy2 FYW`P`)i!#?z S`P`./Z4"YRZ!'\ {RL!$\ %\ "\  yT D-W`ICpْfV`BpڗW`ڷCpW`CpW`Cp04"+)%=!:!o&!{";#^X!(X#H8"K';zX! [![!iM!iH 9DT + qP~ (J͡1a0Ma0L[ƤBpZy 6#+)b">iiNZy 2#.#{#i&,,-DzyZy 0#'^Z    *ǰ yi! #!{!i$  Up B`)y!I#IIh:,Y7'+\"$+"i!Z "$+%y W gzGzT zL<:y!i#[:y%j&9ii_)YZ!Y#jy$i~ YY EYT Y|Z )R#[z[<U PQU [6#ZM&[&,. #i&l "{#i&lllcPdPH–U`l_K:9#,", %#;n—8K] [[Q [B`{Zy 6#+ҕH{/iih zy2#+="}!y **I?*Mb}“(}I}'"!$£JKlҵ(x$="/#\!/r&:%)FV m<*ٕ3 )Sʡ-1NSіCS 鑊`S7))! 2 &W`)y!6$V ` `aIbZ yi0#K['K!; *R Jlb'  k*K!.+ xY)! #I+#)   T!5r U PQV B9 !Z9rK1F`.cpyZ!I#*Y2 9z%IIBpI*ְCpMz_Nz2#+M% "+ҒMi&ij|}8""'r':'~&.B IBR b+0 +WP+gp+s0+0nK7¡#k8&<'Y&+{§]"Z"z"j")"z"&*!?%Mr':% W Gppwp}R`H1}4Ő3Zy 2#+[#{#i&,,[Dz>iy!I#[:!k$y II;\:Y5#+%)$]J ZZL+SpZC`-Z"Z,\%M%"o%;"!%}r": ,,hIi,F`,6{Y3"%r <, !IR j%n2 IS C9\i*ƑXlT`Vmu)Y i)!I#'r"Yi!Y#})%YK YYD`YPp9/!="! yQ a0 A)Ǒb0)ői)Pp=uP=ْi=G`=b0i!"& oy IU e[0 1 E[ibp[~ P[_+j)p[ij;)4m"""NRn"IIhWpIA`ʕX y !Z#y:!L"N I Z9!Y# J YY EYJepYi! #Y9"   @ Y)!&rR + j!z#ٗ!I '"? zz GzWpzc0zF`!&[[[*!*" ii FibpiG`* 1" &z )"Q aRp)B`;Tp;@`;a0 !i92 I U PQ)y!,  &U P PQRy!5**!9#: +  %99Sp9>l[w![#[C`:% ' " $ E@![#k[C`99!5R'i ) ) U PQU DKyY2&"# &;"&<!) )F`/ KIt!.  @`+*94#*J$*\%_ $y" IIx:.Rp[+YjM#r^$ro’XR xR"II@pIS`Q`Q` z7)Y'z# ^[ ~ Z1YiYYLY}Y/X9 җj;M 9Z!  [<    @ d0 [K5"Z*"Z? {,?' B 9'l&j Y"J!z}~Xr :&IU e\\6\ES \US_7\ޑ1bS4^5!k U PQiQ* :!j#K"Z k *"jjIj=b0 :!j#K"Z > *"jj==g0J6¡\KY <%"* Lr':%mr!:'*FV fmЖ0 Ж1 Ж2m ׶1m-)SR0m SɠYpmr`mf49SѶ?iS9]0"*!_H2 J&<", 'z[!—,L!—=]Ҡ:] #\#:'+ [l.( [^_\2 K@P `0 1 .1i" "::T`ٲa`:B04!I EOh#I%9;$9-Bm' yZKR'i :  ~o2 i"( $  ":"klmn"!#;"y$^#: &I")hV h ( t h`0<)kYkI&XI—L%)! %"9#+"H9Ҥk2$z,R!~,Nhy2%Z'XJ *9$jAQ aڣy) ڣkI=iڳNoo) Ǔ ``YJ QP;ȧyI9P9) iA0[:Y6"Kj"|"J<"|R.&X 'iiJoI=K3!9${' K$^x9R ">2 9$;;JwJg0;Pp;E`E`+j)7$%<#/'y'o%fzz GzPpzA`C`i![#m [[A[&0>=Z0$ j&J=! '!B#-"ɓn?8 J&I")P `xiJ< OOjji<IkzI*""j-&)R#HR ",,L P,@`,Pps0f!5U P,9y2bI"[ :"[R "R y2% )Sp)C`Z*4!!I'" 9"LLb0LU`L@p** 4!!##LLFp_,Ô,i![#١'[[eZ !5$U P P !5$U P Py !Y#I9By!'YY EYS@`[$0Y !i##*'ie!5b E5!III DITpMlh#&{8 M}^#k"'!I!K%) j& (bB(T`l74@S : ! JB 'o} Y Ay`pF`ٗC`f!5U P*[ 0¦ {z0  P ` a0 TpɠC`ɠVpZ!J#))I<:?i JJ DJT JepJB`Jy1'""='h" ),B`{Qp9! #$y  F`;I4#9 z X)b"r'&" IIA`I0y֐i!,#{ ,,D`,%0Yi!#Y9"p[6!!E)!5Ҕ%zz I! #Y9b*"  @`l 4R&Yi$#&Ym$8R&Y&K$ҕJ–/2 )2Q0Fl:T0Y!5b9r:[" EE9y!\#98  \\Iƕ>Yy!\#9< \\IƥKli1$J#* &I!z= Q aj6z7WSGS 4)!5$+ eE PQli1$J#* &I!z= Q a:6J7TSDS 4::5# $Z #r"\\IKZOh#I%9;$9-Bm' yZKR'i :  ~o2 i"(¦I$  ":"klmn"!#;"y$^#: &I")hV h ( t hg0l)kYHkIlW`\[ip\[Y`ld0\[IH9*ipy͑c0yYyIFS __4  0#'Z !b"  0E`ZJK)4#'klR 'r" T dI4E`bp#;ң!9K'I/bOJ)* (J;" *#xҥ,·Hr&]H;B"2&"YS C zy=D`=Tp zpPS ? ]Y ?yi{1"&i"&$m<'"/b"&;%n""82&&B /2& zk *"9AQ ai9`0 )0ISp,^yE` 6!9J Z!K]Y% #K'NLm"$Ir#mR!9 _ Z!r y2&J"! V F.ٖ9Ph0Yז@`ٕ| !!9 #io2 *%$\!]2! %":B"K!)!H9¡k2$z,b!~,Nhy2%J'|%j$%jCS c>ڐ~) Y>pp>Q`ڰI yIY>aP>B0y OQ`\-y(9OIX\ i¤!9${' k$^x9R 9##LL9tPLE`LUph+j)5$%<#}~Y I&ZZ EZSpZD`C`~9|: :)7;%!'" i"}}:i}T`}@pJ:4yRZIR i?" i"MMMiMT`MEpy![#٦'[[([i! #9Bybr"  0E`ZMlh#&{8 M}}#k"'!I!K%) j& (bB(T` 7=4/@S :Z ! JB '|} YII DIyepI} Y! #N;   0G`y !J#O !JK0[JDS !5U PQ9Q9 y !J#? !JK0[JCS !I# IISpI{f!5ECzY2!  %jh:{M2 )R0T0R0)B`T0j!|#{ || G|B`|Vp|'0!% U PQT ! U PQT ^J7R& 9!)"N"z%~}&/%k?""GW gWWWapOQ0R0ٲo]-]C`:M9ʐF`(j!{y&)@`+> #)9&j z" r #+#2!lmnP!:!<)Yb j';"z#<%.OHI*R';")&I'I  b!;Nr',r&:%* P  B`bpR0(iS YSKii)ئ^C`z)^cp_*S 8ISZ3 [ 9&{&M’:$:&"82"k'," y#I#!Y$9R!;#% I#2'(R y" S c=Xy=C0=S`Xi=cPi8:U` :A0KٗI=(#Y)'"&_k'|}"*"9:‘;0$j#;&z'.ҔoB" $ !*#y#;")" b'*!," ] L"9!z&. 9(R jvp86ɖ**0ES͐Z-6 O S:J 0 \$][%jo   S q C`{ I9’ !^:&i $J" 9"LL>pPLA`LQp),(#Y)'"Rj% L`|'~@,(9—ZB"I"z")!Ob&,#*%&OR!!]r!: 9(R 9Y}(R`CY h9S ސ]i`+4x6 SKI1"")' ;%Mn&(9 ":l7ХIá<ơ<Zi0l$}"%  A R`< 1 zI#\ '&$"%:> ѡ_6jk1&+ " % % Q aA< ]EPW0,0r9"I\2|Y&,#^2!:%";2"k#?9Kb#8Z?2!ziR y" P @^ jy B0 R`OjtPҐi͓tP͓h'Y )'Y )&] )U EYyRp>Up>E`Pp@`ɤc03~ 1!!"&L \%zm%_' &] xr":  Q Ay֑W PE`O]gS-\*5!!":RL$) )>"Z&Y )&Y )&] )U EYyWpL=C`Pp@`s02lJ1!j"z!z"_ &] #&:O ёQ E`}6z 94r9#'mR I~" 'II DI)D` apf!5U P+ 7r9 I%(r! $K K$$']r#}!]b%O*b!xj{{w{K } 0vp}A`{*I6!(“ r Z$*#!bҥii FiB`iQp!;#;Ai![#~[[G["0K0&Ib<#,"M2&: 'MR ~%'i! *' %9B#+';|!y"m';": I!+$xY GW }jח{MIz9p8`^ Si !)#!")8L 6&Y "rL" )V fi0 FiEiU ies`;I1b&% 9ji{Il'IQ a0 AFZb`b`Pps00 i! #JI    @ J: 6;;!h2 ii@piR` N)>j@zK}ⓙ%;!j"#M%Ң-("-m9&iZ$k$i n"k\M9N&* 9\_"j<~╙%;"^%*8 +!\;r{&ZhV h hh ChCp?Z yZ h}Xh} 054wSXM9Sh6Y !%" $[)yI![#k>j$[D`jj!#!NJҷ#}, Aa0DpR`[5!lJYY&hmɤN/ұ*'ҵ-L!l!.^m{M}^%ym[z  EU ]+ڱIեG`Yy`0;0% \M٠:z .Kz"z"&; &[ z&Or':%)P ` ѐxאa` 2~J֐FS JtSJy 1 ]O89  X !5”9i!i#.ziiQ`iEpiI!#[  ![ u!B`Z 4!ɑ:2 j 7"ٖY "yC`Y!5%)J&^z6 "#  ;" ]%"% "J 9".":'J 9'iV Fi9;Yn_ _>xU`Y=Dp i!Y%,Y0 YYC`Yjj+5&,jH"Z"%ZZ EZl8hmvP Z!\I?{$& ALWpg0 i!Y#,90 YYC`YjZ! # i   @ )C` l K!j#mY0 V fjFjzG`j,e0;m)m| Җ;H"Z2 Y%m"9P ` 0 @ Gp R0 eP i p`~J 0']l!I_’X)P ` 0 @ `` Ši Tp r0Z1%!~2  iQ aAC`Spc0sPmj)jYj j:jl k!j#:i!:Lz V fjFjb`js0j@PjSpZ|4%!~2 &)T dKٔYSpeYk P}*L;!0 y" $I#\," ~ yP `@S`cpC0s;9S{T`M{t{A0̢[S{˔3:| %!~2 &)T dKٔYSpeYk P]H|&i0 'Z(!Y mmM*;68J*.c`Kj^7!"Y]'&."+#|! [!K"+% $ b''j"$l ! !XI ! { ! { ! { ! { ! { ! (9  GW g~0 1 ~v`~Fp~f0~i~yt`Dpd0iyb0͑IDp͑:y5X X@poXv`oq`_Ip~+5첗7ٔۑ2!nj7 j " .%ґi% ^y&$ B Y!#i{ iGW g||   Ǘ+i|sp|c`ڴ9 1 )S_IS :97ғ""k !ZJrz%zzTpz}(,6{mI—"$ z"ٓl2#X0 &١i0 9S C<ǓHw0ٔlMD`v0nmmi !6 /Z%J;6b%+!j"*()•• Y"|^"{?'\!Z|&'": FV fW`ɷ3)Sh>7l)4gSyi!9 Y{!99C8f!5EA!5U PQQZ Y 4\'# ="m%?xi+|J\4ŐTSHZ+l=~O Yk-})"_Y#"zK i"yJ<+y!|y'\•:YYIy!|y'\KYY: 9j!|y!"YYSpY> ;)!,#Z'MO“YZ x§+ ="Z!Z!k::M"Z#Z#k:M"z"Z"{:M"Z!Z!k:M"Z kiM"Z.'Zy: :n$L$Z/—%Z;—&kNM"Z %Z^:hM"Z-'Zx%| ::y$_%k9::~%Z\:n:I$/"k :k:NM"Z %n$Z.§%k9::~M"Z; ?& *"/R B,ZƲQp@`PpɕPpD`QK KZD`k+kk+tpInn\\LL<<<<߱߱B`xkB`8k<<nnƋB`(kƿhǿh֮}׮}A`=۶B`mkܲ}ܲ}ؖ(ؖB`)wp!,# 'l]I•|NIMҰHzҰ}(+]X ?h"z$Z$,::M"Z9#kM"Z('Z{‘:^$<#nM"z+'Z~’:Y$?#i:LM"z %Z\ # ?¢:$'*: $j&jҠ!,J:-:M"ZL!Z¡:z:]$;#,m:H:+M"Zo౨#Z;´$O$ H±:+::h9!NM"z %Z^²:9:$y'Lⲯ L&Ly'y *",,E`,[ [ [ ^ ^}^}[_[_m;m{M;M{-;-{ ; {ȶC`l{ɴɴ//llll  ||ii߳C`={رC`{ɧ|ɧ|̣?̣?C`>{>>ii渴>㸴>D`L>㎴C`H{㏲9㏲9ʢ ʢ YYL>zLzLIiI.,jy3#\" JrK2 k$"9*2 "99 C9lwp~![I * YY EYV`I!5#I #U PQ:i9! #Z"#b]R   9y!lyJ#?&r IImii!KIbZ r-" IIFpIN{H;'#: )(oY( P ` l-]:[[[9i!=z!  B  Z!#  YzJ  AJapQ0l 2R' #%)R b*0 B* pep*K’ I!799!5"!E_ jJe!5R U P :@J"9>H${'{"{%:':! ' n8%.!y Y!K :&N~LfSzj92$i"{ % :k ** r*g`z Sٓi\"kHyҔ =>I*"*!9$;%b#z ;%,@$ '' j Y!K'+  Y!K#~o iCS ˠN 1H SCS >?5HvSɑ[9`Y5Y4jZ4ŐQSi4J91" N|r]A`D`!l IIE`I !: U PQD! #[   0@`)! #  A`j 92r)RyR"[ &9K *BS 3r)!$ r{&$9$ &*+r$9$ !9'i&|] ;іq`ov`D s`;FS 7!5r; E6!5EJ91bY"!%kM @`!L]NR'9&I"j2#$;=X2#K y&I!;#* JU e\Lt \c`s_y얕i; p얕 J |9 })}  } pЗ*4h.4 !j#[i jk !5"U P} J5$ & k 9n(B&_B"*2% Y&I")U eZ} } ~ PZR``pw0)! #9i  &`YI!!*!bIU PQQYiY! #Y)RY" 'i   B`,dZ*0"% lm!/mx"   T =ap @`!5U P PQT uy ! ¤'r '  PB`>T v!|J  E`y! #9j%%! G`y! #%9Jb[$:  G`y! #%9Jb[$ B`.;Z0&9['9/xB"j&b " >b# #iMR b" 9jkE`@` _ 7!5r) Ey)! #)##'  C`i!M;#   @ N!!U P Pd!U P!! U P P{ Y4 LB"" "$ R y&')T dJ0 DJY MMא 0{ Y4&,B" k""lR y$')T dJ0 DJ)\Ǖ 0!%[ W pqY!I:II DI P` -y0R'!$'!j!$9/" IP ` PPPÒR`,)ǒB0nP`ngpn@0ZJ)4R&r ] [#IITTR`+;MY5"$%Bi $ &%9U eZ0 EZY-L)Ҕ[i3r 2,R"\I&"%&$# S c:0 C:)i:G`:WpǓzM)MMMPa0d!J U PyZ! #e&k. k   @ LW` -6!"E*9 "&!| 0 )F`JL Z!#"  AY@p<y ! #e'k. k   ` Dp |b0e!52  P:Z2r)2iB!\ ***~a0ɗ)I!5`ҥU PQYQYKk93! Z Nbҥ S c:C:s0:Gp:RP:e`)I!5r&] U PQYQYKk94! Z Nbҥ T dJDJs0JGpJRPJe`YZ!*#aҥ** *Ep*{lI5! Z Nbҥ )E U[uC[[qP[@p[S0[f`)!5”ky t! @`* R#9K"J O;"EDi!5!' &EDYJ!9 '&99 C9T 9apt! D`:i 2$/o!))D)$0i!#])Tpn<>i6"92$N( L R &!IV fk0 Fk]9kk8ykC*i<>i6 9m2". &,lR $!IV fk0 Fkj]9;;yk@yii!:#JY::Q`:D0j!+#Z:N ++ B+-[ !J# Y J` ly2R'!$'!>!$9/" )R b.RR))))LS`ɴ/Z*)5R&r ҥ %9<" \\Uiƥ\;]Y1"$%BiM 2LR R Yk2 Y"9Q aБ0 AYoie`UpE0o;]Y1 "%BIMk2,RlR YK2 Y"9Q aБ0 A)?ib`RpB0?j4#*\+(;% %$O"=;&-%|',;% #\% J` `^K` A0 `O)@0z`.)`F!# *:![#i9$[[JTpTp! #k    @ ;9Z!9#I)!99 c9Dp9 *:![#i9XO[[MTpTp9 !9#;)!99 c9C 9;cP !9#z !#[\A`I! #9b+"  D` Y“# :#N.l )#>I0 "9Y*:!y#i9$yyJ_J! #K    @ 9Z!9#I)!99 c9Dp9 !)#j )r4ɠG !5EBI)! ##) !  PE`I)! ##bY PE`*+4R9r R:" %L T DIE`IUpE`Up}Y֧Vp99!5R9" %U PQEU)! ##9*2  @` !52)2 U PQCJK6L"-2 !Zk!mm FmV`mcpmES mpSz 7&+R $#yy GyEyU yK(b`]Z*0i '\|'_I"l'] X]b[4 )!IZ$-< Y> "R b*T *ID`kT k><>i6"92$N( L R &!IV fk0 FkZ9hh8ʑykC/i<>i6 9m2".&,lR $!IV fk0 FkjZ988ʑyk@~ii!:#JY::Q`:@0j!+#Z:K ++ B+- ly4R'!$'!>!$9/" )T dMTT)) S`i8Z*)5R&r ҥ %9<" \\Uiƥ+;]Y1"$%Bi* 2LR R Yk2 Y"9Q aБ0 AYoic`SpC0o;]Y1 "%BI*k2,RlR YK2 Y"9Q aБ0 A)?i``Pp@0?9!i# )'i`t!_ iG`:i 2$/o!))D)o*z!{#i9{O{{xhP0ۡT0! #*    @ y9 !9#y)!99 c9C 9ygP9y!#9X  ^) !L#LJYy!#9Z " y {i3$J#/"a#^ !Z N == C=aSУ/5У/4ŰmAS )i!#IR&; {i3$J#~"a#^ !Z N == C=fSУ~5У~4Ű=AS J:6# $Z >" "kkz _}#I%9;$9-Bm' yZKR'i :  ~o2 i"K!зH2 i!*+R&I& & &?#r$^#: &I")P  8iCg0̴QLa0)ʒy>ʒiIWKYLi]٥Y`99٥I٥9j4ŐES K5!9K}"$*$"M!2" $#8R'N"$ &]H;B"2&$YU E *Y<i^Pp<y^B`S 9}yHY 9Y_k1"&i"&$.<' /"")o“Yx&/8"&&B /r hR Y'Y&"9AQ ah9d0-)0hpPj = 2! J JZ!]% #K'NLm2$Ir#٥mR!9 _ "' b'j, Z" R Bi) 0}Mtp..>*#)r #YoXI%:!,%")#+H9ңk2$z,2!~,Nhy2% 'XJ Z"J(R ( (O)[I)wx̒Y,p2ؑpѕ`k /6ʐ[90(ˑ2)x|[y7!9:M x—J%y'#>2 "}}rfyJJi![#, [[D[ 0>=Z5$ j&J=! '!B#<"n?b'Y#a$)U e]ѥi[M XX{:iMI :)1!ZI”xR 9!#kMiQ`GpJ:1!%!##+MiQ`Gp i!9#.z 99W 9k=<8#&{8 }}8"z YY j W gO)tS|4>@S : ! JB ''% Ay`pA`C`Y)! ##Y '   @`Yi!*##Y '^ **@`*L j!+##Y '_+ ++ B+|:.y)! #9j%$y   C`;j93b9 9|bZ;n==P=A0C0Pe!5  P! #    @ ZMy7!9'y,—Kz!yR !{^ J "{{8> 6"&%$y ii fiTpizB`y)! #9j%$   C`Y)! ##I '  F`e!5B  P|y 1&9$9{%;&MR mR$9'9"m 'kn[i!9#I)bjR[B 99 C9IG`Z2$iZ#yL"&Y~'{$9">!L]NR'9&I"j"#; =H%9R$a°::R b-Ѣt -c0rH+9`őYJ_,O  Yt Iݐ9 4H~4 !L#_ L!9#] 99s}-J1$ & k 9nr"i2%$B";!2% &I")Q aH^}ɑyٗ  }q0i![#i[[@[ 0y)! #9j%$9   C`Yi!*##Y '} **p*/ y 3&9$9{% &MR &Oy,m" "99J;y!9#I)bjR[!99 C9IG`]z:4# "&+k&i}“x$+B  b#)!KsSKy4O47v!9#\ 9@:!#i9$o i!o y֥(}J)Z!9#I)2 99 c9D`9I]Z*0i '\|'_I"l&] Xb 4v! #\  @:i 2$/o!))D)"0Y)!)##Y '^ ))@`*! ##Y 'I   @ ]~y)! #9j%$J   C`Kj97b9 9|bZ;*}}P}9z9P! #L    @ My7!9'y,ҖkFs>FsD>Gs G}p(Gs+>G@>0L+>Ld=PM= P~=0R@P99M=@z9pT\ PP= zVPp)p)<zp)0WOB)`20g<ypWpO@<`y0XPM(0}1;wAY M(}(|;`w( ZFMN|N@9;PwNZpM(|(P:@w(P[L(p|(:v(p\ L(|(<:`v(\@K(K( {({():u(u(wJ(z(и9u(`J(@z(d9t(I(z1зN`t1зIu(yu(08@tu(Ib(yb(8 tb(и$II( y1P88{*s)H#( xX1гD8HasF'v+1P70ar`F'`v'h7{*q'@F'@v'37йapq'pE'@u07app0C''s''6b osPC' s'I6{*nZpB!@r!6amz A&q05 Gbpl&?&o^0;5cj ?a&oa&p4P{*ja&;|% l/3`a f,~8$pi /3p$c`c}8$@i$@33{*0c$6s$g. %3a@a2}4#e .3$c^|`4#Pe-{*P^-3#e-8c^-3(e( {*l^(3!d!0FcPl]!/"a,`[c0lpZ{/!0`!pc{lYz/( `(c^lY(._cbPY.(.(_(_(N0Y(@Y(."_"c Y"."_"NY"-Y"^, d@X{ ,"]F,EVB{+!\1,!d`V({P*! [+{*dTz)!PZ+Tz(!pY!@Sz(e!X+Rzjj(t@7tOtj j0$it2it@KitHj ioP#t2tpJy-di@  op"s01sI\y0!d`in!sP0sH3yp{*inds.dsPGxNd{*{*{*.{*@G{*Nd{i{ipSs0.SsFSsdpaiPn2s-2sPFx@] PTi ~nPs-sEx^_ ip5n r+rDYx!dhmir*irCx{*dhhPr`*Pr`CPr0dphphph0*h0Chd`{*`{*`{* *{* C{*ePm{*@mN0{*!d mP{*m`eh[chE!d`{*pp){*)=u8u<CvpRtzP Bf)mpp8'u<mpPR^z@mp@!d)'u`8mp<-v@Rmp0mp{*(u`7_u;v Q3zPRfRf0{*@f (0`gLgPBwВwVg @w0Vg>'w?Ywp'wPYwp&vg[cgq0qPqPqqqqPq0qpqq-rpPzЕSSPq!r Pzzz@mpmPmpmm0B`BPB`BBqqOyyPy 011Dmˈkkk ͇^z)'upж0ym0Ӄm`ˈ^kkPk@5͇0))`'uyЃ^&&ffP(a@{*{*E`87ahP~xp~%Nxj9uj9u`j09u@j8u0#'0@U>UH@h |@{zВ/A (0CP(`( kpNcp\  cp\6<<RSDS@LB R0BSystem.Data.Entity.Design.ni.pdbRSDSy b>H !ÞSystem.Data.Entity.Design.pdb4ȡ8X8ȣ08pФ P Ȧ 08HX`hȧا 080@PXЪ 0@P`pЫ 0@P`pЬ 0@P`pЭ 0@P`pЮ 0@P`pЯ  0@P`pР 0@P`pС 0@P`pТ 0@P`pУ 0@P`pФ 0@P`pХ 0@P`pЦ 0@P`pЧ 0@P`pШ 0@P`pЩ 0@P`pЪ 0@P`pЫ 0@P`pЬ 0@P`pЭ 0@P`pЮ 0@P`pЯ0,0X`ȡСء (08PxȢТآ08`ȣ@h@h8`ئ(08@HPX`hpxȧЧا HpHp8`ت(PxЫث08`ج@xȭ Hp8p@8`ؠ(Pxȡ (08@HPX`xТآ(08`08`ؤ(PȥХ HPxȦЦئ (08@HPxȨШب (08@HPX`hpxЩة HPت (08@HPX`hpxȫЫث08@HPX`hpx (PX`hpxȭ (0XpxȮЮخ8HPX`hpxȯPl8PX`hpxȠРؠ (@X`hpxȡxȢ (0X`hpxȣУأ (08@X(08@HPX`hpxȥХإ PX`hpx (08@X`hpxȧ08@HPX`ȨШب (08@Hȩ (08p 8` (08@X`hpxЬج(@HPX`hpȭЭح08@HPX`Ȯ (0HPX`hpxȯЯد`p 8@HPX`hp(08@HPXȡСء@ȢТآ (08@HPX`hpxȣУأ (08@HPX`hpxȤФؤ (`pxȥإ@HPX`hpئ@X`hpxا@HPX`hpШ (0HPxЩة (08@X`hpxЪتX`hpxȫЫث (X` (08@HPX`hpxȭЭح@HPX`hpxЮخ(Phpxȯدp (0X`hpxȠ(HpxȡСء (08@HPhpxȢPX`hpxȣУأ (08@XhpxȤФؤ (08@HPX`hpxȥХإHPX`hpxȦЦئ0HPX`hpxШب (08@hpx@X`hpxȪЪت (08@HPX`hpxȫЫث8@HPX`h (08PX`hpxȭЭح (08@HPxȮЮخ(08@HPX`x (@xРؠ@HPX`hpxȡСء (08@HPX`hpxȢТآ࢈أ8`hpxȤФؤ8@HPX`hpإ (08@HpxȦЦئ (08@X`hpxȧЧا8@HPX`hب HPX`hpx08@HPX` (08PX`hpxȫЫث08@HPX`xȬЬPX`hpxȭЭح08@HPX`hخ08@HPX`hpxدȠРؠ (08@H`hpx (0HPX`hpxȢТآ (08@HPX`hpxHPX`hpxȤФؤ (08Хإ (08@HhpxȦЦئ8@HPX`h (08@X`hpx PhpxȪ (08@HPX`hpxHPX`hpxȬЬ (08@H`hpxȭЭح (08@HPX`hpxȮЮخ (@Яدd (08@HPX`hpx (08Pp(08@HPX`hpxȢТHȣУأHPX`hpxȤФؤ 8PX`hpxȥ (08@X`hpxȦЦئ (08@HhpxȧЧا HPX`hpxȨШب (0X`hpxة (08@HPhpxȪЪت 8PX`hpxЫثHج (08@HPX`hpx (08@Xx@Яh (@PX`hpxȠРؠ (hpxȡСء8`hpxȢТآ(@HPX`hpX`hpxȤ (pxȥ8@HPX`hpxȦЦئ HPX`hpxȧЧ (@hpxȨШب (08X`hpxȩЩة (08`hpx08@HPX`hpxHPX`hpxȬЬج (08@HPX`hpxȭЭح譠ȮЮخ (08@X`hpȯx (PX`hpxȠРؠ8@HPX`hȡСء (0HPxȢТآ 8`h (08@HPX`hpxȤФؤHPX`hpxإ08@HPX`hpx (0Xا (0X`hpxȨ (0 (HPX`hpxȪЪت (0hpxЫث@HPX`hpȬ 8@HPX`hȭЭح8@HPX`hȮЮخ (PhpxȯЯد HPX`hpxРؠ(hpxPX`hpxȢТآ (08@HPX`hpxȣУأ (08@H`hpxȤФ (08@HhpxȥХإ08@HPX`hpxȦЦئ (08@HPX`hpxHȨ (08@HPX`xȩЩة (08@xȪЪت@HPX`hpxȫЫث (08@HPX`hpxȬЬجxȭЭح (0`hpxȮ (@X`hpxȯ (08@XhpxȠРؠ (08@Hpx0PX`hpxآ8@HPX`hȣУأ (0HPX` Hpx (08@H`h@HPX`hpا (08@HPȨ (08@HPX`hȩЩ (08@HPhȪЪت8@HPX`hpȫЫث8@HPX`hpx (HȭЭح (08@HPX`hpxȮЮخ (Яد$8@HPX`hHPX`hpx08@HPx (08@H`hpxȣУأ8@HPX`hpxȤФؤ (08@HPX`hpx`hpx@X`hpx (08`hpx (0X`hpxȩ (08@HPXp08@HPX`ȫЫثHPX`hpxȬx (XpxȮЮخ (08`ȯЯd(08@HPXxȠРؠ`hpxء@ (08@H`ȣ 8H`Фؤ (08@hȥХإ (08@HPxЦئ08@HPX`hpȧЧ (08@XȨ8@HPX`hȩЩة (PX`hpxت8@HPX`hpx (08HX`hpxȬЬج (08@HPX`(8PhpxЮخ (08hpxȯЯ@08@HPX`ȠРؠ(08@hp (08`xȢТآ PX`hpxȣȤ (08@HPX`hȥХ8@HPX`hȦЦئ8@HPX`hpx (0X`hpx (08HXة@HPX`x (@HPX`hpȫ X`hpxȬЬج PX`hȭЭحHPX`hpxpxȯ  (08@HPXpȠРؠ (08@HPX`hp08@HPX`xȢТآ (PX`hpxУأ(@HpxȤ 8HPX`hȦЦئ (08@HPX`hpxȧЧا hpxШب (08@HhpxȩЩة(8Ъت(08@HPX`hpx (08@HPX`hpЬج (08@HPX`hpxȭ HPX`hpxȮЮخ08Pxȯ008@HPxȠРؠ (08@HPX`hpxСء@HPX`hpxȢТآ@X`hpxȣУأ XȤ (08@HPX`hpxȥХإ (08@HPX`h (08@HPX`hpxȧЧا (08@HPX`hpxȨШب (X`hpxЩة (08@HPX`hpxȪЪت (08@HPX`hpxȫЫث08`hpxȭЭح (08@HPX`hpxȮЮخ (08PX`hpxȯЯد@  (08@HPX`hpxȠРؠ (08@HPX`hpxȡСء (08@HPX`hpxȢ0HPX`hpxУأ(08@HPX`hpx (@HPX`hpxȥ (08@HPX`xȦЦئ (08@HPXpxȧЧا8@X`hpxШب (0X`xȩЩة HPX`hpxȪ0X`xȫЫث (08@HPX`hpxȬЬج (08@HPX`hpx (08@HPX`hpxȮЮخ (08@HPX`hЯدP< 8@HPX`hpxȠРؠ (0ȡ (08@X`hpxȢТآ (08@X`hpxȣ (08@HPXpxȤФؤ (@HPX`hpxȥХإ (08PX`xȦЦ (0HPX`hpxȧ08@HPX`h (PXȩЩة (08@HȪЪت 8PX`hpxȫЫث (08@HPX`hpȬЬج (08@HPX`hpxȭЭح(08@HPX`hpxȮЮخ08@HPX`hpxЯد` (08@X`hpxȠРؠ (08@HPX`hpxȡ (PX`hpxТآ (08PX`hpxУأ(0HPpxȤФؤ HPإ (08@HPȦ (08@HPX`hȧЧا (8@HPX`hpxب(0X`hpxȩЩة (08@HPXЪت (08@HPX`hpȫЫث (08@HPX`hpxȬЬج p4PX`hpxȣУأ (08@HPX`hpxȤФؤ (08@HPX`hpxȥХإ (08@HPX`hpxȦЦئ (08@HPX`hpxȧЧا (08@HPX`hpxȨШب (08@HPX`hpxȩЩة (08@HPX`hpxȪЪت (08@HPX`hpxȫЫث (08@HPX`hpxȬЬج (08@HPX`hpxȭЭح (08@HPX`hpxȮЮخ (08@HPX`hpxȯЯد (08@HPX`hpxȠРؠ (08@HPX`hpxȡСء (08@HPX`hpxȢТآ (08@HPX`hpxȣУأ (08@HPX`hpxȤФؤ (08@HPX`hpxȥХإ (08@HPX`hpxȦЦئ (08@HPX`hpxȧЧا (08@HPX`hpxȨШب (08@HPX`hpxȩЩة (08@HPX`hpxȪЪت (08@HPX`hpxȫЫث (08@HPX`hpxȬЬج (08@HPX`hpxȭЭح (08@HPX`hpxȮЮخ (08@HPX`hpxȯЯد| (08@HPX`hpxȠРؠ (08@(`ȯЯد@(0HPXhpP0ب(00xhX8HX8ؠ(8x@P(@HУأP`Ф hxȥ (8ȧ(88HȩةP`0@HXH`hЭȮX0@@X`@P8hxȣ0@ؤ`pإ 0 P`Ȩp8x P`ЬP@PhЯ 0@P`p@P`pСXآhأ`X(pȦ h@HX`(pȫ 0P(P80|(8HXhx h@PHФ 0@P`p@Щ(PxhXЯ X0(8آ`أ ФPpХ8Ȧ@HH hت 8ثX`ȭXpxpȯ0 xР(pء0Т(Pxأ HФ(إ(HhЦئX`@H`ب8 H xЫ(0PXج`hح0Ю(0Xد@(0X@`@H`8@HPX`hȩةXت08@HPPtX`hpȣ(Pxؤ0(Pxئ08@HPX`hpȯ` xР(ء08@HPX HpШ8`ة(PxȪ@h0XЬ Hp8`خ(8Pxȯp@hx(8HXhx 0`xЩ@X0H8Pج(@xȭ0hخH`Я XpH``p(XpH`8PH`8P8HШ 8PȩةP`pxȪت(8@Phx@X0H@X0H`xȠPh(8@P`hxȢآ (8hУ XpH`Ȧ(HP`xا 08H`pȨШ 0PXhЩة (8HP`pxȪتثXh(@Phd 8PhСpإ0H`x8Phت0H`Ȭ0H`p`xȡФ 8PХئ𦈧Ч 8P(xتPȫث(Xxج8Xxح8XxخPpЯ0PpР0PpС0P(أ(8hȤ(Hhȥ@` @` @` @` @` @` @` @` ` @` @` @` @` @` @` @`إ8Xx(8hا8Xx0PpЩ0PpȪتHhȫ(HhȬ(Hhȭ@P`pЮ(HhȠ(Hȡء(8HXȢآ0PpУ0PpФ0@xХ0PpЦ0PpЧ0PpШ0PpЩ0@P`Ъ Xxث8XxЬ 0@P`pЭ8Xxخ8X 0@P0PС0@Ȣ8 0@Pإ0Pp Pp(HhȨ@`ة8Xxت8h@P`pج(8HXhxȭحXxЮ0PpЯ0PpР0PpС0PpТ0pУ 0@pФ0PpХ0P(Hhȧ(HhȨ(Hhȩ(HhȪ(Hȫث(HhȬ(Hhȭ(HhȮ(Hhȯ(Hh 0` @` 0@P`У0Pp(Х0PpЦHXhxȧا(HhȨ(HhЬ`p(@pЮ Ppȡ(HhȢ(Hhȣ(HhȤ(Hh @` @` @` @` @`ح 8PhȮ0د0 8PhȠ(HP`p8Xxأ8Xxؤ8Xxإ8x(Hhȧ(8H @` @` @Ы ଐȭ@ p@@8ȢPHh(XxإȦ0H(Hة8Xx ȫXЬ@` @` @`PP(` @` @`P`hx0ȥhئxppp(Xpȧ8P 0@HXhpȩ 8ت 8H`Ь(@ xخ0H(Ƞ0hС xȢ0hУ XpȤ(@X0HXpH`8PH`XpH` 08HX`pЮخ@X0HР 8Ph@XPh@X0H@XPXhxȨШ 0@HXH`8PH`8PhpЮPh@@X0HȡС 0@HXhpȢТ 0PXhxȣУ 0@HXhpФ 08HX`p@X0H@X0H 0@HXhpȪPh@XPhح(`xȮPh(8@P`hxȠؠP`@XPh@X0HȥХ 0@HXhpЦ(0@pxЧا (8HP`ȨШ بXh 0@P`pУ 0@P`pФ 0@P`pХ 0@P`pЦ 0@P`pЧ 0@P`pШ 0@P`pЩ 0@P`pЪ 0@P`pЫ 0@P`pЬ 0@P`pЭ 0@P`pЮ 0@P`pЯ  0@P`pР 0@P`pС 0@P`pТ 0@P`pУ 0@P`pФ 0@P`pХ 0@P`pЦ 0@P`pЧ 0@P`pШ 0@P`pЩ 0@P`pЪ 0@P`pЫ 0@P`pЬ 0@P`pЭ 0@P`pЮ 0@P`pЯ0 0@P`pР 0@P`pС 0@P`pТP`@pФP`8Hئ(XhHxبh(8 xЫ pppxxȩة8HXhxȪت(8HXhx(XhxHЭ0xȮ8xدHXР@hآHXȣHXhȤXإ `0XШ 8xȩ(h8hث`pP`ȮخP`ph 0@hxР@ȣ0@hȤ 0Hpإ0`8@h@xp Xhء `xТأ@ȥ0 0hЭ ЮxЯ0Ƞȡ@P(8HXHȦئXh0HhȨ8`Щ0ث0XجHP,xȭح0@P`p(ؠ@HPxȢТآ (0xȣ 08@`hpxȤФؤ (08HPX` (0HPX`x(@HPX`pȧЧا (08@HPXpȨШب(8H`hpxة(08@Hت (0HX`hxȫЫثX`hpxȬЬجHPX`hpxح (08@HPXhȮЮخ (08@H`hpxȯЯدd (08@XРؠ(08@HPX`x (0PX`hxȢآ8@HP`hpȣأ(08@pxФؤ (08X (0XhȦئ(08@PX`hpxȧЧا (0PX`xب (0H`hpxȩЩة (08@HPX`Ъت0PhpxȫЫث (0PȬ(08H`hpxȭЭ (08@H` (08@H`pȯ(08@P`xРؠ (08@HX`pء08@HP`hxȢТآ (0pxȣУ (8@HP`hȤФ (08@HP`ȥХ(08@PȦЦئ(08@HPX`pxЧاhpxȨب(08@HPXhxȩЩة 8@HX`hpxȪت (08@HPXhpxȫЫ (08@PXhpxȬЬج (8@HPX`hpxȭЭح (0@Xpx (`hp (0HPX`hx 08@HX`hxȡСء (08HPȢ 08xȣУأ (08@HP`hp (PX`pxȥХ (08@PȦ(08@HPX`pxȧЧا (8PX`hpب(8H`hpxȩЩة8@HPX`hpت (08@HX`hxЫث8@HPX`hpxȬЬج(X`hpxح (0@HPȮЮ (08@P`hpxЯد (08H`hpx 8hpx(08@HP`hpx (08`hpȣأ (08@HPXФؤ(8X`hpxȥХإ(08@HXhȦЦ (0@HPX`pЧ08@HPX`pȨШ 8@HPX`hpȩ (0@HP`pxЪت (8H`hpxЫث08HPX`hpȬЬج8@HPX`hxȭЭح(08@HXhȮЮ (08@P`hpxȯЯد (08HPȠРؠ (08@PXhxȡء (0@XhpxȢТآPX`hpأ PX`hpxФ(08@HXhpxȥإ (8HxȦЦ (8@HX`Ч 08pxب(X`hpx (0X`hpxȪЪت@HPX`hpx @HXȬج8@HPXhЭ (@HPX`pЮ (08HXpxȯد008@HPX`hȠРؠ 08@Pȡ (8HxТآ 0@Уأ (0@PX`xȤФؤ8@HPX`hpȥХإ (8HPX`pxЦ 0@HPX`hx (8@HX`hpxȨШب (08Hة (0@XpxȪЪت (0@P (0PX`hpxȬЬج@HPX`pЭ (08@HP`hpxȮЮ (08HX`hxЯد@0HPX`hpxȠРؠ0`hpxȡСء8@HPXhxȢТآ8HPX`pxȣУ (08@H`hxȤФؤ08@HPX`pإ(PX`hp0HPX`hpx PX`hpx08@HX`hpxȩЩة (08@HPhxȪЪت (8@HP`hpxȫЫPX`hpxȬЬج (08@X`pЭح 08HPX`pȮЮ (8HX`hpxȯЯدPl (0@P`hpxȠР (08@HPXx (08XhxТآ 0`hpxУ (0@PX`hpxȤФؤ08@HXhpxȥإ(08@PpxȦЦئ 8HPX`hpxȧЧا 0@px (8@HX (0@pxЪت@HPXpЫ (@Ȭ(@HPXpЭHPX`xخ (08@`pЯد` (0H`hpx@HPXp(X`hpȢТ(08@Xȣ 8@X`hpȥХ(08@Xئ (0HPhpxȧЧا(08@PXpxȨب (@pxЩة08@H` PX`hȫ(X`hpȬЬ (0HPXح (08@HPX`hpxȮЮخX`hpدp (08@HPX`hpx (08hpx (8x(PX`hpxȣУأhpxФ xȥХ(08@HPX`ȦЦئ 8PX`hȧ@HPXpШ 08@pȩЩ (0@PȪ0`hpxث 8@Hx (X`hpȭЭح(08@XȮЮ(08@X`hxȯد4 (8HPXpxȠР0`hpxȡСء (08PhpxȢТآ (08@HPX(08@X08@H`xȥХإ (08PȦЦئ(08@PX`hȧЧا (0Hxب8@HPX`hpxȩЩة0HPX`xȪЪت8@HP`hpث (08@pxȬ(08@HPX`ȭЭح PX`hpx (XpxЯد (08@HPpȠРؠ(8@HPء(08@HPX`ȢТآ (0HPX`hpxأHPX`hxȤФؤ (08@`xȥХإ08@ 08@ȧا 0HPبX`hpxЩ (08@P`pЪ (08XȫЫXHPX`hx`ȯЯد (08@HPX`hp@HPXhpxСءࡀ (08@HPأ8@ؤ@px (0@XЦئ@HPX`pȧЧا (08@P`hȨШب(8x8X`hp (@ȫ08@X (08@HxȭЭح (08@HPXxȮ8@HPX`hpȯЯدHPX`hpxРؠ@HPX`hpx (08Ȣ ( (08@HP