From jira at ovirt-jira.atlassian.net Sun Jan 14 06:46:27 2018 Content-Type: multipart/mixed; boundary="===============3754764548377355454==" MIME-Version: 1.0 From: Barak Korren (oVirt JIRA) To: infra at ovirt.org Subject: [JIRA] (OVIRT-1845) Removing build jobs makes change-queue fail with an exception Date: Sun, 14 Jan 2018 06:46:25 +0000 Message-ID: In-Reply-To: JIRA.33393.1515912384000@Atlassian.JIRA --===============3754764548377355454== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multi-part message in MIME format... ------------=3D_1515912385-18534-219 Content-Type: text/plain; charset=3DUTF-8 Content-Transfer-Encoding: 7bit Barak Korren created OVIRT-1845: ----------------------------------- Summary: Removing build jobs makes change-queue fail with an e= xception = Key: OVIRT-1845 URL: https://ovirt-jira.atlassian.net/browse/OVIRT-1845 Project: oVirt - virtualization made easy Issue Type: Bug Components: Change Queue Reporter: Barak Korren Assignee: infra Priority: Highest When changes are added to the change queue, it records the build jobs that = build artifacts for changed code. If the build jobs are removed between the time the change is added to the q= ueue and the time a tested jobs including that change is started, the code = checking for completion of the build jobs would fail with an exception look= ing like the following: {code} java.lang.NullPointerException: Cannot invoke method getBuild() on null obj= ect at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaCla= ssSite.java:48) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSite= Array.java:48) at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.jav= a:35) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSite= Array.java:48) at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaCla= ssSite.java:52) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCall= Site.java:125) at Script1$_all_builds_done_closure4.doCall(Script1.groovy:265) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.ja= va:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccesso= rImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(Clo= sureMetaClass.java:294) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022) {code} '{{Script1}}' in this stack trace refers to our '{{change-queue-tester.groo= vy}}' script. Relevant code section is the following: {code} @NonCPS def all_builds_done(builds) { return !builds.any { if(Jenkins.instance.getItem(it.job_name).getBuild(it.build_id).isBu= ilding()) { print("${it.job_name} (${it.build_id}) still building") return true } return false } } {code} The issue it with not checking for '{{null}}' return from the '{{Jenkins.in= stance.getItem(it.job_name)}}' funcntion call. We should probably check for '{{null}}' there and just ignore it. Similar c= heck will probably be needed in other places in the code like for example w= hen composing the '{{extra-sources}}' file from the build job URLs. = -- This message was sent by Atlassian Jira (v1001.0.0-SNAPSHOT#100075) ------------=3D_1515912385-18534-219 Content-Type: text/html; charset=3D"UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 7bit

Barak Korren created OVIRT-1845:

   Summary: Removing build jobs makes change-queue fail with an except=
ion
       Key: OVIRT-1845
       URL: https://ovirt-jira.atlassian.net/browse/OVIRT-1845
   Project: oVirt - virtualization made easy
Issue Type: Bug
Components: Change Queue
  Reporter: Barak Korren
  Assignee: infra
  Priority: Highest

When changes are added to the change queue, it records the build jobs th= at build artifacts for changed code.

If the build jobs are removed between the time the change is added to th= e queue and the time a tested jobs including that change is started, the co= de checking for completion of the build jobs would fail with an exception l= ooking like the following:

{code} java.lang.NullPointerException: Cannot invoke method getBuild() o= n null object

at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java=
:91)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClas=
sSite.java:48)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteA=
rray.java:48)
at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java=
:35)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteA=
rray.java:48)
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClas=
sSite.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallS=
ite.java:125)
at Script1$_all_builds_done_closure4.doCall(Script1.groovy:265)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav=
a:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor=
Impl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(Clos=
ureMetaClass.java:294)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)

{code}

‘{{Script1}}’ in this stack trace refers to our ‘{{cha= nge-queue-tester.groovy}}’ script. Relevant code section is the follo= wing:

{code} @NonCPS def all_builds_done(builds) {

    return !builds.any {
        if(Jenkins.instance.getItem(it.job_name).getBuild(it.build_id).isBu=
ilding()) {
print("${it.job_name} (${it.build_id}) still building")
return true
        }
        return false
    }

} {code}

