Return-Path: Mailing-List: contact cocoon-dev-help@xml.apache.org; run by ezmlm Delivered-To: mailing list cocoon-dev@xml.apache.org Received: (qmail 45337 invoked from network); 25 Jun 2000 15:51:49 -0000 Received: from the-gimp.canuck.com (HELO canuck.com) (204.50.15.12) by locus.apache.org with SMTP; 25 Jun 2000 15:51:49 -0000 Received: from [62.155.169.164] (p3E9BA9A4.dip.t-dialin.net [62.155.169.164]) by canuck.com (8.9.3/8.9.1) with ESMTP id JAA2438826 for ; Sun, 25 Jun 2000 09:51:24 -0600 (MDT) User-Agent: Microsoft Outlook Express Macintosh Edition - 5.01 (1630) Date: Sun, 25 Jun 2000 17:51:38 +0200 Subject: Re: using Schemas for Form validation From: Mark Washeim To: Message-ID: In-Reply-To: <395619D5.BEBD2E7C@pwr.ch> Mime-version: 1.0 Content-type: multipart/mixed; boundary="MS_Mac_OE_3044800298_855682_MIME_Part" X-Spam-Rating: locus.apache.org 1.6.2 0/1000/N > This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. --MS_Mac_OE_3044800298_855682_MIME_Part Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit on 25/6/00 4:40 pm, Giacomo Pati at Giacomo.Pati@pwr.ch wrote: > Mark Washeim wrote: >> >> on 25/6/00 4:01 pm, Jeremy Quinn at jermq@media.demon.co.uk wrote: >> >>> Hi, >>> >>> I am (still) planning a TagLib to handle the interaction between html forms >>> and XML files on disk. Hopefully a TagLib version of Donald's XMLForm. >>> >>> I was planning a "constraint" mechanism to allow the author to set up tests >>> on the input that have to be passed before data is written. >>> >>> It was set up in such a way that a set of parameters defining a contraint >>> are passed both to the constraint engine and output to the XSL so that a >>> client-side JavaScript can be assembled. >>> >>> I just started looking at the possibility of using Schemas instead. >>> It would save me a lot of work and be more standards compliant. >>> >> >> >> Just a suggestion based on recently implementing 'self-validating' forms. >> Though, I'm actually partial to schema, for the sake of simplifying >> maintenance, I recently build the following: >> 1. validation beans which match constraints specified in >> 2. the form xml itself >> >> The xml looks like: >> >> >>
>> member.xml >> >> >> >> > name="USERNAME" >> value="" >> title="*Username" >> type="text" >> size="16" >> maxlength="64" >> required="TRUE" >> />> name = "PASSWORD" >> value="" >> title = "*Password" >> type="password" >> size = "16" >> maxlength = "8" >> required="TRUE" >> />> name = "PASSWORD2" >> title = "*Confirm" >> value="" >> type="password" >> size = "16" >> maxlength = "8" >> required="TRUE" >> compare_field="PASSWORD" >> /> > name = "EMAILADDRESS" >> title = "*Email address" >> value="" >> type="text" >> size = "16" >> maxlength = "128" >> required="TRUE" >> contains="@" >> /> >> .... >> >> The constraints are arbitrary fields (compare_field, contains). >> >> These forms are in-lined into a node (cloned-in), first being passed to a >> class level method which, >> 1. checks the request for the action >> 2. if it's not yet been posted, just pass through to the node >> 3. if the request contains the action, checkForm, for instance, >> a) for each type of input, instantiate a checker bean, >> b) pass each value set to the bean (bean returns condition string ('Did not >> match', 'Did not contain:', etc) >> c) member method checkForm uses util methods to re-populate the FORM DOM >> with results, or the request values, depending on conditions... >> >> The long and the short of it is, that this permits one document to behave as >> data model ... >> >> I realize that this is a little bit 'overloaded', however, if you maintain >> multiple language versions (I have six languages), it's quite convenient . . >> . often, the same form is used through multiple passes ( populateFromXML >> (including sql), checkForm(request) . . .) >> >> If anyone's interested, I'll post complete examples . . . > > Yes, I'm interested. Please post it (even privately). > > Giacomo Ok, this is a hack version, attached as a zip. It does NOT contain the checker beans and is basically the prototype. Please, don't bother to point out how SUCK the code is :) What you get: member.xml update_member.xml two xsp pages which both import the same logic (using the parser) . . . The class level methods permit: a)importing the form xml (or any other xml) b) populating a form from another XML file (note:requires parity between the element names of the xml used to populate the form and the field names of the form itself. we use column names from SQL strictly in the forms to permit ease of maintenance, though it DOES expose you, we md5 hash everything in production) c) checking the values on the request against the rules in the xml form. in this version, the conditions are just subbed into the field value. not effective, as you'll see for the password field. . .) the form specifies it's own accounting, so to speak: member.xml the checkForm method checks whether to pass the form back out, or scrutinize input on the basis of whether or not 'action' is in the request (happens on form submit). if action is checkForm, checkForm uses checkFormFull to compare the request name/value pairs against the form xml (this is a crude example, keep in mind) . . . If the check's fail, the form dom is repopulated (the attribute values set) in accord with the condition.... I haven't supplied any, but target specifies the page that will handle the validated input. In production, this is usually an xsp page which handles the submit via the sql: taglib . . . NOTE if you wish to use this approach, make sure that your field validation (which is cursory in this example) is thorough. Otherwise, you may have someone writing spurious data ... When I have some time, I'll post a proper version. But, if your inclined, have fun . . . -- Mark (Poetaster) Washeim 'On the linen wrappings of certain mummified remains found near the Etrurian coast are invaluable writings that await translation. Quem colorem habet sapientia?' Evan S. Connell --MS_Mac_OE_3044800298_855682_MIME_Part Content-type: application/zip; name="form.zip"; x-mac-creator="5A495020"; x-mac-type="5A495020" Content-disposition: attachment Content-transfer-encoding: base64 UEsDBAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAARk9STS9QSwMECgAAAAAAAAAAAAAAAAAA AAAAAAAAAAsAAABGT1JNL0NMQVNTL1BLAwQUAAAACAB1i9koRh+0jeoIAACAJQAAFwAhAEZP Uk0vQ0xBU1MvRk9STV9DSEUuQ0xBBSYdAFpQSVQQZm9ybV9jaGVjay5jbGFzc1RFWFRSKmNo 5VpPb9vIFafjZAEGEVr0lCKLYMJDQK0F7d4Wa9kpbFlujNqSK8mBgd2FQZMjixuaVIejxG5i YIOiQFsU6Fdogd4K9LaLXnorin6BXnrYU6899BNs35t/JGVK/hNvbKCERVIz89783pv33rx5 svX9QcIO9/wh9Z/X/chLU2vOsv7w0PqkX7PgurP0x7/A4z6+z+9a1pN/WPL6pP/B9379e8vq t3b73Q/84Rw2zsm+h38Cwj9/xb7++qtX//2dVX69efPbzyxr6SgdLUbJQeg/qRACf4SMxvtR 6JMeZ2F8QCIvPmjIdpZw6nMa6C4BOm1UKpWlR58211b6K5/alYpdsbOR7SSgctw6iOmKrzHc amQt8ceHNOZk4Pk8Ycc18pTzUY+yFxHlXfqzMU05YfI50ZeOkjil0KleqhX7VcW2JRyyTByn AV/hLxwQV/OoH1C+7THvkHLKXAcmDZPYqZJHyyQeRxEyEVzOQ1SHXi9KXcdIBoyQgeSQITH9 6zCFKwU38qo5qgjWPqnIj0YtWZiJOBtTnOMshNxj0JAXi2SwwNJeeixAPGse99xMvVqVtbPY kiJagbd3nHJ6WE/GvD4Cu+BRrBQDooYRGEHCyCBkuJxjUB4yYJSPWSwsoYEGc1K0mhdJGJBT aC9rHzVtr1KKHRZpi5Htq+PBgDIySkCMYG8/CY5h5WL6kuS7XUciFxIDNOK2YrBf5qFFEAoU ZZprwyN1q6RBaH3opVsJo62IotmLVrE4Ym0UwhjGAytXfq3SekyPuKJw5fxq5AsvGk+b1ZV8 5Hj85ESre6MRjQM9hDSm9TvLzqxuOb8agAZZImDe9kqneGymyJl/iTnliIVQnB0TwVYvcT0F hl0ahAwMyM0t9AJxfuTAPb+4gsUJ8T3uD4m70Wkd+XQkl7Eq2SoIlDEDgaKGt2iaegcUJGtI vBN2m4+LxusvGfNAMzIcAyJC7PRlKOAiI4SCXPvHI8QiMfsemDy21lubra1Wu7/X7qy1FmWn rRaFUPUEG1NNVe2FmW1x76AtDVENxwn7shGtkOQuQYfrr4h0xCIObkwb7e2dPoSN16/JRL/o Xum2Vsp7uytrG53VnX6/097c6E1h0Xzaav5ktbOLgVECkcJerX/aNlF8yUX8FEdLNEQG7Jwu VzjQ7Y85dR3klG0o2iurmvJVRb/Zmj4t0As/dGoz4wBavIYksawmSUS9uC6oOwO3HBvyBI8K nGq1vi8pniGBawAajSNrwfmRtP5NGh/woXsGLMOGFBidIarTbf10Z6PbWtMRWRJl2/8AVEmd XN8JMe/wqqErvOWy+0nMvTBOc5u93uPFbK/MuhTkbiqy2ZLXzpw0bwMX0s3WGEKH4rNInIWz JzqHDomtt3uhzXMq8HDkMbo3CGkUnF+Ls9RmvKR00LlgXF6xggE5RPUuT1drYbLL65acT7lX rNYz5noXqntLpekX06Ke4rvul1/EK+6XmyHgivVLYc9rDsMowDGpDuqQDICjQ2szGYttVBPi cBX01FCxCeH4EIZ91IDHUo4Uvi8sVPOb1umzguAbQibihtWSc4PMnCCindqLJ04PWnki5KrU W5/dkERn4ybl1ecNuW3MPprMZj6DNTBE0CfiPnHAFAeA8SjwOF3rbM1OodSWrJYNd/TJtmcq V9X5FN7tG5hVGYu9SMaQk1s7aJavzHbMonoalcx1bp53ZMYwwzMKNpCXboqv7DPqPTfnj9xi r3WaO9lqo6nIq2TEenflx6cMo0xz2sYurzaF+jyqI1erNjN3XmN4D+jAG0d8sZLvO5nu2MKT R8loHAEsEexYcrh7GLmyJ03GzKdt4emiQZ7k2qWuP+WElPG4Yo/OGF/Ir2+kO4n4MmkSRX2R 5WWpJzypCSXhGeycNKIauNdrNfsbnbYgNiaZ09szVcSYxlSdNnRCoB4Cu6F+tCzqXI8fQ5aj GwtZkc799fQ5nyiYl3EHtaA1w84AKKtNmPVfECWThQyZjum5hOQEFhzMT0Mpc4TTfloCUpdN dO4j79Nj24z4dYURruh57zTOvb0mz45xE70qJVIZTsa6cSr6yXq6iGcoaOJ7Ed32+HA9jCiY si60Y3v4cxrkIl2gXmpkdqVIljNn1IWxil+oCueqjqr+yZKElxU+ETOmpBqxC5M4H6Klz5xq QQ0yYuGxN0MsTQLn1OVAGH660VBnZSejcgyziY9qdQX4Ok9UjlklNa25aoMYQuN9htNbKOBg /8aJp990XbLwO86kEKp5AO+xiHbTDUzZFymohaQjYAX6Oq2wgl3wYZ95cYrOGcjCKZGkpgy8 29ve4WFUx8YmHAOTGKtoOSYKFfJyq0q5RJ81ppAreLBCWkLh6UXVaJc0elZK8RhHHZWmHKAK IsOlPmQwVrAa12knpJnEQShKj8wLUyyhNSSRvAvPR2CKUpqVmpboscKfcVSdHkEcS125m5mU B9ZcVsJNVmtPKsWPQB1SNj4M0/pROgJXTSkDdcHDzZESuZIb8WjMeyKSuwZbl3oBegKCwUMG KVxiv9aqMlVQYmLsRMnYlN5zhXcGEUnGV6pq7j3u+c/BdHydAJxMzCo1oH1afbXlajhCtzH4 8wD2imDRUXaQ8yGlY7U5ns77FPa6D/Ge66qw67S63U7XQbcTdOUHLEZT2DDwhAVo9ExqacRh tqroGhW7NE1W1dZ8LTXbKGBF0Q6kGQihhaFAcz1Smyh5Qj7KjuN44pZLoO1DHNkb09P0wvy6 pqnL3ThT9pvay0TZwySWMA7oUWfgwogL4qlUyOefP4Hn0ofZr9OkYn03F/5mfmdoWbfhY61/ R5Pc5OupZW8lsecn1oM7lvWbf/57/sHdH0b/uvUN3qF//u4D6z3rtvWZ9cWtX87/Qj/lvxbc /1h+rL+hHm/fx39FsN5cmyxz7ylR/m8vGz637ac0ekF56HvXjudarnsQswZhABE29KLrh3M9 FzjkHHy+tIofSzTPycA3B97/7uDk4uzde3//1a1v4O19iLlzW9u9Lrz/YHW114fnw/n/fPut IfxSvG/evffX11eP9X9QSwMECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABGT1JNL0dCL1BL AwQUAAAACAA2idko3vHW4AADAAAACgAAEwAcAEZPUk0vR0IvQU1FTUJFUi5YTUwFJhgAWlBJ VAthbWVtYmVyLnhtbFRFWFRSKmNo5VRLb9NAEN4kbaWU+gIcQK2Q5SOCOimtKNJmwWk2aSo/ gnf7CDfjLo1Vx0axU5DgQG/Av0DizA0JCYkjh14REuLMtRL/AMZOUmIoN0QOHWkys998m53d 8Qw653RF977oLT7u+vOfVhFCOYReXUG3+DXw0TR+/Q7MxcQv7Hy5A6YEmAxWRo2yXuB0h9tX 3U4uYRyiVApPYeObt9GF7tsnxzvodDk8XFpACN+Gc+UD0Yu8MKgo5cWSIovADXe9YK+iNJl1 fXV15db1snKbSBJ+6OwJOfZiX1QUdleXmXB6bke2RdT340ghciI4fBjDn0WyG/aDuKIsKWQE Sd5uRVkulW4CtMmobWoGJbGIYqyeLCXc0hjbtuwa6XWMe3Xu90sHGzc2o2ptmVkbD/YqFaye UCRMDa2pa7WaTRkjInL8MLjjOkHf3V90wy5WM3EJr1mbNqeszZtcp6Qjej2sZjEJ15s242ky Xae3j9Vfawnr2tB95EQd4cEBJ4iEGbcp5aPDmMzinhNFAqvZAGTR5G0CVfe9AI5PFnBti/E1 q0ZJubSyugJ3HK3TpE1ut0mD2oZmttOMU2AYajOucSoHfd+vKG3K4HnVsQDQONVpa90yaU1r Z3njEfKLR7eo2TQb0uncYZRgw6o2h1iWOhbIsKq2Ztb+Sk2jBNe1nSwFALiE1qDkxhJWEwtV 0rY41QwSiBjK6DvBbpQQByDUokXXmppu1evUZtV2+hmQMpTiNFzC25rJTbrNdMo5tRPib4iE G8ywWtTWuGUP3z/7kn/GYZM6/PTJuJf0EZEGfZg07nQHoSlQVEdnT9ZR0QgDxw3R/DRCLz9/ K8zPXva/5o+SX4gXZufRDJpCr1Ex/z7/YmQHoy3/faCDd5y6lIzC0RicgORmhlc5s1IEnSqu C/9AxJ7rTDyficjcWhg88HZFEHuOP/l0JiPQkDnQZyirKIVzg4bNQff/v3TG5uzs3Mfn+SPw FmDm5owWs8E/X60yDvZK4fjHj5ONz1Jfn537UPv3Wf0EUEsDBBQAAAAIAIyL2SjjzJ65SAQA AIAWAAAUACAARk9STS9HQi9NRU1CRVJfRi5YTUwFJhwAWlBJVA9tZW1iZXJfZm9ybS54bWxU RVhUUipjaOWYzWvjRhTAx/lYSIhZKCy0pCxCx1BWzW5ZtiCbyvI4EasPI403ySmM5bEtog9X mnjj9rK5ld57WXop9Fh6W9hLe+x/UCi9FXrsHvoPdDsje23HVpw02dSGHRhr9N6b0e+N3oz1 BtwOSFAn8WEzioN7J4EPQA6A7+6CT9FHgJVV+fuX7HKHt5f3f/uMXT5mMgEo4Aews60DBPeR veW2c9wi/QHg9ivW8ccXje1vX3z590uQXU5PzT8AkA1olKBdsWxDoL0OKYgd3CKi4DUKopGS JW2vU8Uh8cViXk7tAkLbEdN3ooRyoaIizTKLfUe4D7I0EOXlXa1chqYQ4oANjV3qRaEodLF/ zG7dNnGPKsxvUZq0pDhuETq0pG0cHiV86GnTPu/AcIQ8bejjsDU0bNVTAz57mlmtobzwpvSN aw60TcWA4kgx6DkmoR71mWSrlpCYdxtXpXNJyQkdEybeF0y4/XBMFOATn4Qt2i6IDz8Zk8fk 82MvJmyWkV1jFFLxPFahIIhVxXH2LLs8NsB5uNx8q4qT5GkUN6aAO9MKDs07ZWNzzaNrc9/P pFSjsOmx6Jj5Cm4Ge6hwo6CDY3LY9IjPtKOJloruLM9Uq2Yj6BwgDekwyzvEG5dwLSOEZrt1 RjPyq6LozoXvo6LZDpoI+9H7qHhxQoWJQH9r3NcIf12ZQa3jxYRWdjJ5ldaNgD64RlAoTxBU jCzYCu5GsUeJQAkOLoKc9iUL+9zp/Y/UDrIhREq5bEPHyWJ3aEwIFXCjEZMkudIMT3t0meC4 FL6qoYMsatWjvQUL5KrlINUqZ6++KvtGcKPGoi0+tj2b6MBBCsrGVqPjkPakhGK6kOj2wfnY 8aIFCII6rO5aJiwrmdiI+KTTjkIiNHCPejezUz+4f/XFOHQAPoGmZu7MdoJ0SeixT80Fc6Ki 7Gdv4SeLRmpYJW0w4VnERlT3WCud7AVGL9mKWb6IX6jHOGzMxQt1F6qPS9Z+xl9nFaqaoluV CrSd0gE0FE3PcsRqNlmuJdR7Agmw5096kfJdGWJPMZEJ9xwdIgTtrMfv4ZB92JGniU8oJfEV Hj+RIPIE9jAmrehomCb2SJLmiU6tZGhoYJcc1wNvlJw6uEvEoqwZ7ItOaMekWRAlL2BZqQTN w4Qp77W8JhtFlvqjFPN5WdfMxzz95NlBUcWhS1jS3L/LyzVbP5NM8/v8OeO7ad/BE/KyNBhY 4ok6f5A0yu+L+cxzAH5msNoGYIVVUAHvXtkFa0YUYjcCm6sAfP3rn8ub6x/4vy89579Mv7y+ CW6BFdAF3yz9tHznzXVwtPLPoKbzuPI+P4oBp3PzJXdr4Mo7W9ZYXVnbJX6XUM/Fc+eZS9lI j04aJKQe9uePM5/CFmSO1WfgbAWpONdfsDm2+v8/nLF9dn3jl6+WnrPWh2zPzRlVx2bt90ol B7Hr3eVXr18POz5L2/r6xs9/vX2qfwFQSwMECgAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAABG T1JNL0lOQ0xVREUvUEsDBBQAAAAIAIOM2Sj3dAdhaAkAAIAxAAAVABkARk9STS9JTkNMVURF L0ZPUk0uWFNMBSYVAFpQSVQIZm9ybS54c2xURVhUUipjaO0aS2/jxpmud4Olsbr0ULTYIJgy CLxeeE1rtV5bAqWYlGhLiCgJFJ1smgQbrkRZBChRkLjr3TgGspeg6K1ALwV6KdBzbwF66bXn Xgq0RQ899JpTf0A6Dz6GL4nys0BCQCI5j+/75pvvPWTuDOzpaOvVzGLurP31898wDLPCML9/ hylqm/CZuS384U/w9hP0vPr07/vwtg3bALwD5jDfXNXkp5r6oDdcYchUdD34HZz4x28++fTX 35z+92sm+Xrz5guRYYT3X40s8NKYzkx7XObyW9vc+5WcAOkpzZzXljEbGoYD4JjxrAQby9zQ cSYlnj85Odk6KWzZ02M+XywW+afdJq9N9fEMLYcLA6zkCEDHGE0s3THASHd6wzLXEQ9l2MkK dU1pVoS6LNYqgtbQmnIFj3+pWy+Mh/YAzAzL6DllDvdxfEXg3VE8npNjWUFq1z5GDyyeqU8m 1uuHHr4Zj4fw7hg4C+HLCTxNVBqRithoYSKT4WYDUm03j5SLg1FkRZLVg7aqIJ6ygiZKTRl8 1KhpdcjpJ9sckNpqTVbLHHysys1mR6zVGq1D/73bEavuO2aJphKeaTUgHUIi23Dqu7Xd2u6e zIEPxWbjsAW53u5wFaGhHIKuWi1zW1u8OdKPDb73jIx85tgTyxg4W8fmgPOo2eNAXW4c1rUy V6TJwptX87F6Y/JwfIyCinDQbmngQKzKZQ5KVF8f65tDw3ppOGZP39Snpm5xoNv4BezOw9FS ith05arWgJB86YEDeQQ6TEucAy4DVETjcvyYmsfDZRkC72r6rshFuVjNJyKeTfSeMQ1he7Qd oMvP4f954eevGkEG+PP5lVWKL4V5ScgCEETZXNME7eNDQ+8Nfel84PaS7t7QtmdGBTewpJ10 nAyNMYDGAs6AMwelUrPR+uBLaPxltSU20YsHJ9kG+vjI7LHdN+5voBVJKh9MzLb5wdp2Iuyh gBGThsiuzF1Hh7sS9EsxITPJY9u5T+bSRmXDWwIAF8VLbzwg7bRI5ILhniBVvPb5snlTeie1 Na2tzDeYz23HsUfn9SGJSofWcYU8WMphZGfBZbkNSBd09RB14TxrLsxFBG8o7Mgas7jRCiug B6DIWr1dK3On+yPDGdr9MxKHYJVxnKn5/AWcOdZHRpkTsX5xQVAX8+vuCNA3Z/pzC3a9cCYv nIfGrKdPzPFxmXttzCD9WDsIsT6OAGuKotYbtZrcIirqxlnLxVYegp5uWT58d2kKBN6UnyGO PEMRrKxiMvEkf7mpjoL2E5TniBlWVaw12tIRlL1Ws9HVuJBNi0GnRoesmStVZCYULVdednfn hkf+lOVtegEBhvc5pp1l6chQRHHgZt2PCz8kkWIQGQJPTYt7xcd7KARJFKd9x3QsAws8CQ5D KH3N9ziRNVIKG5OkpSHIbBKT85QNqz2pFaqPOUIVmRK+ros2b5+JEIe2egnPF6eaXlIuaFTD Dt0cuDI+sWemA1PM+xtlS5859zc4endUmizaID7KHOEGrHkyhzWhNSzcu2Ux5xdgDrFP9dgX cI9wLBxm+HFDjmqkYp5FUVqy+YD9FOLzGY1rUerLUePEmGCeCLx7bhkoLMB2BQuoLJVA0LNd MVxe4GxnaExPTM+lAeh7wvoeRN7E7W8AfdwHQStx2NHWTluRu13xUKbMww8uLdisH1xakkvD kQ++wMW8GxuZ7kvzPtwqs19eH+jWzFinhYu9tHXG4RjTqe2CSZpBERvxHBH3HPbP/luyo6aU ESohoBj//XTSMe8c5V+E+eQ1ah9DpYEcy6YUBfxkjUUWQFUSsrZI2paaoaTmmDscGBoocYWs KPgMKhR3vXxlaYHeSZBL2jziyu8mCErB4GWqgdyt7ck7e6EaW8xMQroiNWK3zoKNJl1biSTb UT7E3X0uMwMK5yq8ZIysqLLFFRjSi9j3S6cosSzk8diXhOX3ZDvNe891DBB6WKbmDe4EZYCI xGWrtaCzQKn9FJdbMq1vZ1EpFYALHVghghA1gNZeN5jZjAQ59ElOspYGccwS6ButzpHmn7z5 Xkkf9+DdnpZK5Gzuk31s+NZREXL9M+KnliM6l2ZdgiCM8NQ3K5ShFzCZwHk9MVBxDN3PONcW n2LS4CuGjN7xA2wY6a8sY3zsDHFBzXs545BWJtbUZuYXBlVRo4tI0bRvEYPyj8OBvF/6zgBj ZPb7loGgPNqJpgORbCCFpXghSBzivjHqGeOVP4HH3IZcynh6W5erHxC9AniZZLO0jzsy1Qla oiJTuwXtz5FM7xYeKdeopsx6lFDKu5BeRop9oQVN9b5pL14N2Qqjj9q85zMv9M18LK5Ibc9g deUm9ME+XpOuDcfKDe1OpDgc7HeSIE70qTF2kBgShLxPMigDEpwSiDzEiyoZCIgbMZCOeQxI tVixTJnA8qlMVqCQOBOBS6HhImjDWMJaA1iqZk6l7wJPNimz5iADLKqyiDfYewFq+6MuWsXU Ppmd4UgNv/ZsC72GBCDjAj3QWeW/eyQpjUCNKGMREZyG4n6jEtN70hNVE+xxT3Efvz+cGoOz WCgb2nWvzEHvBq590KhcatkFKslXgk2j4YVPETNyyD3/iBoHtxksJGVhnuHi8RkcBCynccaR YA+KyNTomw5xcAk1on2Sh+AakPf88zJYdxPs4HQ24hZJDJRaRCGQfHcTOkSKpmsRgk7MvjMk 9JDHLOTg4CyVGgxnITEsdnPKYQWrcpiqqhhYTxKbnzO3ml988tBEq08Bw7KJIvq2AXwJop86 CGIlJcqpq/JBGlFHanPhgWHaWSGdbafZiUUhPhnIU5GKH/ok1UGTvoAC0S0KB6FolhQq1ofO CuO0k/xk4Sd30U8jYnDcOHdxKTIKKW4E0/cuOeZLCPtwk5SQyMdmR2YKfGY30sGGCLhJ0hzx 6A1Nq18qPZgjIecSiYV14sWpFJXHLl34SkuJ40xGPAqxOcE94Jbgo9NKjrmWC30ze3vIMLfg jzm4Hpz/V1edYRV7rPds5t5thvnV3/6zem/tZ9Y/VyX0D/tX1+4xbzG3mD5T/9G/Vn/r3cmn xe/9g/yYfyM+3vop+hSZeXNja1l5y13K9/Zi4e8W65uEG6fnRq67VXs8MPsw54P28ebJuZkL KuQK/H3FhH8Mbl4hhm8Fav/1kUPZ2bW7f/nlqgSf3oY2d0XpdFX4/GNJ6mrw/s7qt99950/8 Cj831+7++c7l0/o/UEsDBBQAAAAIAMqL2Si9lgxKJwIAALUDAAAPAAAARk9STS9NRU1CRVIu WE1MhVLbbtQwEH1ef8XUqlArNTdERTdks1QlRSt1L2K3QIVQZZxpEurEwXZ2t3+PE1cFcVHf xjPnzMw5nmS6rwVsUelKNhMa+SEFbLjMq6aY0Nl66Z2dnY69iE5Tkhy8W15sblYZ7HUbt6xA +EIgOcgWm9nmBu6kqoUsKg7rm/UmmwPlgmkd9PlbXiK/94cETcnXlNhungfnnSmlimHO1D18 YrrEqgZa71z0VjBVYI151dU+lzUFz0sd8aPbOIbDWR5DjfU3VL6VcrKFyD+Fl2EYBmEUhGcQ vo6jcfwqAtRMyAayfQuHQyOSTLnkUjZeqyRHrcE8tDihVt0g939VYVzZjvO0eRBol0UDpcK7 Ca0aLrocB9W+xdJHmsG9Cfr3tB/8ZCABEKwpOhtP6He2ZRS4QmbQ03bk8CdGdUgtzo5rdGyZ E1oa08ZBsNvtfNYy660vVRFE4/E4+LxeBRdS/cZQ+KNDbZ5lfXC4X8TOVOJZ1rUFUWI1kRdP B/CGwIjYy1idv89SMiKjxB7IVZbOh2/SZdUmgcsQW5tni+u1hQHAEEPDamvGskHrneT2KGkK 4OpBD7BYF/SsZH4+W6S2PEoullfX88Ujva7yXCB1fWEEo8Fz3LcqHW7x0i57VKC5kpwJXDFT XlYC4Yi6W7p1/1cLegK55F2NjTmBRyvh+B/JPtCtbDQeJ8HTrH6vwC3Wx3+tqaqiNPQPmFXX i+otDJyHQFzP/mZS8hNQSwMEFAAAAAgAYIrZKNRairncAQAAYQMAABEAAABGT1JNL1VQREFU RV9NLlhNTIVSXW/bMAx8jn4Fq4ehBWJreRjQZLaDInOGAPnCkgANhqHQFNb2JlueLDfpvx9t Z203rOgbRd6Rx6OC8SnX8IC2ykwR8oH/ngMWyhyyIgn5bLPyrq8/DL0BH0csuPi0mmz36xhO VTkqZYLwlUFwES+3s+0e7o3NtUkyBZv9ZhsvgCstq0o0+TuVovrptwkesW8RY8FYGWVM4ZXW KKwqcI8lhpxat7Neq2rXlUm2V7lHjVWK6CC1eB/yrFC6PmA70icsP9Mcnpxo3kSlyU/yGYCW RVJTHPIf8kFyUBalQ6+ima0jztbICUfzimpEzJCnzpUjIY7Hoy9LSZv5xiZiMBwOxe1mLSbG vmBY/FVj5d5kfelwz8TaZfpN1o5AnNFS0Hv35P9Hegbrm89xxHqsF9Bx5nG0wPw7XTnNykB0 GUJBsIiXuw3h4BxDIXPyYlUgeWcU/QgeAXR10QAi9idqaG2Lm9kygnbUZDXfLZbnHnl2OGik a/daw/FUWop7pSlrTRZPSe7Umvw215cJurlRUuNaunSaaYRLTj0axT65wftwMKrOsXB9OBt6 BX2A//E62l33BV7hPueuSJ14IS8Q3Q6N0n8XslmSOv4XqPWi2b+xXHSeA+s6Nj8sYr8BUEsB AhQHCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAICBAAAAAEZPUk0vUEsBAhQH CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAICBAAAAAEZPUk0vQ0xBU1MvUEsB AhQHFAAAAAgAdYvZKEYftI3qCAAAgCUAABcAIQAAAAAAAQAAAICBTAAAAEZPUk0vQ0xBU1Mv Rk9STV9DSEUuQ0xBBSYdAFpQSVQQZm9ybV9jaGVjay5jbGFzc1RFWFRSKmNoUEsBAhQHCgAA AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAICBAAAAAEZPUk0vR0IvUEsBAhQHFAAA AAgANonZKN7x1uAAAwAAAAoAABMAHAAAAAAAAQAAAICBsgkAAEZPUk0vR0IvQU1FTUJFUi5Y TUwFJhgAWlBJVAthbWVtYmVyLnhtbFRFWFRSKmNoUEsBAhQHFAAAAAgAjIvZKOPMnrlIBAAA gBYAABQAIAAAAAAAAQAAAICB/wwAAEZPUk0vR0IvTUVNQkVSX0YuWE1MBSYcAFpQSVQPbWVt YmVyX2Zvcm0ueG1sVEVYVFIqY2hQSwECFAcKAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAAA AAAAAAAAgIEAAAAARk9STS9JTkNMVURFL1BLAQIUBxQAAAAIAIOM2Sj3dAdhaAkAAIAxAAAV ABkAAAAAAAEAAACAgcQRAABGT1JNL0lOQ0xVREUvRk9STS5YU0wFJhUAWlBJVAhmb3JtLnhz bFRFWFRSKmNoUEsBAhQHFAAAAAgAyovZKL2WDEonAgAAtQMAAA8AAAAAAAAAAQAAAICBeBsA AEZPUk0vTUVNQkVSLlhNTFBLAQIUBxQAAAAIAGCK2SjUWoq53AEAAGEDAAARAAAAAAAAAAEA AACAgcwdAABGT1JNL1VQREFURV9NLlhNTFBLBQYAAAAACgAKANoCAADXHwAAAABaUElUBSZG T1JNLwBmb3JtALV784YD4EZPUk0vQ0xBU1MvAGNsYXNzALV78Y8D4EZPUk0vR0IvAGdiALV7 8bgD4EZPUk0vSU5DTFVERS8AaW5jbHVkZQC1e/OGA+BaUElUAGM= --MS_Mac_OE_3044800298_855682_MIME_Part--