From: Ayumu Aizawa Date: 2014-07-12T21:51:54+09:00 Subject: [ruby-list:49873] Re: Rubyへの要望(願望) --001a11c2d600c9dc7404fdfe853b Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit あいざわです。 いずれにしても、中田さんご指摘のように個別の機能リクエストとして https://bugs.ruby-lang.org/ に起票していただいた方がよろしいかと思います。 2014年7月12日 21:22 MASAKI Yuhsuke : > Hi Yukihiro Matsumoto , this is MASAKI Yuhsuke< > reasonset@yahoo.co.jp>. > I reply for your mail on Sat, 12 Jul 2014 15:20:37 +0900. > > You wrote: > > まつもと ゆきひろです > > > > > continue節はPythonにあるものと同じものを期待してらっしゃるの > > でしょうか。面白いアイディアだと思って昔から考えているのです > > が、難点はRubyの場合、ループなどはブロックを使うことを推奨し > > ており、continue節の導入が正当に意味づけしづらいところです。 > > 同様の理由で3 part forも賛成しにくいです。むしろもっとブロッ > > クを使って欲しいところです。 > > > whileを使うことはほとんどないのですが、可能であればむしろブロックにcontinue節が欲しいくらいです。 > something do > # main > continue > # continue > end > さらにいえばこれをやるならば、ブロックにrescueやensureやelseをつけられるようにしてほしいとも思います。 > > > > |#文字列の強制エンコーディング処理 > > そういうのがあるといいですね。もうちょっと具体化するといいの > > ですが。 > > > lvって割と自動認識してくれるよなー、と思ったのですが、lvはアジア言語に特化しているのですね。 > > geditの言語認識は予め候補となるエンコーディングを候補順に並べておく必要がありますが、だいたい認識してくれます。ここらへんが妥当な線かな、とは思います。 > > Teaも同じように対象となるエンコーディングを指定しておくことで自動認識してくれます。恐らくはまた違ったメカニズムだとは思いますが、これもひとつでしょうか。 > それぞれの実装について具体的に述べることは(知識不足で)できませんが、 > 完全な自動化を目指すなら、各エンコーディングの特徴となる部分、 > 例えば先頭のBOMや、UTF-8の可変長認識のためのバイトルール、エスケープシーケンスなどから「そのエンコーディングの特徴を満たしているか?」を判定、 > > 使用するエンコーディングの優先度をStringのクラス変数に持たせておき、ISO8859のようにそのエンコーディングのバイトルールが競合するものについてはその優先度に基づいて決定。 > (より完璧に近づけるならば、単語などでそのエンコーディングに頻出するパターンを照合することで確率の高いエンコーディングをもとめ、 > それとは別にユーザー定義の優先順位を決めるクラス変数を持たせておき、そこで指定されていれば推測された「確率の高いエンコーディング」に代えて > 同様のバイトルールを持つユーザー指定のエンコーディングであると仮定する、というのはどうでしょう) > > 優先度のアクセサは > String.encoding_priority > String.encoding_priority= > とか。そして、その機能がつけばguessを入れ替えるか、もしくは > String#full_guess > とか。さらには#force_encodeを使いたいのですが、これも名前問題がありそうなので、 > String#auto_convert(encode) > でしょうか。 > > > > |#Zsh EXTENDED_GLOBのサポート > > > ZshのGlob全部はシェルでないRubyでは実現できなかったような記憶 > > があります。どこまで欲しいのか、もうちょっと具体的な提案があ > > ると採用しやすいかもしれません。 > > > Zsh manualにあるGlob Operator: > <[x]-[y]> 数値ベースのglob > (...) グループ化 > x|y OR > ^x 否定 > x# 1回以上のx > x## 2回以上のx > > と、Glob Qualifierですね。 > 特に便利なケースとしては、 > **/<->(/n^D) →カレントディレクトリ以下(再帰)の数値の非ドットディレクトリを数値順ソートで > のようなものです。 > > > |#File#flockにブロックを > > flockはfileがcloseすると解放されるので、 > > > > File.open(path, "r") do |f| > > f.flock(File::LOCK_EX) > > # ... > > end > > > > で十分だと思うのですが。ブロック形式の方が便利なケースを思い > > つきませんが、もしあるということでしたら再提案してください。 > > > r+で開いて内容を確認し、内容によって書き込むようなケースですね。例えば > File.open(path, "r+") do |f| > f.flock(File::LOCK_SH) > obj = Marshal.load(f) > f.flock(File::LOCK_UN) > f.seek(0) > #... > if cond > f.flock(File::LOCK_EX) > Marshal.dump(obj, f) > f.flock(File::LOCK_UN) > end > end > > また、このようなことをしないなら、そもそもfileをopenする時点でロックを獲得するような呼び方ができるといいというのもあります。 > > > > |#メソッド名にsymbolを増強 > > ちょっと提案の意味がわかりにくいです。 > > > > 「識別子に使える記号を増やして欲しい」という提案であれば、以 > > 前にも頂いたことがありますが、正直なところ記号があんまり残っ > > てないです。それにプログラムの読みやすさに貢献しないことが明 > > らかなので、あまり積極的になりづらいですね。 > > > > > 実際に遭遇したケースとしては、文字列のエスケープ処理と、文字列のエスケープ処理通過指示(verb)で、 > 通常のメソッドの形でなくsymbolを使うことでスッキリみせたい、というのがありました。 > つまり、 > ^ "Hello" > > のように書きたかったのですが、^インスタンスメソッドを定義した上でinstance_evalを呼んでもself.^を読んでくれないため、そうなりません。 > 記号が残っていない、というのは感じますが、DSLではもうちょっと書き方に自由度が欲しいな、と思うことがちょくちょくあります。 > Ruby組み込みでない(DSL処理スクリプトが処理前に展開する)マクロを書いてしまえばいいのかな、 > とは思いますけれど、それもなんだか嬉しくない気がして。 > > > |# Kernel.syscallにStringを渡せるようにしてほしい > > 「まんま」といわれてもちょっとわからないのですが、syscallでシ > > ステムコールの指定を番号ではなく文字列で指定したいということ > > でしょうか。 > > > これも、mkfifoを楽にするために欲しいな、と思ったことですね。おっしゃるとおり、システムコール名で指定したいのです。 > 他のプラットフォームについて充分に調べられなかったため、syscallを数値で指定すると移植性に影響がでそうだ、と思いまして。 > > > |# next/redo/breakのターゲットを明示できるようにする > > ちょっとよくわかりませんでした。 > > > 次のようなケースです。 > > catch :nested do > a.each do |i1| > begin > b.each do |i2| > case > when i1.nil? > throw :nested > when i2 < 10 > next > else > raise > end > end > rescue > redo > end > end > end > > breakの代わりにthrow, redoの代わりにraiseを使っています。 > このbreakとredoはa.eachに対して行いたい、ということです。 > このようなケースで、どこかに処理をいれようとすると同じ処理を複数箇所に書くことになるんだよな、 > と思って古いコードを探したのですが、発見できませんでした。ごめんなさい。 > > > |# IO#write_reopen/IO#read_reopen? > > open3? > > > あ、そうですね…Open3がどういうものだか全く理解していませんでしたm(_ _)m > > > |# サブプロセスからの読み戻し > > aliasを使ってはどうでしょうか? 適切な名前があれば別名をあら > > かじめ用意するのもよいのかもしれません。 > > > Kernel.`って文字列しかとりませんよね?argをArrayで渡したいということなのですが… > 名称は、ベタにKernel.cmdか、あるいは分かりにくいですけど、Kernel.csubとか? > 後半のは、こういうことですね。 > str = nil > IO.popen(cmd, "w+") do |io| > io.write(input) > io.write_close > str = io.read > end > > > > |# 先進的演算子 > > > |.= > > こういうのが欲しいのはわかりますが、この記法はあまりよくない > > ように思います。 > > > では、パーサが大変になりそうですが、 > obj ->method(arg) > かぶりをさけるなら > obj <-method(arg) > のほうがマシでしょうか。 > > > |# 軽量な起動, precompile > > Emacsでもそうですが、最近マシンが高速化していてそういう対処 > > は不要になってきているようです。起動時間のかかるJRubyならと > > もかく、CRubyでそこまで必要なケースはかなり少なくなっている > > とおもうのですが、なにか事情があるのでしょうか。 > 手元で起こっているケースとしては、シェルスクリプトで一部処理でRubyを使うものにしています。 > シェルスクリプトの1回のループで行われるRubyスクリプトの実行は5回です。 > 大体1回で3万ファイル程度を対象にするため、15万回Rubyを起動し、スクリプトをコンパイルすることになります。 > この場合スクリプトが非常に小さいため、ほとんどはforkのコストですが、なんだか同じ内容をコンパイルばっかりして無駄な気がします。 > > また、webappでは応答性が重視されると思うのですが、fast_cgiやmod_rubyなどでRubyインスタンスは常駐している状態だと、 > 変更されるわけでもないのにくりかえしよばれるスクリプトが毎回parseしてcompileして、という過程を経るのは非常に無駄な気がします。 > 特にトラディショナルなchatのように極めて頻繁に呼ばれるケースでは実行回数が非常に大きくなり、 > トータルの実行時間が長くなる上にその時間で実処理時間が占める割合は相当に低くなります。 > > もちろん、ソケットを使うなど実行モデル自体の見直しによって改善すればよい話なのですが、 > 書き直しの頻度に対して実行数が極めて多い場合は事前にできるだけのことをやっておきたいな、と。 > 実際の運用でスクリプト実行開始までの時間が問題になる印象をRubyで受けたことはないのですが、 > WordPressの応答性の悪さなどを考えると、応答時間に影響する部分は可能な限りつめたほうがよいように思えるのです。 > > > ### > ひとつ抜けていたので追加させてください。 > > #Object.remove_module > prependがあるのならば、モジュールを外すことができれば、一時的にメソッドを書き換えるようなことは > スマートかつ容易に行えるように思えます。 > > ================================ > # The Rider, Hacker and Musician > # ENABLE YOUR HEART. > # > # mailto:reasonset@yahoo.co.jp > # Blog: http://reasonset.net/journal/ > # Twitter @reasonset > ================================= > --001a11c2d600c9dc7404fdfe853b Content-Type: text/html; charset=ISO-2022-JP Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+GyRCJCIkJCQ2JG8kRyQ5ISMbKEI8ZGl2Pjxicj48L2Rpdj48ZGl2Phsk QiQkJDokbCRLJDckRiRiISJDZkVEJDUkcyQ0O1hFJiROJGgkJiRLOERKTCRONSFHPSVqJS8lKCU5 JUgkSCQ3JEYbKEImbmJzcDs8YSBocmVmPSJodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy8iPmh0 dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnLzwvYT4gGyRCJEs1L0k8JDckRiQkJD8kQCQkJD9KfSQs JGgkbSQ3JCQkKyRIO1ckJCReJDkhIxsoQjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4 dHJhIj48YnI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj4NCjIwMTQbJEJHLxsoQjcbJEI3 bhsoQjEyGyRCRnwbKEIgMjE6MjIgTUFTQUtJIFl1aHN1a2UgPHNwYW4gZGlyPSJsdHIiPiZsdDs8 YSBocmVmPSJtYWlsdG86cmVhc29uc2V0QHlhaG9vLmNvLmpwIiB0YXJnZXQ9Il9ibGFuayI+cmVh c29uc2V0QHlhaG9vLmNvLmpwPC9hPiZndDs8L3NwYW4+Ojxicj48YmxvY2txdW90ZSBjbGFzcz0i Z21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MCAwIDAgLjhleDtib3JkZXItbGVmdDoxcHggI2Nj YyBzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij4NCkhpIFl1a2loaXJvIE1hdHN1bW90byAmbHQ7PGEg aHJlZj0ibWFpbHRvOm1hdHpAcnVieS5vci5qcCI+bWF0ekBydWJ5Lm9yLmpwPC9hPiZndDssIHRo aXMgaXMgTUFTQUtJIFl1aHN1a2UmbHQ7PGEgaHJlZj0ibWFpbHRvOnJlYXNvbnNldEB5YWhvby5j by5qcCI+cmVhc29uc2V0QHlhaG9vLmNvLmpwPC9hPiZndDsuPGJyPg0KSSByZXBseSBmb3IgeW91 ciBtYWlsIG9uIFNhdCwgMTIgSnVsIDIwMTQgMTU6MjA6MzcgKzA5MDAuPGJyPg0KPGJyPg0KWW91 IHdyb3RlOjxicj4NCiZndDsgGyRCJF4kRCRiJEgbKEIgGyRCJGYkLSRSJG0kRyQ5GyhCPGJyPg0K PGRpdiBjbGFzcz0iIj4mZ3Q7PGJyPg0KPGJyPg0KJmd0OyBjb250aW51ZRskQkBhJE8bKEJQeXRo b24bJEIkSyQiJGskYiROJEhGMSQ4JGIkTiRyNHxCVCQ3JEYkaSRDJDckYyRrJE4bKEI8YnI+DQom Z3Q7IBskQiRHJDckZyQmJCshI0xMR3IkJCUiJSQlRyUjJSIkQCRIO1ckQyRGQE4kKyRpOU0kKCRG JCQkayROJEckORsoQjxicj4NCiZndDsgGyRCJCwhIkZxRUAkTxsoQlJ1YnkbJEIkTj5sOWchIiVr ITwlVyRKJEkkTyVWJW0lQyUvJHI7SCQmJDMkSCRyP2Q+KSQ3GyhCPGJyPg0KJmd0OyAbJEIkRiQq JGohIhsoQmNvbnRpbnVlGyRCQGEkTkYzRn4kLEA1RXYkSzBVTCMkRSQxJDckRSRpJCQkSCQzJG0k RyQ5ISMbKEI8YnI+DQomZ3Q7IBskQkYxTU0kTk19TTMkRxsoQjMgcGFydCBmb3IbJEIkYjs/QC4k NyRLJC8kJCRHJDkhIyRgJDckbSRiJEMkSCVWJW0lQxsoQjxicj4NCiZndDsgGyRCJS8kcjtIJEMk Rk1fJDckJCRIJDMkbSRHJDkhIxsoQjxicj4NCiZndDs8YnI+DQo8L2Rpdj53aGlsZRskQiRyO0gk JiQzJEgkTyRbJEgkcyRJJEokJCROJEckOSQsISIyREc9JEckIiRsJFAkYCQ3JG0lViVtJUMlLyRL GyhCY29udGludWUbJEJAYSQsTV8kNyQkJC8kaSQkJEckOSEjGyhCPGJyPg0Kc29tZXRoaW5nIGRv PGJyPg0KJm5ic3A7ICMgbWFpbjxicj4NCmNvbnRpbnVlPGJyPg0KJm5ic3A7ICMgY29udGludWU8 YnI+DQplbmQ8YnI+DQobJEIkNSRpJEskJCQoJFAkMyRsJHIkZCRrJEokaSRQISIlViVtJUMlLyRL GyhCcmVzY3VlGyRCJGQbKEJlbnN1cmUbJEIkZBsoQmVsc2UbJEIkciREJDEkaSRsJGskaCQmJEsk NyRGJFskNyQkJEgkYjtXJCQkXiQ5ISMbKEI8YnI+DQo8YnI+DQo8YnI+DQomZ3Q7IHwjGyRCSjg7 ek5zJE42L0ApJSglcyUzITwlRyUjJXMlMD1oTX0bKEI8YnI+DQomZ3Q7IBskQiQ9JCYkJCQmJE4k LCQiJGskSCQkJCQkRyQ5JE0hIyRiJCYkQSRnJEMkSDZxQk4yPSQ5JGskSCQkJCQkThsoQjxicj4N CiZndDsgGyRCJEckOSQsISMbKEI8YnI+DQomZ3Q7PGJyPg0KbHYbJEIkQyRGM2QkSDwrRjBHJzwx JDckRiQvJGwkayRoJEohPCEiJEg7VyRDJD8kTiRHJDkkLCEiGyhCbHYbJEIkTyUiJTglIjhAOGwk S0ZDMj0kNyRGJCQkayROJEckOSRNISMbKEI8YnI+DQpnZWRpdBskQiROOEA4bEcnPDEkT009JGE4 dUpkJEgkSiRrJSglcyUzITwlRyUjJXMlMCRyOHVKZD1nJEtKQiRZJEYkKiQvSSxNVyQsJCIkaiRe JDkkLCEiJEAkJCQ/JCRHJzwxJDckRiQvJGwkXiQ5ISMkMyQzJGkkWCRzJCxCRUV2JEpAfiQrJEoh IiRIJE87VyQkJF4kOSEjGyhCPGJyPg0KVGVhGyRCJGJGMSQ4JGgkJiRLQlA+XSRIJEokayUoJXMl MyE8JUclIyVzJTAkcjtYRGokNyRGJCokLyQzJEgkRzwrRjBHJzwxJDckRiQvJGwkXiQ5ISM2MiRp JC8kTyReJD8wYyRDJD8lYSUrJUslOiVgJEAkSCRPO1ckJCReJDkkLCEiJDMkbCRiJFIkSCREJEck NyRnJCYkKyEjGyhCPGJyPg0KGyRCJD0kbCQ+JGwkTjxCQXUkSyREJCQkRjZxQk5FKiRLPVIkWSRr JDMkSCRPIUpDTjwxSVRCLSRHIUskRyQtJF4kOyRzJCwhIhsoQjxicj4NChskQjQwQTQkSjwrRjAy PSRyTFw7WCQ5JEokaSEiM0YlKCVzJTMhPCVHJSMlcyUwJE5GQ0QnJEgkSiRrSXRKLCEiGyhCPGJy Pg0KGyRCTmMkKCRQQGhGLCROGyhCQk9NGyRCJGQhIhsoQlVURi04GyRCJE4yREpRRDlHJzwxJE4k PyRhJE4lUCUkJUglayE8JWshIiUoJTklMSE8JVclNyE8JTElcyU5JEokSSQrJGkhViQ9JE4lKCVz JTMhPCVHJSMlcyUwJE5GQ0QnJHJLfiQ/JDckRiQkJGskKyEpIVckckg9RGohIhsoQjxicj4NChsk QjtITVEkOSRrJSglcyUzITwlRyUjJXMlMCROTSVAaEVZJHIbKEJTdHJpbmcbJEIkTiUvJWklOUpR P3QkSzt9JD8kOyRGJCokLSEiGyhCSVNPODg1ORskQiROJGgkJiRLJD0kTiUoJXMlMyE8JUclIyVz JTAkTiVQJSQlSCVrITwlayQsNiU5ZyQ5JGskYiROJEskRCQkJEYkTyQ9JE5NJUBoRVkkSzRwJEUk JCRGN2hEaiEjGyhCPGJyPg0KGyRCIUokaCRqNDBgeiRLNmEkRSQxJGskSiRpJFAhIkMxOGwkSiRJ JEckPSROJSglcyUzITwlRyUjJXMlMCRLSVE9UCQ5JGslUSU/ITwlcyRyPkg5ZyQ5JGskMyRIJEcz Tk4oJE45YiQkJSglcyUzITwlRyUjJXMlMCRyJGIkSCRhISIbKEI8YnI+DQobJEIhISQ9JGwkSCRP SkwkSyVmITwlNiE8RGo1QSROTSVAaD1nMEwkcjdoJGEkayUvJWklOUpRP3Qkcjt9JD8kOyRGJCok LSEiJD0kMyRHO1hEaiQ1JGwkRiQkJGwkUD9kQiwkNSRsJD8hVjNOTigkTjliJCQlKCVzJTMhPCVH JSMlcyUwIVckS0JlJCgkRhsoQjxicj4NChskQiEhRjFNTSROJVAlJCVIJWshPCVrJHI7fSREJWYh PCU2ITw7WERqJE4lKCVzJTMhPCVHJSMlcyUwJEckIiRrJEgyPkRqJDkkayEiJEgkJCQmJE4kTyRJ JCYkRyQ3JGckJiFLGyhCPGJyPg0KPGJyPg0KGyRCTSVAaEVZJE4lIiUvJTslNSRPGyhCPGJyPg0K U3RyaW5nLmVuY29kaW5nX3ByaW9yaXR5PGJyPg0KU3RyaW5nLmVuY29kaW5nX3ByaW9yaXR5PTxi cj4NChskQiRIJCshIyQ9JDckRiEiJD0kTjUhRz0kLCREJDEkUBsoQmd1ZXNzGyRCJHJGfiRsQlgk KCRrJCshIiRiJDckLyRPGyhCPGJyPg0KU3RyaW5nI2Z1bGxfZ3Vlc3M8YnI+DQobJEIkSCQrISMk NSRpJEskTxsoQiNmb3JjZV9lbmNvZGUbJEIkcjtIJCQkPyQkJE4kRyQ5JCwhIiQzJGwkYkw+QTBM ZEJqJCwkIiRqJD0kJiRKJE4kRyEiGyhCPGJyPg0KU3RyaW5nI2F1dG9fY29udmVydChlbmNvZGUp PGJyPg0KGyRCJEckNyRnJCYkKyEjGyhCPGJyPg0KPGJyPg0KPGJyPg0KJmd0OyB8I1pzaCBFWFRF TkRFRF9HTE9CGyRCJE4lNSVdITwlSBsoQjxicj4NCjxkaXYgY2xhc3M9IiI+PGJyPg0KJmd0OyBa c2gbJEIkThsoQkdsb2IbJEJBNEl0JE8lNyUnJWskRyRKJCQbKEJSdWJ5GyRCJEckTzxCOD0kRyQt JEokKyRDJD8kaCQmJEo1LTIxGyhCPGJyPg0KJmd0OyAbJEIkLCQiJGokXiQ5ISMkSSQzJF4kR01f JDckJCROJCshIiRiJCYkQSRnJEMkSDZxQk5FKiRKRHMwRiQsJCIbKEI8YnI+DQomZ3Q7IBskQiRr JEg6Tk1RJDckZCQ5JCQkKyRiJDckbCReJDskcyEjGyhCPGJyPg0KJmd0Ozxicj4NCjwvZGl2Plpz aCBtYW51YWwbJEIkSyQiJGsbKEJHbG9iIE9wZXJhdG9yOjxicj4NCiZuYnNwOyAmbHQ7W3hdLVt5 XSZndDsgGyRCP3RDTSVZITwlOSROGyhCZ2xvYjxicj4NCiZuYnNwOyAoLi4uKSAbJEIlMCVrITwl VzI9GyhCPGJyPg0KJm5ic3A7IHh8eSBPUjxicj4NCiZuYnNwOyBeeCAbJEJIXURqGyhCPGJyPg0K Jm5ic3A7IHgjIDEbJEIyczBKPmUkThsoQng8YnI+DQombmJzcDsgeCMjIDIbJEIyczBKPmUkThso Qng8YnI+DQo8YnI+DQobJEIkSCEiGyhCR2xvYiBRdWFsaWZpZXIbJEIkRyQ5JE0hIxsoQjxicj4N ChskQkZDJEtKWE14JEolMSE8JTkkSCQ3JEYkTyEiGyhCPGJyPg0KJm5ic3A7ICoqLyZsdDstJmd0 Oygvbl5EKRskQiEhIiolKyVsJXMlSCVHJSMlbCUvJUglajBKMjwhSjpGNSIhSyROP3RDTSROSHMl SSVDJUglRyUjJWwlLyVIJWokcj90Q009ZyU9ITwlSCRHGyhCPGJyPg0KGyRCJE4kaCQmJEokYiRO JEckOSEjGyhCPGJyPg0KPGJyPg0KJmd0OyB8I0ZpbGUjZmxvY2sbJEIkSyVWJW0lQyUvJHIbKEI8 YnI+DQo8ZGl2IGNsYXNzPSIiPiZndDsgZmxvY2sbJEIkTxsoQmZpbGUbJEIkLBsoQmNsb3NlGyRC JDkkayRIMnJKfCQ1JGwkayROJEchIhsoQjxicj4NCiZndDs8YnI+DQomZ3Q7IEZpbGUub3Blbihw YXRoLCAmcXVvdDtyJnF1b3Q7KSBkbyB8Znw8YnI+DQomZ3Q7ICZuYnNwOyBmLmZsb2NrKEZpbGU6 OkxPQ0tfRVgpPGJyPg0KJmd0OyAmbmJzcDsgIyAuLi48YnI+DQomZ3Q7IGVuZDxicj4NCiZndDs8 YnI+DQomZ3Q7IBskQiRHPT1KLCRAJEg7VyQmJE4kRyQ5JCwhIyVWJW0lQyUvN0E8MCROSn0kLEpY TXgkSiUxITwlOSRyO1ckJBsoQjxicj4NCiZndDsgGyRCJEQkLSReJDskcyQsISIkYiQ3JCIkayRI JCQkJiQzJEgkRyQ3JD8kaTpGRHMwRiQ3JEYkLyRAJDUkJCEjGyhCPGJyPg0KJmd0Ozxicj4NCjwv ZGl2PnIrGyRCJEczKyQkJEZGYk1GJHIzTkcnJDchIkZiTUYkSyRoJEMkRj1xJC05fiRgJGgkJiRK JTEhPCU5JEckOSRNISNOYyQoJFAbKEI8YnI+DQpGaWxlLm9wZW4ocGF0aCwgJnF1b3Q7cismcXVv dDspIGRvIHxmfDxicj4NCiZuYnNwOyBmLmZsb2NrKEZpbGU6OkxPQ0tfU0gpPGJyPg0KJm5ic3A7 IG9iaiA9IE1hcnNoYWwubG9hZChmKTxicj4NCiZuYnNwOyBmLmZsb2NrKEZpbGU6OkxPQ0tfVU4p PGJyPg0KJm5ic3A7IGYuc2VlaygwKTxicj4NCiZuYnNwOyAjLi4uPGJyPg0KJm5ic3A7IGlmIGNv bmQ8YnI+DQombmJzcDsgJm5ic3A7IGYuZmxvY2soRmlsZTo6TE9DS19FWCk8YnI+DQombmJzcDsg Jm5ic3A7IE1hcnNoYWwuZHVtcChvYmosIGYpPGJyPg0KJm5ic3A7ICZuYnNwOyBmLmZsb2NrKEZp bGU6OkxPQ0tfVU4pPGJyPg0KJm5ic3A7IGVuZDxicj4NCmVuZDxicj4NCjxicj4NChskQiReJD8h IiQzJE4kaCQmJEokMyRIJHIkNyRKJCQkSiRpISIkPSRiJD0kYhsoQmZpbGUbJEIkchsoQm9wZW4b JEIkOSRrO35FQCRHJW0lQyUvJHIzTUZAJDkkayRoJCYkSjhGJFNKfSQsJEckLSRrJEgkJCQkJEgk JCQmJE4kYiQiJGokXiQ5ISMbKEI8YnI+DQo8YnI+DQo8YnI+DQomZ3Q7IHwjGyRCJWElPSVDJUlM PiRLGyhCc3ltYm9sGyRCJHJBfTYvGyhCPGJyPg0KPGRpdiBjbGFzcz0iIj4mZ3Q7IBskQiRBJGck QyRIRHMwRiROMFVMIyQsJG8kKyRqJEskLyQkJEckOSEjGyhCPGJyPg0KJmd0Ozxicj4NCiZndDsg GyRCIVY8MUpMO1IkSztIJCgkazUtOWYkckF9JGQkNyRGTV8kNyQkIVckSCQkJCZEczBGJEckIiRs JFAhIjBKGyhCPGJyPg0KJmd0OyAbJEJBMCRLJGJEOiQkJD8kMyRIJCwkIiRqJF4kOSQsISJANUQ+ JEokSCQzJG01LTlmJCwkIiRzJF4kajtEJEMbKEI8YnI+DQomZ3Q7IBskQiRGJEokJCRHJDkhIyQ9 JGwkSyVXJW0lMCVpJWAkTkZJJF8kZCQ5JDUkSzlXOCUkNyRKJCQkMyRIJCxMQBsoQjxicj4NCiZn dDsgGyRCJGkkKyRKJE4kRyEiJCIkXiRqQFE2S0UqJEskSiRqJEUkaSQkJEckOSRNISMbKEI8YnI+ DQomZ3Q7PGJyPg0KJmd0Ozxicj4NCjwvZGl2PhskQjxCOl0kS0F4NngkNyQ/JTEhPCU5JEgkNyRG JE8hIko4O3pOcyROJSglOSUxITwlVz1oTX0kSCEiSjg7ek5zJE4lKCU5JTEhPCVXPWhNfURMMmE7 WDwoGyhCKHZlcmIpGyRCJEchIhsoQjxicj4NChskQkRMPm8kTiVhJT0lQyVJJE43QSRHJEokLxso QnN5bWJvbBskQiRyO0gkJiQzJEgkRyU5JUMlLSVqJF8kOyQ/JCQhIiRIJCQkJiROJCwkIiRqJF4k NyQ/ISMbKEI8YnI+DQobJEIkRCReJGohIhsoQjxicj4NCl4gJnF1b3Q7SGVsbG8mcXVvdDs8YnI+ DQobJEIkTiRoJCYkSz1xJC0kPyQrJEMkPyROJEckOSQsISIbKEJeGyRCJSQlcyU5JT8lcyU5JWEl PSVDJUkkckRqNUEkNyQ/PmUkRxsoQmluc3RhbmNlX2V2YWwbJEIkcjhGJHMkRyRiGyhCc2VsZi5e GyRCJHJGSSRzJEckLyRsJEokJCQ/JGEhIiQ9JCYkSiRqJF4kOyRzISMbKEI8YnI+DQobJEI1LTlm JCw7RCRDJEYkJCRKJCQhIiRIJCQkJiROJE80NiQ4JF4kOSQsISIbKEJEU0wbJEIkRyRPJGIkJiRB JGckQyRIPXEkLUp9JEs8K00zRVkkLE1fJDckJCRKISIkSDtXJCYkMyRIJCwkQSRnJC8kQSRnJC8k IiRqJF4kOSEjGyhCPGJyPg0KUnVieRskQkFIJF85fiRfJEckSiQkIUobKEJEU0wbJEI9aE19JTkl LyVqJVclSCQsPWhNfUEwJEtFODMrJDkkayFLJV4lLyVtJHI9cSQkJEYkNyReJCgkUCQkJCQkTiQr JEohIhsoQjxicj4NChskQiRIJE87VyQkJF4kOSQxJGwkSSEiJD0kbCRiJEokcyRAJCs0ciQ3JC8k SiQkNSQkLCQ3JEYhIxsoQjxicj4NCjxicj4NCiZndDsgfCMgS2VybmVsLnN5c2NhbGwbJEIkSxso QlN0cmluZxskQiRyRU8kOyRrJGgkJiRLJDckRiRbJDckJBsoQjxicj4NCjxkaXYgY2xhc3M9IiI+ Jmd0OyAbJEIhViReJHMkXiFXJEgkJCRvJGwkRiRiJEEkZyRDJEgkbyQrJGkkSiQkJE4kRyQ5JCwh IhsoQnN5c2NhbGwbJEIkRyU3GyhCPGJyPg0KJmd0OyAbJEIlOSVGJWAlMyE8JWskTjtYRGokckhW OWYkRyRPJEokL0o4O3pOcyRHO1hEaiQ3JD8kJCRIJCQkJiQzJEgbKEI8YnI+DQomZ3Q7IBskQiRH JDckZyQmJCshIxsoQjxicj4NCiZndDs8YnI+DQo8L2Rpdj4bJEIkMyRsJGIhIhsoQm1rZmlmbxsk QiRyM1okSyQ5JGskPyRhJEtNXyQ3JCQkSiEiJEg7VyRDJD8kMyRIJEckOSRNISMkKiRDJDckYyRr JEgkKiRqISIlNyU5JUYlYCUzITwla0w+JEc7WERqJDckPyQkJE4kRyQ5ISMbKEI8YnI+DQobJEJC PiROJVclaSVDJUglVSUpITwlYCRLJEQkJCRGPTxKLCRLRDQkWSRpJGwkSiQrJEMkPyQ/JGEhIhso QnN5c2NhbGwbJEIkcj90Q00kRztYRGokOSRrJEgwXD8iQC0kSzFGNkEkLCRHJD0kJiRAISIkSDtX JCQkXiQ3JEYhIxsoQjxicj4NCjxicj4NCiZndDsgfCMgbmV4dC9yZWRvL2JyZWFrGyRCJE4lPyE8 JTIlQyVIJHJMQDwoJEckLSRrJGgkJiRLJDkkaxsoQjxicj4NCiZndDsgGyRCJEEkZyRDJEgkaCQv JG8kKyRqJF4kOyRzJEckNyQ/ISMbKEI8YnI+DQomZ3Q7PGJyPg0KGyRCPCEkTiRoJCYkSiUxITwl OSRHJDkhIxsoQjxicj4NCjxicj4NCmNhdGNoIDpuZXN0ZWQgZG88YnI+DQombmJzcDsgYS5lYWNo IGRvIHxpMXw8YnI+DQombmJzcDsgJm5ic3A7IGJlZ2luPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJz cDsgYi5lYWNoIGRvIHxpMnw8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgY2FzZTxi cj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyB3aGVuIGkxLm5pbD88YnI+DQombmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHRocm93IDpuZXN0ZWQ8YnI+DQombmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgd2hlbiBpMiAmbHQ7IDEwPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyBuZXh0PGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IGVs c2U8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJhaXNlPGJyPg0KJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IGVuZDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7IGVu ZDxicj4NCiZuYnNwOyAmbmJzcDsgcmVzY3VlPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmVk bzxicj4NCiZuYnNwOyAmbmJzcDsgZW5kPGJyPg0KJm5ic3A7IGVuZDxicj4NCmVuZDxicj4NCjxi cj4NCmJyZWFrGyRCJE5CZSRvJGokSxsoQnRocm93LCByZWRvGyRCJE5CZSRvJGokSxsoQnJhaXNl GyRCJHI7SCRDJEYkJCReJDkhIxsoQjxicj4NChskQiQzJE4bKEJicmVhaxskQiRIGyhCcmVkbxsk QiRPGyhCYS5lYWNoGyRCJEtCUCQ3JEY5VCQkJD8kJCEiJEgkJCQmJDMkSCRHJDkhIxsoQjxicj4N ChskQiQzJE4kaCQmJEolMSE8JTkkRyEiJEkkMyQrJEs9aE19JHIkJCRsJGgkJiRIJDkkayRIRjEk OD1oTX0kckojP3QyVT1qJEs9cSQvJDMkSCRLJEokayRzJEAkaCRKISIbKEI8YnI+DQobJEIkSDtX JEMkRjhFJCQlMyE8JUkkckM1JDckPyROJEckOSQsISJILzgrJEckLSReJDskcyRHJDckPyEjJDQk YSRzJEokNSQkISMbKEI8YnI+DQo8YnI+DQomZ3Q7IHwjIElPI3dyaXRlX3Jlb3Blbi9JTyNyZWFk X3Jlb3Blbj88YnI+DQomZ3Q7IG9wZW4zPzxicj4NCiZndDs8YnI+DQobJEIkIiEiJD0kJiRHJDkk TRsoQiZoZWxsaXA7T3BlbjMbJEIkLCRJJCYkJCQmJGIkTiRAJCtBNCQvTX0yciQ3JEYkJCReJDsk cyRHJDckPxsoQm0oXyBfKW08YnI+DQo8YnI+DQomZ3Q7IHwjIBskQiU1JVYlVyVtJTslOSQrJGkk TkZJJF9MYSQ3GyhCPGJyPg0KJmd0OyBhbGlhcxskQiRyO0gkQyRGJE8kSSQmJEckNyRnJCYkKyEp GyhCIBskQkUsQFokSkw+QTAkLCQiJGwkUEpMTD4kciQiJGkbKEI8YnI+DQomZ3Q7IBskQiQrJDgk YU1RMFUkOSRrJE4kYiRoJCQkTiQrJGIkNyRsJF4kOyRzISMbKEI8YnI+DQomZ3Q7PGJyPg0KS2Vy bmVsLmAbJEIkQyRGSjg7ek5zJDckKyRIJGokXiQ7JHMkaCRNISkbKEJhcmcbJEIkchsoQkFycmF5 GyRCJEdFTyQ3JD8kJCRIJCQkJiQzJEgkSiROJEckOSQsGyhCJmhlbGxpcDs8YnI+DQobJEJMPj5O JE8hIiVZJT8kSxsoQktlcm5lbC5jbWQbJEIkKyEiJCIkayQkJE9KLCQrJGokSyQvJCQkRyQ5JDEk SSEiGyhCS2VybmVsLmNzdWIbJEIkSCQrISkbKEI8YnI+DQobJEI4ZUg+JE4kTyEiJDMkJiQkJCYk MyRIJEckOSRNISMbKEI8YnI+DQpzdHIgPSBuaWw8YnI+DQpJTy5wb3BlbihjbWQsICZxdW90O3cr JnF1b3Q7KSBkbyB8aW98PGJyPg0KJm5ic3A7IGlvLndyaXRlKGlucHV0KTxicj4NCiZuYnNwOyBp by53cml0ZV9jbG9zZTxicj4NCiZuYnNwOyBzdHIgPSBpby5yZWFkPGJyPg0KZW5kPGJyPg0KPGJy Pg0KPGJyPg0KJmd0OyB8IyAbJEJAaD9KRSoxaTs7O1IbKEI8YnI+DQo8YnI+DQomZ3Q7IHwuPTxi cj4NCiZndDsgGyRCJDMkJiQkJCYkTiQsTV8kNyQkJE4kTyRvJCskaiReJDkkLCEiJDMkTjUtSyEk TyQiJF4kaiRoJC8kSiQkGyhCPGJyPg0KJmd0OyAbJEIkaCQmJEs7VyQkJF4kOSEjGyhCPGJyPg0K Jmd0Ozxicj4NChskQiRHJE8hIiVRITwlNSQsQmdKUSRLJEokaiQ9JCYkRyQ5JCwhIhsoQjxicj4N Cm9iaiAtJmd0O21ldGhvZChhcmcpPGJyPg0KGyRCJCskViRqJHIkNSQxJGskSiRpGyhCPGJyPg0K b2JqICZsdDstbWV0aG9kKGFyZyk8YnI+DQobJEIkTiRbJCYkLCVeJTckRyQ3JGckJiQrISMbKEI8 YnI+DQo8YnI+DQomZ3Q7IHwjIBskQjdaTkwkSjUvRjAbKEIsIHByZWNvbXBpbGU8YnI+DQo8ZGl2 IGNsYXNzPSIiPiZndDsgRW1hY3MbJEIkRyRiJD0kJiRHJDkkLCEiOkc2YSVeJTclcyQsOWJCLjI9 JDckRiQkJEYkPSQmJCQkJkJQPWgbKEI8YnI+DQomZ3Q7IBskQiRPSVRNVyRLJEokQyRGJC0kRiQk JGskaCQmJEckOSEjNS9GMDt+NFYkTiQrJCskaxsoQkpSdWJ5GyRCJEokaSRIGyhCPGJyPg0KJmd0 OyAbJEIkYiQrJC8hIhsoQkNSdWJ5GyRCJEckPSQzJF4kR0ksTVckSiUxITwlOSRPJCskSiRqPi8k SiQvJEokQyRGJCQkaxsoQjxicj4NCiZndDsgGyRCJEgkKiRiJCYkTiRHJDkkLCEiJEokSyQrO3Y+ cCQsJCIkayROJEckNyRnJCYkKyEjGyhCPGJyPg0KPC9kaXY+GyRCPGo4NSRHNS8kMyRDJEYkJCRr JTEhPCU5JEgkNyRGJE8hIiU3JSclayU5JS8laiVXJUgkRzBsSXQ9aE19JEcbKEJSdWJ5GyRCJHI7 SCQmJGIkTiRLJDckRiQkJF4kOSEjGyhCPGJyPg0KGyRCJTclJyVrJTklLyVqJVclSCROGyhCMRsk QjJzJE4layE8JVckRzlUJG8kbCRrGyhCUnVieRskQiU5JS8laiVXJUgkTjxCOVQkTxsoQjUbJEIy cyRHJDkhIxsoQjxicj4NChskQkJnQk4bKEIxGyRCMnMkRxsoQjMbJEJLfCVVJSElJCVrRHhFWSRy QlA+XSRLJDkkayQ/JGEhIhsoQjE1GyRCS3wycxsoQlJ1YnkbJEIkcjUvRjAkNyEiJTklLyVqJVcl SCRyJTMlcyVRJSQlayQ5JGskMyRIJEskSiRqJF4kOSEjGyhCPGJyPg0KGyRCJDMkTj5sOWclOSUv JWolVyVIJCxIcz5vJEs+LiQ1JCQkPyRhISIkWyRIJHMkSSRPGyhCZm9yaxskQiROJTMlOSVIJEck OSQsISIkSiRzJEAkK0YxJDhGYk1GJHIlMyVzJVElJCVrJFAkQyQrJGokNyRGTDVCTCRKNSQkLCQ3 JF4kOSEjGyhCPGJyPg0KPGJyPg0KGyRCJF4kPyEiGyhCd2ViYXBwGyRCJEckTzF+RXpALSQsPUU7 ayQ1JGwkayRIO1ckJiROJEckOSQsISIbKEJmYXN0X2NnaRskQiRkGyhCbW9kX3J1YnkbJEIkSiRJ JEcbKEJSdWJ5GyRCJSQlcyU5JT8lcyU5JE8+b0NzJDckRiQkJGs+dUJWJEAkSCEiGyhCPGJyPg0K GyRCSlE5OSQ1JGwkayRvJDEkRyRiJEokJCROJEskLyRqJCskKCQ3JGgkUCRsJGslOSUvJWolVyVI JCxLaDJzGyhCcGFyc2UbJEIkNyRGGyhCY29tcGlsZRskQiQ3JEYhIiRIJCQkJjJhRHgkcjdQJGsk TiRPSHM+byRLTDVCTCRKNSQkLCQ3JF4kOSEjGyhCPGJyPg0KGyRCRkMkSyVIJWklRyUjJTclZyVK JWskShsoQmNoYXQbJEIkTiRoJCYkSzZLJGEkRklRSEskSzhGJFAkbCRrJTEhPCU5JEckTzxCOVQy cz90JCxIcz5vJEtCZyQtJC8kSiRqISIbKEI8YnI+DQobJEIlSCE8JT8layROPEI5VDt+NFYkLEQ5 JC8kSiRrPmUkSyQ9JE47fjRWJEc8Qj1oTX07fjRWJCxAaiRhJGszZDlnJE9BakV2JEtEYyQvJEok aiReJDkhIxsoQjxicj4NCjxicj4NChskQiRiJEEkbSRzISIlPSUxJUMlSCRyO0gkJiRKJEk8QjlU JWIlRyVrPCtCTiROOCtEPiQ3JEskaCRDJEYyfkExJDkkbCRQJGgkJE9DJEokTiRHJDkkLCEiGyhC PGJyPg0KGyRCPXEkLUQ+JDckTklRRVkkS0JQJDckRjxCOVQ/dCQsNkskYSRGQj8kJD5sOWckTzt2 QTAkSyRHJC0kayRAJDEkTiQzJEgkciRkJEMkRiQqJC0kPyQkJEohIiRIISMbKEI8YnI+DQobJEI8 QjpdJE4xP01RJEclOSUvJWolVyVIPEI5VDMrO08kXiRHJE47fjRWJCxMZEJqJEskSiRrMHU+XSRy GyhCUnVieRskQiRHPHUkMSQ/JDMkSCRPJEokJCROJEckOSQsISIbKEI8YnI+DQpXb3JkUHJlc3Mb JEIkTjF+RXpALSROMC0kNSRKJEkkcjlNJCgkayRIISIxfkV6O340ViRLMUY2QSQ5JGtJdEosJE8y REc9JEo4QiRqJEQkYSQ/JFskJiQsJGgkJCRoJCYkSztXJCgkayROJEckOSEjGyhCPGJyPg0KPGJy Pg0KPGJyPg0KIyMjPGJyPg0KGyRCJFIkSCRESDQkMSRGJCQkPyROJEdESTJDJDUkOyRGJC8kQCQ1 JCQhIxsoQjxicj4NCjxicj4NCiNPYmplY3QucmVtb3ZlX21vZHVsZTxicj4NCnByZXBlbmQbJEIk LCQiJGskTiRKJGkkUCEiJWIlOCVlITwlayRyMzAkOSQzJEgkLCRHJC0kbCRQISIwbDt+RSokSyVh JT0lQyVJJHI9cSQtNDkkKCRrJGgkJiRKJDMkSCRPGyhCPGJyPg0KGyRCJTklXiE8JUgkKyRETUYw VyRLOVQkKCRrJGgkJiRLO1ckKCReJDkhIxsoQjxicj4NCjxkaXYgY2xhc3M9IiI+PGJyPg0KPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT08YnI+DQojIFRoZSBSaWRlciwgSGFja2VyIGFu ZCBNdXNpY2lhbjxicj4NCiMgJm5ic3A7ICZuYnNwO0VOQUJMRSBZT1VSIEhFQVJULjxicj4NCiM8 YnI+DQo8L2Rpdj4jICZuYnNwO21haWx0bzo8YSBocmVmPSJtYWlsdG86cmVhc29uc2V0QHlhaG9v LmNvLmpwIj5yZWFzb25zZXRAeWFob28uY28uanA8L2E+PGJyPg0KPGRpdiBjbGFzcz0iSE9Fblpi Ij48ZGl2IGNsYXNzPSJoNSI+IyBCbG9nOiA8YSBocmVmPSJodHRwOi8vcmVhc29uc2V0Lm5ldC9q b3VybmFsLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9yZWFzb25zZXQubmV0L2pvdXJuYWwvPC9h Pjxicj4NCiMgVHdpdHRlciBAcmVhc29uc2V0PGJyPg0KPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PGJyPg0KPC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjwvZGl2Pjxicj48L2Rpdj4N Cg== --001a11c2d600c9dc7404fdfe853b--