The issue it with not checking for ‘{{null}}’ return from th= e ‘{{Jenkins.instance.getItem(it.job_name)}}’ funcntion call.

We should probably check for ‘{{null}}’ there and just ignor= e it. Similar check will probably be needed in other places in the code lik= e for example when composing the ‘{{extra-sources}}’ file from = the build job URLs.

— This message was sent by Atlassian Jira (v1001.0.0-SNAPSHOT#1000= 75)

3D"" ------------=3D_1515912385-18534-219-- --===============3754764548377355454== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4uLgoKLS0tLS0tLS0t LS0tPV8xNTE1OTEyMzg1LTE4NTM0LTIxOQpDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJz ZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAoKQmFyYWsgS29ycmVuIGNy ZWF0ZWQgT1ZJUlQtMTg0NToKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAg ICAgICAgICAgICBTdW1tYXJ5OiBSZW1vdmluZyBidWlsZCBqb2JzIG1ha2VzIGNoYW5nZS1xdWV1 ZSBmYWlsIHdpdGggYW4gZXhjZXB0aW9uIAogICAgICAgICAgICAgICAgIEtleTogT1ZJUlQtMTg0 NQogICAgICAgICAgICAgICAgIFVSTDogaHR0cHM6Ly9vdmlydC1qaXJhLmF0bGFzc2lhbi5uZXQv YnJvd3NlL09WSVJULTE4NDUKICAgICAgICAgICAgIFByb2plY3Q6IG9WaXJ0IC0gdmlydHVhbGl6 YXRpb24gbWFkZSBlYXN5CiAgICAgICAgICBJc3N1ZSBUeXBlOiBCdWcKICAgICAgICAgIENvbXBv bmVudHM6IENoYW5nZSBRdWV1ZQogICAgICAgICAgICBSZXBvcnRlcjogQmFyYWsgS29ycmVuCiAg ICAgICAgICAgIEFzc2lnbmVlOiBpbmZyYQogICAgICAgICAgICBQcmlvcml0eTogSGlnaGVzdAoK CldoZW4gY2hhbmdlcyBhcmUgYWRkZWQgdG8gdGhlIGNoYW5nZSBxdWV1ZSwgaXQgcmVjb3JkcyB0 aGUgYnVpbGQgam9icyB0aGF0IGJ1aWxkIGFydGlmYWN0cyBmb3IgY2hhbmdlZCBjb2RlLgoKSWYg dGhlIGJ1aWxkIGpvYnMgYXJlIHJlbW92ZWQgYmV0d2VlbiB0aGUgdGltZSB0aGUgY2hhbmdlIGlz IGFkZGVkIHRvIHRoZSBxdWV1ZSBhbmQgdGhlIHRpbWUgYSB0ZXN0ZWQgam9icyBpbmNsdWRpbmcg dGhhdCBjaGFuZ2UgaXMgc3RhcnRlZCwgdGhlIGNvZGUgY2hlY2tpbmcgZm9yIGNvbXBsZXRpb24g b2YgdGhlIGJ1aWxkIGpvYnMgd291bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbiBsb29raW5nIGxp a2UgdGhlIGZvbGxvd2luZzoKCntjb2RlfQpqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb246 IENhbm5vdCBpbnZva2UgbWV0aG9kIGdldEJ1aWxkKCkgb24gbnVsbCBvYmplY3QKCWF0IG9yZy5j b2RlaGF1cy5ncm9vdnkucnVudGltZS5OdWxsT2JqZWN0Lmludm9rZU1ldGhvZChOdWxsT2JqZWN0 LmphdmE6OTEpCglhdCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuY2FsbHNpdGUuUG9nb01l dGFDbGFzc1NpdGUuY2FsbChQb2dvTWV0YUNsYXNzU2l0ZS5qYXZhOjQ4KQoJYXQgb3JnLmNvZGVo YXVzLmdyb292eS5ydW50aW1lLmNhbGxzaXRlLkNhbGxTaXRlQXJyYXkuZGVmYXVsdENhbGwoQ2Fs bFNpdGVBcnJheS5qYXZhOjQ4KQoJYXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLmNhbGxz aXRlLk51bGxDYWxsU2l0ZS5jYWxsKE51bGxDYWxsU2l0ZS5qYXZhOjM1KQoJYXQgb3JnLmNvZGVo YXVzLmdyb292eS5ydW50aW1lLmNhbGxzaXRlLkNhbGxTaXRlQXJyYXkuZGVmYXVsdENhbGwoQ2Fs bFNpdGVBcnJheS5qYXZhOjQ4KQoJYXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLmNhbGxz aXRlLlBvam9NZXRhQ2xhc3NTaXRlLmNhbGwoUG9qb01ldGFDbGFzc1NpdGUuamF2YTo1MikKCWF0 IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5jYWxsc2l0ZS5BYnN0cmFjdENhbGxTaXRlLmNh bGwoQWJzdHJhY3RDYWxsU2l0ZS5qYXZhOjEyNSkKCWF0IFNjcmlwdDEkX2FsbF9idWlsZHNfZG9u ZV9jbG9zdXJlNC5kb0NhbGwoU2NyaXB0MS5ncm9vdnk6MjY1KQoJYXQgc3VuLnJlZmxlY3QuTmF0 aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZTAoTmF0aXZlIE1ldGhvZCkKCWF0IHN1bi5yZWZs ZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoTmF0aXZlTWV0aG9kQWNjZXNzb3JJ bXBsLmphdmE6NjIpCglhdCBzdW4ucmVmbGVjdC5EZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBs Lmludm9rZShEZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsLmphdmE6NDMpCglhdCBqYXZhLmxh bmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjQ5OCkKCWF0IG9yZy5jb2RlaGF1 cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRNZXRob2QuaW52b2tlKENhY2hlZE1ldGhvZC5qYXZh OjkzKQoJYXQgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZC5kb01ldGhvZEludm9rZShNZXRhTWV0aG9k LmphdmE6MzI1KQoJYXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5DbG9z dXJlTWV0YUNsYXNzLmludm9rZU1ldGhvZChDbG9zdXJlTWV0YUNsYXNzLmphdmE6Mjk0KQoJYXQg Z3Jvb3Z5LmxhbmcuTWV0YUNsYXNzSW1wbC5pbnZva2VNZXRob2QoTWV0YUNsYXNzSW1wbC5qYXZh OjEwMjIpCntjb2RlfQoKJ3t7U2NyaXB0MX19JyBpbiB0aGlzIHN0YWNrIHRyYWNlIHJlZmVycyB0 byBvdXIgJ3t7Y2hhbmdlLXF1ZXVlLXRlc3Rlci5ncm9vdnl9fScgc2NyaXB0LiBSZWxldmFudCBj b2RlIHNlY3Rpb24gaXMgdGhlIGZvbGxvd2luZzoKCntjb2RlfQpATm9uQ1BTCmRlZiBhbGxfYnVp bGRzX2RvbmUoYnVpbGRzKSB7CiAgICByZXR1cm4gIWJ1aWxkcy5hbnkgewogICAgICAgIGlmKEpl bmtpbnMuaW5zdGFuY2UuZ2V0SXRlbShpdC5qb2JfbmFtZSkuZ2V0QnVpbGQoaXQuYnVpbGRfaWQp LmlzQnVpbGRpbmcoKSkgewogICAgICAgICAgICBwcmludCgiJHtpdC5qb2JfbmFtZX0gKCR7aXQu YnVpbGRfaWR9KSBzdGlsbCBidWlsZGluZyIpCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAg ICAgfQogICAgICAgIHJldHVybiBmYWxzZQogICAgfQp9Cntjb2RlfQoKVGhlIGlzc3VlIGl0IHdp dGggbm90IGNoZWNraW5nIGZvciAne3tudWxsfX0nIHJldHVybiBmcm9tIHRoZSAne3tKZW5raW5z Lmluc3RhbmNlLmdldEl0ZW0oaXQuam9iX25hbWUpfX0nIGZ1bmNudGlvbiBjYWxsLgoKV2Ugc2hv dWxkIHByb2JhYmx5IGNoZWNrIGZvciAne3tudWxsfX0nIHRoZXJlIGFuZCBqdXN0IGlnbm9yZSBp dC4gU2ltaWxhciBjaGVjayB3aWxsIHByb2JhYmx5IGJlIG5lZWRlZCBpbiBvdGhlciBwbGFjZXMg aW4gdGhlIGNvZGUgbGlrZSBmb3IgZXhhbXBsZSB3aGVuIGNvbXBvc2luZyB0aGUgJ3t7ZXh0cmEt c291cmNlc319JyBmaWxlIGZyb20gdGhlIGJ1aWxkIGpvYiBVUkxzLiAgCgoKCgotLQpUaGlzIG1l c3NhZ2Ugd2FzIHNlbnQgYnkgQXRsYXNzaWFuIEppcmEKKHYxMDAxLjAuMC1TTkFQU0hPVCMxMDAw NzUpCgotLS0tLS0tLS0tLS09XzE1MTU5MTIzODUtMTg1MzQtMjE5CkNvbnRlbnQtVHlwZTogdGV4 dC9odG1sOyBjaGFyc2V0PSJVVEYtOCIKQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCkNvbnRl bnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKCjxodG1sPjxib2R5Pgo8aDM+QmFyYWsgS29ycmVu IGNyZWF0ZWQgT1ZJUlQtMTg0NTo8L2gzPgo8cHJlPiAgIFN1bW1hcnk6IFJlbW92aW5nIGJ1aWxk IGpvYnMgbWFrZXMgY2hhbmdlLXF1ZXVlIGZhaWwgd2l0aCBhbiBleGNlcHRpb24KICAgICAgIEtl eTogT1ZJUlQtMTg0NQogICAgICAgVVJMOiBodHRwczovL292aXJ0LWppcmEuYXRsYXNzaWFuLm5l dC9icm93c2UvT1ZJUlQtMTg0NQogICBQcm9qZWN0OiBvVmlydCAtIHZpcnR1YWxpemF0aW9uIG1h ZGUgZWFzeQpJc3N1ZSBUeXBlOiBCdWcKQ29tcG9uZW50czogQ2hhbmdlIFF1ZXVlCiAgUmVwb3J0 ZXI6IEJhcmFrIEtvcnJlbgogIEFzc2lnbmVlOiBpbmZyYQogIFByaW9yaXR5OiBIaWdoZXN0PC9w cmU+CjxwPldoZW4gY2hhbmdlcyBhcmUgYWRkZWQgdG8gdGhlIGNoYW5nZSBxdWV1ZSwgaXQgcmVj b3JkcyB0aGUgYnVpbGQgam9icyB0aGF0IGJ1aWxkIGFydGlmYWN0cyBmb3IgY2hhbmdlZCBjb2Rl LjwvcD4KPHA+SWYgdGhlIGJ1aWxkIGpvYnMgYXJlIHJlbW92ZWQgYmV0d2VlbiB0aGUgdGltZSB0 aGUgY2hhbmdlIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSBhbmQgdGhlIHRpbWUgYSB0ZXN0ZWQgam9i cyBpbmNsdWRpbmcgdGhhdCBjaGFuZ2UgaXMgc3RhcnRlZCwgdGhlIGNvZGUgY2hlY2tpbmcgZm9y IGNvbXBsZXRpb24gb2YgdGhlIGJ1aWxkIGpvYnMgd291bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlv biBsb29raW5nIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+CjxwPntjb2RlfSBqYXZhLmxhbmcuTnVs bFBvaW50ZXJFeGNlcHRpb246IENhbm5vdCBpbnZva2UgbWV0aG9kIGdldEJ1aWxkKCkgb24gbnVs bCBvYmplY3Q8L3A+CjxwcmU+YXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk51bGxPYmpl Y3QuaW52b2tlTWV0aG9kKE51bGxPYmplY3QuamF2YTo5MSkKYXQgb3JnLmNvZGVoYXVzLmdyb292 eS5ydW50aW1lLmNhbGxzaXRlLlBvZ29NZXRhQ2xhc3NTaXRlLmNhbGwoUG9nb01ldGFDbGFzc1Np dGUuamF2YTo0OCkKYXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLmNhbGxzaXRlLkNhbGxT aXRlQXJyYXkuZGVmYXVsdENhbGwoQ2FsbFNpdGVBcnJheS5qYXZhOjQ4KQphdCBvcmcuY29kZWhh dXMuZ3Jvb3Z5LnJ1bnRpbWUuY2FsbHNpdGUuTnVsbENhbGxTaXRlLmNhbGwoTnVsbENhbGxTaXRl LmphdmE6MzUpCmF0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5jYWxsc2l0ZS5DYWxsU2l0 ZUFycmF5LmRlZmF1bHRDYWxsKENhbGxTaXRlQXJyYXkuamF2YTo0OCkKYXQgb3JnLmNvZGVoYXVz Lmdyb292eS5ydW50aW1lLmNhbGxzaXRlLlBvam9NZXRhQ2xhc3NTaXRlLmNhbGwoUG9qb01ldGFD bGFzc1NpdGUuamF2YTo1MikKYXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLmNhbGxzaXRl LkFic3RyYWN0Q2FsbFNpdGUuY2FsbChBYnN0cmFjdENhbGxTaXRlLmphdmE6MTI1KQphdCBTY3Jp cHQxJF9hbGxfYnVpbGRzX2RvbmVfY2xvc3VyZTQuZG9DYWxsKFNjcmlwdDEuZ3Jvb3Z5OjI2NSkK YXQgc3VuLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZTAoTmF0aXZlIE1l dGhvZCkKYXQgc3VuLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmludm9rZShOYXRp dmVNZXRob2RBY2Nlc3NvckltcGwuamF2YTo2MikKYXQgc3VuLnJlZmxlY3QuRGVsZWdhdGluZ01l dGhvZEFjY2Vzc29ySW1wbC5pbnZva2UoRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5qYXZh OjQzKQphdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjQ5OCkK YXQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZE1ldGhvZC5pbnZva2UoQ2Fj aGVkTWV0aG9kLmphdmE6OTMpCmF0IGdyb292eS5sYW5nLk1ldGFNZXRob2QuZG9NZXRob2RJbnZv a2UoTWV0YU1ldGhvZC5qYXZhOjMyNSkKYXQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1l dGFjbGFzcy5DbG9zdXJlTWV0YUNsYXNzLmludm9rZU1ldGhvZChDbG9zdXJlTWV0YUNsYXNzLmph dmE6Mjk0KQphdCBncm9vdnkubGFuZy5NZXRhQ2xhc3NJbXBsLmludm9rZU1ldGhvZChNZXRhQ2xh c3NJbXBsLmphdmE6MTAyMik8L3ByZT4KPHA+e2NvZGV9PC9wPgo8cD4mbHNxdW87e3tTY3JpcHQx fX0mcnNxdW87IGluIHRoaXMgc3RhY2sgdHJhY2UgcmVmZXJzIHRvIG91ciAmbHNxdW87e3tjaGFu Z2UtcXVldWUtdGVzdGVyLmdyb292eX19JnJzcXVvOyBzY3JpcHQuIFJlbGV2YW50IGNvZGUgc2Vj dGlvbiBpcyB0aGUgZm9sbG93aW5nOjwvcD4KPHA+e2NvZGV9IEBOb25DUFMgZGVmIGFsbF9idWls ZHNfZG9uZShidWlsZHMpIHs8L3A+CjxwcmU+ICAgIHJldHVybiAhYnVpbGRzLmFueSB7CiAgICAg ICAgaWYoSmVua2lucy5pbnN0YW5jZS5nZXRJdGVtKGl0LmpvYl9uYW1lKS5nZXRCdWlsZChpdC5i dWlsZF9pZCkuaXNCdWlsZGluZygpKSB7CnByaW50KCIke2l0LmpvYl9uYW1lfSAoJHtpdC5idWls ZF9pZH0pIHN0aWxsIGJ1aWxkaW5nIikKcmV0dXJuIHRydWUKICAgICAgICB9CiAgICAgICAgcmV0 dXJuIGZhbHNlCiAgICB9PC9wcmU+CjxwPn0ge2NvZGV9PC9wPgo8cD5UaGUgaXNzdWUgaXQgd2l0 aCBub3QgY2hlY2tpbmcgZm9yICZsc3F1bzt7e251bGx9fSZyc3F1bzsgcmV0dXJuIGZyb20gdGhl ICZsc3F1bzt7e0plbmtpbnMuaW5zdGFuY2UuZ2V0SXRlbShpdC5qb2JfbmFtZSl9fSZyc3F1bzsg ZnVuY250aW9uIGNhbGwuPC9wPgo8cD5XZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgZm9yICZsc3F1 bzt7e251bGx9fSZyc3F1bzsgdGhlcmUgYW5kIGp1c3QgaWdub3JlIGl0LiBTaW1pbGFyIGNoZWNr IHdpbGwgcHJvYmFibHkgYmUgbmVlZGVkIGluIG90aGVyIHBsYWNlcyBpbiB0aGUgY29kZSBsaWtl IGZvciBleGFtcGxlIHdoZW4gY29tcG9zaW5nIHRoZSAmbHNxdW87e3tleHRyYS1zb3VyY2VzfX0m cnNxdW87IGZpbGUgZnJvbSB0aGUgYnVpbGQgam9iIFVSTHMuPC9wPgo8cD4mbWRhc2g7IFRoaXMg bWVzc2FnZSB3YXMgc2VudCBieSBBdGxhc3NpYW4gSmlyYSAodjEwMDEuMC4wLVNOQVBTSE9UIzEw MDA3NSk8L3A+Cgo8aW1nIHNyYz0iaHR0cHM6Ly91NDA0MzQwMi5jdC5zZW5kZ3JpZC5uZXQvd2Yv b3Blbj91cG49aTVUTVdHVjk5YW1KYk54SnBTcDItMkJKMzNCU00zdHVpVWZSVGs2NEstMkJPakdw Ri0yQnVNem9KUlJCMWlmelpJRXJ0SXhUY2NMeTUyMXp6N094WlZpQjVtbnBiYndZSkZ6NmZsZ2V2 WE96VUpWSC0yRnFCcXZjcXFxS0lwM3A0T2N5REZPc1J3dmFMazFyN1g4SnBMRWJiWXRRLTJGOHNl LTJGQW9HM05xTXk2TUVGOTYwZk00V0NmQXJJUGlwREF4VjNJOVF0RHh3SVprZU5XRDl5QXBQc2RK cmEzVjROVDdoSU9vVGlmNDZoTjlBMk5hLTJCSXNlSG5nU1NPenJTUG84N1hzNWRsVE9wd0FDeW1Q dndsUDExa2xxLTJGV3JUblVlRVRJalJwRHoyZ3JIdGs5SUkwUWh6NDNjMVZWeW1UbE8tMkY0a2hU VFl5bXA4elJlT1oxbFNjVFl4VXYwQUlUMmdUamRkUEVUTDlxYmhMZVJnMW4zZzdVaGNybGlMY0xH WWdXbEhidDRFcU14U3BUZ0FrcE42YVJuUjgtMkYxMXVXSTN3S1puUVM1Ni0yQlRUenE2SHlTNDBX RUVHYk1xcTRhSkc5bmRiVjhTeUhCYjciIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBib3Jk ZXI9IjAiIHN0eWxlPSJoZWlnaHQ6MXB4ICFpbXBvcnRhbnQ7d2lkdGg6MXB4ICFpbXBvcnRhbnQ7 Ym9yZGVyLXdpZHRoOjAgIWltcG9ydGFudDttYXJnaW4tdG9wOjAgIWltcG9ydGFudDttYXJnaW4t Ym90dG9tOjAgIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6MCAhaW1wb3J0YW50O21hcmdpbi1sZWZ0 OjAgIWltcG9ydGFudDtwYWRkaW5nLXRvcDowICFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MCAh aW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MCAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDowICFpbXBv cnRhbnQ7Ii8+CjwvYm9keT48L2h0bWw+CgotLS0tLS0tLS0tLS09XzE1MTU5MTIzODUtMTg1MzQt MjE5LS0K --===============3754764548377355454==--