ZipPackageクラスを使ってOfficeファイルを編集する
UWSC公式掲示板に、ワードファイルの新規自動作成についての質問があった。
方法を考えたものの、簡単には実証コードが書けなくて断念したのだが、、、くやしいので再挑戦した。
全てPowershellを使って書いても良かったけど、UWSCでの質問なので、編集周りだけPowershellにした。
解説
いつもならスクリプト掲載が先ですが、Wordファイルを含んでいて長いので、先に解説。
思想としては、内包したひな形をファイル出力して、Powershell使って編集する、という形です。
速度を求めるなら、Powershell内でやるべき(UWSCのPowershell関数コールは重たい)。
既存の「フォルダ1」〜「フォルダ100」に、「ファイル1.docx」〜「ファイル100.docx」をそれぞれ作成し、本文にファイル名と固定文を記載する、というもの。
フォルダ1〜100がスクリプトと同じ場所に存在しないと、エラーとなります。
UWSCのスクリプトは、ほとんどが内包したひな形の出力を担当。
編集は、TEXTBLOCKに定義したPowershellスクリプトです。
Wordの本文は、/word/document.xmlにあるようなので、そこを編集します。
該当の部分をXmlDocumentとして読み込み、差分を更新。
差分の更新は「$doc.document.body.p[0].r[1].t = $suffix」の部分ですが、その位置なのは、内包したひな形の都合です。
ひな形を変更したりした場合は、この部分を修正する必要があるかと思います。
はまったポイントは、ZipPackageクラスはCloseの段階でファイル更新が行われること。(CloseじゃなくてFlushか)
ZipPackagePartのGetStreamしたストリームを更新し、またGetStreamしても前のままという。
ひな形のUWSCスクリプト化は、
ファイルをUWSCスクリプトにするスクリプト - じゅんじゅんのきまぐれ
を参照のこと。
スクリプト
OPTION EXPLICIT // 対象パス DIM ppath = GET_CUR_DIR + "\", pshCode = REPLACE(_PSH_CODE, "%target%", ppath) DIM xml = CreateOleObj("Microsoft.XMLDOM"), t=xml.createElement("t"), i t.dataType="bin.base64" t.text=_DOCX FOR i = 1 TO 100 // 編集前ファイル生成 WITH CreateOleObj("ADODB.Stream") .Open() .Type=1 .Write(t.nodeTypedValue) .SaveToFile(ppath + "フォルダ" + i + "\ファイル" + i + ".docx", 2) .Close() ENDWITH // 更新 Powershell(Replace(pshCode, "%number%", i)) NEXT TEXTBLOCK _PSH_CODE Add-Type -AssemblyName WindowsBase $parentPath = '%target%' $i = %number% $suffix = '' + $i + '.docx' $path = $parentPath + 'フォルダ' + $i + '\ファイル' + $suffix $package = [System.IO.Packaging.Package]::Open($path) $enc = [System.Text.Encoding]::UTF8 foreach($p in $package.GetParts()) { if($p.Uri.OriginalString -eq '/word/document.xml') { $sr = New-Object System.IO.StreamReader $p.GetStream(),$enc $doc = [xml]$sr.ReadToEnd() $sr.Close() $doc.document.body.p[0].r[1].t = $suffix $sw = New-Object System.IO.StreamWriter $p.GetStream(),$enc $doc.Save($sw) $sw.Close() } } $package.Close() ENDTEXTBLOCK TEXTBLOCK _DOCX UEsDBBQAAAAIAAAAIQARF6DZCAEAADkEAAAcAAAAd29yZC9fcmVscy9kb2N1bWVudC54bWwu cmVsc62TzU7DMBCE70i8g7V34qRAQahOLwipVwgP4CbrJCLxRvbyk7fHKmpJoYp68HHH2pnP Y3m1/uo78YHOt2QVZEkKAm1JVWtrBa/F09U9CM/aVrojiwpG9LDOLy9Wz9hpDku+aQcvgov1 Chrm4UFKXzbYa5/QgDacGHK95jC6Wg66fNM1ykWaLqWbekB+5Ck2lQK3qa5BFOOA53iTMW2J j1S+92j5RIT8xO0LMofL+WCrXY2sYCImwRHkaZC7mCAcdvEXYTf+iNkcwyImg//XhD+jhiwq Ao8dTgF281z8Mma8IcuF3naTlzhIcxC3MSHQVpZ42sJemUO4iYlgiPgPw0HaQ8ijD59/A1BL AwQUAAAACAAAACEAKQT9kb0CAAAnCQAAEQAAAHdvcmQvZG9jdW1lbnQueG1srVbdbtMwFL5H 4h2q3K9J2rVrozUT0jSukCZ+HsBLnMYisSPbbVeumo5JiF0ggcbG4AIkhpC45QaB4F3IOo0r XoHj/LRMm7ZuWVXJPj7+vnP82T7O8spmGFT6mAvCaEczq4ZWwdRhLqHdjvbo4dpCS6sIiaiL AkZxRxtioa3Yt28tDyyXOb0QU1kBCiqsPnh9KSNL14Xj4xCJKoswBafHeIgkmLyrh4g/7kUL DgsjJMkGCYgc6jXDaGo5DetoPU6tnGIhJA5ngnlSQSzmecTBeVMg+DxxM8hqnnIaUec4gBwY FT6JRMEWXpcNnH5B0r9oEf0wKOYNonmiuRwNYD/CIAs0YNyNOHOwEDC6mjmnjKYxh4CKYoqY J4XTMYtMQkTolIae3f9p7CrEzkVLqWYLAS1sOEsbzB2qNqoMLDiL7v2OZuQ/rRhaxR7qBVJ5 6q1Gq2amyGidq4bnzRqjUgDCJxRmYiTkHUGQptvLej5Jn2GuBhxY0k62dpPxh2T8Mdn6ohwy c1+TzajCHdo8xaOyOyNEvtwbEmJgOSxgHHx9FBQ6X67QJSC1hsm3r8koPt47PPq+rzpvxn9e v4LOyef9yfbhyWg7Gb+c/NpO4gMwJ8/fJvFeEn9K4hdJ/D6Jd5P46Q1pccW8j37u/P1xcMF+ zsFRM8zFcgygXjmCpXLw43fPyhHUzVJ4VUgsESEHCknEscC8jzUbTlMyGpUits1mOXzpw2E0 SuHPV6a0LL/3duB/ikPPr5zAjlzn59w75Yy6D56ACx4O02yrlxuqDPSbrXorqy9R9x5SYMng fTPbrUZ6XUnXh3tqLhnp7d1gUrJwZgfY+8/rY+RieNhbjdT0GJPKbLdryuz2ZGoa03KmKl0u 0GKtkQ1Dbb3LiavyGEbgCAiFjxcVCjrrRDqQdL1ZqJKtOO1mj5E++8Kx/wFQSwMEFAAAAAgA AAAhAF1LmPdiAQAA2AMAABEAAAB3b3JkL2VuZG5vdGVzLnhtbK2Sz26DMAzG75P2Dij3Fui6 qkKFXqqdp/15gCyEEo3YURJgffu5FKi2VhWadgnEjn/fF8eb7ZeugkZapxBSFs8jFkgQmCvY p+z97Wm2ZoHzHHJeIciUHaRj2+z+btMmEnJAL11ACHBJQ9nSe5OEoROl1NzN0UigZIFWc09b uw81t5+1mQnUhnv1oSrlD+Eiilasx2DKagtJj5hpJSw6LPyxJMGiUEL2n6HCTtE9lexQ1FqC 7xRDKyvygOBKZdxA03+lUbIcIM2tSzS6Gs61ZopabnlL76Grk1CLNjcWhXSOortTciTG0YQG HhFjxRQLPzUHJ5orGDFw+f6j9py0+6Z1qPNFqBfZeZaCNvEHQyAnDbfco2UUUnnKou6YoR2N av5CgSherharJRtCO1nwuvKXmedj6GH9uF7EHcQel1EgzDZhF6PVdGvv5ZotgeAV1N3UvP62 GP+zxatiN+ye/132DVBLAwQUAAAACAAAACEAll9Y9ugBAABiBgAAEgAAAHdvcmQvZm9udFRh YmxlLnhtbNWUwW7TMBjH70i8Q+Q7i+OWNq2WTm1HOG0HGA/gOU5jKbYjf26zXrs7Zw7wCIgD SFz2NpV23SvgJuk2iKJRCZCwFSn5/53PX375y8cnVzL3VtyA0CpCwRFGHldMJ0ItIvTuIn4R Ig8sVQnNteIRWnNAJ5Pnz47LcaqVBc+9r2BsIpRZW4x9H1jGJYUjXXDlvFQbSa17NAtfp6lg /FSzpeTK+gTjgW94Tq3bGzJRAGqqlb9TrdQmKYxmHMA1K/O6nqRCoUnTnVeOFZWu67nbb2nW lVFQpYEHzlvRPEKY4D4euOtlNQnu4T7ydwtZRg1we78Q13JKpcjXe9VoSVVtFMKybK+vqBH0 Mue1BWLhjCVc4l0dN0g4RLUSNIobjUJaSu9nhT3UwaO4UR7XcXv6NYEWibubz3c3X73bD+9v P36qeNDcnjtr3/jZW+9MKJbp5qNatIijNXK8iKMVdtIKD6KViiuetFG9qlDF8QOqwXQ+jE/j 2a+oAvIEKnI4qgshOXjnvPTeVG134+g5FP1/Ep4dETJ9TGTulGHYD1rhGT0ZniA+kEgTnu3m 23bzfXt9vd186YjQa20zwboiNKsiNGwiRA6KkNQJN/9NhqbuR+YdyZlVxw65n4ckB0oB8GeS 0/sryWluYPIDUEsDBBQAAAAIAAAAIQDNoWKMYgEAAN4DAAASAAAAd29yZC9mb290bm90ZXMu eG1srVJNb4MwDL1P2n9AubdA11UVKvRS7Tzt4wdkIZRoxI6SAOu/n6GFdVtVoWkXR36O33tx vNl+6CpopHUKIWXxPGKBBIG5gn3KXl8eZmsWOM8h5xWCTNlBOrbNbm82bVIgekAvXUAc4JKG yqX3JglDJ0qpuZujkUDFAq3mnlK7DzW377WZCdSGe/WmKuUP4SKKVuxEgymrLSQniplWwqLD wnctCRaFEvJ0DB12iu6xZYei1hJ8rxhaWZEHBFcq4wY2/Vc2KpYDSXPtEY2uhnutmaKWW97S h+jqKNSizY1FIZ0jdHcsjoxxNGGAHcXYMcXCd83BieYKRhr4/f+j9py0T0Prqb4eQrPIzpYp aBN/MMTkpOGWe7SMIJWnLOrvGcpoWfMnAqJ4uVqslmyAdrLgdeV/Vx476G59v17EPYntwigQ ZpuwxyiaPg5mLhoTCF5B3S/O80+T8T+bvCh2zfBZ4rJPUEsDBBQAAAAIAAAAIQDg7Xc6jgMA AMMIAAARAAAAd29yZC9zZXR0aW5ncy54bWzFVk1v2zgQvS+w/8HQubZsx3YNIU7RNHHTwtkN qmT3PBLHFhuKJEjKH/31O5REy07TRbCXvdjke/NBPs4MdPlhX4reFo3lSi6i0WAY9VDminG5 WURPj8v+POpZB5KBUBIX0QFt9OHq998ud4lF58jM9iiEtIlaRJWRic0LLMH2S54bZdXa9XNV Jmq95jm2f1HrYRZR4ZxO4rh1GiiNkri1MiU42ppN3LjcqLwqUbp4PBzOYoMCHB3YFlzbEK38 r9GILEKQ7b9dYluKYLcbDd9w3Z0y7OjxluN5B21UjtaSsqUIB+QyhLHiLXEaasUzA+ZwEuSK nu2HUmVvl2g0OUlAbz4cRrEnMkpOhXCj/lAurYxRlWR3CIT9kl4q5Vqa4Roq4R4hS53SlGAL dNT5pA3OuNUCDnfK8B9KOhA3BnZ0x8+Gs1uqv0PwOLf/C43j+a+tx411XoCBnI6SasjJ7hOl MEoEK3oSbUjTh0rmrqpLp/ErmEkL0HjTHN5eXarEeqC9je1tE9yTSMi4o0bQnJWwX0QXw/cT EnObOGIzte9xSd2wiKaD+VS7d4P39HOy9sniF5EJeS3/LlmTppJkfTCnO7oKZ0d1XqCjOsFL V5Tsp815mHMwRDnz89KB8ytL0uJSmadVUw4gQOaYktoCrw+OmqrKmtXfnLmieUVfLCuELV5D /mwF2OKjnyM1WYlHA1z4J8PO+navadqkBV+7b+ioxWoK2PfKuhWXeId8U7gvkgpNtHEsLm9X cFCVay7QnZnGGrNh8Y3UOVbZ8GI+nY9HjQ6e7ZjRZDaeTV5jOp/4GLtM/PzwYjWrJZVer2w8 PkGZGQ69ez9hYm+RmedrLgOfITUtnjJplQWy328IW4IQSyrvQNBwaRjfI1Q59Vrcg9l0kYeN hXkVpRL8eozmhwCaz9TOumF3BvQXybC7xmgyaT25pDcoA26rLA1ekgbNCUWz4c+tqZXqBNol jsYSeoVWIDdBV5T9pzSiHYJ1Hy2HRfQd+l8f2tYWJvXTDO9Ba157ZZvRIhK+DEbezdGOgXmu N9lm3HLjmhs3XL2B3F+WrNtFh40DdmJ3EbCLDpsEbNJh04BNO2wWsJnHigMNW8HlM43usPT4 WgmhdsjuOv4nqBHB/m9DqgVE3V5niTznM+nz9AwctHM5PnOum8a+nHYMc04Fnh7KrJvXg+bW gluXoqbR7pQJ3Lu2/cLXx9U/UEsDBBQAAAAIAAAAIQAOi8h33wYAAAo+AAAPAAAAd29yZC9z dHlsZXMueG1s5ZvLcts2FED3nek/cLhqF45elmR7omQcJ2ncycOJ7OkaJiELNQWwBBTZXXXq Rb+gj5/oH3SmH+Npv6PgS5ZMwrjXwK4rSyBwzyUueCDPgE+fXy2S4DPNJBN8EvaedMOA8kjE jF9MwrPT1zt7YSAV4TFJBKeT8JrK8PmzL794ujqQ6jqhMtABuDzIJuFcqfSg05HRnC6IfCJS yvW1mcgWROmv2UVHzGYsoi9FtFxQrjr9bnfUyWhClIbLOUtlWEVbQaKtRBanmYiolDrbRVLG WxDGw2c6vVhEL+mMLBMl86/ZSVZ9rb4Vf14LrmSwOiAyYuxUo/QtLhgX2ZtDLlmor1Ai1aFk ZPPiq6otvz7PO7aOjKTaaH7BYhZ2cuglzbi+/Jkkk7BfNskf1w29uuVIrtuqXgnhF3Ub5Ttn 0838JuH3ZOfbk7zpXKMmIcl2pof5wE51u537k5Cuv5W97s2Yrouu0rSssr5KZ29FdEnjqdIX JmE3LBvPjk8yJjKmrifh/n7VOKUL9obFMc0XVd2Rz1lMv5tTfiZpfNf+8XVR1CpiJJZcf+6P xkUVExm/uopomi8RfZWTfELf5wOSvLfc4BTDl+wum7LhHrVo/KFGVrPdSplTkj8GQc8K2vcD 6rfGRYUYuIfYdQ8xdA8xcg8xdg+x5x5i//EhlIjKxbc5fLBvGdFYRdYRjUVjHdFYI9YRjSVh HdFYAdYRjYJbRzTqax3RKOeDIyJSfG+MGYLXwClTCbUKqOeoukr7wQnJyEVG0nmQb4wNygMR pstzBUu155bqVGWCX1gx/b4b5tUinRPJpB3kOPWn5DyhwTcZi62ooWGfMQc/SUhE5yKJaRac 0iuFHf9eBNOURAww4Y5lfcsu5iqYzgtpWmEjw6Tb4r9lUtmDG27FFhxUw5FhXZqDv6MxWy7q qQH8GhkNHBF9O2L3kYi8AJBbGLrEB+Q/emT8vMaQ/Mcu8QH577nEH9jjo03zkmSXsMdrjH52 j0QistkyAethjH6C1wjYLaAf4nV8kCTG6Cd4S5/BYRTp/9wg6xRdizuPIijoctwJFUFBF+W+ WREsdIHuKxbBcnMtAoSW7if6mcn69y1iXJHZ+remNbGBYQYC4G+Lj0uh7D9M+47/xR9zRbmk AYw2MDx5UNrWfoeosdvGhwC57YAIkNtWiAA9fk+EQ9w3RwQLreWtXRIBQpt5a7tEgNBabt03 Ab+/0GVq7psACrpAzX0TQEFXx7RvAljoApn2TQDLz74JAKH3zVZ5A0B+5A0A+ZE3AORH3gCQ u7ztEH/yBrDQbmiVNwCE1kOrvAEgtBta5Q345xZdpqa8ARR0gZryBlDQ1THJG8BCF8gkbwDL j7wBID/yBoD8yBsA8iNvAMiPvAEgd3nbIf7kDWCh3dAqbwAIrYdWeQNAaDe0ynvXCvIhbwAF XaCmvAEUdHVM8gaw0AUyyRvA8iNvAMiPvAEgP/IGgPzIGwDyI28AyF3edog/eQNYaDe0yhsA QuuhVd4AENoNrfIeWkE+5A2goAvUlDeAgq6OSd4AFrpAJnkDWH7kDQD5kTcA5EfeAJAfeQNA fuQNALnL2w7xJ28AC+2GVnkDQGg9tMobAEK7oVXeIyvIh7wBFHSBmvIGUNDVMckbwEIXyCRv AMuPvAEgP/IGgPzIGwDyI28AyI+8ASB3edsh/uQNYKHd0CpvAAith1Z5A0BoN+TnbBMagI+n 9jydagAD+44HQasb/ERnNKM8ApykcATWd4ggOp4tfiHEZQA72D0wLBAwip0nTBTHbK4bsccP DDz9cBS8oevjdlvjWt5g6Ky2XhfKwxavh+mO6jrV8dLN0z5xedy8OjRcdDzWt0WKN35yflC9 5VS96FOkWQGLz2n5+taKxWJ1JLjKRFIPqR6e76O64VyoeZViWr0GVRCbOUZznWSkaPZQjt1G kobD80Uad/NW967f71pXvey3VeHOQ1mq/MD4Qxn2DNMYFEfNTXnt78MS2y6EOk/KUugPxzzW wVbV8iyTja9IWHc8oknyjpS9RWrumtCZKq/2unst13VBlViYx2fFD0JjgM52Mp31TZinnC8X 5zSrHgXTtPdbpr08Tuo44+a8th6qu0wGjUzyl5H0si6nj+iwH3h9qZ50xi/XTbuuKesiSBbX o7rdwd5wr1+t/OrZ1ctYVn/rfvmmWT58qZCTcLc/rF583OhTFHfdZW/Y3a1rWsWTnKSnotiG N42AfPqjpdRrrJBZo9C7jem9vfnj9ubm9uan25u/gq/+/e2Xf/78/ev22e62TPcAOd2muUUv lGHjTmZCKMRCGSEz/38tlFHLQvk1Xyg///24hTJETrd9odSf5LP/AFBLAwQUAAAACAAAACEA e2+EG9YFAABSGwAAFQAAAHdvcmQvdGhlbWUvdGhlbWUxLnhtbO1ZTW8bRRi+I/EfRntv1+uv OlGdKnbsFtq0UeIW9TjeHe9OPbuzmhkn8Q01EhckJERBHCjixgEBlVqJS/k1hiIoUv8C737Y nrXHidsGUdT6EO/MPu/7vN8761y+chwydEiEpDxqWs7FkoVI5HKPRn7Tut3rXmhYSCoceZjx iDStMZHWla3337uMN1VAQoJAPpKbuGkFSsWbti1d2MbyIo9JBPcGXIRYwVL4tifwEegNmV0u lep2iGlkoQiHoPbWYEBdgiYnn0xOnk5OvrW2pgQdBn8iJZMNl4kDN2XVpVKsN3SSLzmWbSbQ IWZNC7g8ftQjx8pCDEsFN5pWKf1Y9tZleybE1ApZTa6bfnK5XMAbllM54fdngk63unFpZ6a/ nOlfxnU6nXbHmelLAdh1wVNnCVvtNpzWVKcGyi6XdbdLtVK1iNf0V5bwG61Wq7ZRwFfm+OoS vlGqV7fLBXx1jq8t29/abrfrBXxtjq8v4buXNurVIj4FBYxGwyV0ks9ZZmaQAWfXjPAGwBvT ApijbK26MvlIraq1EN/joguANLlY0QipcUwG2AXctqCYJerxJsHafrblyqWthAlJV9BYNa0P Yww9MYe8ePrji6eP0eT+k8n9XyYnJ5P7PxukruHI16Wef//53w8/Rn89/u75gy/NeKnjf//p 099+/cIMVDrw2VeP/njy6NnXn/35wwMDfFvgvg7v0ZBIdJMcoX0egmMGAtIXLyfRCzDVJbYj X+IIJzIGdEcFBfTNMWbYgGuRYgTvCBgAJuDV0b2CwQeBGClqAF4PwgJwl3PW4sLo0/WES4/C KPLN5GKk4/YxPjRxtxfy2xnFUMnUpLIdkIKZewxSjn0SEYWSe3xIiEHsLqWFuO5SV3DJBwrd paiFqTEkPdpXZqFrNIS8jE0GQr4Lsdm9g1qcmdTvkMMiErpi2opFlYQVwngVjxQOjRbjkOnI G1gFJiMPxsItBFwqyLRPGEcdj0hpkrklxgVzr2OYRMa077JxWEQKRYcm5A3MuY7c4cN2gMPY aDONAh37gRxCiWK0x5XRCF7skGQNecDRynTfoaSQ7rN7+zb1CybNCyS5MxL51C7M35BGq4dx Gx4dIzE+73EMA/DZNw//R4NYeyidOn5X4RaHbpsLj775M3cHj6I9AmX+buS+G7lv48hd1c/r Dtr5bLUzDdoBOVx5Ph5Qxg7UmJEbMp3KEoz2urCZLlKh2XE8DuAypyvgfIHTayS4+oiq4CDA MdA4KYMvc9W+RDGX8BJgrdSd3ICngsr2atPXP0Bjtcu9bLuivxbO1KQrX+pElUTBumSVS69H 5mTANdmcmpmtdiqbrUUTugHh5MXfqZczaqgYzIiXxD1TME3LuadIBtgjeY4coyNOZc2wNc6O msa2UXk9tnWSpNNVV9DVTqNbM0ulpSzZy+3IouIKHYFVtXLNQi6Om9YADlFwGcagTyYDCDM/ alquyl05s5kXHTaXpVNa6XCBIhZS7WAZZFLprVyIRXP7y7VqEofzccAwjdazotJw/kMr7MXU ksGAuGrFznyZ3+MjRcRB4B2hPhuJfQx2V7Pq8qiEZ0Z5uhDQodW88Iqdn3fB4q8zeXdgFgc4 n0kNLfcZPL2e2ZCuNPPsFba/oiuVc3RFL+O3zJWkcuHYWvGSSxeOAQKjpEabFhcq4DCF4oC6 XQEHh5QL7ELQFolJiCW/Nye2ksP53Mp0pA0F5xC1T30kKEw6FQhC9lTu5xnKnHwq5p2RK8rn zMxcGWfffXJIWC/p3nriv4WC6TTJA5HiFpNWXOfB6PvdN/jkU50GBb/M8WBOVJ2VzDpk2tDX HgUbr2fCSz5qy2aPy7W1H7UxvHyg5A8MbipcNj/f9vg+ZB+x6YkSQSFeaOTtN9vsg80NzblE Vcbwbx2j5imY8S4EW2+Ocwx2xUxXPp3u1YNdM8RaryNDqO3lFrW1F5l0tfQ/J96/B9w78KI0 Ykqm/pFjeNVsT/9bAHrsuejWP1BLAwQUAAAACAAAACEAStiKkrQAAAAEAQAAFAAAAHdvcmQv d2ViU2V0dGluZ3MueG1sjc7BasMwDMbxe2HvEHRfnfUwSkhSKKMv0PUBXEdpDLFkJG3e9vQ1 bJfdehSf+PHvD19pbT5RNDIN8LJtoUEKPEW6DXB5Pz3voVHzNPmVCQf4RoXD+LTpS1fwekaz +qlNVUg7GWAxy51zGhZMXreckeo2syRv9ZSb43mOAd84fCQkc7u2fXWCq7daoEvMCn9aeUQr LFMWDqhaQ9L66yUfCcbayNliij94YjkKF0VxY+/+tY93UEsDBBQAAAAIAAAAIQBvGmuQaAEA ACgGAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbLVUW0/CMBR+N/E/LH0lW8EHY8w2Hrw8Kon4 A0p7Bo1d27SH27/3jAExBhmKvCxZ2u+6s5MPV7VJFhCidrZgg6zPErDSKW2nBXsfP6d3LIko rBLGWSjYGiIbltdX+XjtISaEtrFgM0R/z3mUM6hFzJwHSyeVC7VAeg1T7oX8EFPgN/3+LZfO IlhMseFgZf5KBoJWkIxEwBdRkw5fuqB45RxahxAzomPJQ4trpAsmvDdaCiTjfGHVN9HUVZWW oJyc1wTJGjofnIQYKVptsj11r6HmZf4IlZgbTJ5WpNHWEcDE36luY2aE3NyJM+2PKRyPtcX9 WM8+3b+3sz+phba9Lh8R1+YS36jl7ZQHqy40JDvmYxYIPQrOR05aZzuAZjQUqJRseAioT4gf AZHsXiD+jrnTAtJ/D+1zcLaNDU2nZEUCYzExcLbegdWwpe40sYTJ28Xa/0J+0vxJF/5Qxm5j NegDU8c3e778BFBLAwQUAAAACAAAACEAHpEat+oAAABOAgAACwAAAF9yZWxzLy5yZWxzjZJR S8QwDIDfBf9DyfstuxNE5Lp7EeHeROYPCG22ldva0ka9+/dWUHRwnntsmnz5ErLdHadRvXHK LngN66oGxd4E63yv4aV9XN2BykLe0hg8azhxhl1zfbV95pGkFOXBxawKxWcNg0i8R8xm4Ily FSL78tOFNJGUZ+oxkjlQz7ip61tMvxnQzJhqbzWkvb0B1Z4iL2GHrnOGH4J5ndjLmRbIR2Fv 2a5iKvVJXJlGtZR6Fg02mKcSzkgxVgUNeN5os9zo72lxYiFLQmhC4ss+nxmXhNbLhf5f0Tzj x+Y9JIv2K/xtg7MraD4AUEsDBBQAAAAIAAAAIQDHZPPtawEAAMcCAAAQAAAAZG9jUHJvcHMv YXBwLnhtbJ1Sy07DMBC8I/EPUe7UaQUIoY0RaoU48JKalrNlbxILx7Zst6J/z4a0IYgbPu3M ekcza8PdZ2eyPYaonS3z+azIM7TSKW2bMt9UDxc3eRaTsEoYZ7HMDxjzO35+Bm/BeQxJY8xI wsYyb1Pyt4xF2WIn4ozaljq1C51IBEPDXF1riSsndx3axBZFcc3wM6FVqC78KJgPirf79F9R 5WTvL26rgyc9DhV23oiE/KWfNDPlUgdsZKFySZhKd8gXRI8A3kSDkc+BDQW8u6AivwE2FLBs RRAy0f74JbETCPfeGy1FosXyZy2Di65O2eu326wfBza9ApRgjXIXdDrwAtgUwpO2g42hIFtB NEH49uhtRLCWwuCSsvNamIjAfghYus4LS3JsrEjvI2585Vb9Go4jv8lJxned2rUXkixcXU3T ThqwJhYV2R8djAQ80nME08vTrG1Qne78bfT72w7/ks8Xs4LO98JOHMUePwz/AlBLAwQUAAAA CAAAACEA9hwjsWUBAADXAgAAEQAAAGRvY1Byb3BzL2NvcmUueG1sjJJNT8MwDIbvSPyHKvc2 aQcIVW0nAdqJSUgMgbiFxNvCmg8l2br+e7J26yjagZvt9/Uj20kx3cs62oF1QqsSpQlBESim uVCrEr0tZvE9ipynitNaKyhRCw5Nq+urgpmcaQsvVhuwXoCLAkm5nJkSrb03OcaOrUFSlwSH CuJSW0l9SO0KG8o2dAU4I+QOS/CUU0/xARibgYiOSM4GpNnaugNwhqEGCco7nCYpPns9WOku NnTKL6cUvjVw0XoSB/feicHYNE3STDprmD/FH/Pn127VWKjDrRigquAs98LXUBX4HIbIbb++ gfm+PCQhZhao17YXhiSceQNtoy13QRllwcbBMSuMD4/X940KwV1T5+fhNZcC+EPbE/7WQsnC Thx+QJV2jiEtjufs5wEehTPk/dFOyvvk8WkxQ1VG0puY3MfkdkGyPEtzQj4PI436z0B5HOD/ xMmYeAL0O42/YvUDAAD//wMAUEsBAi0AFAAAAAgAAAAhABEXoNkIAQAAOQQAABwAAAAAAAAA AAAAAAAAAAAAAHdvcmQvX3JlbHMvZG9jdW1lbnQueG1sLnJlbHNQSwECLQAUAAAACAAAACEA KQT9kb0CAAAnCQAAEQAAAAAAAAAAAAAAAABCAQAAd29yZC9kb2N1bWVudC54bWxQSwECLQAU AAAACAAAACEAXUuY92IBAADYAwAAEQAAAAAAAAAAAAAAAAAuBAAAd29yZC9lbmRub3Rlcy54 bWxQSwECLQAUAAAACAAAACEAll9Y9ugBAABiBgAAEgAAAAAAAAAAAAAAAAC/BQAAd29yZC9m b250VGFibGUueG1sUEsBAi0AFAAAAAgAAAAhAM2hYoxiAQAA3gMAABIAAAAAAAAAAAAAAAAA 1wcAAHdvcmQvZm9vdG5vdGVzLnhtbFBLAQItABQAAAAIAAAAIQDg7Xc6jgMAAMMIAAARAAAA AAAAAAAAAAAAAGkJAAB3b3JkL3NldHRpbmdzLnhtbFBLAQItABQAAAAIAAAAIQAOi8h33wYA AAo+AAAPAAAAAAAAAAAAAAAAACYNAAB3b3JkL3N0eWxlcy54bWxQSwECLQAUAAAACAAAACEA e2+EG9YFAABSGwAAFQAAAAAAAAAAAAAAAAAyFAAAd29yZC90aGVtZS90aGVtZTEueG1sUEsB Ai0AFAAAAAgAAAAhAErYipK0AAAABAEAABQAAAAAAAAAAAAAAAAAOxoAAHdvcmQvd2ViU2V0 dGluZ3MueG1sUEsBAi0AFAAAAAgAAAAhAG8aa5BoAQAAKAYAABMAAAAAAAAAAAAAAAAAIRsA AFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAAACAAAACEAHpEat+oAAABOAgAACwAAAAAA AAAAAAAAAAC6HAAAX3JlbHMvLnJlbHNQSwECLQAUAAAACAAAACEAx2Tz7WsBAADHAgAAEAAA AAAAAAAAAAAAAADNHQAAZG9jUHJvcHMvYXBwLnhtbFBLAQItABQAAAAIAAAAIQD2HCOxZQEA ANcCAAARAAAAAAAAAAAAAAAAAGYfAABkb2NQcm9wcy9jb3JlLnhtbFBLBQYAAAAADQANAEAD AAD6IAAAAAA= ENDTEXTBLOCK