From salaboy at gmail.com Sat Oct 24 00:23:32 2009 Content-Type: multipart/mixed; boundary="===============1091306278441686361==" MIME-Version: 1.0 From: Mauricio Salatino To: rules-users at lists.jboss.org Subject: Re: [rules-users] [droolsflow] - one way to use Hibernate mapping with JPAVariablePersister Date: Fri, 23 Oct 2009 21:23:31 -0700 Message-ID: In-Reply-To: 463447.27253.qm@web45915.mail.sp1.yahoo.com --===============1091306278441686361== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable hmm I will take a look at it.. during the weekend.. 2009/10/23 Bill Tarr > I'm not sure this should be comitted to the trunk. > > Users can't use this code as is, because: > > 1. Manual/Automatic flush > - they'd need to implement flush() and persist() if they have manual > flush set up. > 2. HibUtil > - is a system specific implementation used to manage SessionFactory and > Sessions > - systems using Hibernate will already have some version of this they > will need to leverage > > so this is more of a template. > > In fact, it won't compile without a HibUtil, so that's another problem for > adding it to the trunk... > > A test case in examples would let us create a simple HibUtil and > hibernate.cfg.xml. > > The test case could create a H2 DB and the tables needed... > > > ------------------------------ > *From:* Mauricio Salatino > *To:* Rules Users List > *Sent:* Fri, October 23, 2009 4:18:16 PM > *Subject:* Re: [rules-users] [droolsflow] - one way to use Hibernate > mapping with JPAVariablePersister > > nice.. do you mind if I commit it to the trunk? > can you create some unit testing too? > > > On Fri, Oct 23, 2009 at 3:27 PM, Bill Tarr wro= te: > >> Here is an alternate version of JPAVariablePersister for people who are >> already using Hibernate xml mapping files. >> >> This implementation has some downsides, but it seems to be working for >> now. >> >> I am going to keep using JPA to manage all the Drools Flow tables. >> >> My domain object persistence will be managed by Hibernate Session. >> >> We are also currently using automatic flush (so no code to persist domain >> objects in this class) >> >> Obviously you need to use your own version of HibUtil. >> >> import java.util.logging.Level; >> import java.util.logging.Logger; >> import >> org.drools.persistence.processinstance.variabletypes.JPAPersistedVariabl= e; >> import >> org.drools.persistence.processinstance.variabletypes.VariableInstanceInf= o; >> import >> org.drools.persistence.processinstance.persisters.VariablePersister; >> import org.drools.runtime.Environment; >> import org.hibernate.Session; >> import HibUtil; >> /** >> * Variation on Drools JPA Variable Persister. >> * org.drools.persistence.processinstance.persisters.JPAVariablePersister >> * for using variables persisted by Hibernate, while still using JPA to >> * persist DroolsFlow data. >> * >> * @author Kris Verlaene= n >> * @author salaboy >> */ >> public class JPAVariablePersisterHibernate implements VariablePersister { >> public VariableInstanceInfo persistExternalVariable(String name, Object >> o, >> VariableInstanceInfo oldValue, Environment env) { >> if(o =3D=3D null || (oldValue !=3D null && >> oldValue.getPersister().equals(""))){ >> return null; >> } >> try { >> JPAPersistedVariable result =3D null; >> if (oldValue instanceof JPAPersistedVariable) { >> result =3D (JPAPersistedVariable) oldValue; >> } >> if (result =3D=3D null) { >> result =3D new JPAPersistedVariable(); >> } >> Long idValue =3D geHibIdValue(o); >> result.setPersister(this.getClass().getName()); >> result.setName(name); >> result.setEntityId(idValue); >> result.setEntity(o); >> result.setEntityClass(o.getClass().getCanonicalName()); >> return result; >> } catch (Throwable t) { >> Logger.getLogger(JPAVariablePersisterHibernate.class.getName()) >> .log(Level.SEVERE, null, t); >> throw new RuntimeException("Could not persist external variable", t); >> } >> } >> public Object getExternalPersistedVariable( >> VariableInstanceInfo variableInstanceInfo, Environment env) { >> if(((JPAPersistedVariable) variableInstanceInfo) =3D=3D null || >> ((JPAPersistedVariable) variableInstanceInfo).getEntityId() =3D=3D null){ >> return null; >> } >> System.out.println("Restoring JPAPersistedVariable id=3D" + >> ((JPAPersistedVariable) variableInstanceInfo).getId() + " entityId=3D" + >> ((JPAPersistedVariable) variableInstanceInfo).getEntityId() + " class=3D= " + >> ((JPAPersistedVariable) variableInstanceInfo).getEntityClass() + " value= =3D" + >> ((JPAPersistedVariable) variableInstanceInfo).getEntity()); >> String varType =3D ((JPAPersistedVariable) >> variableInstanceInfo).getEntityClass(); >> >> Object obj =3D HibUtil.getCurrentSession().get(varType, >> ((JPAPersistedVariable) variableInstanceInfo).getEntityId()); >> HibUtil.closeCurrentSession(); >> return obj; >> } >> /** >> * Hibernate lookup to get ID column. >> * @param o Dto to look up. >> * @return Long id. >> */ >> private Long geHibIdValue(Object o) { >> Session session =3D HibUtil.getCurrentSession(); >> return (Long) session.getIdentifier(o); >> } >> } >> >> >> >> >> _______________________________________________ >> rules-users mailing list >> rules-users(a)lists.jboss.org >> https://lists.jboss.org/mailman/listinfo/rules-users >> > > > > -- > - http://salaboy.wordpress.com > - http://www.jbug.com.ar > - Salatino "Salaboy" Mauricio - > > > _______________________________________________ > rules-users mailing list > rules-users(a)lists.jboss.org > https://lists.jboss.org/mailman/listinfo/rules-users > > -- = - http://salaboy.wordpress.com - http://www.jbug.com.ar - Salatino "Salaboy" Mauricio - --===============1091306278441686361== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" aG1tPGJyPkkgd2lsbCB0YWtlIGEgbG9vayBhdCBpdC4uIGR1cmluZyB0aGUgd2Vla2VuZC4uPGJy Pjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+MjAwOS8xMC8yMyBCaWxsIFRhcnIgPHNwYW4g ZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJtYWlsdG86amF2YXRlc3RjYXNlQHlhaG9vLmNvbSI+amF2 YXRlc3RjYXNlQHlhaG9vLmNvbTwvYT4mZ3Q7PC9zcGFuPjxicj48YmxvY2txdW90ZSBjbGFzcz0i Z21haWxfcXVvdGUiIHN0eWxlPSJib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYigyMDQsIDIwNCwg MjA0KTsgbWFyZ2luOiAwcHQgMHB0IDBwdCAwLjhleDsgcGFkZGluZy1sZWZ0OiAxZXg7Ij4KPGRp dj48ZGl2IHN0eWxlPSJmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IGZv bnQtc2l6ZTogMTJwdDsiPjxkaXY+SSYjMzk7bSBub3Qgc3VyZSB0aGlzIHNob3VsZCBiZSBjb21p dHRlZCB0byB0aGUgdHJ1bmsuPC9kaXY+CjxkaXY+oDwvZGl2Pgo8ZGl2PlVzZXJzoGNhbiYjMzk7 dCB1c2UgdGhpcyBjb2RlIGFzIGlzLCBiZWNhdXNlOjwvZGl2Pgo8ZGl2PqA8L2Rpdj4KPGRpdj4x LiBNYW51YWwvQXV0b21hdGljIGZsdXNoIDwvZGl2Pgo8ZGl2PqCgIC0gdGhleSYjMzk7ZCBuZWVk IHRvIGltcGxlbWVudCBmbHVzaCgpIGFuZCBwZXJzaXN0KCkgaWYgdGhleSBoYXZlIG1hbnVhbCBm bHVzaCBzZXQgdXAuPC9kaXY+CjxkaXY+Mi4gSGliVXRpbCA8L2Rpdj4KPGRpdj6goCAtIGlzIGEg c3lzdGVtIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gbWFuYWdlIFNlc3Npb25GYWN0 b3J5IGFuZCBTZXNzaW9uczwvZGl2Pgo8ZGl2PqCgIC0gc3lzdGVtcyB1c2luZyBIaWJlcm5hdGUg d2lsbCBhbHJlYWR5IGhhdmUgc29tZSB2ZXJzaW9uIG9mIHRoaXMgdGhleSB3aWxsIG5lZWQgdG8g bGV2ZXJhZ2U8L2Rpdj4KPGRpdj6gPC9kaXY+CjxkaXY+c28gdGhpcyBpcyBtb3JlIG9mIGEgdGVt cGxhdGUuoCA8L2Rpdj4KPGRpdj6gPC9kaXY+CjxkaXY+SW4gZmFjdCwgaXQgd29uJiMzOTt0IGNv bXBpbGUgd2l0aG91dCBhIEhpYlV0aWwsIHNvIHRoYXQmIzM5O3MgYW5vdGhlciBwcm9ibGVtIGZv ciBhZGRpbmcgaXQgdG8gdGhlIHRydW5rLi4uPC9kaXY+CjxkaXY+oDwvZGl2Pgo8ZGl2PkEgdGVz dCBjYXNlIGluIGV4YW1wbGVzIHdvdWxkIGxldCB1cyBjcmVhdGUgYSBzaW1wbGUgSGliVXRpbCBh bmQgaGliZXJuYXRlLmNmZy54bWwuPC9kaXY+CjxkaXY+PGJyPlRoZSB0ZXN0IGNhc2UgY291bGQg Y3JlYXRlIGEgSDIgREIgYW5kIHRoZSB0YWJsZXMgbmVlZGVkLi4uPC9kaXY+CjxkaXY+oDwvZGl2 Pgo8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IGZv bnQtc2l6ZTogMTJwdDsiPjxicj4KPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IHRpbWVzIG5ldyBy b21hbixuZXcgeW9yayx0aW1lcyxzZXJpZjsgZm9udC1zaXplOiAxMnB0OyI+PGZvbnQgZmFjZT0i VGFob21hIiBzaXplPSIyIj4KPGhyIHNpemU9IjEiPgo8Yj48c3BhbiBzdHlsZT0iZm9udC13ZWln aHQ6IGJvbGQ7Ij5Gcm9tOjwvc3Bhbj48L2I+IE1hdXJpY2lvIFNhbGF0aW5vICZsdDs8YSBocmVm PSJtYWlsdG86c2FsYWJveUBnbWFpbC5jb20iIHRhcmdldD0iX2JsYW5rIj5zYWxhYm95QGdtYWls LmNvbTwvYT4mZ3Q7PGJyPjxiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPlRvOjwv c3Bhbj48L2I+IFJ1bGVzIFVzZXJzIExpc3QgJmx0OzxhIGhyZWY9Im1haWx0bzpydWxlcy11c2Vy c0BsaXN0cy5qYm9zcy5vcmciIHRhcmdldD0iX2JsYW5rIj5ydWxlcy11c2Vyc0BsaXN0cy5qYm9z cy5vcmc8L2E+Jmd0Ozxicj4KPGI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+U2Vu dDo8L3NwYW4+PC9iPiBGcmksIE9jdG9iZXIgMjMsIDIwMDkgNDoxODoxNiBQTTxicj48Yj48c3Bh biBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TdWJqZWN0Ojwvc3Bhbj48L2I+IFJlOiBbcnVs ZXMtdXNlcnNdIFtkcm9vbHNmbG93XSAtIG9uZSB3YXkgdG8gdXNlIEhpYmVybmF0ZSBtYXBwaW5n IHdpdGggSlBBVmFyaWFibGVQZXJzaXN0ZXI8YnI+CjwvZm9udD48ZGl2PjxkaXY+PC9kaXY+PGRp diBjbGFzcz0iaDUiPjxicj5uaWNlLi4gZG8geW91IG1pbmQgaWYgSSBjb21taXQgaXQgdG8gdGhl IHRydW5rPzxicj5jYW4geW91IGNyZWF0ZSBzb21lIHVuaXQgdGVzdGluZyB0b28/PGJyPjxicj48 YnI+CjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj5PbiBGcmksIE9jdCAyMywgMjAwOSBhdCAzOjI3 IFBNLCBCaWxsIFRhcnIgPHNwYW4gZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJtYWlsdG86amF2YXRl c3RjYXNlQHlhaG9vLmNvbSIgcmVsPSJub2ZvbGxvdyIgdGFyZ2V0PSJfYmxhbmsiPmphdmF0ZXN0 Y2FzZUB5YWhvby5jb208L2E+Jmd0Ozwvc3Bhbj4gd3JvdGU6PGJyPgo8YmxvY2txdW90ZSBzdHls ZT0iYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCByZ2IoMjA0LCAyMDQsIDIwNCk7IG1hcmdpbjogMHB0 IDBwdCAwcHQgMC44ZXg7IHBhZGRpbmctbGVmdDogMWV4OyIgY2xhc3M9ImdtYWlsX3F1b3RlIj5I ZXJlIGlzIGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIEpQQVZhcmlhYmxlUGVyc2lzdGVyIGZvciBw ZW9wbGUgd2hvIGFyZSBhbHJlYWR5IHVzaW5nIEhpYmVybmF0ZSB4bWygbWFwcGluZyBmaWxlcy6g PGJyPgo8YnI+VGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgc29tZSBkb3duc2lkZXMsIGJ1dCBpdCBz ZWVtcyB0byBiZSB3b3JraW5nIGZvciBub3cuPGJyPjxicj5JIGFtIGdvaW5nIHRvIGtlZXAgdXNp bmcgSlBBIHRvIG1hbmFnZSBhbGwgdGhlIERyb29scyBGbG93IHRhYmxlcy48YnI+PGJyPk15IGRv bWFpbiBvYmplY3QgcGVyc2lzdGVuY2Ugd2lsbCBiZSBtYW5hZ2VkIGJ5IEhpYmVybmF0ZSBTZXNz aW9uLqA8YnI+Cjxicj5XZSBhcmUgYWxzbyBjdXJyZW50bHkgdXNpbmcgYXV0b21hdGljIGZsdXNo IChzbyBubyBjb2RlIHRvIHBlcnNpc3QgZG9tYWluIG9iamVjdHMgaW4gdGhpcyBjbGFzcyk8YnI+ PGJyPk9idmlvdXNseSB5b3UgbmVlZCB0byB1c2UgeW91ciBvd24gdmVyc2lvbiBvZiBIaWJVdGls Ljxicj48YnI+aW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOzxicj5pbXBvcnQgamF2YS51 dGlsLmxvZ2dpbmcuTG9nZ2VyOzxicj4KaW1wb3J0IG9yZy5kcm9vbHMucGVyc2lzdGVuY2UucHJv Y2Vzc2luc3RhbmNlLnZhcmlhYmxldHlwZXMuSlBBUGVyc2lzdGVkVmFyaWFibGU7PGJyPmltcG9y dCBvcmcuZHJvb2xzLnBlcnNpc3RlbmNlLnByb2Nlc3NpbnN0YW5jZS52YXJpYWJsZXR5cGVzLlZh cmlhYmxlSW5zdGFuY2VJbmZvOzxicj5pbXBvcnQKIG9yZy5kcm9vbHMucGVyc2lzdGVuY2UucHJv Y2Vzc2luc3RhbmNlLnBlcnNpc3RlcnMuVmFyaWFibGVQZXJzaXN0ZXI7PGJyPmltcG9ydCBvcmcu ZHJvb2xzLnJ1bnRpbWUuRW52aXJvbm1lbnQ7PGJyPmltcG9ydCBvcmcuaGliZXJuYXRlLlNlc3Np b247PGJyPmltcG9ydCBIaWJVdGlsOzxicj4vKio8YnI+oCogVmFyaWF0aW9uIG9uIERyb29scyBK UEEgVmFyaWFibGUgUGVyc2lzdGVyLjxicj4KoCogb3JnLmRyb29scy5wZXJzaXN0ZW5jZS5wcm9j ZXNzaW5zdGFuY2UucGVyc2lzdGVycy5KUEFWYXJpYWJsZVBlcnNpc3Rlcjxicj6gKiBmb3IgdXNp bmcgdmFyaWFibGVzIHBlcnNpc3RlZCBieSBIaWJlcm5hdGUsIHdoaWxlIHN0aWxsIHVzaW5nIEpQ QSB0bzxicj6gKiBwZXJzaXN0IERyb29sc0Zsb3cgZGF0YS48YnI+oCo8YnI+oCogQGF1dGhvciAm bHQ7YSBocmVmPSZxdW90O21haWx0bzo8YSBocmVmPSJtYWlsdG86a3Jpc192ZXJsYWVuZW5AaG90 bWFpbC5jb20iIHJlbD0ibm9mb2xsb3ciIHRhcmdldD0iX2JsYW5rIj5rcmlzX3ZlcmxhZW5lbkBo b3RtYWlsLmNvbTwvYT4mcXVvdDsmZ3Q7S3JpcyBWZXJsYWVuZW4mbHQ7L2EmZ3Q7PGJyPgqgKiBA YXV0aG9yIHNhbGFib3k8YnI+oCovPGJyPnB1YmxpYyBjbGFzcyBKUEFWYXJpYWJsZVBlcnNpc3Rl ckhpYmVybmF0ZSBpbXBsZW1lbnRzIFZhcmlhYmxlUGVyc2lzdGVyIHs8YnI+oHB1YmxpYyBWYXJp YWJsZUluc3RhbmNlSW5mbyBwZXJzaXN0RXh0ZXJuYWxWYXJpYWJsZShTdHJpbmcgbmFtZSwgT2Jq ZWN0IG8sPGJyPqCgoFZhcmlhYmxlSW5zdGFuY2VJbmZvIG9sZFZhbHVlLCBFbnZpcm9ubWVudCBl bnYpCiB7PGJyPqCgoKCgoKCgoKCgoKCgoCBpZihvID09IG51bGwgfHwgKG9sZFZhbHVlICE9IG51 bGwgJmFtcDsmYW1wOyBvbGRWYWx1ZS5nZXRQZXJzaXN0ZXIoKS5lcXVhbHMoJnF1b3Q7JnF1b3Q7 KSkpezxicj6goKCgoKCgoKCgoKCgoKCgoKCgIHJldHVybiBudWxsOzxicj6goKCgoKCgoKCgoKCg oKAgfTxicj6goHRyeSB7PGJyPqCgoEpQQVBlcnNpc3RlZFZhcmlhYmxlIHJlc3VsdCA9IG51bGw7 PGJyPgqgoKBpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgezxi cj6goKCgcmVzdWx0ID0gKEpQQVBlcnNpc3RlZFZhcmlhYmxlKSBvbGRWYWx1ZTs8YnI+oKCgfTxi cj6goKBpZiAocmVzdWx0ID09IG51bGwpIHs8YnI+oKCgoHJlc3VsdCA9IG5ldyBKUEFQZXJzaXN0 ZWRWYXJpYWJsZSgpOzxicj6goKB9PGJyPqCgoExvbmcgaWRWYWx1ZSA9IGdlSGliSWRWYWx1ZShv KTs8YnI+CqCgoHJlc3VsdC5zZXRQZXJzaXN0ZXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7 PGJyPqCgoKCgoKCgoKCgCiByZXN1bHQuc2V0TmFtZShuYW1lKTs8YnI+oKCgcmVzdWx0LnNldEVu dGl0eUlkKGlkVmFsdWUpOzxicj6goKByZXN1bHQuc2V0RW50aXR5KG8pOzxicj6goKByZXN1bHQu c2V0RW50aXR5Q2xhc3Moby5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7PGJyPqCgoKCg oKCgoKCgIHJldHVybiByZXN1bHQ7PGJyPqCgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHs8YnI+oKCg TG9nZ2VyLmdldExvZ2dlcihKUEFWYXJpYWJsZVBlcnNpc3RlckhpYmVybmF0ZS5jbGFzcy5nZXRO YW1lKCkpPGJyPgqgoKCgLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIHQpOzxicj6goKB0aHJvdyBu ZXcgUnVudGltZUV4Y2VwdGlvbigmcXVvdDtDb3VsZCBub3QgcGVyc2lzdCBleHRlcm5hbCB2YXJp YWJsZSZxdW90OywgdCk7PGJyPqCgfTxicj6gfTxicj6gcHVibGljIE9iamVjdCBnZXRFeHRlcm5h bFBlcnNpc3RlZFZhcmlhYmxlKDxicj6goKBWYXJpYWJsZUluc3RhbmNlSW5mbyB2YXJpYWJsZUlu c3RhbmNlSW5mbywgRW52aXJvbm1lbnQgZW52KSB7PGJyPgqgoKCgoKCgIGlmKCgoSlBBUGVyc2lz dGVkVmFyaWFibGUpIHZhcmlhYmxlSW5zdGFuY2VJbmZvKSA9PSBudWxsIHx8ICgoSlBBUGVyc2lz dGVkVmFyaWFibGUpIHZhcmlhYmxlSW5zdGFuY2VJbmZvKS5nZXRFbnRpdHlJZCgpID09IG51bGwp ezxicj6goKCgoKCgoKCgoCByZXR1cm4KIG51bGw7PGJyPqCgoKCgoKAgfTxicj6goKCgoKCgIFN5 c3RlbS5vdXQucHJpbnRsbigmcXVvdDtSZXN0b3JpbmcgSlBBUGVyc2lzdGVkVmFyaWFibGUgaWQ9 JnF1b3Q7ICsgKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgdmFyaWFibGVJbnN0YW5jZUluZm8pLmdl dElkKCkgKyAmcXVvdDsgZW50aXR5SWQ9JnF1b3Q7ICsgKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkg dmFyaWFibGVJbnN0YW5jZUluZm8pLmdldEVudGl0eUlkKCkgKyAmcXVvdDsgY2xhc3M9JnF1b3Q7 ICsgKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgdmFyaWFibGVJbnN0YW5jZUluZm8pLmdldEVudGl0 eUNsYXNzKCkgKyAmcXVvdDsgdmFsdWU9JnF1b3Q7ICsgKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkg dmFyaWFibGVJbnN0YW5jZUluZm8pLmdldEVudGl0eSgpKTs8YnI+CqCgU3RyaW5nIHZhclR5cGUg PSAoKEpQQVBlcnNpc3RlZFZhcmlhYmxlKSB2YXJpYWJsZUluc3RhbmNlSW5mbykuZ2V0RW50aXR5 Q2xhc3MoKTs8YnI+oKCgoKCgoDxicj6goKCgoKCgIE9iamVjdCBvYmogPSBIaWJVdGlsLmdldEN1 cnJlbnRTZXNzaW9uKCkuZ2V0KHZhclR5cGUsICgoSlBBUGVyc2lzdGVkVmFyaWFibGUpIHZhcmlh YmxlSW5zdGFuY2VJbmZvKS5nZXRFbnRpdHlJZCgpKTs8YnI+CqCgoKCgoKAgSGliVXRpbC5jbG9z ZUN1cnJlbnRTZXNzaW9uKCk7PGJyPqCgoKCgoKAgcmV0dXJuIG9iajs8YnI+oH08YnI+LyoqPGJy PqAqIEhpYmVybmF0ZSBsb29rdXAgdG8gZ2V0IElEIGNvbHVtbi48YnI+oCogQHBhcmFtIG8gRHRv CiB0byBsb29rIHVwLjxicj6gKiBAcmV0dXJuIExvbmcgaWQuPGJyPqAqLzxicj6gcHJpdmF0ZSBM b25nIGdlSGliSWRWYWx1ZShPYmplY3QgbymgIHs8YnI+oKCgoKCgoCBTZXNzaW9uIHNlc3Npb24g PSBIaWJVdGlsLmdldEN1cnJlbnRTZXNzaW9uKCk7PGJyPqCgoKCgoKAgcmV0dXJuIChMb25nKSBz ZXNzaW9uLmdldElkZW50aWZpZXIobyk7PGJyPqB9PGJyPn2gPGJyPjxicj48YnI+PGJyPgo8YnI+ X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX188YnI+cnVsZXMt dXNlcnMgbWFpbGluZyBsaXN0PGJyPjxhIGhyZWY9Im1haWx0bzpydWxlcy11c2Vyc0BsaXN0cy5q Ym9zcy5vcmciIHJlbD0ibm9mb2xsb3ciIHRhcmdldD0iX2JsYW5rIj5ydWxlcy11c2Vyc0BsaXN0 cy5qYm9zcy5vcmc8L2E+PGJyPjxhIGhyZWY9Imh0dHBzOi8vbGlzdHMuamJvc3Mub3JnL21haWxt YW4vbGlzdGluZm8vcnVsZXMtdXNlcnMiIHJlbD0ibm9mb2xsb3ciIHRhcmdldD0iX2JsYW5rIj5o dHRwczovL2xpc3RzLmpib3NzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3J1bGVzLXVzZXJzPC9hPjxi cj4KPC9ibG9ja3F1b3RlPjwvZGl2Pjxicj48YnIgY2xlYXI9ImFsbCI+PGJyPi0tIDxicj4tIDxh IGhyZWY9Imh0dHA6Ly9zYWxhYm95LndvcmRwcmVzcy5jb20iIHRhcmdldD0iX2JsYW5rIj5odHRw Oi8vc2FsYWJveS53b3JkcHJlc3MuY29tPC9hPjxicj4tIDxhIGhyZWY9Imh0dHA6Ly93d3cuamJ1 Zy5jb20uYXIiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LmpidWcuY29tLmFyPC9hPjxicj4K LSBTYWxhdGlubyAmcXVvdDtTYWxhYm95JnF1b3Q7IE1hdXJpY2lvIC08YnI+PC9kaXY+PC9kaXY+ PC9kaXY+PC9kaXY+PC9kaXY+PGJyPgoKICAgICAgPC9kaXY+PGJyPl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPGJyPgpydWxlcy11c2VycyBtYWlsaW5nIGxp c3Q8YnI+CjxhIGhyZWY9Im1haWx0bzpydWxlcy11c2Vyc0BsaXN0cy5qYm9zcy5vcmciPnJ1bGVz LXVzZXJzQGxpc3RzLmpib3NzLm9yZzwvYT48YnI+CjxhIGhyZWY9Imh0dHBzOi8vbGlzdHMuamJv c3Mub3JnL21haWxtYW4vbGlzdGluZm8vcnVsZXMtdXNlcnMiIHRhcmdldD0iX2JsYW5rIj5odHRw czovL2xpc3RzLmpib3NzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3J1bGVzLXVzZXJzPC9hPjxicj4K PGJyPjwvYmxvY2txdW90ZT48L2Rpdj48YnI+PGJyIGNsZWFyPSJhbGwiPjxicj4tLSA8YnI+IC0g PGEgaHJlZj0iaHR0cDovL3NhbGFib3kud29yZHByZXNzLmNvbSI+aHR0cDovL3NhbGFib3kud29y ZHByZXNzLmNvbTwvYT48YnI+IC0gPGEgaHJlZj0iaHR0cDovL3d3dy5qYnVnLmNvbS5hciI+aHR0 cDovL3d3dy5qYnVnLmNvbS5hcjwvYT48YnI+IC0gU2FsYXRpbm8gJnF1b3Q7U2FsYWJveSZxdW90 OyBNYXVyaWNpbyAtPGJyPgoK --===============1091306278441686361==--