<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>31554</bug_id>
          
          <creation_ts>2009-11-16 08:06:13 -0800</creation_ts>
          <short_desc>[Android] Android is missing the implementation of the GeolocationService iface.</short_desc>
          <delta_ts>2009-11-17 05:13:32 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Andrei Popescu">andreip</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>android-webkit-unforking</cc>
    
    <cc>benm</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>163992</commentid>
    <comment_count>0</comment_count>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2009-11-16 08:06:13 -0800</bug_when>
    <thetext>Each port of WebKit that wants to support Geolocation must implement the GeolocationService interface. So Android needs one too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163997</commentid>
    <comment_count>1</comment_count>
      <attachid>43308</attachid>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2009-11-16 08:16:16 -0800</bug_when>
    <thetext>Created attachment 43308
Android implementation of the GeolocationService implementation

The corresponding code in the Android source tree can be found at

http://android.git.kernel.org/?p=platform/external/webkit.git;a=tree;f=WebCore/platform/android;h=b66c3277d6de15bd67218256deeafa72925b557d;hb=refs/heads/eclair</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164005</commentid>
    <comment_count>2</comment_count>
      <attachid>43308</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-11-16 09:15:04 -0800</bug_when>
    <thetext>Comment on attachment 43308
Android implementation of the GeolocationService implementation

&gt; +// GeolocationServiceBridge is the bridge to the Java implementation. It manages
&gt; +// the lifetime of the Java object. It is an implementation detail of
&gt; +// GeolocationServiceAndroid.
&gt; +class GeolocationServiceBridge {

Can you split this out into a separate file?

&gt; +    static PassRefPtr&lt;Geoposition&gt; convertLocationToGeoposition(JNIEnv *env, const jobject &amp;location);

toGeoposition is shorter and more inline with the WebKit convention.

&gt; +static const char* kJavaGeolocationServiceClass = &quot;android/webkit/GeolocationService&quot;;

prefix k* is not necessary, just use standard camelCase.

&gt; +enum kJavaGeolocationServiceClassMethods {
&gt; +    GEOLOCATION_SERVICE_METHOD_INIT = 0,

GeolocationServiceMethodInit &lt;-- casing here and elsewhere

&gt; +    GEOLOCATION_SERVICE_METHOD_START,
&gt; +    GEOLOCATION_SERVICE_METHOD_STOP,
&gt; +    GEOLOCATION_SERVICE_METHOD_SET_ENABLE_GPS,
&gt; +    GEOLOCATION_SERVICE_METHOD_COUNT,
&gt; +};</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164029</commentid>
    <comment_count>3</comment_count>
      <attachid>43314</attachid>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2009-11-16 10:48:53 -0800</bug_when>
    <thetext>Created attachment 43314
Android implementation of the GeolocationService implementation v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164030</commentid>
    <comment_count>4</comment_count>
      <attachid>43315</attachid>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2009-11-16 10:52:37 -0800</bug_when>
    <thetext>Created attachment 43315
Android implementation of the GeolocationService implementation v2

The previous patch was missing new lines at the end of the new files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164032</commentid>
    <comment_count>5</comment_count>
    <who name="Andrei Popescu">andreip</who>
    <bug_when>2009-11-16 10:54:59 -0800</bug_when>
    <thetext>Thanks Dimitri,

(In reply to comment #2)
&gt; (From update of attachment 43308 [details])
&gt; &gt; +// GeolocationServiceBridge is the bridge to the Java implementation. It manages
&gt; &gt; +// the lifetime of the Java object. It is an implementation detail of
&gt; &gt; +// GeolocationServiceAndroid.
&gt; &gt; +class GeolocationServiceBridge {
&gt; 
&gt; Can you split this out into a separate file?
&gt; 

Sure, done.

&gt; &gt; +    static PassRefPtr&lt;Geoposition&gt; convertLocationToGeoposition(JNIEnv *env, const jobject &amp;location);
&gt; 
&gt; toGeoposition is shorter and more inline with the WebKit convention.
&gt;

Indeed. Changed.
 
&gt; &gt; +static const char* kJavaGeolocationServiceClass = &quot;android/webkit/GeolocationService&quot;;
&gt; 
&gt; prefix k* is not necessary, just use standard camelCase.
&gt; 

Done.

&gt; &gt; +enum kJavaGeolocationServiceClassMethods {
&gt; &gt; +    GEOLOCATION_SERVICE_METHOD_INIT = 0,
&gt; 
&gt; GeolocationServiceMethodInit &lt;-- casing here and elsewhere
&gt;

Fixed.
 
Andrei</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164034</commentid>
    <comment_count>6</comment_count>
      <attachid>43315</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-11-16 11:09:48 -0800</bug_when>
    <thetext>Comment on attachment 43315
Android implementation of the GeolocationService implementation v2

looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164193</commentid>
    <comment_count>7</comment_count>
      <attachid>43315</attachid>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-11-17 04:28:20 -0800</bug_when>
    <thetext>Comment on attachment 43315
Android implementation of the GeolocationService implementation v2

Will land this manually as the commit queue is currently disabled.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164203</commentid>
    <comment_count>8</comment_count>
    <who name="Ben Murdoch">benm</who>
    <bug_when>2009-11-17 05:13:32 -0800</bug_when>
    <thetext>Landed as r51071.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43308</attachid>
            <date>2009-11-16 08:16:16 -0800</date>
            <delta_ts>2009-11-16 10:48:53 -0800</delta_ts>
            <desc>Android implementation of the GeolocationService implementation</desc>
            <filename>31544.patch</filename>
            <type>text/plain</type>
            <size>23135</size>
            <attacher name="Andrei Popescu">andreip</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MTAzOCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDEgQEAKKzIwMDktMTEtMTYgIEFuZHJlaSBQb3Blc2N1ICA8YW5kcmVpcEBnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtBbmRyb2lkXSBBbmRyb2lkIGlzIG1pc3NpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBH
ZW9sb2NhdGlvblNlcnZpY2UgaWZhY2UuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zMTU1NAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyByZXF1aXJlZCBh
cyB0aGlzIGlzIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9h
bmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Okdl
b2xvY2F0aW9uU2VydmljZUJyaWRnZSk6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNl
cnZpY2VCcmlkZ2U6On5HZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UpOgorICAgICAgICAoV2ViQ29y
ZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpH
ZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6OnN0b3ApOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9j
YXRpb25TZXJ2aWNlQnJpZGdlOjpzZXRFbmFibGVHcHMpOgorICAgICAgICAoV2ViQ29yZTo6R2Vv
bG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpuZXdMb2NhdGlvbkF2YWlsYWJsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Om5ld0Vycm9yQXZhaWxhYmxlKToKKyAg
ICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6Y29udmVydExvY2F0aW9u
VG9HZW9wb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VCcmlk
Z2U6OnN0YXJ0SmF2YUltcGxlbWVudGF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0
aW9uU2VydmljZUJyaWRnZTo6c3RvcEphdmFJbXBsZW1lbnRhdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZCk6
CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpzdGFydFVwZGF0
aW5nKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OnN0b3BV
cGRhdGluZyk6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpz
dXNwZW5kKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OnJl
c3VtZSk6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpuZXdQ
b3NpdGlvbkF2YWlsYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VB
bmRyb2lkOjpuZXdFcnJvckF2YWlsYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlv
blNlcnZpY2VBbmRyb2lkOjp0aW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0
aW9uU2VydmljZUFuZHJvaWQ6OmlzUG9zaXRpb25Nb3ZlbWVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjppc1Bvc2l0aW9uTW9yZUFjY3VyYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmlzUG9zaXRpb25Nb3Jl
VGltZWx5KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUFu
ZHJvaWQuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRy
b2lkOjp+R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZCk6CisgICAgICAgIChXZWJDb3JlOjpHZW9s
b2NhdGlvblNlcnZpY2VBbmRyb2lkOjpsYXN0UG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6bGFzdEVycm9yKToKKwogMjAwOS0xMS0xNCAgQW50
b25pbyBHb21lcyAgPHRvbmlraXRvb0B3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEFudHRpIEtvaXZpc3RvLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0
aW9uU2VydmljZUFuZHJvaWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYW5k
cm9pZC9HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmgiCisKKyNpbmNsdWRlICJHZW9wb3NpdGlv
bi5oIgorI2luY2x1ZGUgIlBvc2l0aW9uRXJyb3IuaCIKKyNpbmNsdWRlICJQb3NpdGlvbk9wdGlv
bnMuaCIKKyNpbmNsdWRlICJXZWJWaWV3Q29yZS5oIgorCisjaW5jbHVkZSA8Sk5JSGVscC5oPiAg
Ly8gRm9yIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcworI2luY2x1ZGUgPGpuaV91dGlsaXR5Lmg+
ICAvLyBGb3IgZ2V0Sk5JRW52CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisKK3VzaW5n
IEpTQzo6QmluZGluZ3M6OmdldEpOSUVudjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworLy8gR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlIGlzIHRoZSBicmlk
Z2UgdG8gdGhlIEphdmEgaW1wbGVtZW50YXRpb24uIEl0IG1hbmFnZXMKKy8vIHRoZSBsaWZldGlt
ZSBvZiB0aGUgSmF2YSBvYmplY3QuIEl0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZgor
Ly8gR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZC4KK2NsYXNzIEdlb2xvY2F0aW9uU2VydmljZUJy
aWRnZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkIExp
c3RlbmVySW50ZXJmYWNlOworICAgIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZShMaXN0ZW5lcklu
dGVyZmFjZSogbGlzdGVuZXIpOworICAgIH5HZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UoKTsKKwor
ICAgIHZvaWQgc3RhcnQoKTsKKyAgICB2b2lkIHN0b3AoKTsKKyAgICB2b2lkIHNldEVuYWJsZUdw
cyhib29sIGVuYWJsZSk7CisKKyAgICAvLyBTdGF0aWMgd3JhcHBlciBmdW5jdGlvbnMgdG8gaGlk
ZSBKTkkgbmFzdGluZXNzLgorICAgIHN0YXRpYyB2b2lkIG5ld0xvY2F0aW9uQXZhaWxhYmxlKEpO
SUVudiAqZW52LCBqY2xhc3MsIGpsb25nIG5hdGl2ZU9iamVjdCwgam9iamVjdCBsb2NhdGlvbik7
CisgICAgc3RhdGljIHZvaWQgbmV3RXJyb3JBdmFpbGFibGUoSk5JRW52ICplbnYsIGpjbGFzcywg
amxvbmcgbmF0aXZlT2JqZWN0LCBqc3RyaW5nIG1lc3NhZ2UpOworICAgIHN0YXRpYyBQYXNzUmVm
UHRyPEdlb3Bvc2l0aW9uPiBjb252ZXJ0TG9jYXRpb25Ub0dlb3Bvc2l0aW9uKEpOSUVudiAqZW52
LCBjb25zdCBqb2JqZWN0ICZsb2NhdGlvbik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzdGFydEph
dmFJbXBsZW1lbnRhdGlvbigpOworICAgIHZvaWQgc3RvcEphdmFJbXBsZW1lbnRhdGlvbigpOwor
CisgICAgTGlzdGVuZXJJbnRlcmZhY2UqIG1fbGlzdGVuZXI7CisgICAgam9iamVjdCBtX2phdmFH
ZW9sb2NhdGlvblNlcnZpY2VPYmplY3Q7Cit9OworCitzdGF0aWMgY29uc3QgY2hhcioga0phdmFH
ZW9sb2NhdGlvblNlcnZpY2VDbGFzcyA9ICJhbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZp
Y2UiOworZW51bSBrSmF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kcyB7CisgICAgR0VP
TE9DQVRJT05fU0VSVklDRV9NRVRIT0RfSU5JVCA9IDAsCisgICAgR0VPTE9DQVRJT05fU0VSVklD
RV9NRVRIT0RfU1RBUlQsCisgICAgR0VPTE9DQVRJT05fU0VSVklDRV9NRVRIT0RfU1RPUCwKKyAg
ICBHRU9MT0NBVElPTl9TRVJWSUNFX01FVEhPRF9TRVRfRU5BQkxFX0dQUywKKyAgICBHRU9MT0NB
VElPTl9TRVJWSUNFX01FVEhPRF9DT1VOVCwKK307CitzdGF0aWMgam1ldGhvZElEIGphdmFHZW9s
b2NhdGlvblNlcnZpY2VDbGFzc01ldGhvZElEc1tHRU9MT0NBVElPTl9TRVJWSUNFX01FVEhPRF9D
T1VOVF07CisKK3N0YXRpYyBjb25zdCBKTklOYXRpdmVNZXRob2Qga0phdmFHZW9sb2NhdGlvblNl
cnZpY2VDbGFzc05hdGl2ZU1ldGhvZHNbXSA9IHsKKyAgICB7ICJuYXRpdmVOZXdMb2NhdGlvbkF2
YWlsYWJsZSIsICIoSkxhbmRyb2lkL2xvY2F0aW9uL0xvY2F0aW9uOylWIiwKKyAgICAgICAgKHZv
aWQqKSBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Om5ld0xvY2F0aW9uQXZhaWxhYmxlIH0sCisg
ICAgeyAibmF0aXZlTmV3RXJyb3JBdmFpbGFibGUiLCAiKEpMamF2YS9sYW5nL1N0cmluZzspViIs
CisgICAgICAgICh2b2lkKikgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpuZXdFcnJvckF2YWls
YWJsZSB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqa0phdmFMb2NhdGlvbkNsYXNzID0gImFu
ZHJvaWQvbG9jYXRpb24vTG9jYXRpb24iOworZW51bSBrSmF2YUxvY2F0aW9uQ2xhc3NNZXRob2Rz
IHsKKyAgICBMT0NBVElPTl9NRVRIT0RfR0VUX0xBVElUVURFID0gMCwKKyAgICBMT0NBVElPTl9N
RVRIT0RfR0VUX0xPTkdJVFVERSwKKyAgICBMT0NBVElPTl9NRVRIT0RfSEFTX0FMVElUVURFLAor
ICAgIExPQ0FUSU9OX01FVEhPRF9HRVRfQUxUSVRVREUsCisgICAgTE9DQVRJT05fTUVUSE9EX0hB
U19BQ0NVUkFDWSwKKyAgICBMT0NBVElPTl9NRVRIT0RfR0VUX0FDQ1VSQUNZLAorICAgIExPQ0FU
SU9OX01FVEhPRF9IQVNfQkVBUklORywKKyAgICBMT0NBVElPTl9NRVRIT0RfR0VUX0JFQVJJTkcs
CisgICAgTE9DQVRJT05fTUVUSE9EX0hBU19TUEVFRCwKKyAgICBMT0NBVElPTl9NRVRIT0RfR0VU
X1NQRUVELAorICAgIExPQ0FUSU9OX01FVEhPRF9HRVRfVElNRSwKKyAgICBMT0NBVElPTl9NRVRI
T0RfQ09VTlQsCit9Oworc3RhdGljIGptZXRob2RJRCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElE
c1tMT0NBVElPTl9NRVRIT0RfQ09VTlRdOworCitHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Okdl
b2xvY2F0aW9uU2VydmljZUJyaWRnZShMaXN0ZW5lckludGVyZmFjZSogbGlzdGVuZXIpCisgICAg
OiBtX2xpc3RlbmVyKGxpc3RlbmVyKQorICAgICwgbV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNlT2Jq
ZWN0KDApCit7CisgICAgQVNTRVJUKG1fbGlzdGVuZXIpOworICAgIHN0YXJ0SmF2YUltcGxlbWVu
dGF0aW9uKCk7Cit9CisKK0dlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6fkdlb2xvY2F0aW9uU2Vy
dmljZUJyaWRnZSgpCit7CisgICAgc3RvcCgpOworICAgIHN0b3BKYXZhSW1wbGVtZW50YXRpb24o
KTsKK30KKwordm9pZCBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6OnN0YXJ0KCkKK3sKKyAgICBB
U1NFUlQobV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNlT2JqZWN0KTsKKyAgICBnZXRKTklFbnYoKS0+
Q2FsbFZvaWRNZXRob2QobV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNlT2JqZWN0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJ
RHNbR0VPTE9DQVRJT05fU0VSVklDRV9NRVRIT0RfU1RBUlRdKTsKK30KKwordm9pZCBHZW9sb2Nh
dGlvblNlcnZpY2VCcmlkZ2U6OnN0b3AoKQoreworICAgIEFTU0VSVChtX2phdmFHZW9sb2NhdGlv
blNlcnZpY2VPYmplY3QpOworICAgIGdldEpOSUVudigpLT5DYWxsVm9pZE1ldGhvZChtX2phdmFH
ZW9sb2NhdGlvblNlcnZpY2VPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGphdmFHZW9sb2NhdGlvblNlcnZpY2VDbGFzc01ldGhvZElEc1tHRU9MT0NBVElPTl9TRVJWSUNF
X01FVEhPRF9TVE9QXSk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzZXRF
bmFibGVHcHMoYm9vbCBlbmFibGUpCit7CisgICAgQVNTRVJUKG1famF2YUdlb2xvY2F0aW9uU2Vy
dmljZU9iamVjdCk7CisgICAgZ2V0Sk5JRW52KCktPkNhbGxWb2lkTWV0aG9kKG1famF2YUdlb2xv
Y2F0aW9uU2VydmljZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2
YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kSURzW0dFT0xPQ0FUSU9OX1NFUlZJQ0VfTUVU
SE9EX1NFVF9FTkFCTEVfR1BTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5h
YmxlKTsKK30KKwordm9pZCBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Om5ld0xvY2F0aW9uQXZh
aWxhYmxlKEpOSUVudiogZW52LCBqY2xhc3MsIGpsb25nIG5hdGl2ZU9iamVjdCwgam9iamVjdCBs
b2NhdGlvbikKK3sKKyAgICBBU1NFUlQobmF0aXZlT2JqZWN0KTsKKyAgICBBU1NFUlQobG9jYXRp
b24pOworICAgIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZSogb2JqZWN0ID0gcmVpbnRlcnByZXRf
Y2FzdDxHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UqPihuYXRpdmVPYmplY3QpOworICAgIG9iamVj
dC0+bV9saXN0ZW5lci0+bmV3UG9zaXRpb25BdmFpbGFibGUoY29udmVydExvY2F0aW9uVG9HZW9w
b3NpdGlvbihlbnYsIGxvY2F0aW9uKSk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJp
ZGdlOjpuZXdFcnJvckF2YWlsYWJsZShKTklFbnYqIGVudiwgamNsYXNzLCBqbG9uZyBuYXRpdmVP
YmplY3QsIGpzdHJpbmcgbWVzc2FnZSkKK3sKKyAgICBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2Uq
IG9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlKj4obmF0
aXZlT2JqZWN0KTsKKyAgICBSZWZQdHI8UG9zaXRpb25FcnJvcj4gZXJyb3IgPQorICAgICAgICBQ
b3NpdGlvbkVycm9yOjpjcmVhdGUoUG9zaXRpb25FcnJvcjo6UE9TSVRJT05fVU5BVkFJTEFCTEUs
IGFuZHJvaWQ6OnRvX3N0cmluZyhlbnYsIG1lc3NhZ2UpKTsKKyAgICBvYmplY3QtPm1fbGlzdGVu
ZXItPm5ld0Vycm9yQXZhaWxhYmxlKGVycm9yLnJlbGVhc2UoKSk7Cit9CisKK1Bhc3NSZWZQdHI8
R2VvcG9zaXRpb24+IEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6Y29udmVydExvY2F0aW9uVG9H
ZW9wb3NpdGlvbihKTklFbnYgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqb2Jq
ZWN0ICZsb2NhdGlvbikKK3sKKyAgICAvLyBhbHRpdHVkZSBpcyBvcHRpb25hbCBhbmQgbWF5IG5v
dCBiZSBzdXBwbGllZC4KKyAgICBib29sIGhhc0FsdGl0dWRlID0KKyAgICAgICAgZW52LT5DYWxs
Qm9vbGVhbk1ldGhvZChsb2NhdGlvbiwgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTE9DQVRJ
T05fTUVUSE9EX0hBU19BTFRJVFVERV0pOworICAgIGRvdWJsZSBhbHRpdHVkZSA9CisgICAgICAg
IGhhc0FsdGl0dWRlID8KKyAgICAgICAgZW52LT5DYWxsRG91YmxlTWV0aG9kKGxvY2F0aW9uLCBq
YXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfR0VUX0FMVElUVURFXSkg
OgorICAgICAgICAwLjA7CisgICAgLy8gYWNjdXJhY3kgaXMgcmVxdWlyZWQsIGJ1dCBpcyBub3Qg
c3VwcGxpZWQgYnkgdGhlIGVtdWxhdG9yLgorICAgIGRvdWJsZSBhY2N1cmFjeSA9CisgICAgICAg
IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobG9jYXRpb24sIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9k
SURzW0xPQ0FUSU9OX01FVEhPRF9IQVNfQUNDVVJBQ1ldKSA/CisgICAgICAgIGVudi0+Q2FsbEZs
b2F0TWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9N
RVRIT0RfR0VUX0FDQ1VSQUNZXSkgOgorICAgICAgICAwLjA7CisgICAgLy8gaGVhZGluZyBpcyBv
cHRpb25hbCBhbmQgbWF5IG5vdCBiZSBzdXBwbGllZC4KKyAgICBib29sIGhhc0hlYWRpbmcgPQor
ICAgICAgICBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFz
c01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfSEFTX0JFQVJJTkddKTsKKyAgICBkb3VibGUgaGVh
ZGluZyA9CisgICAgICAgIGhhc0hlYWRpbmcgPworICAgICAgICBlbnYtPkNhbGxGbG9hdE1ldGhv
ZChsb2NhdGlvbiwgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTE9DQVRJT05fTUVUSE9EX0dF
VF9CRUFSSU5HXSkgOgorICAgICAgICAwLjA7CisgICAgLy8gc3BlZWQgaXMgb3B0aW9uYWwgYW5k
IG1heSBub3QgYmUgc3VwcGxpZWQuCisgICAgYm9vbCBoYXNTcGVlZCA9CisgICAgICAgIGVudi0+
Q2FsbEJvb2xlYW5NZXRob2QobG9jYXRpb24sIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xP
Q0FUSU9OX01FVEhPRF9IQVNfU1BFRURdKTsKKyAgICBkb3VibGUgc3BlZWQgPQorICAgICAgICBo
YXNTcGVlZCA/CisgICAgICAgIGVudi0+Q2FsbEZsb2F0TWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9j
YXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfR0VUX1NQRUVEXSkgOgorICAgICAg
ICAwLjA7CisKKyAgICBSZWZQdHI8Q29vcmRpbmF0ZXM+IG5ld0Nvb3JkaW5hdGVzID0gV2ViQ29y
ZTo6Q29vcmRpbmF0ZXM6OmNyZWF0ZSgKKyAgICAgICAgZW52LT5DYWxsRG91YmxlTWV0aG9kKGxv
Y2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfR0VUX0xB
VElUVURFXSksCisgICAgICAgIGVudi0+Q2FsbERvdWJsZU1ldGhvZChsb2NhdGlvbiwgamF2YUxv
Y2F0aW9uQ2xhc3NNZXRob2RJRHNbTE9DQVRJT05fTUVUSE9EX0dFVF9MT05HSVRVREVdKSwKKyAg
ICAgICAgaGFzQWx0aXR1ZGUsIGFsdGl0dWRlLAorICAgICAgICBhY2N1cmFjeSwKKyAgICAgICAg
ZmFsc2UsIDAuMCwgIC8vIGFsdGl0dWRlQWNjdXJhY3kgbm90IHByb3ZpZGVkLgorICAgICAgICBo
YXNIZWFkaW5nLCBoZWFkaW5nLAorICAgICAgICBoYXNTcGVlZCwgc3BlZWQpOworCisgICAgcmV0
dXJuIFdlYkNvcmU6Okdlb3Bvc2l0aW9uOjpjcmVhdGUoCisgICAgICAgICBuZXdDb29yZGluYXRl
cy5yZWxlYXNlKCksCisgICAgICAgICBlbnYtPkNhbGxMb25nTWV0aG9kKGxvY2F0aW9uLCBqYXZh
TG9jYXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfR0VUX1RJTUVdKSk7Cit9CisK
K3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydEphdmFJbXBsZW1lbnRhdGlvbigp
Cit7CisgICAgSk5JRW52KiBlbnYgPSBnZXRKTklFbnYoKTsKKworICAgIC8vIEdldCB0aGUgSmF2
YSBHZW9sb2NhdGlvblNlcnZpY2UgY2xhc3MuCisgICAgamNsYXNzIGphdmFHZW9sb2NhdGlvblNl
cnZpY2VDbGFzcyA9IGVudi0+RmluZENsYXNzKGtKYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3Mp
OworICAgIEFTU0VSVChqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3MpOworCisgICAgLy8gU2V0
IHVwIHRoZSBtZXRob2RzIHdlIHdpc2ggdG8gY2FsbCBvbiB0aGUgSmF2YSBHZW9sb2NhdGlvblNl
cnZpY2UgY2xhc3MuCisgICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kSURzW0dF
T0xPQ0FUSU9OX1NFUlZJQ0VfTUVUSE9EX0lOSVRdID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0
aG9kSUQoamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzLCAiPGluaXQ+IiwgIihKKVYiKTsKKyAg
ICBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJRHNbR0VPTE9DQVRJT05fU0VSVklD
RV9NRVRIT0RfU1RBUlRdID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUdlb2xv
Y2F0aW9uU2VydmljZUNsYXNzLCAic3RhcnQiLCAiKClWIik7CisgICAgamF2YUdlb2xvY2F0aW9u
U2VydmljZUNsYXNzTWV0aG9kSURzW0dFT0xPQ0FUSU9OX1NFUlZJQ0VfTUVUSE9EX1NUT1BdID0K
KyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNz
LCAic3RvcCIsICIoKVYiKTsKKyAgICBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJ
RHNbR0VPTE9DQVRJT05fU0VSVklDRV9NRVRIT0RfU0VUX0VOQUJMRV9HUFNdID0KKyAgICAgICAg
ICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzLCAic2V0RW5h
YmxlR3BzIiwgIihaKVYiKTsKKworICAgIC8vIENyZWF0ZSB0aGUgSmF2YSBHZW9sb2NhdGlvblNl
cnZpY2Ugb2JqZWN0LgorICAgIGpsb25nIG5hdGl2ZU9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8
amxvbmc+KHRoaXMpOworICAgIGpvYmplY3Qgb2JqZWN0ID0gZW52LT5OZXdPYmplY3QoamF2YUdl
b2xvY2F0aW9uU2VydmljZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kSURzW0dFT0xPQ0FUSU9OX1NFUlZJ
Q0VfTUVUSE9EX0lOSVRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0
aXZlT2JqZWN0KTsKKworICAgIG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCA9IGdldEpO
SUVudigpLT5OZXdHbG9iYWxSZWYob2JqZWN0KTsKKyAgICBBU1NFUlQobV9qYXZhR2VvbG9jYXRp
b25TZXJ2aWNlT2JqZWN0KTsKKworICAgIC8vIFJlZ2lzdGVyIHRvIGhhbmRsZSBjYWxscyB0byBu
YXRpdmUgbWV0aG9kcyBvZiB0aGUgSmF2YSBHZW9sb2NhdGlvblNlcnZpY2UKKyAgICAvLyBvYmpl
Y3QuIFdlIHJlZ2lzdGVyIG9uY2Ugb25seS4KKyAgICBzdGF0aWMgaW50IHJlZ2lzdGVyZWQgPSBq
bmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBrSmF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSmF2
YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTmF0aXZlTWV0aG9kcywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVMRU0oa0phdmFHZW9sb2NhdGlv
blNlcnZpY2VDbGFzc05hdGl2ZU1ldGhvZHMpKTsKKyAgICBBU1NFUlQocmVnaXN0ZXJlZCA9PSBK
TklfT0spOworCisgICAgLy8gU2V0IHVwIHRoZSBtZXRob2RzIHdlIHdpc2ggdG8gY2FsbCBvbiB0
aGUgSmF2YSBMb2NhdGlvbiBjbGFzcy4KKyAgICBqY2xhc3MgamF2YUxvY2F0aW9uQ2xhc3MgPSBl
bnYtPkZpbmRDbGFzcyhrSmF2YUxvY2F0aW9uQ2xhc3MpOworICAgIEFTU0VSVChqYXZhTG9jYXRp
b25DbGFzcyk7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTE9DQVRJT05fTUVUSE9E
X0dFVF9MQVRJVFVERV0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFMb2NhdGlvbkNs
YXNzLCAiZ2V0TGF0aXR1ZGUiLCAiKClEIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJ
RHNbTE9DQVRJT05fTUVUSE9EX0dFVF9MT05HSVRVREVdID0KKyAgICAgICAgZW52LT5HZXRNZXRo
b2RJRChqYXZhTG9jYXRpb25DbGFzcywgImdldExvbmdpdHVkZSIsICIoKUQiKTsKKyAgICBqYXZh
TG9jYXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfSEFTX0FMVElUVURFXSA9Cisg
ICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUxvY2F0aW9uQ2xhc3MsICJoYXNBbHRpdHVkZSIs
ICIoKVoiKTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0Rf
R0VUX0FMVElUVURFXSA9CisgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUxvY2F0aW9uQ2xh
c3MsICJnZXRBbHRpdHVkZSIsICIoKUQiKTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElE
c1tMT0NBVElPTl9NRVRIT0RfSEFTX0FDQ1VSQUNZXSA9CisgICAgICAgIGVudi0+R2V0TWV0aG9k
SUQoamF2YUxvY2F0aW9uQ2xhc3MsICJoYXNBY2N1cmFjeSIsICIoKVoiKTsKKyAgICBqYXZhTG9j
YXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfR0VUX0FDQ1VSQUNZXSA9CisgICAg
ICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUxvY2F0aW9uQ2xhc3MsICJnZXRBY2N1cmFjeSIsICIo
KUYiKTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMT0NBVElPTl9NRVRIT0RfSEFT
X0JFQVJJTkddID0KKyAgICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywg
Imhhc0JlYXJpbmciLCAiKClaIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTE9D
QVRJT05fTUVUSE9EX0dFVF9CRUFSSU5HXSA9CisgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2
YUxvY2F0aW9uQ2xhc3MsICJnZXRCZWFyaW5nIiwgIigpRiIpOworICAgIGphdmFMb2NhdGlvbkNs
YXNzTWV0aG9kSURzW0xPQ0FUSU9OX01FVEhPRF9IQVNfU1BFRURdID0KKyAgICAgICAgZW52LT5H
ZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImhhc1NwZWVkIiwgIigpWiIpOworICAgIGph
dmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xPQ0FUSU9OX01FVEhPRF9HRVRfU1BFRURdID0KKyAg
ICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImdldFNwZWVkIiwgIigp
RiIpOworICAgIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xPQ0FUSU9OX01FVEhPRF9HRVRf
VElNRV0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFMb2NhdGlvbkNsYXNzLCAiZ2V0
VGltZSIsICIoKUoiKTsKK30KKwordm9pZCBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6OnN0b3BK
YXZhSW1wbGVtZW50YXRpb24oKQoreworICAgIC8vIENhbGxlZCBieSBHZW9sb2NhdGlvblNlcnZp
Y2VBbmRyb2lkIG9uIFdlYktpdCB0aHJlYWQuCisgICAgQVNTRVJUKG1famF2YUdlb2xvY2F0aW9u
U2VydmljZU9iamVjdCk7CisgICAgZ2V0Sk5JRW52KCktPkRlbGV0ZUdsb2JhbFJlZihtX2phdmFH
ZW9sb2NhdGlvblNlcnZpY2VPYmplY3QpOworfQorCisvLyBHZW9sb2NhdGlvblNlcnZpY2VBbmRy
b2lkIGlzIHRoZSBBbmRyb2lkIGltcGxtZW50YXRpb24gb2YgR2VvbG9jYXRpb24KKy8vIHNlcnZp
Y2UuIEVhY2ggb2JqZWN0IG9mIHRoaXMgY2xhc3Mgb3ducyBhbiBvYmplY3Qgb2YgdHlwZQorLy8g
R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLCB3aGljaCBpbiB0dXJuIG93bnMgYSBKYXZhIEdlb2xv
Y2F0aW9uU2VydmljZQorLy8gb2JqZWN0LiBUaGVyZWZvcmUsIHRoZXJlIGlzIGEgMToxIG1hcHBp
bmcgYmV0d2VlbiBHZW9sb2NhdGlvbiwKKy8vIEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQsIEdl
b2xvY2F0aW9uU2VydmljZUJyaWRnZSBhbmQgSmF2YQorLy8gR2VvbG9jYXRpb25TZXJ2aWNlIG9i
amVjdHMuIEluIHRoZSBjYXNlIHdoZXJlIG11bHRpcGxlIEdlb2xvY2F0aW9uIG9iamVjdHMKKy8v
IGV4aXN0IHNpbXVsdGFuZW91c2x5LCB0aGUgY29ycmVzcG9uc2luZyBKYXZhIEdlb2xvY2F0aW9u
U2VydmljZSBvYmplY3RzIGFsbAorLy8gcmVnaXN0ZXIgd2l0aCB0aGUgcGxhdGZvcm0gbG9jYXRp
b24gc2VydmljZS4gSXQgaXMgdGhlIHBsYXRmb3JtIHNlcnZpY2UgdGhhdAorLy8gaGFuZGxlcyBt
YWtpbmcgc3VyZSB0aGF0IHVwZGF0ZXMgYXJlIHBhc3NlZCB0byBhbGwgR2VvbG9jYXRpb24gb2Jq
ZWN0cy4KK0dlb2xvY2F0aW9uU2VydmljZSogR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6Y3Jl
YXRlKEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcg
R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZChjbGllbnQpOworfQorCitHZW9sb2NhdGlvblNlcnZp
Y2U6OkZhY3RvcnlGdW5jdGlvbiogR2VvbG9jYXRpb25TZXJ2aWNlOjpzX2ZhY3RvcnlGdW5jdGlv
biA9ICZHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpjcmVhdGU7CisKK0dlb2xvY2F0aW9uU2Vy
dmljZUFuZHJvaWQ6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQoR2VvbG9jYXRpb25TZXJ2aWNl
Q2xpZW50KiBjbGllbnQpCisgICAgOiBHZW9sb2NhdGlvblNlcnZpY2UoY2xpZW50KQorICAgICwg
bV90aW1lcih0aGlzLCAmR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6dGltZXJGaXJlZCkKKyAg
ICAsIG1famF2YUJyaWRnZSgwKQoreworfQorCitib29sIEdlb2xvY2F0aW9uU2VydmljZUFuZHJv
aWQ6OnN0YXJ0VXBkYXRpbmcoUG9zaXRpb25PcHRpb25zKiBvcHRpb25zKQoreworICAgIC8vIFRo
aXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSB0aW1lIGEgbmV3IHdhdGNoIG9yIG9uZS1zaG90IHBv
c2l0aW9uIHJlcXVlc3QKKyAgICAvLyBpcyBzdGFydGVkLiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBw
b3NpdGlvbiBvciBhbiBlcnJvciwgY2FsbCBiYWNrCisgICAgLy8gaW1tZWRpYXRlbHkuCisgICAg
aWYgKG1fbGFzdFBvc2l0aW9uIHx8IG1fbGFzdEVycm9yKSB7CisgICAgICAgIEFTU0VSVChtX2ph
dmFCcmlkZ2UpOworICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKKyAgICB9CisKKyAg
ICAvLyBMYXppbGx5IGNyZWF0ZSB0aGUgSmF2YSBvYmplY3QuCisgICAgYm9vbCBoYXZlSmF2YUJy
aWRnZSA9IG1famF2YUJyaWRnZTsKKyAgICBpZiAoIWhhdmVKYXZhQnJpZGdlKQorICAgICAgICBt
X2phdmFCcmlkZ2Uuc2V0KG5ldyBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UodGhpcykpOworICAg
IEFTU0VSVChtX2phdmFCcmlkZ2UpOworCisgICAgLy8gT24gQW5kcm9pZCwgaGlnaCBwb3dlciA9
PSBHUFMuIFNldCB3aGV0aGVyIHRvIHVzZSBHUFMgYmVmb3JlIHdlIHN0YXJ0IHRoZQorICAgIC8v
IGltcGxlbWVudGF0aW9uLgorICAgIEFTU0VSVChvcHRpb25zKTsKKyAgICBpZiAob3B0aW9ucy0+
ZW5hYmxlSGlnaEFjY3VyYWN5KCkpCisgICAgICAgIG1famF2YUJyaWRnZS0+c2V0RW5hYmxlR3Bz
KHRydWUpOworCisgICAgaWYgKCFoYXZlSmF2YUJyaWRnZSkKKyAgICAgICAgbV9qYXZhQnJpZGdl
LT5zdGFydCgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2
aWNlQW5kcm9pZDo6c3RvcFVwZGF0aW5nKCkKK3sKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgR2Vv
bG9jYXRpb24gb2JqZWN0IGhhcyBubyB3YXRjaGVzIG9yIG9uZSBzaG90cyBpbgorICAgIC8vIHBy
b2dyZXNzLgorICAgIG1famF2YUJyaWRnZS5jbGVhcigpOworICAgIC8vIFJlc2V0IGxhc3QgcG9z
aXRpb24gYW5kIGVycm9yIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyB0cnkgdG8gZ2V0IGEK
KyAgICAvLyBuZXcgcG9zaXRpb24gZnJvbSB0aGUgc3lzdGVtIHNlcnZpY2Ugd2hlbiBhIHJlcXVl
c3QgaXMgZmlyc3QgbWFkZS4KKyAgICBtX2xhc3RQb3NpdGlvbiA9IDA7CisgICAgbV9sYXN0RXJy
b3IgPSAwOworfQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OnN1c3BlbmQoKQor
eworICAgIEFTU0VSVChtX2phdmFCcmlkZ2UpOworICAgIG1famF2YUJyaWRnZS0+c3RvcCgpOwor
fQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OnJlc3VtZSgpCit7CisgICAgQVNT
RVJUKG1famF2YUJyaWRnZSk7CisgICAgbV9qYXZhQnJpZGdlLT5zdGFydCgpOworfQorCisvLyBO
b3RlIHRoYXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgc3Vic2VxdWVudCBjYWxscyB0byB0
aGlzIG1ldGhvZCBvZmZlciBhCisvLyBtb3JlIGFjY3VyYXRlIG9yIHVwZGF0ZWQgcG9zaXRpb24u
Cit2b2lkIEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6Om5ld1Bvc2l0aW9uQXZhaWxhYmxlKFBh
c3NSZWZQdHI8R2VvcG9zaXRpb24+IHBvc2l0aW9uKQoreworICAgIEFTU0VSVChwb3NpdGlvbik7
CisgICAgaWYgKCFtX2xhc3RQb3NpdGlvbgorICAgICAgICB8fCBpc1Bvc2l0aW9uTW92ZW1lbnQo
bV9sYXN0UG9zaXRpb24uZ2V0KCksIHBvc2l0aW9uLmdldCgpKQorICAgICAgICB8fCBpc1Bvc2l0
aW9uTW9yZUFjY3VyYXRlKG1fbGFzdFBvc2l0aW9uLmdldCgpLCBwb3NpdGlvbi5nZXQoKSkKKyAg
ICAgICAgfHwgaXNQb3NpdGlvbk1vcmVUaW1lbHkobV9sYXN0UG9zaXRpb24uZ2V0KCksIHBvc2l0
aW9uLmdldCgpKSkgeworICAgICAgICBtX2xhc3RQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAg
ICAvLyBSZW1vdmUgdGhlIGxhc3QgZXJyb3IuCisgICAgICAgIG1fbGFzdEVycm9yID0gMDsKKyAg
ICAgICAgcG9zaXRpb25DaGFuZ2VkKCk7CisgICAgfQorfQorCit2b2lkIEdlb2xvY2F0aW9uU2Vy
dmljZUFuZHJvaWQ6Om5ld0Vycm9yQXZhaWxhYmxlKFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvcj4g
ZXJyb3IpCit7CisgICAgQVNTRVJUKGVycm9yKTsKKyAgICAvLyBXZSBsZWF2ZSB0aGUgbGFzdCBw
b3NpdGlvbgorICAgIG1fbGFzdEVycm9yID0gZXJyb3I7CisgICAgZXJyb3JPY2N1cnJlZCgpOwor
fQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OnRpbWVyRmlyZWQoVGltZXI8R2Vv
bG9jYXRpb25TZXJ2aWNlQW5kcm9pZD4qIHRpbWVyKQoreworICAgIEFTU0VSVCgmbV90aW1lciA9
PSB0aW1lcik7CisgICAgQVNTRVJUKG1fbGFzdFBvc2l0aW9uIHx8IG1fbGFzdEVycm9yKTsKKyAg
ICBpZiAobV9sYXN0UG9zaXRpb24pCisgICAgICAgIHBvc2l0aW9uQ2hhbmdlZCgpOworICAgIGVs
c2UKKyAgICAgICAgZXJyb3JPY2N1cnJlZCgpOworfQorCitib29sIEdlb2xvY2F0aW9uU2Vydmlj
ZUFuZHJvaWQ6OmlzUG9zaXRpb25Nb3ZlbWVudChHZW9wb3NpdGlvbiogcG9zaXRpb24xLCBHZW9w
b3NpdGlvbiogcG9zaXRpb24yKQoreworICAgIEFTU0VSVChwb3NpdGlvbjEgJiYgcG9zaXRpb24y
KTsKKyAgICAvLyBGb3IgdGhlIHNtYWxsIGRpc3RhbmNlcyBpbiB3aGljaCB3ZSBhcmUgbGlrZWx5
IGNvbmNlcm5lZCwgaXQncyByZWFzb25hYmxlCisgICAgLy8gdG8gYXBwcm94aW1hdGUgdGhlIGRp
c3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb3NpdGlvbnMgYXMgdGhlIHN1bSBvZiB0aGUKKyAgICAv
LyBkaWZmZXJlbmNlcyBpbiBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlLgorICAgIGRvdWJsZSBkZWx0
YSA9IGZhYnMocG9zaXRpb24xLT5jb29yZHMoKS0+bGF0aXR1ZGUoKSAtIHBvc2l0aW9uMi0+Y29v
cmRzKCktPmxhdGl0dWRlKCkpCisgICAgICAgICsgZmFicyhwb3NpdGlvbjEtPmNvb3JkcygpLT5s
b25naXR1ZGUoKSAtIHBvc2l0aW9uMi0+Y29vcmRzKCktPmxvbmdpdHVkZSgpKTsKKyAgICAvLyBB
cHByb3hpbWF0ZSBjb252ZXJzaW9uIGZyb20gZGVncmVlcyBvZiBhcmMgdG8gbWV0cmVzLgorICAg
IGRlbHRhICo9IDYwICogMTg1MjsKKyAgICAvLyBUaGUgdGhyZXNob2xkIGlzIHdoZW4gdGhlIGRp
c3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb3NpdGlvbnMgZXhjZWVkcyB0aGUKKyAgICAvLyB3b3Jz
ZSAobGFyZ2VyKSBvZiB0aGUgdHdvIGFjY3VyYWNpZXMuCisgICAgaW50IG1heEFjY3VyYWN5ID0g
bWF4KHBvc2l0aW9uMS0+Y29vcmRzKCktPmFjY3VyYWN5KCksIHBvc2l0aW9uMi0+Y29vcmRzKCkt
PmFjY3VyYWN5KCkpOworICAgIHJldHVybiBkZWx0YSA+IG1heEFjY3VyYWN5OworfQorCitib29s
IEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmlzUG9zaXRpb25Nb3JlQWNjdXJhdGUoR2VvcG9z
aXRpb24qIHBvc2l0aW9uMSwgR2VvcG9zaXRpb24qIHBvc2l0aW9uMikKK3sKKyAgICBBU1NFUlQo
cG9zaXRpb24xICYmIHBvc2l0aW9uMik7CisgICAgcmV0dXJuIHBvc2l0aW9uMi0+Y29vcmRzKCkt
PmFjY3VyYWN5KCkgPCBwb3NpdGlvbjEtPmNvb3JkcygpLT5hY2N1cmFjeSgpOworfQorCitib29s
IEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmlzUG9zaXRpb25Nb3JlVGltZWx5KEdlb3Bvc2l0
aW9uKiBwb3NpdGlvbjEsIEdlb3Bvc2l0aW9uKiBwb3NpdGlvbjIpCit7CisgICAgQVNTRVJUKHBv
c2l0aW9uMSAmJiBwb3NpdGlvbjIpOworICAgIERPTVRpbWVTdGFtcCBjdXJyZW50VGltZU1pbGxp
cyA9IFdURjo6Y3VycmVudFRpbWUoKSAqIDEwMDAuMDsKKyAgICBET01UaW1lU3RhbXAgbWF4aW11
bUFnZU1pbGxpcyA9IDEwICogNjAgKiAxMDAwOyAgLy8gMTAgbWludXRlcworICAgIHJldHVybiBj
dXJyZW50VGltZU1pbGxpcyAtIHBvc2l0aW9uMS0+dGltZXN0YW1wKCkgPiBtYXhpbXVtQWdlTWls
bGlzOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9p
ZC5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDks
IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEdlb2xvY2F0
aW9uU2VydmljZUFuZHJvaWRfaAorI2RlZmluZSBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkX2gK
KworI2luY2x1ZGUgIkdlb2xvY2F0aW9uU2VydmljZS5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisj
aW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5j
bHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFRoZSBHZW9s
b2NhdGlvblNlcnZpY2VCcmlkZ2UgaXMgdGhlIGJyaWRnZSB0byB0aGUgSmF2YSBpbXBsZW1lbnRh
dGlvbiBvZgorLy8gdGhlIEdlb2xvY2F0aW9uIHNlcnZpY2UuIEl0IGlzIGFuIGltcGxlbWVudGF0
aW9uIGRldGFpbCBvZgorLy8gR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZC4KK2NsYXNzIEdlb2xv
Y2F0aW9uU2VydmljZUJyaWRnZTsKKworY2xhc3MgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZCA6
IHB1YmxpYyBHZW9sb2NhdGlvblNlcnZpY2UgeworcHVibGljOgorICAgIHN0YXRpYyBHZW9sb2Nh
dGlvblNlcnZpY2UqIGNyZWF0ZShHZW9sb2NhdGlvblNlcnZpY2VDbGllbnQqKTsKKworICAgIHZp
cnR1YWwgfkdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQoKSB7fTsKKworICAgIHZpcnR1YWwgYm9v
bCBzdGFydFVwZGF0aW5nKFBvc2l0aW9uT3B0aW9ucyopOworICAgIHZpcnR1YWwgdm9pZCBzdG9w
VXBkYXRpbmcoKTsKKworICAgIHZpcnR1YWwgR2VvcG9zaXRpb24qIGxhc3RQb3NpdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1fbGFzdFBvc2l0aW9uLmdldCgpOyB9CisgICAgdmlydHVhbCBQb3NpdGlv
bkVycm9yKiBsYXN0RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX2xhc3RFcnJvci5nZXQoKTsgfQor
CisgICAgdmlydHVhbCB2b2lkIHN1c3BlbmQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lKCk7
CisKKyAgICAvLyBBbmRyb2lkLXNwZWNpZmljCisgICAgdm9pZCBuZXdQb3NpdGlvbkF2YWlsYWJs
ZShQYXNzUmVmUHRyPEdlb3Bvc2l0aW9uPik7CisgICAgdm9pZCBuZXdFcnJvckF2YWlsYWJsZShQ
YXNzUmVmUHRyPFBvc2l0aW9uRXJyb3I+KTsKKyAgICB2b2lkIHRpbWVyRmlyZWQoVGltZXI8R2Vv
bG9jYXRpb25TZXJ2aWNlQW5kcm9pZD4qIHRpbWVyKTsKKworcHJpdmF0ZToKKyAgICBHZW9sb2Nh
dGlvblNlcnZpY2VBbmRyb2lkKEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCopOworCisgICAgc3Rh
dGljIGJvb2wgaXNQb3NpdGlvbk1vdmVtZW50KEdlb3Bvc2l0aW9uKiBwb3NpdGlvbjEsIEdlb3Bv
c2l0aW9uKiBwb3NpdGlvbjIpOworICAgIHN0YXRpYyBib29sIGlzUG9zaXRpb25Nb3JlQWNjdXJh
dGUoR2VvcG9zaXRpb24qIHBvc2l0aW9uMSwgR2VvcG9zaXRpb24qIHBvc2l0aW9uMik7CisgICAg
c3RhdGljIGJvb2wgaXNQb3NpdGlvbk1vcmVUaW1lbHkoR2VvcG9zaXRpb24qIHBvc2l0aW9uMSwg
R2VvcG9zaXRpb24qIHBvc2l0aW9uMik7CisKKyAgICBUaW1lcjxHZW9sb2NhdGlvblNlcnZpY2VB
bmRyb2lkPiBtX3RpbWVyOworICAgIFJlZlB0cjxHZW9wb3NpdGlvbj4gbV9sYXN0UG9zaXRpb247
CisgICAgUmVmUHRyPFBvc2l0aW9uRXJyb3I+IG1fbGFzdEVycm9yOworICAgIE93blB0cjxHZW9s
b2NhdGlvblNlcnZpY2VCcmlkZ2U+IG1famF2YUJyaWRnZTsKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWRfaAo=
</data>
<flag name="review"
          id="25007"
          type_id="1"
          status="-"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43314</attachid>
            <date>2009-11-16 10:48:53 -0800</date>
            <delta_ts>2009-11-16 10:52:37 -0800</delta_ts>
            <desc>Android implementation of the GeolocationService implementation v2</desc>
            <filename>31544.patch.v2</filename>
            <type>text/plain</type>
            <size>26861</size>
            <attacher name="Andrei Popescu">andreip</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MTA0MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDMgQEAKKzIwMDktMTEtMTYgIEFuZHJlaSBQb3Blc2N1ICA8YW5kcmVpcEBnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtBbmRyb2lkXSBBbmRyb2lkIGlzIG1pc3NpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBH
ZW9sb2NhdGlvblNlcnZpY2UgaWZhY2UuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zMTU1NAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyByZXF1aXJlZCBh
cyB0aGlzIGlzIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9h
bmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmNyZWF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lk
KToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OnN0YXJ0VXBk
YXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6c3Rv
cFVwZGF0aW5nKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6
OnN1c3BlbmQpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6
cmVzdW1lKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6Om5l
d1Bvc2l0aW9uQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2Vydmlj
ZUFuZHJvaWQ6Om5ld0Vycm9yQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0
aW9uU2VydmljZUFuZHJvaWQ6OnRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9j
YXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vdmVtZW50KToKKyAgICAgICAgKFdlYkNv
cmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmlzUG9zaXRpb25Nb3JlQWNjdXJhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1v
cmVUaW1lbHkpOgorICAgICAgICAqIHBsYXRmb3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNl
QW5kcm9pZC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFu
ZHJvaWQ6On5HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkKToKKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6Omxhc3RQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3Jl
OjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpsYXN0RXJyb3IpOgorICAgICAgICAqIHBsYXRm
b3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdl
OjpHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRp
b25TZXJ2aWNlQnJpZGdlOjp+R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlKToKKyAgICAgICAgKFdl
YkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6c3RhcnQpOgorICAgICAgICAoV2ViQ29y
ZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdG9wKToKKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uU2VydmljZUJyaWRnZTo6c2V0RW5hYmxlR3BzKToKKyAgICAgICAgKFdlYkNvcmU6
Okdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6bmV3TG9jYXRpb25BdmFpbGFibGUpOgorICAgICAg
ICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpuZXdFcnJvckF2YWlsYWJsZSk6
CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6OnRvR2VvcG9zaXRp
b24pOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydEph
dmFJbXBsZW1lbnRhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VC
cmlkZ2U6OnN0b3BKYXZhSW1wbGVtZW50YXRpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2FuZHJv
aWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmg6IEFkZGVkLgorCiAyMDA5LTExLTE2ICBBbGV4
ZXkgUHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERh
cmluIEFkbGVyLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9uU2Vy
dmljZUFuZHJvaWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYW5kcm9pZC9H
ZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3Bl
biBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJH
ZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmgiCisKKyNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZp
Y2VCcmlkZ2UuaCIKKyNpbmNsdWRlICJHZW9wb3NpdGlvbi5oIgorI2luY2x1ZGUgIlBvc2l0aW9u
RXJyb3IuaCIKKyNpbmNsdWRlICJQb3NpdGlvbk9wdGlvbnMuaCIKKworI2luY2x1ZGUgPHd0Zi9D
dXJyZW50VGltZS5oPgorCit1c2luZyBKU0M6OkJpbmRpbmdzOjpnZXRKTklFbnY7Cit1c2luZyBu
YW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEdlb2xvY2F0aW9uU2Vy
dmljZUFuZHJvaWQgaXMgdGhlIEFuZHJvaWQgaW1wbG1lbnRhdGlvbiBvZiBHZW9sb2NhdGlvbgor
Ly8gc2VydmljZS4gRWFjaCBvYmplY3Qgb2YgdGhpcyBjbGFzcyBvd25zIGFuIG9iamVjdCBvZiB0
eXBlCisvLyBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UsIHdoaWNoIGluIHR1cm4gb3ducyBhIEph
dmEgR2VvbG9jYXRpb25TZXJ2aWNlCisvLyBvYmplY3QuIFRoZXJlZm9yZSwgdGhlcmUgaXMgYSAx
OjEgbWFwcGluZyBiZXR3ZWVuIEdlb2xvY2F0aW9uLAorLy8gR2VvbG9jYXRpb25TZXJ2aWNlQW5k
cm9pZCwgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlIGFuZCBKYXZhCisvLyBHZW9sb2NhdGlvblNl
cnZpY2Ugb2JqZWN0cy4gSW4gdGhlIGNhc2Ugd2hlcmUgbXVsdGlwbGUgR2VvbG9jYXRpb24gb2Jq
ZWN0cworLy8gZXhpc3Qgc2ltdWx0YW5lb3VzbHksIHRoZSBjb3JyZXNwb25zaW5nIEphdmEgR2Vv
bG9jYXRpb25TZXJ2aWNlIG9iamVjdHMgYWxsCisvLyByZWdpc3RlciB3aXRoIHRoZSBwbGF0Zm9y
bSBsb2NhdGlvbiBzZXJ2aWNlLiBJdCBpcyB0aGUgcGxhdGZvcm0gc2VydmljZSB0aGF0CisvLyBo
YW5kbGVzIG1ha2luZyBzdXJlIHRoYXQgdXBkYXRlcyBhcmUgcGFzc2VkIHRvIGFsbCBHZW9sb2Nh
dGlvbiBvYmplY3RzLgorR2VvbG9jYXRpb25TZXJ2aWNlKiBHZW9sb2NhdGlvblNlcnZpY2VBbmRy
b2lkOjpjcmVhdGUoR2VvbG9jYXRpb25TZXJ2aWNlQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0
dXJuIG5ldyBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkKGNsaWVudCk7Cit9CisKK0dlb2xvY2F0
aW9uU2VydmljZTo6RmFjdG9yeUZ1bmN0aW9uKiBHZW9sb2NhdGlvblNlcnZpY2U6OnNfZmFjdG9y
eUZ1bmN0aW9uID0gJkdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmNyZWF0ZTsKKworR2VvbG9j
YXRpb25TZXJ2aWNlQW5kcm9pZDo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZChHZW9sb2NhdGlv
blNlcnZpY2VDbGllbnQqIGNsaWVudCkKKyAgICA6IEdlb2xvY2F0aW9uU2VydmljZShjbGllbnQp
CisgICAgLCBtX3RpbWVyKHRoaXMsICZHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjp0aW1lckZp
cmVkKQorICAgICwgbV9qYXZhQnJpZGdlKDApCit7Cit9CisKK2Jvb2wgR2VvbG9jYXRpb25TZXJ2
aWNlQW5kcm9pZDo6c3RhcnRVcGRhdGluZyhQb3NpdGlvbk9wdGlvbnMqIG9wdGlvbnMpCit7Cisg
ICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuZXcgd2F0Y2ggb3Igb25l
LXNob3QgcG9zaXRpb24gcmVxdWVzdAorICAgIC8vIGlzIHN0YXJ0ZWQuIElmIHdlIGFscmVhZHkg
aGF2ZSBhIHBvc2l0aW9uIG9yIGFuIGVycm9yLCBjYWxsIGJhY2sKKyAgICAvLyBpbW1lZGlhdGVs
eS4KKyAgICBpZiAobV9sYXN0UG9zaXRpb24gfHwgbV9sYXN0RXJyb3IpIHsKKyAgICAgICAgQVNT
RVJUKG1famF2YUJyaWRnZSk7CisgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOworICAg
IH0KKworICAgIC8vIExhemlsbHkgY3JlYXRlIHRoZSBKYXZhIG9iamVjdC4KKyAgICBib29sIGhh
dmVKYXZhQnJpZGdlID0gbV9qYXZhQnJpZGdlOworICAgIGlmICghaGF2ZUphdmFCcmlkZ2UpCisg
ICAgICAgIG1famF2YUJyaWRnZS5zZXQobmV3IEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZSh0aGlz
KSk7CisgICAgQVNTRVJUKG1famF2YUJyaWRnZSk7CisKKyAgICAvLyBPbiBBbmRyb2lkLCBoaWdo
IHBvd2VyID09IEdQUy4gU2V0IHdoZXRoZXIgdG8gdXNlIEdQUyBiZWZvcmUgd2Ugc3RhcnQgdGhl
CisgICAgLy8gaW1wbGVtZW50YXRpb24uCisgICAgQVNTRVJUKG9wdGlvbnMpOworICAgIGlmIChv
cHRpb25zLT5lbmFibGVIaWdoQWNjdXJhY3koKSkKKyAgICAgICAgbV9qYXZhQnJpZGdlLT5zZXRF
bmFibGVHcHModHJ1ZSk7CisKKyAgICBpZiAoIWhhdmVKYXZhQnJpZGdlKQorICAgICAgICBtX2ph
dmFCcmlkZ2UtPnN0YXJ0KCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHZW9sb2Nh
dGlvblNlcnZpY2VBbmRyb2lkOjpzdG9wVXBkYXRpbmcoKQoreworICAgIC8vIENhbGxlZCB3aGVu
IHRoZSBHZW9sb2NhdGlvbiBvYmplY3QgaGFzIG5vIHdhdGNoZXMgb3Igb25lIHNob3RzIGluCisg
ICAgLy8gcHJvZ3Jlc3MuCisgICAgbV9qYXZhQnJpZGdlLmNsZWFyKCk7CisgICAgLy8gUmVzZXQg
bGFzdCBwb3NpdGlvbiBhbmQgZXJyb3IgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIHRyeSB0
byBnZXQgYQorICAgIC8vIG5ldyBwb3NpdGlvbiBmcm9tIHRoZSBzeXN0ZW0gc2VydmljZSB3aGVu
IGEgcmVxdWVzdCBpcyBmaXJzdCBtYWRlLgorICAgIG1fbGFzdFBvc2l0aW9uID0gMDsKKyAgICBt
X2xhc3RFcnJvciA9IDA7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6c3Vz
cGVuZCgpCit7CisgICAgQVNTRVJUKG1famF2YUJyaWRnZSk7CisgICAgbV9qYXZhQnJpZGdlLT5z
dG9wKCk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6cmVzdW1lKCkKK3sK
KyAgICBBU1NFUlQobV9qYXZhQnJpZGdlKTsKKyAgICBtX2phdmFCcmlkZ2UtPnN0YXJ0KCk7Cit9
CisKKy8vIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBzdWJzZXF1ZW50IGNh
bGxzIHRvIHRoaXMgbWV0aG9kIG9mZmVyIGEKKy8vIG1vcmUgYWNjdXJhdGUgb3IgdXBkYXRlZCBw
b3NpdGlvbi4KK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6bmV3UG9zaXRpb25BdmFp
bGFibGUoUGFzc1JlZlB0cjxHZW9wb3NpdGlvbj4gcG9zaXRpb24pCit7CisgICAgQVNTRVJUKHBv
c2l0aW9uKTsKKyAgICBpZiAoIW1fbGFzdFBvc2l0aW9uCisgICAgICAgIHx8IGlzUG9zaXRpb25N
b3ZlbWVudChtX2xhc3RQb3NpdGlvbi5nZXQoKSwgcG9zaXRpb24uZ2V0KCkpCisgICAgICAgIHx8
IGlzUG9zaXRpb25Nb3JlQWNjdXJhdGUobV9sYXN0UG9zaXRpb24uZ2V0KCksIHBvc2l0aW9uLmdl
dCgpKQorICAgICAgICB8fCBpc1Bvc2l0aW9uTW9yZVRpbWVseShtX2xhc3RQb3NpdGlvbi5nZXQo
KSwgcG9zaXRpb24uZ2V0KCkpKSB7CisgICAgICAgIG1fbGFzdFBvc2l0aW9uID0gcG9zaXRpb247
CisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlcnJvci4KKyAgICAgICAgbV9sYXN0RXJyb3Ig
PSAwOworICAgICAgICBwb3NpdGlvbkNoYW5nZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgR2VvbG9j
YXRpb25TZXJ2aWNlQW5kcm9pZDo6bmV3RXJyb3JBdmFpbGFibGUoUGFzc1JlZlB0cjxQb3NpdGlv
bkVycm9yPiBlcnJvcikKK3sKKyAgICBBU1NFUlQoZXJyb3IpOworICAgIC8vIFdlIGxlYXZlIHRo
ZSBsYXN0IHBvc2l0aW9uCisgICAgbV9sYXN0RXJyb3IgPSBlcnJvcjsKKyAgICBlcnJvck9jY3Vy
cmVkKCk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6dGltZXJGaXJlZChU
aW1lcjxHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkPiogdGltZXIpCit7CisgICAgQVNTRVJUKCZt
X3RpbWVyID09IHRpbWVyKTsKKyAgICBBU1NFUlQobV9sYXN0UG9zaXRpb24gfHwgbV9sYXN0RXJy
b3IpOworICAgIGlmIChtX2xhc3RQb3NpdGlvbikKKyAgICAgICAgcG9zaXRpb25DaGFuZ2VkKCk7
CisgICAgZWxzZQorICAgICAgICBlcnJvck9jY3VycmVkKCk7Cit9CisKK2Jvb2wgR2VvbG9jYXRp
b25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vdmVtZW50KEdlb3Bvc2l0aW9uKiBwb3NpdGlv
bjEsIEdlb3Bvc2l0aW9uKiBwb3NpdGlvbjIpCit7CisgICAgQVNTRVJUKHBvc2l0aW9uMSAmJiBw
b3NpdGlvbjIpOworICAgIC8vIEZvciB0aGUgc21hbGwgZGlzdGFuY2VzIGluIHdoaWNoIHdlIGFy
ZSBsaWtlbHkgY29uY2VybmVkLCBpdCdzIHJlYXNvbmFibGUKKyAgICAvLyB0byBhcHByb3hpbWF0
ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvc2l0aW9ucyBhcyB0aGUgc3VtIG9mIHRo
ZQorICAgIC8vIGRpZmZlcmVuY2VzIGluIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUuCisgICAgZG91
YmxlIGRlbHRhID0gZmFicyhwb3NpdGlvbjEtPmNvb3JkcygpLT5sYXRpdHVkZSgpIC0gcG9zaXRp
b24yLT5jb29yZHMoKS0+bGF0aXR1ZGUoKSkKKyAgICAgICAgKyBmYWJzKHBvc2l0aW9uMS0+Y29v
cmRzKCktPmxvbmdpdHVkZSgpIC0gcG9zaXRpb24yLT5jb29yZHMoKS0+bG9uZ2l0dWRlKCkpOwor
ICAgIC8vIEFwcHJveGltYXRlIGNvbnZlcnNpb24gZnJvbSBkZWdyZWVzIG9mIGFyYyB0byBtZXRy
ZXMuCisgICAgZGVsdGEgKj0gNjAgKiAxODUyOworICAgIC8vIFRoZSB0aHJlc2hvbGQgaXMgd2hl
biB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvc2l0aW9ucyBleGNlZWRzIHRoZQorICAg
IC8vIHdvcnNlIChsYXJnZXIpIG9mIHRoZSB0d28gYWNjdXJhY2llcy4KKyAgICBpbnQgbWF4QWNj
dXJhY3kgPSBtYXgocG9zaXRpb24xLT5jb29yZHMoKS0+YWNjdXJhY3koKSwgcG9zaXRpb24yLT5j
b29yZHMoKS0+YWNjdXJhY3koKSk7CisgICAgcmV0dXJuIGRlbHRhID4gbWF4QWNjdXJhY3k7Cit9
CisKK2Jvb2wgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vcmVBY2N1cmF0
ZShHZW9wb3NpdGlvbiogcG9zaXRpb24xLCBHZW9wb3NpdGlvbiogcG9zaXRpb24yKQoreworICAg
IEFTU0VSVChwb3NpdGlvbjEgJiYgcG9zaXRpb24yKTsKKyAgICByZXR1cm4gcG9zaXRpb24yLT5j
b29yZHMoKS0+YWNjdXJhY3koKSA8IHBvc2l0aW9uMS0+Y29vcmRzKCktPmFjY3VyYWN5KCk7Cit9
CisKK2Jvb2wgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vcmVUaW1lbHko
R2VvcG9zaXRpb24qIHBvc2l0aW9uMSwgR2VvcG9zaXRpb24qIHBvc2l0aW9uMikKK3sKKyAgICBB
U1NFUlQocG9zaXRpb24xICYmIHBvc2l0aW9uMik7CisgICAgRE9NVGltZVN0YW1wIGN1cnJlbnRU
aW1lTWlsbGlzID0gV1RGOjpjdXJyZW50VGltZSgpICogMTAwMC4wOworICAgIERPTVRpbWVTdGFt
cCBtYXhpbXVtQWdlTWlsbGlzID0gMTAgKiA2MCAqIDEwMDA7ICAvLyAxMCBtaW51dGVzCisgICAg
cmV0dXJuIGN1cnJlbnRUaW1lTWlsbGlzIC0gcG9zaXRpb24xLT50aW1lc3RhbXAoKSA+IG1heGlt
dW1BZ2VNaWxsaXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQuaAko
cmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZp
Y2VBbmRyb2lkLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmln
aHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZF9oCisjZGVmaW5lIEdlb2xvY2F0aW9uU2VydmljZUFu
ZHJvaWRfaAorCisjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlLmgiCisjaW5jbHVkZSAiVGlt
ZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIu
aD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8g
VGhlIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZSBpcyB0aGUgYnJpZGdlIHRvIHRoZSBKYXZhIGlt
cGxlbWVudGF0aW9uIG9mCisvLyB0aGUgR2VvbG9jYXRpb24gc2VydmljZS4gSXQgaXMgYW4gaW1w
bGVtZW50YXRpb24gZGV0YWlsIG9mCisvLyBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLgorY2xh
c3MgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOworCitjbGFzcyBHZW9sb2NhdGlvblNlcnZpY2VB
bmRyb2lkIDogcHVibGljIEdlb2xvY2F0aW9uU2VydmljZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IEdlb2xvY2F0aW9uU2VydmljZSogY3JlYXRlKEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCopOwor
CisgICAgdmlydHVhbCB+R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZCgpIHt9OworCisgICAgdmly
dHVhbCBib29sIHN0YXJ0VXBkYXRpbmcoUG9zaXRpb25PcHRpb25zKik7CisgICAgdmlydHVhbCB2
b2lkIHN0b3BVcGRhdGluZygpOworCisgICAgdmlydHVhbCBHZW9wb3NpdGlvbiogbGFzdFBvc2l0
aW9uKCkgY29uc3QgeyByZXR1cm4gbV9sYXN0UG9zaXRpb24uZ2V0KCk7IH0KKyAgICB2aXJ0dWFs
IFBvc2l0aW9uRXJyb3IqIGxhc3RFcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdEVycm9yLmdl
dCgpOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc3VzcGVuZCgpOworICAgIHZpcnR1YWwgdm9pZCBy
ZXN1bWUoKTsKKworICAgIC8vIEFuZHJvaWQtc3BlY2lmaWMKKyAgICB2b2lkIG5ld1Bvc2l0aW9u
QXZhaWxhYmxlKFBhc3NSZWZQdHI8R2VvcG9zaXRpb24+KTsKKyAgICB2b2lkIG5ld0Vycm9yQXZh
aWxhYmxlKFBhc3NSZWZQdHI8UG9zaXRpb25FcnJvcj4pOworICAgIHZvaWQgdGltZXJGaXJlZChU
aW1lcjxHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkPiogdGltZXIpOworCitwcml2YXRlOgorICAg
IEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQoR2VvbG9jYXRpb25TZXJ2aWNlQ2xpZW50Kik7CisK
KyAgICBzdGF0aWMgYm9vbCBpc1Bvc2l0aW9uTW92ZW1lbnQoR2VvcG9zaXRpb24qIHBvc2l0aW9u
MSwgR2VvcG9zaXRpb24qIHBvc2l0aW9uMik7CisgICAgc3RhdGljIGJvb2wgaXNQb3NpdGlvbk1v
cmVBY2N1cmF0ZShHZW9wb3NpdGlvbiogcG9zaXRpb24xLCBHZW9wb3NpdGlvbiogcG9zaXRpb24y
KTsKKyAgICBzdGF0aWMgYm9vbCBpc1Bvc2l0aW9uTW9yZVRpbWVseShHZW9wb3NpdGlvbiogcG9z
aXRpb24xLCBHZW9wb3NpdGlvbiogcG9zaXRpb24yKTsKKworICAgIFRpbWVyPEdlb2xvY2F0aW9u
U2VydmljZUFuZHJvaWQ+IG1fdGltZXI7CisgICAgUmVmUHRyPEdlb3Bvc2l0aW9uPiBtX2xhc3RQ
b3NpdGlvbjsKKyAgICBSZWZQdHI8UG9zaXRpb25FcnJvcj4gbV9sYXN0RXJyb3I7CisgICAgT3du
UHRyPEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZT4gbV9qYXZhQnJpZGdlOworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZF9o
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2FuZHJvaWQvR2VvbG9jYXRpb25T
ZXJ2aWNlQnJpZGdlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYW5kcm9p
ZC9HZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIz
NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9q
ZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uU2Vy
dmljZUJyaWRnZS5oIgorCisjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZC5oIgor
I2luY2x1ZGUgIkdlb3Bvc2l0aW9uLmgiCisjaW5jbHVkZSAiUG9zaXRpb25FcnJvci5oIgorI2lu
Y2x1ZGUgIldlYlZpZXdDb3JlLmgiCisjaW5jbHVkZSA8Sk5JSGVscC5oPiAgLy8gRm9yIGpuaVJl
Z2lzdGVyTmF0aXZlTWV0aG9kcworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIEpTQzo6
QmluZGluZ3M6OmdldEpOSUVudjsKKworc3RhdGljIGNvbnN0IGNoYXIqIGphdmFHZW9sb2NhdGlv
blNlcnZpY2VDbGFzc05hbWUgPSAiYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlIjsK
K2VudW0gamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kcyB7CisgICAgR2VvbG9jYXRp
b25TZXJ2aWNlTWV0aG9kSW5pdCA9IDAsCisgICAgR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU3Rh
cnQsCisgICAgR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU3RvcCwKKyAgICBHZW9sb2NhdGlvblNl
cnZpY2VNZXRob2RTZXRFbmFibGVHcHMsCisgICAgR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kQ291
bnQsCit9Oworc3RhdGljIGptZXRob2RJRCBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRo
b2RJRHNbR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kQ291bnRdOworCitzdGF0aWMgY29uc3QgSk5J
TmF0aXZlTWV0aG9kIGphdmFHZW9sb2NhdGlvblNlcnZpY2VDbGFzc05hdGl2ZU1ldGhvZHNbXSA9
IHsKKyAgICB7ICJuYXRpdmVOZXdMb2NhdGlvbkF2YWlsYWJsZSIsICIoSkxhbmRyb2lkL2xvY2F0
aW9uL0xvY2F0aW9uOylWIiwKKyAgICAgICAgKHZvaWQqKSBHZW9sb2NhdGlvblNlcnZpY2VCcmlk
Z2U6Om5ld0xvY2F0aW9uQXZhaWxhYmxlIH0sCisgICAgeyAibmF0aXZlTmV3RXJyb3JBdmFpbGFi
bGUiLCAiKEpMamF2YS9sYW5nL1N0cmluZzspViIsCisgICAgICAgICh2b2lkKikgR2VvbG9jYXRp
b25TZXJ2aWNlQnJpZGdlOjpuZXdFcnJvckF2YWlsYWJsZSB9Cit9OworCitzdGF0aWMgY29uc3Qg
Y2hhciAqamF2YUxvY2F0aW9uQ2xhc3NOYW1lID0gImFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb24i
OworZW51bSBqYXZhTG9jYXRpb25DbGFzc01ldGhvZHMgeworICAgIExvY2F0aW9uTWV0aG9kR2V0
TGF0aXR1ZGUgPSAwLAorICAgIExvY2F0aW9uTWV0aG9kR2V0TG9uZ2l0dWRlLAorICAgIExvY2F0
aW9uTWV0aG9kSGFzQWx0aXR1ZGUsCisgICAgTG9jYXRpb25NZXRob2RHZXRBbHRpdHVkZSwKKyAg
ICBMb2NhdGlvbk1ldGhvZEhhc0FjY3VyYWN5LAorICAgIExvY2F0aW9uTWV0aG9kR2V0QWNjdXJh
Y3ksCisgICAgTG9jYXRpb25NZXRob2RIYXNCZWFyaW5nLAorICAgIExvY2F0aW9uTWV0aG9kR2V0
QmVhcmluZywKKyAgICBMb2NhdGlvbk1ldGhvZEhhc1NwZWVkLAorICAgIExvY2F0aW9uTWV0aG9k
R2V0U3BlZWQsCisgICAgTG9jYXRpb25NZXRob2RHZXRUaW1lLAorICAgIExvY2F0aW9uTWV0aG9k
Q291bnQsCit9Oworc3RhdGljIGptZXRob2RJRCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tM
b2NhdGlvbk1ldGhvZENvdW50XTsKKworR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpHZW9sb2Nh
dGlvblNlcnZpY2VCcmlkZ2UoTGlzdGVuZXJJbnRlcmZhY2UqIGxpc3RlbmVyKQorICAgIDogbV9s
aXN0ZW5lcihsaXN0ZW5lcikKKyAgICAsIG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCgw
KQoreworICAgIEFTU0VSVChtX2xpc3RlbmVyKTsKKyAgICBzdGFydEphdmFJbXBsZW1lbnRhdGlv
bigpOworfQorCitHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6On5HZW9sb2NhdGlvblNlcnZpY2VC
cmlkZ2UoKQoreworICAgIHN0b3AoKTsKKyAgICBzdG9wSmF2YUltcGxlbWVudGF0aW9uKCk7Cit9
CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydCgpCit7CisgICAgQVNTRVJU
KG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCk7CisgICAgZ2V0Sk5JRW52KCktPkNhbGxW
b2lkTWV0aG9kKG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kSURzW0dl
b2xvY2F0aW9uU2VydmljZU1ldGhvZFN0YXJ0XSk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2
aWNlQnJpZGdlOjpzdG9wKCkKK3sKKyAgICBBU1NFUlQobV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNl
T2JqZWN0KTsKKyAgICBnZXRKTklFbnYoKS0+Q2FsbFZvaWRNZXRob2QobV9qYXZhR2VvbG9jYXRp
b25TZXJ2aWNlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhR2Vv
bG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJRHNbR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU3Rv
cF0pOworfQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6c2V0RW5hYmxlR3BzKGJv
b2wgZW5hYmxlKQoreworICAgIEFTU0VSVChtX2phdmFHZW9sb2NhdGlvblNlcnZpY2VPYmplY3Qp
OworICAgIGdldEpOSUVudigpLT5DYWxsVm9pZE1ldGhvZChtX2phdmFHZW9sb2NhdGlvblNlcnZp
Y2VPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFHZW9sb2NhdGlv
blNlcnZpY2VDbGFzc01ldGhvZElEc1tHZW9sb2NhdGlvblNlcnZpY2VNZXRob2RTZXRFbmFibGVH
cHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworfQorCit2b2lk
IEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6bmV3TG9jYXRpb25BdmFpbGFibGUoSk5JRW52KiBl
bnYsIGpjbGFzcywgamxvbmcgbmF0aXZlT2JqZWN0LCBqb2JqZWN0IGxvY2F0aW9uKQoreworICAg
IEFTU0VSVChuYXRpdmVPYmplY3QpOworICAgIEFTU0VSVChsb2NhdGlvbik7CisgICAgR2VvbG9j
YXRpb25TZXJ2aWNlQnJpZGdlKiBvYmplY3QgPSByZWludGVycHJldF9jYXN0PEdlb2xvY2F0aW9u
U2VydmljZUJyaWRnZSo+KG5hdGl2ZU9iamVjdCk7CisgICAgb2JqZWN0LT5tX2xpc3RlbmVyLT5u
ZXdQb3NpdGlvbkF2YWlsYWJsZSh0b0dlb3Bvc2l0aW9uKGVudiwgbG9jYXRpb24pKTsKK30KKwor
dm9pZCBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Om5ld0Vycm9yQXZhaWxhYmxlKEpOSUVudiog
ZW52LCBqY2xhc3MsIGpsb25nIG5hdGl2ZU9iamVjdCwganN0cmluZyBtZXNzYWdlKQoreworICAg
IEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZSogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxHZW9s
b2NhdGlvblNlcnZpY2VCcmlkZ2UqPihuYXRpdmVPYmplY3QpOworICAgIFJlZlB0cjxQb3NpdGlv
bkVycm9yPiBlcnJvciA9CisgICAgICAgIFBvc2l0aW9uRXJyb3I6OmNyZWF0ZShQb3NpdGlvbkVy
cm9yOjpQT1NJVElPTl9VTkFWQUlMQUJMRSwgYW5kcm9pZDo6dG9fc3RyaW5nKGVudiwgbWVzc2Fn
ZSkpOworICAgIG9iamVjdC0+bV9saXN0ZW5lci0+bmV3RXJyb3JBdmFpbGFibGUoZXJyb3IucmVs
ZWFzZSgpKTsKK30KKworUGFzc1JlZlB0cjxHZW9wb3NpdGlvbj4gR2VvbG9jYXRpb25TZXJ2aWNl
QnJpZGdlOjp0b0dlb3Bvc2l0aW9uKEpOSUVudiAqZW52LCBjb25zdCBqb2JqZWN0ICZsb2NhdGlv
bikKK3sKKyAgICAvLyBBbHRpdHVkZSBpcyBvcHRpb25hbCBhbmQgbWF5IG5vdCBiZSBzdXBwbGll
ZC4KKyAgICBib29sIGhhc0FsdGl0dWRlID0KKyAgICAgICAgZW52LT5DYWxsQm9vbGVhbk1ldGhv
ZChsb2NhdGlvbiwgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTG9jYXRpb25NZXRob2RIYXNB
bHRpdHVkZV0pOworICAgIGRvdWJsZSBBbHRpdHVkZSA9CisgICAgICAgIGhhc0FsdGl0dWRlID8K
KyAgICAgICAgZW52LT5DYWxsRG91YmxlTWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFz
c01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldEFsdGl0dWRlXSkgOgorICAgICAgICAwLjA7Cisg
ICAgLy8gQWNjdXJhY3kgaXMgcmVxdWlyZWQsIGJ1dCBpcyBub3Qgc3VwcGxpZWQgYnkgdGhlIGVt
dWxhdG9yLgorICAgIGRvdWJsZSBBY2N1cmFjeSA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5N
ZXRob2QobG9jYXRpb24sIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9k
SGFzQWNjdXJhY3ldKSA/CisgICAgICAgIGVudi0+Q2FsbEZsb2F0TWV0aG9kKGxvY2F0aW9uLCBq
YXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldEFjY3VyYWN5XSkgOgor
ICAgICAgICAwLjA7CisgICAgLy8gaGVhZGluZyBpcyBvcHRpb25hbCBhbmQgbWF5IG5vdCBiZSBz
dXBwbGllZC4KKyAgICBib29sIGhhc0hlYWRpbmcgPQorICAgICAgICBlbnYtPkNhbGxCb29sZWFu
TWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhv
ZEhhc0JlYXJpbmddKTsKKyAgICBkb3VibGUgaGVhZGluZyA9CisgICAgICAgIGhhc0hlYWRpbmcg
PworICAgICAgICBlbnYtPkNhbGxGbG9hdE1ldGhvZChsb2NhdGlvbiwgamF2YUxvY2F0aW9uQ2xh
c3NNZXRob2RJRHNbTG9jYXRpb25NZXRob2RHZXRCZWFyaW5nXSkgOgorICAgICAgICAwLjA7Cisg
ICAgLy8gc3BlZWQgaXMgb3B0aW9uYWwgYW5kIG1heSBub3QgYmUgc3VwcGxpZWQuCisgICAgYm9v
bCBoYXNTcGVlZCA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobG9jYXRpb24sIGph
dmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kSGFzU3BlZWRdKTsKKyAgICBk
b3VibGUgc3BlZWQgPQorICAgICAgICBoYXNTcGVlZCA/CisgICAgICAgIGVudi0+Q2FsbEZsb2F0
TWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhv
ZEdldFNwZWVkXSkgOgorICAgICAgICAwLjA7CisKKyAgICBSZWZQdHI8Q29vcmRpbmF0ZXM+IG5l
d0Nvb3JkaW5hdGVzID0gV2ViQ29yZTo6Q29vcmRpbmF0ZXM6OmNyZWF0ZSgKKyAgICAgICAgZW52
LT5DYWxsRG91YmxlTWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tM
b2NhdGlvbk1ldGhvZEdldExhdGl0dWRlXSksCisgICAgICAgIGVudi0+Q2FsbERvdWJsZU1ldGhv
ZChsb2NhdGlvbiwgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTG9jYXRpb25NZXRob2RHZXRM
b25naXR1ZGVdKSwKKyAgICAgICAgaGFzQWx0aXR1ZGUsIEFsdGl0dWRlLAorICAgICAgICBBY2N1
cmFjeSwKKyAgICAgICAgZmFsc2UsIDAuMCwgIC8vIEFsdGl0dWRlQWNjdXJhY3kgbm90IHByb3Zp
ZGVkLgorICAgICAgICBoYXNIZWFkaW5nLCBoZWFkaW5nLAorICAgICAgICBoYXNTcGVlZCwgc3Bl
ZWQpOworCisgICAgcmV0dXJuIFdlYkNvcmU6Okdlb3Bvc2l0aW9uOjpjcmVhdGUoCisgICAgICAg
ICBuZXdDb29yZGluYXRlcy5yZWxlYXNlKCksCisgICAgICAgICBlbnYtPkNhbGxMb25nTWV0aG9k
KGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldFRp
bWVdKSk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydEphdmFJbXBs
ZW1lbnRhdGlvbigpCit7CisgICAgSk5JRW52KiBlbnYgPSBnZXRKTklFbnYoKTsKKworICAgIC8v
IEdldCB0aGUgSmF2YSBHZW9sb2NhdGlvblNlcnZpY2UgY2xhc3MuCisgICAgamNsYXNzIGphdmFH
ZW9sb2NhdGlvblNlcnZpY2VDbGFzcyA9IGVudi0+RmluZENsYXNzKGphdmFHZW9sb2NhdGlvblNl
cnZpY2VDbGFzc05hbWUpOworICAgIEFTU0VSVChqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3Mp
OworCisgICAgLy8gU2V0IHVwIHRoZSBtZXRob2RzIHdlIHdpc2ggdG8gY2FsbCBvbiB0aGUgSmF2
YSBHZW9sb2NhdGlvblNlcnZpY2UgY2xhc3MuCisgICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNs
YXNzTWV0aG9kSURzW0dlb2xvY2F0aW9uU2VydmljZU1ldGhvZEluaXRdID0KKyAgICAgICAgICAg
IGVudi0+R2V0TWV0aG9kSUQoamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzLCAiPGluaXQ+Iiwg
IihKKVYiKTsKKyAgICBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJRHNbR2VvbG9j
YXRpb25TZXJ2aWNlTWV0aG9kU3RhcnRdID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQo
amF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzLCAic3RhcnQiLCAiKClWIik7CisgICAgamF2YUdl
b2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kSURzW0dlb2xvY2F0aW9uU2VydmljZU1ldGhvZFN0
b3BdID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUdlb2xvY2F0aW9uU2Vydmlj
ZUNsYXNzLCAic3RvcCIsICIoKVYiKTsKKyAgICBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NN
ZXRob2RJRHNbR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU2V0RW5hYmxlR3BzXSA9CisgICAgICAg
ICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFHZW9sb2NhdGlvblNlcnZpY2VDbGFzcywgInNldEVu
YWJsZUdwcyIsICIoWilWIik7CisKKyAgICAvLyBDcmVhdGUgdGhlIEphdmEgR2VvbG9jYXRpb25T
ZXJ2aWNlIG9iamVjdC4KKyAgICBqbG9uZyBuYXRpdmVPYmplY3QgPSByZWludGVycHJldF9jYXN0
PGpsb25nPih0aGlzKTsKKyAgICBqb2JqZWN0IG9iamVjdCA9IGVudi0+TmV3T2JqZWN0KGphdmFH
ZW9sb2NhdGlvblNlcnZpY2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGphdmFHZW9sb2NhdGlvblNlcnZpY2VDbGFzc01ldGhvZElEc1tHZW9sb2NhdGlvblNlcnZp
Y2VNZXRob2RJbml0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2
ZU9iamVjdCk7CisKKyAgICBtX2phdmFHZW9sb2NhdGlvblNlcnZpY2VPYmplY3QgPSBnZXRKTklF
bnYoKS0+TmV3R2xvYmFsUmVmKG9iamVjdCk7CisgICAgQVNTRVJUKG1famF2YUdlb2xvY2F0aW9u
U2VydmljZU9iamVjdCk7CisKKyAgICAvLyBSZWdpc3RlciB0byBoYW5kbGUgY2FsbHMgdG8gbmF0
aXZlIG1ldGhvZHMgb2YgdGhlIEphdmEgR2VvbG9jYXRpb25TZXJ2aWNlCisgICAgLy8gb2JqZWN0
LiBXZSByZWdpc3RlciBvbmNlIG9ubHkuCisgICAgc3RhdGljIGludCByZWdpc3RlcmVkID0gam5p
UmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTmFtZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2
YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTmF0aXZlTWV0aG9kcywKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVMRU0oamF2YUdlb2xvY2F0aW9u
U2VydmljZUNsYXNzTmF0aXZlTWV0aG9kcykpOworICAgIEFTU0VSVChyZWdpc3RlcmVkID09IEpO
SV9PSyk7CisKKyAgICAvLyBTZXQgdXAgdGhlIG1ldGhvZHMgd2Ugd2lzaCB0byBjYWxsIG9uIHRo
ZSBKYXZhIExvY2F0aW9uIGNsYXNzLgorICAgIGpjbGFzcyBqYXZhTG9jYXRpb25DbGFzcyA9IGVu
di0+RmluZENsYXNzKGphdmFMb2NhdGlvbkNsYXNzTmFtZSk7CisgICAgQVNTRVJUKGphdmFMb2Nh
dGlvbkNsYXNzKTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhv
ZEdldExhdGl0dWRlXSA9CisgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUxvY2F0aW9uQ2xh
c3MsICJnZXRMYXRpdHVkZSIsICIoKUQiKTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElE
c1tMb2NhdGlvbk1ldGhvZEdldExvbmdpdHVkZV0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElE
KGphdmFMb2NhdGlvbkNsYXNzLCAiZ2V0TG9uZ2l0dWRlIiwgIigpRCIpOworICAgIGphdmFMb2Nh
dGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kSGFzQWx0aXR1ZGVdID0KKyAgICAgICAg
ZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImhhc0FsdGl0dWRlIiwgIigpWiIp
OworICAgIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kR2V0QWx0aXR1
ZGVdID0KKyAgICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImdldEFs
dGl0dWRlIiwgIigpRCIpOworICAgIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9u
TWV0aG9kSGFzQWNjdXJhY3ldID0KKyAgICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRp
b25DbGFzcywgImhhc0FjY3VyYWN5IiwgIigpWiIpOworICAgIGphdmFMb2NhdGlvbkNsYXNzTWV0
aG9kSURzW0xvY2F0aW9uTWV0aG9kR2V0QWNjdXJhY3ldID0KKyAgICAgICAgZW52LT5HZXRNZXRo
b2RJRChqYXZhTG9jYXRpb25DbGFzcywgImdldEFjY3VyYWN5IiwgIigpRiIpOworICAgIGphdmFM
b2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kSGFzQmVhcmluZ10gPQorICAgICAg
ICBlbnYtPkdldE1ldGhvZElEKGphdmFMb2NhdGlvbkNsYXNzLCAiaGFzQmVhcmluZyIsICIoKVoi
KTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldEJlYXJp
bmddID0KKyAgICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImdldEJl
YXJpbmciLCAiKClGIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTG9jYXRpb25N
ZXRob2RIYXNTcGVlZF0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFMb2NhdGlvbkNs
YXNzLCAiaGFzU3BlZWQiLCAiKClaIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNb
TG9jYXRpb25NZXRob2RHZXRTcGVlZF0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFM
b2NhdGlvbkNsYXNzLCAiZ2V0U3BlZWQiLCAiKClGIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NN
ZXRob2RJRHNbTG9jYXRpb25NZXRob2RHZXRUaW1lXSA9CisgICAgICAgIGVudi0+R2V0TWV0aG9k
SUQoamF2YUxvY2F0aW9uQ2xhc3MsICJnZXRUaW1lIiwgIigpSiIpOworfQorCit2b2lkIEdlb2xv
Y2F0aW9uU2VydmljZUJyaWRnZTo6c3RvcEphdmFJbXBsZW1lbnRhdGlvbigpCit7CisgICAgLy8g
Q2FsbGVkIGJ5IEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQgb24gV2ViS2l0IHRocmVhZC4KKyAg
ICBBU1NFUlQobV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNlT2JqZWN0KTsKKyAgICBnZXRKTklFbnYo
KS0+RGVsZXRlR2xvYmFsUmVmKG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCk7Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUJy
aWRnZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0
aW9uU2VydmljZUJyaWRnZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDY1IEBACisvKgorICog
Q29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIg
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZV9oCisjZGVmaW5lIEdlb2xvY2F0aW9uU2Vy
dmljZUJyaWRnZV9oCisKKyNpbmNsdWRlIDxqbmlfdXRpbGl0eS5oPgorI2luY2x1ZGUgPHd0Zi9Q
YXNzUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR2VvbG9jYXRpb25T
ZXJ2aWNlQW5kcm9pZDsKK2NsYXNzIEdlb3Bvc2l0aW9uOworCisvLyBHZW9sb2NhdGlvblNlcnZp
Y2VCcmlkZ2UgaXMgdGhlIGJyaWRnZSB0byB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbi4gSXQgbWFu
YWdlcworLy8gdGhlIGxpZmV0aW1lIG9mIHRoZSBKYXZhIG9iamVjdC4gSXQgaXMgYW4gaW1wbGVt
ZW50YXRpb24gZGV0YWlsIG9mCisvLyBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLgorY2xhc3Mg
R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEdlb2xvY2F0
aW9uU2VydmljZUFuZHJvaWQgTGlzdGVuZXJJbnRlcmZhY2U7CisgICAgR2VvbG9jYXRpb25TZXJ2
aWNlQnJpZGdlKExpc3RlbmVySW50ZXJmYWNlKiBsaXN0ZW5lcik7CisgICAgfkdlb2xvY2F0aW9u
U2VydmljZUJyaWRnZSgpOworCisgICAgdm9pZCBzdGFydCgpOworICAgIHZvaWQgc3RvcCgpOwor
ICAgIHZvaWQgc2V0RW5hYmxlR3BzKGJvb2wgZW5hYmxlKTsKKworICAgIC8vIFN0YXRpYyB3cmFw
cGVyIGZ1bmN0aW9ucyB0byBoaWRlIEpOSSBuYXN0aW5lc3MuCisgICAgc3RhdGljIHZvaWQgbmV3
TG9jYXRpb25BdmFpbGFibGUoSk5JRW52ICplbnYsIGpjbGFzcywgamxvbmcgbmF0aXZlT2JqZWN0
LCBqb2JqZWN0IGxvY2F0aW9uKTsKKyAgICBzdGF0aWMgdm9pZCBuZXdFcnJvckF2YWlsYWJsZShK
TklFbnYgKmVudiwgamNsYXNzLCBqbG9uZyBuYXRpdmVPYmplY3QsIGpzdHJpbmcgbWVzc2FnZSk7
CisgICAgc3RhdGljIFBhc3NSZWZQdHI8R2VvcG9zaXRpb24+IHRvR2VvcG9zaXRpb24oSk5JRW52
ICplbnYsIGNvbnN0IGpvYmplY3QgJmxvY2F0aW9uKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHN0
YXJ0SmF2YUltcGxlbWVudGF0aW9uKCk7CisgICAgdm9pZCBzdG9wSmF2YUltcGxlbWVudGF0aW9u
KCk7CisKKyAgICBMaXN0ZW5lckludGVyZmFjZSogbV9saXN0ZW5lcjsKKyAgICBqb2JqZWN0IG1f
amF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZV9oClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43315</attachid>
            <date>2009-11-16 10:52:37 -0800</date>
            <delta_ts>2009-11-17 04:28:20 -0800</delta_ts>
            <desc>Android implementation of the GeolocationService implementation v2</desc>
            <filename>31544.patch.v2</filename>
            <type>text/plain</type>
            <size>26799</size>
            <attacher name="Andrei Popescu">andreip</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MTA0MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDMgQEAKKzIwMDktMTEtMTYgIEFuZHJlaSBQb3Blc2N1ICA8YW5kcmVpcEBnb29n
bGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtBbmRyb2lkXSBBbmRyb2lkIGlzIG1pc3NpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBH
ZW9sb2NhdGlvblNlcnZpY2UgaWZhY2UuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zMTU1NAorCisgICAgICAgIE5vIG5ldyB0ZXN0cyByZXF1aXJlZCBh
cyB0aGlzIGlzIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9h
bmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmNyZWF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lk
KToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OnN0YXJ0VXBk
YXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6c3Rv
cFVwZGF0aW5nKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6
OnN1c3BlbmQpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6
cmVzdW1lKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6Om5l
d1Bvc2l0aW9uQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2Vydmlj
ZUFuZHJvaWQ6Om5ld0Vycm9yQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0
aW9uU2VydmljZUFuZHJvaWQ6OnRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9j
YXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vdmVtZW50KToKKyAgICAgICAgKFdlYkNv
cmU6Okdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmlzUG9zaXRpb25Nb3JlQWNjdXJhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1v
cmVUaW1lbHkpOgorICAgICAgICAqIHBsYXRmb3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNl
QW5kcm9pZC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUFu
ZHJvaWQ6On5HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkKToKKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6Omxhc3RQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3Jl
OjpHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjpsYXN0RXJyb3IpOgorICAgICAgICAqIHBsYXRm
b3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdl
OjpHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRp
b25TZXJ2aWNlQnJpZGdlOjp+R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlKToKKyAgICAgICAgKFdl
YkNvcmU6Okdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6c3RhcnQpOgorICAgICAgICAoV2ViQ29y
ZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdG9wKToKKyAgICAgICAgKFdlYkNvcmU6Okdl
b2xvY2F0aW9uU2VydmljZUJyaWRnZTo6c2V0RW5hYmxlR3BzKToKKyAgICAgICAgKFdlYkNvcmU6
Okdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6bmV3TG9jYXRpb25BdmFpbGFibGUpOgorICAgICAg
ICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpuZXdFcnJvckF2YWlsYWJsZSk6
CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6OnRvR2VvcG9zaXRp
b24pOgorICAgICAgICAoV2ViQ29yZTo6R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydEph
dmFJbXBsZW1lbnRhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHZW9sb2NhdGlvblNlcnZpY2VC
cmlkZ2U6OnN0b3BKYXZhSW1wbGVtZW50YXRpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2FuZHJv
aWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmg6IEFkZGVkLgorCiAyMDA5LTExLTE2ICBBbGV4
ZXkgUHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERh
cmluIEFkbGVyLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9uU2Vy
dmljZUFuZHJvaWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYW5kcm9pZC9H
ZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmNwcAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3Bl
biBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJH
ZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmgiCisKKyNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZp
Y2VCcmlkZ2UuaCIKKyNpbmNsdWRlICJHZW9wb3NpdGlvbi5oIgorI2luY2x1ZGUgIlBvc2l0aW9u
RXJyb3IuaCIKKyNpbmNsdWRlICJQb3NpdGlvbk9wdGlvbnMuaCIKKworI2luY2x1ZGUgPHd0Zi9D
dXJyZW50VGltZS5oPgorCit1c2luZyBKU0M6OkJpbmRpbmdzOjpnZXRKTklFbnY7Cit1c2luZyBu
YW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEdlb2xvY2F0aW9uU2Vy
dmljZUFuZHJvaWQgaXMgdGhlIEFuZHJvaWQgaW1wbG1lbnRhdGlvbiBvZiBHZW9sb2NhdGlvbgor
Ly8gc2VydmljZS4gRWFjaCBvYmplY3Qgb2YgdGhpcyBjbGFzcyBvd25zIGFuIG9iamVjdCBvZiB0
eXBlCisvLyBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UsIHdoaWNoIGluIHR1cm4gb3ducyBhIEph
dmEgR2VvbG9jYXRpb25TZXJ2aWNlCisvLyBvYmplY3QuIFRoZXJlZm9yZSwgdGhlcmUgaXMgYSAx
OjEgbWFwcGluZyBiZXR3ZWVuIEdlb2xvY2F0aW9uLAorLy8gR2VvbG9jYXRpb25TZXJ2aWNlQW5k
cm9pZCwgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlIGFuZCBKYXZhCisvLyBHZW9sb2NhdGlvblNl
cnZpY2Ugb2JqZWN0cy4gSW4gdGhlIGNhc2Ugd2hlcmUgbXVsdGlwbGUgR2VvbG9jYXRpb24gb2Jq
ZWN0cworLy8gZXhpc3Qgc2ltdWx0YW5lb3VzbHksIHRoZSBjb3JyZXNwb25zaW5nIEphdmEgR2Vv
bG9jYXRpb25TZXJ2aWNlIG9iamVjdHMgYWxsCisvLyByZWdpc3RlciB3aXRoIHRoZSBwbGF0Zm9y
bSBsb2NhdGlvbiBzZXJ2aWNlLiBJdCBpcyB0aGUgcGxhdGZvcm0gc2VydmljZSB0aGF0CisvLyBo
YW5kbGVzIG1ha2luZyBzdXJlIHRoYXQgdXBkYXRlcyBhcmUgcGFzc2VkIHRvIGFsbCBHZW9sb2Nh
dGlvbiBvYmplY3RzLgorR2VvbG9jYXRpb25TZXJ2aWNlKiBHZW9sb2NhdGlvblNlcnZpY2VBbmRy
b2lkOjpjcmVhdGUoR2VvbG9jYXRpb25TZXJ2aWNlQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0
dXJuIG5ldyBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkKGNsaWVudCk7Cit9CisKK0dlb2xvY2F0
aW9uU2VydmljZTo6RmFjdG9yeUZ1bmN0aW9uKiBHZW9sb2NhdGlvblNlcnZpY2U6OnNfZmFjdG9y
eUZ1bmN0aW9uID0gJkdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQ6OmNyZWF0ZTsKKworR2VvbG9j
YXRpb25TZXJ2aWNlQW5kcm9pZDo6R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZChHZW9sb2NhdGlv
blNlcnZpY2VDbGllbnQqIGNsaWVudCkKKyAgICA6IEdlb2xvY2F0aW9uU2VydmljZShjbGllbnQp
CisgICAgLCBtX3RpbWVyKHRoaXMsICZHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOjp0aW1lckZp
cmVkKQorICAgICwgbV9qYXZhQnJpZGdlKDApCit7Cit9CisKK2Jvb2wgR2VvbG9jYXRpb25TZXJ2
aWNlQW5kcm9pZDo6c3RhcnRVcGRhdGluZyhQb3NpdGlvbk9wdGlvbnMqIG9wdGlvbnMpCit7Cisg
ICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuZXcgd2F0Y2ggb3Igb25l
LXNob3QgcG9zaXRpb24gcmVxdWVzdAorICAgIC8vIGlzIHN0YXJ0ZWQuIElmIHdlIGFscmVhZHkg
aGF2ZSBhIHBvc2l0aW9uIG9yIGFuIGVycm9yLCBjYWxsIGJhY2sKKyAgICAvLyBpbW1lZGlhdGVs
eS4KKyAgICBpZiAobV9sYXN0UG9zaXRpb24gfHwgbV9sYXN0RXJyb3IpIHsKKyAgICAgICAgQVNT
RVJUKG1famF2YUJyaWRnZSk7CisgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOworICAg
IH0KKworICAgIC8vIExhemlsbHkgY3JlYXRlIHRoZSBKYXZhIG9iamVjdC4KKyAgICBib29sIGhh
dmVKYXZhQnJpZGdlID0gbV9qYXZhQnJpZGdlOworICAgIGlmICghaGF2ZUphdmFCcmlkZ2UpCisg
ICAgICAgIG1famF2YUJyaWRnZS5zZXQobmV3IEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZSh0aGlz
KSk7CisgICAgQVNTRVJUKG1famF2YUJyaWRnZSk7CisKKyAgICAvLyBPbiBBbmRyb2lkLCBoaWdo
IHBvd2VyID09IEdQUy4gU2V0IHdoZXRoZXIgdG8gdXNlIEdQUyBiZWZvcmUgd2Ugc3RhcnQgdGhl
CisgICAgLy8gaW1wbGVtZW50YXRpb24uCisgICAgQVNTRVJUKG9wdGlvbnMpOworICAgIGlmIChv
cHRpb25zLT5lbmFibGVIaWdoQWNjdXJhY3koKSkKKyAgICAgICAgbV9qYXZhQnJpZGdlLT5zZXRF
bmFibGVHcHModHJ1ZSk7CisKKyAgICBpZiAoIWhhdmVKYXZhQnJpZGdlKQorICAgICAgICBtX2ph
dmFCcmlkZ2UtPnN0YXJ0KCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHZW9sb2Nh
dGlvblNlcnZpY2VBbmRyb2lkOjpzdG9wVXBkYXRpbmcoKQoreworICAgIC8vIENhbGxlZCB3aGVu
IHRoZSBHZW9sb2NhdGlvbiBvYmplY3QgaGFzIG5vIHdhdGNoZXMgb3Igb25lIHNob3RzIGluCisg
ICAgLy8gcHJvZ3Jlc3MuCisgICAgbV9qYXZhQnJpZGdlLmNsZWFyKCk7CisgICAgLy8gUmVzZXQg
bGFzdCBwb3NpdGlvbiBhbmQgZXJyb3IgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIHRyeSB0
byBnZXQgYQorICAgIC8vIG5ldyBwb3NpdGlvbiBmcm9tIHRoZSBzeXN0ZW0gc2VydmljZSB3aGVu
IGEgcmVxdWVzdCBpcyBmaXJzdCBtYWRlLgorICAgIG1fbGFzdFBvc2l0aW9uID0gMDsKKyAgICBt
X2xhc3RFcnJvciA9IDA7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6c3Vz
cGVuZCgpCit7CisgICAgQVNTRVJUKG1famF2YUJyaWRnZSk7CisgICAgbV9qYXZhQnJpZGdlLT5z
dG9wKCk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6cmVzdW1lKCkKK3sK
KyAgICBBU1NFUlQobV9qYXZhQnJpZGdlKTsKKyAgICBtX2phdmFCcmlkZ2UtPnN0YXJ0KCk7Cit9
CisKKy8vIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBzdWJzZXF1ZW50IGNh
bGxzIHRvIHRoaXMgbWV0aG9kIG9mZmVyIGEKKy8vIG1vcmUgYWNjdXJhdGUgb3IgdXBkYXRlZCBw
b3NpdGlvbi4KK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6bmV3UG9zaXRpb25BdmFp
bGFibGUoUGFzc1JlZlB0cjxHZW9wb3NpdGlvbj4gcG9zaXRpb24pCit7CisgICAgQVNTRVJUKHBv
c2l0aW9uKTsKKyAgICBpZiAoIW1fbGFzdFBvc2l0aW9uCisgICAgICAgIHx8IGlzUG9zaXRpb25N
b3ZlbWVudChtX2xhc3RQb3NpdGlvbi5nZXQoKSwgcG9zaXRpb24uZ2V0KCkpCisgICAgICAgIHx8
IGlzUG9zaXRpb25Nb3JlQWNjdXJhdGUobV9sYXN0UG9zaXRpb24uZ2V0KCksIHBvc2l0aW9uLmdl
dCgpKQorICAgICAgICB8fCBpc1Bvc2l0aW9uTW9yZVRpbWVseShtX2xhc3RQb3NpdGlvbi5nZXQo
KSwgcG9zaXRpb24uZ2V0KCkpKSB7CisgICAgICAgIG1fbGFzdFBvc2l0aW9uID0gcG9zaXRpb247
CisgICAgICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlcnJvci4KKyAgICAgICAgbV9sYXN0RXJyb3Ig
PSAwOworICAgICAgICBwb3NpdGlvbkNoYW5nZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgR2VvbG9j
YXRpb25TZXJ2aWNlQW5kcm9pZDo6bmV3RXJyb3JBdmFpbGFibGUoUGFzc1JlZlB0cjxQb3NpdGlv
bkVycm9yPiBlcnJvcikKK3sKKyAgICBBU1NFUlQoZXJyb3IpOworICAgIC8vIFdlIGxlYXZlIHRo
ZSBsYXN0IHBvc2l0aW9uCisgICAgbV9sYXN0RXJyb3IgPSBlcnJvcjsKKyAgICBlcnJvck9jY3Vy
cmVkKCk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6dGltZXJGaXJlZChU
aW1lcjxHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkPiogdGltZXIpCit7CisgICAgQVNTRVJUKCZt
X3RpbWVyID09IHRpbWVyKTsKKyAgICBBU1NFUlQobV9sYXN0UG9zaXRpb24gfHwgbV9sYXN0RXJy
b3IpOworICAgIGlmIChtX2xhc3RQb3NpdGlvbikKKyAgICAgICAgcG9zaXRpb25DaGFuZ2VkKCk7
CisgICAgZWxzZQorICAgICAgICBlcnJvck9jY3VycmVkKCk7Cit9CisKK2Jvb2wgR2VvbG9jYXRp
b25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vdmVtZW50KEdlb3Bvc2l0aW9uKiBwb3NpdGlv
bjEsIEdlb3Bvc2l0aW9uKiBwb3NpdGlvbjIpCit7CisgICAgQVNTRVJUKHBvc2l0aW9uMSAmJiBw
b3NpdGlvbjIpOworICAgIC8vIEZvciB0aGUgc21hbGwgZGlzdGFuY2VzIGluIHdoaWNoIHdlIGFy
ZSBsaWtlbHkgY29uY2VybmVkLCBpdCdzIHJlYXNvbmFibGUKKyAgICAvLyB0byBhcHByb3hpbWF0
ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvc2l0aW9ucyBhcyB0aGUgc3VtIG9mIHRo
ZQorICAgIC8vIGRpZmZlcmVuY2VzIGluIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUuCisgICAgZG91
YmxlIGRlbHRhID0gZmFicyhwb3NpdGlvbjEtPmNvb3JkcygpLT5sYXRpdHVkZSgpIC0gcG9zaXRp
b24yLT5jb29yZHMoKS0+bGF0aXR1ZGUoKSkKKyAgICAgICAgKyBmYWJzKHBvc2l0aW9uMS0+Y29v
cmRzKCktPmxvbmdpdHVkZSgpIC0gcG9zaXRpb24yLT5jb29yZHMoKS0+bG9uZ2l0dWRlKCkpOwor
ICAgIC8vIEFwcHJveGltYXRlIGNvbnZlcnNpb24gZnJvbSBkZWdyZWVzIG9mIGFyYyB0byBtZXRy
ZXMuCisgICAgZGVsdGEgKj0gNjAgKiAxODUyOworICAgIC8vIFRoZSB0aHJlc2hvbGQgaXMgd2hl
biB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvc2l0aW9ucyBleGNlZWRzIHRoZQorICAg
IC8vIHdvcnNlIChsYXJnZXIpIG9mIHRoZSB0d28gYWNjdXJhY2llcy4KKyAgICBpbnQgbWF4QWNj
dXJhY3kgPSBtYXgocG9zaXRpb24xLT5jb29yZHMoKS0+YWNjdXJhY3koKSwgcG9zaXRpb24yLT5j
b29yZHMoKS0+YWNjdXJhY3koKSk7CisgICAgcmV0dXJuIGRlbHRhID4gbWF4QWNjdXJhY3k7Cit9
CisKK2Jvb2wgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vcmVBY2N1cmF0
ZShHZW9wb3NpdGlvbiogcG9zaXRpb24xLCBHZW9wb3NpdGlvbiogcG9zaXRpb24yKQoreworICAg
IEFTU0VSVChwb3NpdGlvbjEgJiYgcG9zaXRpb24yKTsKKyAgICByZXR1cm4gcG9zaXRpb24yLT5j
b29yZHMoKS0+YWNjdXJhY3koKSA8IHBvc2l0aW9uMS0+Y29vcmRzKCktPmFjY3VyYWN5KCk7Cit9
CisKK2Jvb2wgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZDo6aXNQb3NpdGlvbk1vcmVUaW1lbHko
R2VvcG9zaXRpb24qIHBvc2l0aW9uMSwgR2VvcG9zaXRpb24qIHBvc2l0aW9uMikKK3sKKyAgICBB
U1NFUlQocG9zaXRpb24xICYmIHBvc2l0aW9uMik7CisgICAgRE9NVGltZVN0YW1wIGN1cnJlbnRU
aW1lTWlsbGlzID0gV1RGOjpjdXJyZW50VGltZSgpICogMTAwMC4wOworICAgIERPTVRpbWVTdGFt
cCBtYXhpbXVtQWdlTWlsbGlzID0gMTAgKiA2MCAqIDEwMDA7ICAvLyAxMCBtaW51dGVzCisgICAg
cmV0dXJuIGN1cnJlbnRUaW1lTWlsbGlzIC0gcG9zaXRpb24xLT50aW1lc3RhbXAoKSA+IG1heGlt
dW1BZ2VNaWxsaXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQuaAko
cmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYW5kcm9pZC9HZW9sb2NhdGlvblNlcnZp
Y2VBbmRyb2lkLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmln
aHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZF9oCisjZGVmaW5lIEdlb2xvY2F0aW9uU2VydmljZUFu
ZHJvaWRfaAorCisjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlLmgiCisjaW5jbHVkZSAiVGlt
ZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIu
aD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8g
VGhlIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZSBpcyB0aGUgYnJpZGdlIHRvIHRoZSBKYXZhIGlt
cGxlbWVudGF0aW9uIG9mCisvLyB0aGUgR2VvbG9jYXRpb24gc2VydmljZS4gSXQgaXMgYW4gaW1w
bGVtZW50YXRpb24gZGV0YWlsIG9mCisvLyBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkLgorY2xh
c3MgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOworCitjbGFzcyBHZW9sb2NhdGlvblNlcnZpY2VB
bmRyb2lkIDogcHVibGljIEdlb2xvY2F0aW9uU2VydmljZSB7CitwdWJsaWM6CisgICAgc3RhdGlj
IEdlb2xvY2F0aW9uU2VydmljZSogY3JlYXRlKEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCopOwor
CisgICAgdmlydHVhbCB+R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZCgpIHsgfTsKKworICAgIHZp
cnR1YWwgYm9vbCBzdGFydFVwZGF0aW5nKFBvc2l0aW9uT3B0aW9ucyopOworICAgIHZpcnR1YWwg
dm9pZCBzdG9wVXBkYXRpbmcoKTsKKworICAgIHZpcnR1YWwgR2VvcG9zaXRpb24qIGxhc3RQb3Np
dGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdFBvc2l0aW9uLmdldCgpOyB9CisgICAgdmlydHVh
bCBQb3NpdGlvbkVycm9yKiBsYXN0RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX2xhc3RFcnJvci5n
ZXQoKTsgfQorCisgICAgdmlydHVhbCB2b2lkIHN1c3BlbmQoKTsKKyAgICB2aXJ0dWFsIHZvaWQg
cmVzdW1lKCk7CisKKyAgICAvLyBBbmRyb2lkLXNwZWNpZmljCisgICAgdm9pZCBuZXdQb3NpdGlv
bkF2YWlsYWJsZShQYXNzUmVmUHRyPEdlb3Bvc2l0aW9uPik7CisgICAgdm9pZCBuZXdFcnJvckF2
YWlsYWJsZShQYXNzUmVmUHRyPFBvc2l0aW9uRXJyb3I+KTsKKyAgICB2b2lkIHRpbWVyRmlyZWQo
VGltZXI8R2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZD4qIHRpbWVyKTsKKworcHJpdmF0ZToKKyAg
ICBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkKEdlb2xvY2F0aW9uU2VydmljZUNsaWVudCopOwor
CisgICAgc3RhdGljIGJvb2wgaXNQb3NpdGlvbk1vdmVtZW50KEdlb3Bvc2l0aW9uKiBwb3NpdGlv
bjEsIEdlb3Bvc2l0aW9uKiBwb3NpdGlvbjIpOworICAgIHN0YXRpYyBib29sIGlzUG9zaXRpb25N
b3JlQWNjdXJhdGUoR2VvcG9zaXRpb24qIHBvc2l0aW9uMSwgR2VvcG9zaXRpb24qIHBvc2l0aW9u
Mik7CisgICAgc3RhdGljIGJvb2wgaXNQb3NpdGlvbk1vcmVUaW1lbHkoR2VvcG9zaXRpb24qIHBv
c2l0aW9uMSwgR2VvcG9zaXRpb24qIHBvc2l0aW9uMik7CisKKyAgICBUaW1lcjxHZW9sb2NhdGlv
blNlcnZpY2VBbmRyb2lkPiBtX3RpbWVyOworICAgIFJlZlB0cjxHZW9wb3NpdGlvbj4gbV9sYXN0
UG9zaXRpb247CisgICAgUmVmUHRyPFBvc2l0aW9uRXJyb3I+IG1fbGFzdEVycm9yOworICAgIE93
blB0cjxHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U+IG1famF2YUJyaWRnZTsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWRf
aApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9uU2VydmljZUJyaWRn
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0dlb2xvY2F0aW9u
U2VydmljZUJyaWRnZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2FuZHJv
aWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwy
MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJv
amVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHZW9sb2NhdGlvblNl
cnZpY2VCcmlkZ2UuaCIKKworI2luY2x1ZGUgIkdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQuaCIK
KyNpbmNsdWRlICJHZW9wb3NpdGlvbi5oIgorI2luY2x1ZGUgIlBvc2l0aW9uRXJyb3IuaCIKKyNp
bmNsdWRlICJXZWJWaWV3Q29yZS5oIgorI2luY2x1ZGUgPEpOSUhlbHAuaD4KKyNpbmNsdWRlIDxq
bmlfdXRpbGl0eS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIEpTQzo6QmluZGlu
Z3M6OmdldEpOSUVudjsKKworc3RhdGljIGNvbnN0IGNoYXIqIGphdmFHZW9sb2NhdGlvblNlcnZp
Y2VDbGFzc05hbWUgPSAiYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlIjsKK2VudW0g
amF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kcyB7CisgICAgR2VvbG9jYXRpb25TZXJ2
aWNlTWV0aG9kSW5pdCA9IDAsCisgICAgR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU3RhcnQsCisg
ICAgR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU3RvcCwKKyAgICBHZW9sb2NhdGlvblNlcnZpY2VN
ZXRob2RTZXRFbmFibGVHcHMsCisgICAgR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kQ291bnQsCit9
Oworc3RhdGljIGptZXRob2RJRCBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJRHNb
R2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kQ291bnRdOworCitzdGF0aWMgY29uc3QgSk5JTmF0aXZl
TWV0aG9kIGphdmFHZW9sb2NhdGlvblNlcnZpY2VDbGFzc05hdGl2ZU1ldGhvZHNbXSA9IHsKKyAg
ICB7ICJuYXRpdmVOZXdMb2NhdGlvbkF2YWlsYWJsZSIsICIoSkxhbmRyb2lkL2xvY2F0aW9uL0xv
Y2F0aW9uOylWIiwKKyAgICAgICAgKHZvaWQqKSBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Om5l
d0xvY2F0aW9uQXZhaWxhYmxlIH0sCisgICAgeyAibmF0aXZlTmV3RXJyb3JBdmFpbGFibGUiLCAi
KEpMamF2YS9sYW5nL1N0cmluZzspViIsCisgICAgICAgICh2b2lkKikgR2VvbG9jYXRpb25TZXJ2
aWNlQnJpZGdlOjpuZXdFcnJvckF2YWlsYWJsZSB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAq
amF2YUxvY2F0aW9uQ2xhc3NOYW1lID0gImFuZHJvaWQvbG9jYXRpb24vTG9jYXRpb24iOworZW51
bSBqYXZhTG9jYXRpb25DbGFzc01ldGhvZHMgeworICAgIExvY2F0aW9uTWV0aG9kR2V0TGF0aXR1
ZGUgPSAwLAorICAgIExvY2F0aW9uTWV0aG9kR2V0TG9uZ2l0dWRlLAorICAgIExvY2F0aW9uTWV0
aG9kSGFzQWx0aXR1ZGUsCisgICAgTG9jYXRpb25NZXRob2RHZXRBbHRpdHVkZSwKKyAgICBMb2Nh
dGlvbk1ldGhvZEhhc0FjY3VyYWN5LAorICAgIExvY2F0aW9uTWV0aG9kR2V0QWNjdXJhY3ksCisg
ICAgTG9jYXRpb25NZXRob2RIYXNCZWFyaW5nLAorICAgIExvY2F0aW9uTWV0aG9kR2V0QmVhcmlu
ZywKKyAgICBMb2NhdGlvbk1ldGhvZEhhc1NwZWVkLAorICAgIExvY2F0aW9uTWV0aG9kR2V0U3Bl
ZWQsCisgICAgTG9jYXRpb25NZXRob2RHZXRUaW1lLAorICAgIExvY2F0aW9uTWV0aG9kQ291bnQs
Cit9Oworc3RhdGljIGptZXRob2RJRCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlv
bk1ldGhvZENvdW50XTsKKworR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpHZW9sb2NhdGlvblNl
cnZpY2VCcmlkZ2UoTGlzdGVuZXJJbnRlcmZhY2UqIGxpc3RlbmVyKQorICAgIDogbV9saXN0ZW5l
cihsaXN0ZW5lcikKKyAgICAsIG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCgwKQorewor
ICAgIEFTU0VSVChtX2xpc3RlbmVyKTsKKyAgICBzdGFydEphdmFJbXBsZW1lbnRhdGlvbigpOwor
fQorCitHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6On5HZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2Uo
KQoreworICAgIHN0b3AoKTsKKyAgICBzdG9wSmF2YUltcGxlbWVudGF0aW9uKCk7Cit9CisKK3Zv
aWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydCgpCit7CisgICAgQVNTRVJUKG1famF2
YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCk7CisgICAgZ2V0Sk5JRW52KCktPkNhbGxWb2lkTWV0
aG9kKG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0aG9kSURzW0dlb2xvY2F0
aW9uU2VydmljZU1ldGhvZFN0YXJ0XSk7Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJp
ZGdlOjpzdG9wKCkKK3sKKyAgICBBU1NFUlQobV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNlT2JqZWN0
KTsKKyAgICBnZXRKTklFbnYoKS0+Q2FsbFZvaWRNZXRob2QobV9qYXZhR2VvbG9jYXRpb25TZXJ2
aWNlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhR2VvbG9jYXRp
b25TZXJ2aWNlQ2xhc3NNZXRob2RJRHNbR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU3RvcF0pOwor
fQorCit2b2lkIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZTo6c2V0RW5hYmxlR3BzKGJvb2wgZW5h
YmxlKQoreworICAgIEFTU0VSVChtX2phdmFHZW9sb2NhdGlvblNlcnZpY2VPYmplY3QpOworICAg
IGdldEpOSUVudigpLT5DYWxsVm9pZE1ldGhvZChtX2phdmFHZW9sb2NhdGlvblNlcnZpY2VPYmpl
Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFHZW9sb2NhdGlvblNlcnZp
Y2VDbGFzc01ldGhvZElEc1tHZW9sb2NhdGlvblNlcnZpY2VNZXRob2RTZXRFbmFibGVHcHNdLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworfQorCit2b2lkIEdlb2xv
Y2F0aW9uU2VydmljZUJyaWRnZTo6bmV3TG9jYXRpb25BdmFpbGFibGUoSk5JRW52KiBlbnYsIGpj
bGFzcywgamxvbmcgbmF0aXZlT2JqZWN0LCBqb2JqZWN0IGxvY2F0aW9uKQoreworICAgIEFTU0VS
VChuYXRpdmVPYmplY3QpOworICAgIEFTU0VSVChsb2NhdGlvbik7CisgICAgR2VvbG9jYXRpb25T
ZXJ2aWNlQnJpZGdlKiBvYmplY3QgPSByZWludGVycHJldF9jYXN0PEdlb2xvY2F0aW9uU2Vydmlj
ZUJyaWRnZSo+KG5hdGl2ZU9iamVjdCk7CisgICAgb2JqZWN0LT5tX2xpc3RlbmVyLT5uZXdQb3Np
dGlvbkF2YWlsYWJsZSh0b0dlb3Bvc2l0aW9uKGVudiwgbG9jYXRpb24pKTsKK30KKwordm9pZCBH
ZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2U6Om5ld0Vycm9yQXZhaWxhYmxlKEpOSUVudiogZW52LCBq
Y2xhc3MsIGpsb25nIG5hdGl2ZU9iamVjdCwganN0cmluZyBtZXNzYWdlKQoreworICAgIEdlb2xv
Y2F0aW9uU2VydmljZUJyaWRnZSogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxHZW9sb2NhdGlv
blNlcnZpY2VCcmlkZ2UqPihuYXRpdmVPYmplY3QpOworICAgIFJlZlB0cjxQb3NpdGlvbkVycm9y
PiBlcnJvciA9CisgICAgICAgIFBvc2l0aW9uRXJyb3I6OmNyZWF0ZShQb3NpdGlvbkVycm9yOjpQ
T1NJVElPTl9VTkFWQUlMQUJMRSwgYW5kcm9pZDo6dG9fc3RyaW5nKGVudiwgbWVzc2FnZSkpOwor
ICAgIG9iamVjdC0+bV9saXN0ZW5lci0+bmV3RXJyb3JBdmFpbGFibGUoZXJyb3IucmVsZWFzZSgp
KTsKK30KKworUGFzc1JlZlB0cjxHZW9wb3NpdGlvbj4gR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdl
Ojp0b0dlb3Bvc2l0aW9uKEpOSUVudiAqZW52LCBjb25zdCBqb2JqZWN0ICZsb2NhdGlvbikKK3sK
KyAgICAvLyBBbHRpdHVkZSBpcyBvcHRpb25hbCBhbmQgbWF5IG5vdCBiZSBzdXBwbGllZC4KKyAg
ICBib29sIGhhc0FsdGl0dWRlID0KKyAgICAgICAgZW52LT5DYWxsQm9vbGVhbk1ldGhvZChsb2Nh
dGlvbiwgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTG9jYXRpb25NZXRob2RIYXNBbHRpdHVk
ZV0pOworICAgIGRvdWJsZSBBbHRpdHVkZSA9CisgICAgICAgIGhhc0FsdGl0dWRlID8KKyAgICAg
ICAgZW52LT5DYWxsRG91YmxlTWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhv
ZElEc1tMb2NhdGlvbk1ldGhvZEdldEFsdGl0dWRlXSkgOgorICAgICAgICAwLjA7CisgICAgLy8g
QWNjdXJhY3kgaXMgcmVxdWlyZWQsIGJ1dCBpcyBub3Qgc3VwcGxpZWQgYnkgdGhlIGVtdWxhdG9y
LgorICAgIGRvdWJsZSBBY2N1cmFjeSA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5NZXRob2Qo
bG9jYXRpb24sIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kSGFzQWNj
dXJhY3ldKSA/CisgICAgICAgIGVudi0+Q2FsbEZsb2F0TWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9j
YXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldEFjY3VyYWN5XSkgOgorICAgICAg
ICAwLjA7CisgICAgLy8gaGVhZGluZyBpcyBvcHRpb25hbCBhbmQgbWF5IG5vdCBiZSBzdXBwbGll
ZC4KKyAgICBib29sIGhhc0hlYWRpbmcgPQorICAgICAgICBlbnYtPkNhbGxCb29sZWFuTWV0aG9k
KGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEhhc0Jl
YXJpbmddKTsKKyAgICBkb3VibGUgaGVhZGluZyA9CisgICAgICAgIGhhc0hlYWRpbmcgPworICAg
ICAgICBlbnYtPkNhbGxGbG9hdE1ldGhvZChsb2NhdGlvbiwgamF2YUxvY2F0aW9uQ2xhc3NNZXRo
b2RJRHNbTG9jYXRpb25NZXRob2RHZXRCZWFyaW5nXSkgOgorICAgICAgICAwLjA7CisgICAgLy8g
c3BlZWQgaXMgb3B0aW9uYWwgYW5kIG1heSBub3QgYmUgc3VwcGxpZWQuCisgICAgYm9vbCBoYXNT
cGVlZCA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobG9jYXRpb24sIGphdmFMb2Nh
dGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kSGFzU3BlZWRdKTsKKyAgICBkb3VibGUg
c3BlZWQgPQorICAgICAgICBoYXNTcGVlZCA/CisgICAgICAgIGVudi0+Q2FsbEZsb2F0TWV0aG9k
KGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldFNw
ZWVkXSkgOgorICAgICAgICAwLjA7CisKKyAgICBSZWZQdHI8Q29vcmRpbmF0ZXM+IG5ld0Nvb3Jk
aW5hdGVzID0gV2ViQ29yZTo6Q29vcmRpbmF0ZXM6OmNyZWF0ZSgKKyAgICAgICAgZW52LT5DYWxs
RG91YmxlTWV0aG9kKGxvY2F0aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlv
bk1ldGhvZEdldExhdGl0dWRlXSksCisgICAgICAgIGVudi0+Q2FsbERvdWJsZU1ldGhvZChsb2Nh
dGlvbiwgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTG9jYXRpb25NZXRob2RHZXRMb25naXR1
ZGVdKSwKKyAgICAgICAgaGFzQWx0aXR1ZGUsIEFsdGl0dWRlLAorICAgICAgICBBY2N1cmFjeSwK
KyAgICAgICAgZmFsc2UsIDAuMCwgIC8vIEFsdGl0dWRlQWNjdXJhY3kgbm90IHByb3ZpZGVkLgor
ICAgICAgICBoYXNIZWFkaW5nLCBoZWFkaW5nLAorICAgICAgICBoYXNTcGVlZCwgc3BlZWQpOwor
CisgICAgcmV0dXJuIFdlYkNvcmU6Okdlb3Bvc2l0aW9uOjpjcmVhdGUoCisgICAgICAgICBuZXdD
b29yZGluYXRlcy5yZWxlYXNlKCksCisgICAgICAgICBlbnYtPkNhbGxMb25nTWV0aG9kKGxvY2F0
aW9uLCBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldFRpbWVdKSk7
Cit9CisKK3ZvaWQgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlOjpzdGFydEphdmFJbXBsZW1lbnRh
dGlvbigpCit7CisgICAgSk5JRW52KiBlbnYgPSBnZXRKTklFbnYoKTsKKworICAgIC8vIEdldCB0
aGUgSmF2YSBHZW9sb2NhdGlvblNlcnZpY2UgY2xhc3MuCisgICAgamNsYXNzIGphdmFHZW9sb2Nh
dGlvblNlcnZpY2VDbGFzcyA9IGVudi0+RmluZENsYXNzKGphdmFHZW9sb2NhdGlvblNlcnZpY2VD
bGFzc05hbWUpOworICAgIEFTU0VSVChqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3MpOworCisg
ICAgLy8gU2V0IHVwIHRoZSBtZXRob2RzIHdlIHdpc2ggdG8gY2FsbCBvbiB0aGUgSmF2YSBHZW9s
b2NhdGlvblNlcnZpY2UgY2xhc3MuCisgICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTWV0
aG9kSURzW0dlb2xvY2F0aW9uU2VydmljZU1ldGhvZEluaXRdID0KKyAgICAgICAgICAgIGVudi0+
R2V0TWV0aG9kSUQoamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzLCAiPGluaXQ+IiwgIihKKVYi
KTsKKyAgICBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJRHNbR2VvbG9jYXRpb25T
ZXJ2aWNlTWV0aG9kU3RhcnRdID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUdl
b2xvY2F0aW9uU2VydmljZUNsYXNzLCAic3RhcnQiLCAiKClWIik7CisgICAgamF2YUdlb2xvY2F0
aW9uU2VydmljZUNsYXNzTWV0aG9kSURzW0dlb2xvY2F0aW9uU2VydmljZU1ldGhvZFN0b3BdID0K
KyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNz
LCAic3RvcCIsICIoKVYiKTsKKyAgICBqYXZhR2VvbG9jYXRpb25TZXJ2aWNlQ2xhc3NNZXRob2RJ
RHNbR2VvbG9jYXRpb25TZXJ2aWNlTWV0aG9kU2V0RW5hYmxlR3BzXSA9CisgICAgICAgICAgICBl
bnYtPkdldE1ldGhvZElEKGphdmFHZW9sb2NhdGlvblNlcnZpY2VDbGFzcywgInNldEVuYWJsZUdw
cyIsICIoWilWIik7CisKKyAgICAvLyBDcmVhdGUgdGhlIEphdmEgR2VvbG9jYXRpb25TZXJ2aWNl
IG9iamVjdC4KKyAgICBqbG9uZyBuYXRpdmVPYmplY3QgPSByZWludGVycHJldF9jYXN0PGpsb25n
Pih0aGlzKTsKKyAgICBqb2JqZWN0IG9iamVjdCA9IGVudi0+TmV3T2JqZWN0KGphdmFHZW9sb2Nh
dGlvblNlcnZpY2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGph
dmFHZW9sb2NhdGlvblNlcnZpY2VDbGFzc01ldGhvZElEc1tHZW9sb2NhdGlvblNlcnZpY2VNZXRo
b2RJbml0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZU9iamVj
dCk7CisKKyAgICBtX2phdmFHZW9sb2NhdGlvblNlcnZpY2VPYmplY3QgPSBnZXRKTklFbnYoKS0+
TmV3R2xvYmFsUmVmKG9iamVjdCk7CisgICAgQVNTRVJUKG1famF2YUdlb2xvY2F0aW9uU2Vydmlj
ZU9iamVjdCk7CisKKyAgICAvLyBSZWdpc3RlciB0byBoYW5kbGUgY2FsbHMgdG8gbmF0aXZlIG1l
dGhvZHMgb2YgdGhlIEphdmEgR2VvbG9jYXRpb25TZXJ2aWNlCisgICAgLy8gb2JqZWN0LiBXZSBy
ZWdpc3RlciBvbmNlIG9ubHkuCisgICAgc3RhdGljIGludCByZWdpc3RlcmVkID0gam5pUmVnaXN0
ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgamF2YUdlb2xvY2F0aW9uU2VydmljZUNsYXNzTmFtZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YUdlb2xv
Y2F0aW9uU2VydmljZUNsYXNzTmF0aXZlTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVMRU0oamF2YUdlb2xvY2F0aW9uU2Vydmlj
ZUNsYXNzTmF0aXZlTWV0aG9kcykpOworICAgIEFTU0VSVChyZWdpc3RlcmVkID09IEpOSV9PSyk7
CisKKyAgICAvLyBTZXQgdXAgdGhlIG1ldGhvZHMgd2Ugd2lzaCB0byBjYWxsIG9uIHRoZSBKYXZh
IExvY2F0aW9uIGNsYXNzLgorICAgIGpjbGFzcyBqYXZhTG9jYXRpb25DbGFzcyA9IGVudi0+Rmlu
ZENsYXNzKGphdmFMb2NhdGlvbkNsYXNzTmFtZSk7CisgICAgQVNTRVJUKGphdmFMb2NhdGlvbkNs
YXNzKTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldExh
dGl0dWRlXSA9CisgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2YUxvY2F0aW9uQ2xhc3MsICJn
ZXRMYXRpdHVkZSIsICIoKUQiKTsKKyAgICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2Nh
dGlvbk1ldGhvZEdldExvbmdpdHVkZV0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFM
b2NhdGlvbkNsYXNzLCAiZ2V0TG9uZ2l0dWRlIiwgIigpRCIpOworICAgIGphdmFMb2NhdGlvbkNs
YXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kSGFzQWx0aXR1ZGVdID0KKyAgICAgICAgZW52LT5H
ZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImhhc0FsdGl0dWRlIiwgIigpWiIpOworICAg
IGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kR2V0QWx0aXR1ZGVdID0K
KyAgICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImdldEFsdGl0dWRl
IiwgIigpRCIpOworICAgIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9k
SGFzQWNjdXJhY3ldID0KKyAgICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFz
cywgImhhc0FjY3VyYWN5IiwgIigpWiIpOworICAgIGphdmFMb2NhdGlvbkNsYXNzTWV0aG9kSURz
W0xvY2F0aW9uTWV0aG9kR2V0QWNjdXJhY3ldID0KKyAgICAgICAgZW52LT5HZXRNZXRob2RJRChq
YXZhTG9jYXRpb25DbGFzcywgImdldEFjY3VyYWN5IiwgIigpRiIpOworICAgIGphdmFMb2NhdGlv
bkNsYXNzTWV0aG9kSURzW0xvY2F0aW9uTWV0aG9kSGFzQmVhcmluZ10gPQorICAgICAgICBlbnYt
PkdldE1ldGhvZElEKGphdmFMb2NhdGlvbkNsYXNzLCAiaGFzQmVhcmluZyIsICIoKVoiKTsKKyAg
ICBqYXZhTG9jYXRpb25DbGFzc01ldGhvZElEc1tMb2NhdGlvbk1ldGhvZEdldEJlYXJpbmddID0K
KyAgICAgICAgZW52LT5HZXRNZXRob2RJRChqYXZhTG9jYXRpb25DbGFzcywgImdldEJlYXJpbmci
LCAiKClGIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTG9jYXRpb25NZXRob2RI
YXNTcGVlZF0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFMb2NhdGlvbkNsYXNzLCAi
aGFzU3BlZWQiLCAiKClaIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJRHNbTG9jYXRp
b25NZXRob2RHZXRTcGVlZF0gPQorICAgICAgICBlbnYtPkdldE1ldGhvZElEKGphdmFMb2NhdGlv
bkNsYXNzLCAiZ2V0U3BlZWQiLCAiKClGIik7CisgICAgamF2YUxvY2F0aW9uQ2xhc3NNZXRob2RJ
RHNbTG9jYXRpb25NZXRob2RHZXRUaW1lXSA9CisgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoamF2
YUxvY2F0aW9uQ2xhc3MsICJnZXRUaW1lIiwgIigpSiIpOworfQorCit2b2lkIEdlb2xvY2F0aW9u
U2VydmljZUJyaWRnZTo6c3RvcEphdmFJbXBsZW1lbnRhdGlvbigpCit7CisgICAgLy8gQ2FsbGVk
IGJ5IEdlb2xvY2F0aW9uU2VydmljZUFuZHJvaWQgb24gV2ViS2l0IHRocmVhZC4KKyAgICBBU1NF
UlQobV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNlT2JqZWN0KTsKKyAgICBnZXRKTklFbnYoKS0+RGVs
ZXRlR2xvYmFsUmVmKG1famF2YUdlb2xvY2F0aW9uU2VydmljZU9iamVjdCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYW5kcm9pZC9HZW9sb2Nh
dGlvblNlcnZpY2VCcmlkZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2FuZHJv
aWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2FuZHJvaWQvR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlLmgJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBT
b3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlX2gK
KyNkZWZpbmUgR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlX2gKKworI2luY2x1ZGUgPGpuaV91dGls
aXR5Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBHZW9sb2NhdGlvblNlcnZpY2VBbmRyb2lkOworY2xhc3MgR2VvcG9zaXRpb247
CisKKy8vIEdlb2xvY2F0aW9uU2VydmljZUJyaWRnZSBpcyB0aGUgYnJpZGdlIHRvIHRoZSBKYXZh
IGltcGxlbWVudGF0aW9uLiBJdCBtYW5hZ2VzCisvLyB0aGUgbGlmZXRpbWUgb2YgdGhlIEphdmEg
b2JqZWN0LiBJdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YKKy8vIEdlb2xvY2F0aW9u
U2VydmljZUFuZHJvaWQuCitjbGFzcyBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UgeworcHVibGlj
OgorICAgIHR5cGVkZWYgR2VvbG9jYXRpb25TZXJ2aWNlQW5kcm9pZCBMaXN0ZW5lckludGVyZmFj
ZTsKKyAgICBHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UoTGlzdGVuZXJJbnRlcmZhY2UqIGxpc3Rl
bmVyKTsKKyAgICB+R2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlKCk7CisKKyAgICB2b2lkIHN0YXJ0
KCk7CisgICAgdm9pZCBzdG9wKCk7CisgICAgdm9pZCBzZXRFbmFibGVHcHMoYm9vbCBlbmFibGUp
OworCisgICAgLy8gU3RhdGljIHdyYXBwZXIgZnVuY3Rpb25zIHRvIGhpZGUgSk5JIG5hc3RpbmVz
cy4KKyAgICBzdGF0aWMgdm9pZCBuZXdMb2NhdGlvbkF2YWlsYWJsZShKTklFbnYgKmVudiwgamNs
YXNzLCBqbG9uZyBuYXRpdmVPYmplY3QsIGpvYmplY3QgbG9jYXRpb24pOworICAgIHN0YXRpYyB2
b2lkIG5ld0Vycm9yQXZhaWxhYmxlKEpOSUVudiAqZW52LCBqY2xhc3MsIGpsb25nIG5hdGl2ZU9i
amVjdCwganN0cmluZyBtZXNzYWdlKTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxHZW9wb3NpdGlv
bj4gdG9HZW9wb3NpdGlvbihKTklFbnYgKmVudiwgY29uc3Qgam9iamVjdCAmbG9jYXRpb24pOwor
Citwcml2YXRlOgorICAgIHZvaWQgc3RhcnRKYXZhSW1wbGVtZW50YXRpb24oKTsKKyAgICB2b2lk
IHN0b3BKYXZhSW1wbGVtZW50YXRpb24oKTsKKworICAgIExpc3RlbmVySW50ZXJmYWNlKiBtX2xp
c3RlbmVyOworICAgIGpvYmplY3QgbV9qYXZhR2VvbG9jYXRpb25TZXJ2aWNlT2JqZWN0OworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gR2VvbG9jYXRpb25TZXJ2aWNl
QnJpZGdlX2gK
</data>
<flag name="review"
          id="25013"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
    <flag name="commit-queue"
          id="25015"
          type_id="3"
          status="-"
          setter="benm"
    />
          </attachment>
      

    </bug>

</bugzilla>