seq / strictness and laziness

Phil Trinder trinder@cee.hw.ac.uk
Mon, 19 Nov 2001 13:57:49 +0000 (GMT Standard Time)


--Part10111191349.I
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

Both parallel and sequential computation must be carefully controlled to 
produce good parallel and distributed Haskell programs. Several languages 
including Glasgow parallel Haskell and Eden use *evaluation strategies*: 
overloaded polymorphic functions to describe the amount of evaluation. 

> type Done = ()
> type Strategy a = a -> Done

There are three basic strategies: 
 - r0 performs no evaluation on its argument,  
 - rwhnf reduces its argument to weak head normal form,
 - rnf reduces its argument to (head) normal form: i.e. deepseq. System support 
   for rnf/deepseq would be A Good Thing.

> r0, rwhnf :: Strategy a 
> r0 x = ()
> rwhnf x = x `seq` () 
 
> class NFData a where
> class Eval a => NFData a where
>   rnf :: Strategy a

Example instances of NFData are given below, a useful set are predefined in the 
module below:

> instance (NFData a, NFData b) => NFData (a,b) where
>   rnf (x,y) = rnf x `seq` rnf y

> instance NFData a => NFData [a] where
>   rnf [] = ()
>   rnf (x:xs) = rnf x `seq` rnf xs

Strategies are simply functions that can be abstracted and composed lilke 
any others, e.g. SeqList applies a strategy to each element of a list 
sequentially.

> seqList :: Strategy a -> Strategy [a]
> seqList strat []     = ()
> seqList strat (x:xs) = strat x `seq` (seqList strat xs)

So 'SeqList r0' evaluates just the spine of the list, and 'seqList (seqList 
rwhnf)' evaluates the elements of a list of lists to weak head normal form.

You can apply a strategy to an expression 

> using :: a -> Strategy a -> a
> using x s = s x `seq` x

So to force newcounts in your program you want to change the last line to be
something like:

countAFile oldcounts filename =
    do 
        compiledFile <- readAndCompile filename
        let newcounts = countAssociations compiledFile oldcounts
        return newcounts 'using' rnf

There's a copy of the Strategies module attached. More info in "Algorithm + 
Strategy = Parallelism", 
P.W. Trinder, K. Hammond, H-W. Loidl, S.L. Peyton Jones 
In Journal of Functional Programming 8(1):23--60, January 1998.
URL: http://www.cee.hw.ac.uk/~dsg/gph/papers/ps/strategies.ps.gz

Phil

--------------------------------------------------
Phil Trinder
Department of Computing and Electrical Engineering
Heriot Watt University
Riccarton
Edinburgh, EH14 4AS

E-mail: trinder@cee.hw.ac.uk
Teleph: +44 (0)131 451 3435
Depart: +44 (0)131 451 3328
Fasmly: +44 (0)131 451 3327
Intrnt: http://www.cee.hw.ac.uk/~trinder

--Part10111191349.I
Content-Type: APPLICATION/octet-stream; name="Strategies.lhs"
Content-Transfer-Encoding: BASE64

VGltZS1zdGFtcDogPFNhdCBOb3YgMTggMjAwMCAwMTowOTo1OCBTdGFyZGF0
ZTogWy0zMF01NzQ1LjI0IGh3bG9pZGw+CiRJZDogU3RyYXRlZ2llcy5saHMs
diAxLjEgMjAwMC8wMS8xNCAxMzozNDozMiBod2xvaWRsIEV4cCAkCgpUaGlz
IG1vZHVsZSBkZWZpbmVzIHBhcmFsbGVsIHN0cmF0ZWd5IGNvbWJpbmF0b3Jz
CgoJUGhpbCBUcmluZGVyLCBIYW5zLVdvbGZnYW5nIExvaWRsLCBLZXZpbiBI
YW1tb25kIGV0IGFsLiAKCglCYXNlZCBvbiBWZXJzaW9uIFZJSSAoMS81Lzk2
KSBgU3RyYXRlZ2llczk2JyBvZiB0eXBlIGEgLT4gKCkKCkF1dGhvcjogICAg
JEF1dGhvcjogaHdsb2lkbCAkCkRhdGU6ICAgICAgJERhdGU6IDIwMDAvMDEv
MTQgMTM6MzQ6MzIgJApSZXZpc2lvbjogICRSZXZpc2lvbjogMS4xICQKU291
cmNlOiAgICAkU291cmNlOiAvaG9tZS9jdnMvcm9vdC9mcHRvb2xzL2hzbGli
cy9jb25jdXJyZW50L1N0cmF0ZWdpZXMubGhzLHYgJApTdGF0ZTogICAgICRT
dGF0ZTogRXhwICQKClRoaXMgbW9kdWxlIGRlZmluZXMgZXZhbHVhdGlvbiBz
dHJhdGVnaWVzIGZvciBjb250cm9sbGluZyB0aGUgcGFyYWxsZWwKZXZhbHVh
dGlvbiBvZiBub24tc3RyaWN0IHByb2dyYW1zLiBUaGV5IHByb3ZpZGUgYSBj
bGVhbiBzZXBhcmF0aW9uIGJldHdlZW4KYWxnb3JpdGhtaWMgYW5kIGJlaGF2
aW91cmFsIGNvZGUuCgpUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBoZXJlLCBh
bmQgdGhlaXIgdXNlIGlzIGRvY3VtZW50ZWQgaW4KCiJBbGdvcml0aG0gKyBT
dHJhdGVneSA9IFBhcmFsbGVsaXNtIiwgClAuVy4gVHJpbmRlciwgSy4gSGFt
bW9uZCwgSC1XLiBMb2lkbCwgUy5MLiBQZXl0b24gSm9uZXMgCkluIEpvdXJu
YWwgb2YgRnVuY3Rpb25hbCBQcm9ncmFtbWluZyA4KDEpOjIzLS02MCwgSmFu
dWFyeSAxOTk4LgpVUkw6IGh0dHA6Ly93d3cuY2VlLmh3LmFjLnVrL35kc2cv
Z3BoL3BhcGVycy9wcy9zdHJhdGVnaWVzLnBzLmd6CgpUaGlzIG1vZHVsZSBz
dXBwb3J0cyBIYXNrZWxsIDEuMiwgSGFza2VsbCAxLjQgYW5kIEhhc2tlbGw5
OC4KVGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgYmFzZWQgb24gdGhlIF9fSEFT
S0VMTDFfXyBDUFAgdmFyaWFibGUuIApQYXJ0cyBvZiB0aGUgbW9kdWxlIGNv
dWxkIGJlIHJld3JpdHRlbiB1c2luZyBjb25zdHJ1Y3RvciBjbGFzc2VzLgoK
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVGhlIGhpc3Rvcnkg
b2YgdGhlIFN0cmF0ZWdpZXMgbW9kdWxlOgoKQ2hhbmdlbG9nOgokTG9nOiBT
dHJhdGVnaWVzLmxocyx2ICQKUmV2aXNpb24gMS4xICAyMDAwLzAxLzE0IDEz
OjM0OjMyICBod2xvaWRsCk1vZHVsZSBmb3Igc3BlY2lmeWluZyAocGFyYWxs
ZWwpIGJlaGF2aW91cmFsIGNvZGUuCgpSZXZpc2lvbiAxLjkgIDE5OTcvMTAv
MDEgMDA6Mjc6MTkgIGh3bG9pZGwKVHlwZSBvZiBwYXIgYW5kIHNlcSBjaGFu
Z2VkIHRvIERvbmUgLT4gRG9uZSAtPiBEb25lIHdpdGggRG9uZSA9ICgpCldv
cmtzIGZvciBIYXNrZWxsIDEuMiBhcyB3ZWxsIGFzIEhhc2tlbGwgMS40IChj
aGVja3MgdGhlIENQUCB2YXJpYWJsZQpfX0hBU0tFTEwxX18gdG8gZGlzdGlu
Z3Vpc2ggc2V0dXBzKS4KRml4ZWQgcHJlY2VkZW5jZXMgZm9yIHBhciBhbmQg
c2VxIGZvciBIYXNrZWxsIDEuNCAoc3Ryb25nZXIgdGhhbiB1c2luZykuCk5l
dyBpbmZpeCBvcGVyYXRvcnMgPnwgYW5kID58fCBhcyBhbGlhc2VzIGZvciBw
YXIgYW5kIHNlcSBhcyBzdHJhdGVneQpjb21iaW5hdG9ycy4KClJldmlzaW9u
IDEuOCAgMTk5Ny8wNS8yMCAyMToxMzoyMiAgaHdsb2lkbApSZXZpc2VkIHRv
IHVzZSBgZGVtYW5kaW5nYCBhbmQgYHNwYXJraW5nYCAoZmluYWwgSkZQIHBh
cGVyIHZlcnNpb24pCgpSZXZpc2lvbiAxLjcgIDE5OTcvMDQvMDIgMjE6MjY6
MjEgIGh3bG9pZGwKTWlub3IgY2hhbmdlcyBpbiBkb2N1bWVudGF0aW9uLCBu
b25lIGluIHRoZSBjb2RlLgoKCnJldmlzaW9uIDEuNQpWZXJzaW9uIFZJSS4x
OyBTdHJhdGVnaWVzOTY7IFR5cGU6IGEgLT4gKCkKTWlub3IgY2hhbmdlcyB0
byBwcmV2aW91cyB2ZXJzaW9uLgpDUFAgZmxhZ3Mgbm93IHNlcGFyYXRlIEdV
TSBmcm9tIEdyYW5TaW0gdmVyc2lvbi4KSW5maXggZGVjbGFyYXRpb24gZm9y
IGB1c2luZ2AgKGltcG9ydGFudCBmb3IgZS5nLiBxdWlja3NvcnQgd2hlcmUg
dGhlIG9sZAp2ZXJzaW9uIHB1dHMgcGFyZW50aGVzZXMgaW4gdGhlIHdyb25n
IHdheSkuCk1vZXIgaW5zdGFuY2VzIGZvciBORkRhdGEgYW5kIG1hcmtTdGFy
dGVnaWVzIChpbiBHcmFuU2ltIHNldHVwIG9ubHkpLgoKcmV2aXNpb24gMS40
ClZlcnNpb24gVklJOyBTdHJhdGVnaWVzOTY7IFR5cGU6IGEgLT4gKCkKVGhl
IHR5cGUgaGFzIGNoYW5nZWQgYWdhaW47IHdpdGggdGhlIG9sZCB0eXBlIGl0
J3Mgbm90IHBvc3NpYmxlIHRvIGRlc2NyaWJlCmFsbCB0aGUgc3RyYXRlZ2ll
cyB3ZSB3YW50IChmb3IgZXhhbXBsZSBzZXFQYWlyIHIwIHJuZiB3aGljaCBz
aG91bGQgbm90CmV2YWx1YXRlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhl
IHBhaXIgYXQgYWxsKS4gVGhlICgpIHR5cGUgYWN0cyBhcyBpbmZvCnRoYXQg
dGhlIHN0cmF0ZWd5IGhhcyBiZWVuIGFwcGxpZWQuClRoZSBmdW5jdGlvbiBg
dXNpbmdgIGlzIHVzZWQgYXMgaW52ZXJzZSBzdHJhdGVneSBhcHBsaWNhdGlv
biBpLmUuCm9uIHRvcCBsZXZlbCB3ZSB1c3VhbGx5IGhhdmUgc29tZXRoaW5n
IGxpa2UgcmVzIGB1c2luZ2Agc3RyYXQgd2hlcmUgLi4uClRoZSBtYXJrU3Ry
YXRlZ3kgaGFjayBpcyBpbmNsdWRlZCBpbiB0aGlzIHZlcnNpb246IGl0IGF0
dGFjaGVzIGFuIEludCB2YWx1ZQp0byB0aGUgY3VycmVudGx5IHJ1bm5pbmcg
c3RyYXRlZ3kgKHRoaXMgY2FuIGJlIGluaGVyaXRlZCBieSBhbGwgc3ViLXN0
cmF0cykKSXQgZG9lc24ndCBtb2RlbCB0aGUganVtcHMgYmV0d2VlbiBldmFs
dWF0aW5nIHByb2R1Y2VyIGFuZCBjb25zdW1lciBw
cm9wZXJseQooZm9yIHRoYXQgc29tZXRoaW5nIGxpa2UgY29zdCBjZW50ZXJz
IHdvdWxkIGJlIG5lY2Vzc2FyeSkuCgpyZXZpc2lvbiAxLjMKVmVyc2lvbiBW
SSAoVi1iYXNlZCk7IFN0cmF0ZWdpZXM5NTsgVHlwZTogYSAtPiBhCk5vdyB1
c2VzIGxpYnJhcnkgbW9kdWxlcyBsaWtlIEZpbml0ZU1hcCB3aXRoIHN0cmF0
ZWdpZXMgaW4gdGhlcmUuCkNQUCBmbGFncyBmb3IgdXNpbmcgdGhlIHNhbWUg
bW9kdWxlIHdpdGggR1VNIGFuZCBHcmFuU2ltLgpBIGZldyBuZXcgc3RyYXRl
Z2llcy4KCnJldmlzaW9uIDEuMgpWZXJzaW9uIFY7IFN0cmF0ZWdpZXM5NTsg
VHlwZTogYSAtPiBhClRoZSB0eXBlIG9mIFN0cmF0ZWdpZXMgaGFzIGNoYW5n
ZWQgZnJvbSBhIC0+ICgpIHRvIGEgLT4gYQpBbGwgc3RyYXRlZ2llcyBhbmQg
aW5zdGFuY2VzIG9mIE5GRGF0YSBoYXZlIGJlZW4gcmVkZWZpbmVkIGFjY29y
ZGluZ2x5LgpUaGlzIGJyYW5jaCBzdGFydGVkIG9mZiBhZnRlciBkaXNjdXNz
aW9ucyBiZXR3ZWVuIFBXVCwgU0xQSiBhbmQgSFdMIGluCm1pZCBOb3YgKHN0
YXJ0IG9mIGRldmVsb3BtZW50IG9mIHRoZSBhY3R1YWwgbW9kdWxlOiAxMC8x
Lzk2KQoKcmV2aXNpb24gMS4xIEluaXRpYWwgcmV2aXNpb24KLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gVG8gdXNlIGZha2VpbmZvIGZp
cnN0IHJlcGxhY2UgYWxsICUlJCBieSBcQCAKLS0gSWYgeW91IGhhdmUgZmFr
ZWluZm8gbWFrZXJzIGluIHRoZSBmaWxlIHlvdSBuZWVkIGEgc2xpZ2h0bHkg
bW9kaWZpZWQgCi0tIHZlcnNpb24gb2YgdGhlIGxpdC1kZWF0aWZ5IHNjcmlw
dCAoY2FsbGVkIGJ5IGxpdDJwZ20pLiBZb3UgZ2V0IHRoYXQgCi0tIHZlcnNp
b24gb24gU3VucyBhbmQgQWxwaGFzIGluIEdsYXNnb3cgYnkgdXNpbmcgCi0t
ICBcdHJ7bGl0MnBnbSAtSCAiJHtIT01FfS9iaW4vYGh3X29zYCJ9Ci0tIGlu
IHlvdXIgTWFrZWZpbGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KCi0tQG5vZGUgRXZhbHVhdGlvbiBTdHJhdGVnaWVzLCAsICwKLS1AY2hh
cHRlciBFdmFsdWF0aW9uIFN0cmF0ZWdpZXMKCi0tQG1lbnUKLS0qIEltcG9y
dHMgYW5kIGluZml4IGRlY2xhcmF0aW9uczo6ICAKLS0qIFN0cmF0ZWd5IFR5
cGUgYW5kIEFwcGxpY2F0aW9uOjogIAotLSogQmFzaWMgU3RyYXRlZ2llczo6
CQkKLS0qIFN0cmF0ZWdpYyBGdW5jdGlvbiBBcHBsaWNhdGlvbjo6ICAKLS0q
IE1hcmtpbmcgYSBTdHJhdGVneTo6CQotLSogU3RyYXRlZ3kgSW5zdGFuY2Vz
OjoJCi0tKiBMb2xpdGEtc3BlY2lmaWMgU3RyYXRlZ2llczo6ICAKLS1AZW5k
IG1lbnUKCi0tQG5vZGUgSW1wb3J0cyBhbmQgaW5maXggZGVjbGFyYXRpb25z
LCBTdHJhdGVneSBUeXBlIGFuZCBBcHBsaWNhdGlvbiwgRXZhbHVhdGlvbiBT
dHJhdGVnaWVzLCBFdmFsdWF0aW9uIFN0cmF0ZWdpZXMKLS1Ac2VjdGlvbiBJ
bXBvcnRzIGFuZCBpbmZpeCBkZWNsYXJhdGlvbnMKCj4gbW9kdWxlIFN0cmF0
ZWdpZXMoCj4jaWYgKF9fSEFTS0VMTDFfXz49NCkKPiAgICAgICAgICAgICAg
ICAgICBtb2R1bGUgU3RyYXRlZ2llcwo+I2Vsc2UKPiAgICAgICAgICAgICAg
ICAgICBTdHJhdGVnaWVzLi4KPiNlbmRpZgo+ICAgICAgICAgICAgICAgICAg
KSB3aGVyZQo+Cj4jaWYgZGVmaW5lZChHUkFOKSAmJiAhKF9fSEFTS0VMTDFf
Xz49NCkKPiBpbXBvcnQgUHJlbHVkZUdsYVNUICAgICAgICAgICAgICAgICAg
ICAgICAgLS0gb25seSBuZWVkZWQgZm9yIG1hcmtTdHJhdAo+I2VuZGlmCj4j
aWYgKF9fSEFTS0VMTDFfXz49NCkKPiBpbXBvcnQgUHJlbHVkZSBoaWRpbmcg
KHNlcSkKPiBpbXBvcnQgcXVhbGlmaWVkIFBhcmFsbGVsCj4jZWxzZQo+IGlt
cG9ydCBQYXJhbGxlbCByZW5hbWluZyAocGFyIHRvIHBhcl9mcm9tX1BhcmFs
bGVsLCBzZXEgdG8gc2VxX2Zyb21fUGFyYWxsZWwpCj4jZW5kaWYKCj4jaWYg
KF9fSEFTS0VMTDFfXz49NCkKPiBpbXBvcnQgSXgKPiBpbXBvcnQgQXJyYXkK
PiNlbmRpZgoKPiNpZiBkZWZpbmVkKFBBUl9HUkFOX0xJU1QpCj4gaW1wb3J0
IFFTb3J0IC0tIHRtcCAob25seSBmb3IgcGFyR3Jhbkxpc3QpCj4jZW5kaWYK
CkkgbGlmdGVkIHRoZSBwcmVjZWRlbmNlIG9mIEBwYXJAIGFuZCBAc2VxQCBi
eSBvbmUgbGV2ZWwgdG8gbWFrZSBAdXNpbmdAIHRoZSAKY29tYmluYXRvciB3
aXRoIHRoZSB3ZWFrZXN0IHByZWNlZGVuY2UuCk9vb29wcywgdGhlcmUgc2Vl
bXMgdG8gYmUgYSBidWcgaW4gZ2hjIDAuMjkgcHJvaGliaXRpbmcgYW5vdGhl
ciBpbmZpeCAKZGVjbGFyYXRpb24gb2YgQHBhckAgYW5kIEBzZXFAIGRlc3Bp
dGUgcmVuYW1pbmcgdGhlIGltcG9ydGVkIHZlcnNpb25zLgoKPiNpZiAoX19I
QVNLRUxMMV9fPj00KQo+IGluZml4ciAyIGBwYXJgICAgICAgICAgICAtLSB3
YXM6IDAKPiBpbmZpeHIgMyBgc2VxYCAgICAgICAgICAgLS0gd2FzOiAxIAo+
I2Vsc2UKPiBpbmZpeHIgMCBgcGFyYCAgICAgICAgICAgLS0gd2FzOiAwCj4g
aW5maXhyIDEgYHNlcWAgICAgICAgICAgIC0tIHdhczogMSAKPiNlbmRpZgoK
PiBpbmZpeGwgMCBgdXNpbmdgLGBkZW1hbmRpbmdgLGBzcGFya2luZ2AgICAg
ICAgICAgICAgIC0tIHdlYWtlc3QgcHJlY2VkZW5jZSEKCj4gaW5maXhyIDIg
Pnx8ICAgICAgICAgICAgICAgIC0tIGFub3RoZXIgbmFtZSBmb3IgcGFyCj4g
aW5maXhyIDMgPnwgICAgICAgICAgICAgICAgIC0tIGFub3RoZXIgbmFtZSBm
b3Igc2VxCj4gaW5maXhsIDYgJHx8LCAkfCAgICAgICAgICAgIC0tIHN0cmF0
ZWdpYyBmdW5jdGlvbiBhcHBsaWNhdGlvbiAoc2VxIGFuZCBwYXIpCj4gaW5m
aXhsIDkgLnwsIC58fCwgLXwsIC18fCAgIC0tIHN0cmF0ZWdpYyAoaW52ZXJz
ZSkgZnVuY3Rpb24gY29tcG9zaXRpb24KCj4gc3RyYXRlZ3lfdmVyc2lvbiA9
ICIkUmV2aXNpb246IDEuMSAkIgo+IHN0cmF0ZWd5
X2lkID0gIiRJZDogU3RyYXRlZ2llcy5saHMsdiAxLjEgMjAwMC8wMS8xNCAx
MzozNDozMiBod2xvaWRsIEV4cCAkIgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCgkJCVN0cmF0ZWd5IFR5cGUsIEFwcGxpY2F0aW9uIGFu
ZCBTZW1hbnRpY3MJICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotLUBub2RlIFN0cmF0ZWd5IFR5cGUgYW5kIEFwcGxpY2F0aW9u
LCBCYXNpYyBTdHJhdGVnaWVzLCBJbXBvcnRzIGFuZCBpbmZpeCBkZWNsYXJh
dGlvbnMsIEV2YWx1YXRpb24gU3RyYXRlZ2llcwotLUBzZWN0aW9uIFN0cmF0
ZWd5IFR5cGUgYW5kIEFwcGxpY2F0aW9uCgotLUBjaW5kZXggU3RyYXRlZ3kK
Cj4gdHlwZSBEb25lID0gKCkKPiB0eXBlIFN0cmF0ZWd5IGEgPSBhIC0+IERv
bmUKCkEgc3RyYXRlZ3kgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIGR1
bW15IGBkb25lJyB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0CnRoZSBzcGVjaWZl
ZCBldmFsdWF0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KClRoZSBiYXNpYyBj
b21iaW5hdG9ycyBmb3Igc3RyYXRlZ2llcyBhcmUgQHBhckAgYW5kIEBzZXFA
IGJ1dCB3aXRoIHR5cGVzIHRoYXQgCmluZGljYXRlIHRoYXQgdGhleSBvbmx5
IGNvbWJpbmUgdGhlIHJlc3VsdHMgb2YgYSBzdHJhdGVneSBhcHBsaWNhdGlv
bi4gCgpOQjogVGhpcyB2ZXJzaW9uIGNhbiBiZSB1c2VkIHdpdGggSGFza2Vs
bCAxLjQgKEdIQyAyLjA1IGFuZCBiZXlvbmQpLCAqYnV0KgogICAgeW91IHdv
bid0IGdldCBzdHJhdGVneSBjaGVja2luZyBvbiBzZXEgKG9ubHkgb24gcGFy
KSEKClRoZSBpbmZpeCBmY3RzID58IGFuZCA+fHwgYXJlIGFsdGVybmF0aXZl
IG5hbWVzIGZvciBgc2VxYCBhbmQgYHBhcmAuCldpdGggdGhlIGludHJvZHVj
dGlvbiBvZiBhIFByZWx1ZGUgZnVuY3Rpb24gYHNlcWAgc2VwYXJhdGluZyB0
aGUgUHJlbHVkZSAKZnVuY3Rpb24gZnJvbSB0aGUgU3RyYXRlZ3kgZnVuY3Rp
b24gYmVjb21lcyBhIHBhaW4uIFRoZSBub3RhdGlvbiBhbHNvIG1hdGNoZXMK
dGhlIG5vdGF0aW9uIGZvciBzdHJhdGVnaWMgZnVuY3Rpb24gYXBwbGljYXRp
b24uCgotLUBjaW5kZXggcGFyCi0tQGNpbmRleCBzZXEKLS1AY2luZGV4ID58
Ci0tQGNpbmRleCA+fHwKCj4jaWYgKF9fSEFTS0VMTDFfXz49NCkKPiBwYXIg
OjogRG9uZSAtPiBEb25lIC0+IERvbmUgCj4gcGFyID0gUGFyYWxsZWwucGFy
Cj4gc2VxIDo6IGEgLT4gYiAtPiBiICAgICAgLS0gdGhhdCdzIHRoZSByZWFs
IHR5cGUgb2Ygc2VxIGRlZmluZWQgaW4gUHJlbHVkZQo+IHNlcSA9IFBhcmFs
bGVsLnNlcQo+ICg+fCksICg+fHwpIDo6IERvbmUgLT4gRG9uZSAtPiBEb25l
IAo+IHstIyBJTkxJTkUgKD58KSAjLX0KPiB7LSMgSU5MSU5FICg+fHwpICMt
fQo+ICg+fCkgPSBQcmVsdWRlLnNlcQo+ICg+fHwpID0gUGFyYWxsZWwucGFy
Cj4jZWxzZQo+IHBhciwgc2VxLCAoPnwpLCAoPnx8KSA6OiBEb25lIC0+IERv
bmUgLT4gRG9uZSAKPiBwYXIgPSBwYXJfZnJvbV9QYXJhbGxlbAo+IHNlcSA9
IHNlcV9mcm9tX1BhcmFsbGVsCj4gey0jIElOTElORSAoPnwpICMtfQo+IHst
IyBJTkxJTkUgKD58fCkgIy19Cj4gKD58KSA9IHNlcQo+ICg+fHwpID0gcGFy
Cj4jZW5kaWYKCi0tQGNpbmRleCB1c2luZwoKPiB1c2luZyA6OiBhIC0+IFN0
cmF0ZWd5IGEgLT4gYQo+I2lmIChfX0hBU0tFTEwxX18+PTQpCj4gdXNpbmcg
eCBzID0gcyB4IGBzZXFgIHgKPiNlbHNlCj4gdXNpbmcgeCBzID0gcyB4IGBz
ZXFfZnJvbV9QYXJhbGxlbGAgeAo+I2VuZGlmCgp1c2luZyB0YWtlcyBhIHN0
cmF0ZWd5IGFuZCBhIHZhbHVlLCBhbmQgYXBwbGllcyB0aGUgc3RyYXRlZ3kg
dG8gdGhlCnZhbHVlIGJlZm9yZSByZXR1cm5pbmcgdGhlIHZhbHVlLiBVc2Vk
IHRvIGV4cHJlc3MgZGF0YS1vcmllbnRlZCBwYXJhbGxlbGlzbQoKeCBgdXNp
bmdgIHMgaXMgYSBwcm9qZWN0aW9uIG9uIHgsIGkuZS4gYm90aAoKICBhIHJl
dHJhY3Rpb246IHggYHVzaW5nYCBzIFsgeAoJCQkgICAgLQogIGFuZCBpZGVt
cG90ZW50OiAoeCBgdXNpbmdgIHMpIGB1c2luZ2AgcyA9IHggYHVzaW5nYCBz
CgpkZW1hbmRpbmcgYW5kIHNwYXJraW5nIGFyZSB1c2VkIHRvIGV4cHJlc3Mg
Y29udHJvbC1vcmllbnRlZApwYXJhbGxlbGlzbS4gVGhlaXIgc2Vjb25kIGFy
Z3VtZW50IGlzIHVzdWFsbHkgYSBzZXF1ZW5jZSBvZiBzdHJhdGVneQphcHBs
aWNhdGlvbnMgY29tYmluZWQgYHBhcmAgYW5kIGBzZXFgLiBTcGFya2luZyBz
aG91bGQgb25seSBiZSB1c2VkCndpdGggYSBzaW5nbGV0b24gc2VxdWVuY2Ug
YXMgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IGV4Y3V0ZWQKCi0tQGNpbmRleCBk
ZW1hbmRpbmcKLS1AY2luZGV4IHNwYXJraW5nCgo+IGRlbWFuZGluZywgc3Bh
cmtpbmcgOjogYSAtPiBEb25lIC0+IGEKPiNpZiAoX19IQVNLRUxMMV9fPj00
KQo+IGRlbWFuZGluZyA9IGZsaXAgUGFyYWxsZWwuc2VxCj4gc3Bhcmtpbmcg
ID0gZmxpcCBQYXJhbGxlbC5wYXIKPiNlbHNlCj4gZGVtYW5kaW5nID0gZmxp
cCBzZXFfZnJvbV9QYXJhbGxlbAo+IHNwYXJraW5nICA9IGZsaXAgcGFyX2Zy
b21fUGFyYWxsZWwKPiNlbmRpZgoKc1BhciBhbmQgc1NlcSBoYXZlIGJlZW4g
c3VwZXJjZWRlZCBieSBzcGFya2luZyBhbmQgZGVtYW5kaW5nOiByZXBsYWNl
IAogIGUgYHVzaW5nYCBzUGFyIHgJd2l0aCAgCWUgYHNwYXJraW5nYCAgeCAK
ICBlIGB1c2luZ2Agc1NlcSB4CXdpdGggCWUgYGRlbWFuZGluZ2AgeAoKPHNQ
YXIgaXMgYSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHBhci4gaS5lLiB4
IGBwYXJgIGUgPD0+IGUgYHVzaW5nYCBzUGFyIHgKPAo8PiBzUGFyIDo6IGEg
LT4gU3RyYXRlZ3kgYgo8PiBzUGFyIHggeSA9IHggYHBhcmAgKCkKPAo8c1Nl
cSBpcyBhIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcg
dG8gc2VxLiBpLmUuIHggYHNlcWAgZSA8PT4gZSBgdXNpbmdgIHNTZXEgeAo8
Cjw+IHNTZXEgOjogYSAtPiBTdHJhdGVneSBiCjw+IHNTZXEgeCB5ID0geCBg
c2VxYCAoKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJ
QmFzaWMgU3RyYXRlZ2llcwkJCQkgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotLUBub2RlIEJhc2ljIFN0cmF0ZWdpZXMsIFN0cmF0
ZWdpYyBGdW5jdGlvbiBBcHBsaWNhdGlvbiwgU3RyYXRlZ3kgVHlwZSBhbmQg
QXBwbGljYXRpb24sIEV2YWx1YXRpb24gU3RyYXRlZ2llcwotLUBzZWN0aW9u
IEJhc2ljIFN0cmF0ZWdpZXMKCnIwIHBlcmZvcm1zICpubyogZXZhbHVhdGlv
biBvbiBpdHMgYXJndW1lbnQuCgotLUBjaW5kZXggcjAKCj4gcjAgOjogU3Ry
YXRlZ3kgYSAKPiByMCB4ID0gKCkKCnJ3aG5mIHJlZHVjZXMgaXRzIGFyZ3Vt
ZW50IHRvIHdlYWsgaGVhZCBub3JtYWwgZm9ybS4KCi0tQGNpbmRleCByd2hu
ZgotLUBjaW5kZXggcm5mCi0tQGNpbmRleCBORkRhdGEKCj4jaWYgZGVmaW5l
ZChfX0hBU0tFTEw5OF9fKQo+IHJ3aG5mIDo6IFN0cmF0ZWd5IGEgCj4gcndo
bmYgeCA9IHggYHNlcWAgKCkgIAo+I2VsaWYgKF9fSEFTS0VMTDFfXz09NCkK
PiByd2huZiA6OiBFdmFsIGEgPT4gU3RyYXRlZ3kgYSAKPiByd2huZiB4ID0g
eCBgc2VxYCAoKSAgCj4jZWxzZQo+IHJ3aG5mIDo6IFN0cmF0ZWd5IGEgCj4g
cndobmYgeCA9IHggYHNlcV9mcm9tX1BhcmFsbGVsYCAoKSAgCj4jZW5kaWYK
Cj4jaWYgZGVmaW5lZChfX0hBU0tFTEw5OF9fKQo+IGNsYXNzIE5GRGF0YSBh
IHdoZXJlCj4jZWxpZiAoX19IQVNLRUxMMV9fPj00KQo+IGNsYXNzIEV2YWwg
YSA9PiBORkRhdGEgYSB3aGVyZQo+I2Vsc2UKPiBjbGFzcyBORkRhdGEgYSB3
aGVyZQo+I2VuZGlmCj4gICAtLSBybmYgcmVkdWNlcyBpdHMgYXJndW1lbnQg
dG8gKGhlYWQpIG5vcm1hbCBmb3JtCj4gICBybmYgOjogU3RyYXRlZ3kgYQo+
ICAgLS0gRGVmYXVsdCBtZXRob2QuIFVzZWZ1bCBmb3IgYmFzZSB0eXBlcy4g
QSBzcGVjaWZpYyBtZXRob2QgaXMgbmVjZXNzYXkgZm9yCj4gICAtLSBjb25z
dHJ1Y3RlZCB0eXBlcwo+ICAgcm5mID0gcndobmYKPgo+IGNsYXNzIChORkRh
dGEgYSwgSW50ZWdyYWwgYSkgPT4gTkZEYXRhSW50ZWdyYWwgYQo+IGNsYXNz
IChORkRhdGEgYSwgT3JkIGEpID0+IE5GRGF0YU9yZCBhCgotLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAg
ICAgU3RyYXRlZ2ljIEZ1bmN0aW9uIEFwcGxpY2F0aW9uCi0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLUBub2RlIFN0cmF0ZWdpYyBGdW5j
dGlvbiBBcHBsaWNhdGlvbiwgTWFya2luZyBhIFN0cmF0ZWd5LCBCYXNpYyBT
dHJhdGVnaWVzLCBFdmFsdWF0aW9uIFN0cmF0ZWdpZXMKLS1Ac2VjdGlvbiBT
dHJhdGVnaWMgRnVuY3Rpb24gQXBwbGljYXRpb24KClRoZSB0d28gIGluZml4
IGZ1bmN0aW9ucyBAJHxAICAgYW5kIEAkfHxAICBwZXJmb3JtIHNlcXVlbnRp
YWwgYW5kICBwYXJhbGxlbApmdW5jdGlvbiBhcHBsaWNhdGlvbiwgcmVzcGVj
dGl2ZWx5LiBUaGV5ICBhcmUgcGFyYW1ldGVyaXNlZCB3aXRoIGEgc3RyYXRl
Z3kKdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSBhcmd1bWVudCBvZiB0aGUgIGZ1
bmN0aW9uIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyB2ZXJ5CmhhbmR5IHdoZW4g
IHdyaXRpbmcgIHBpcGVsaW5lIHBhcmFsbGVsaXNtICBhcyAgYSBzZXF1ZW5j
ZSBvZiAgQCRALCBAJHxAIGFuZApAJHx8QCdzLiBUaGVyZSBpcyBubyAgbmVl
ZCBvZiBuYW1pbmcgaW50ZXJtZWRpYXRlIHZhbHVlcyAgaW4gdGhpcyBjYXNl
LiBUaGUKc2VwYXJhdGlvbiAgb2YgYWxnb3JpdGhtIGZyb20gc3RyYXRlZ3kg
IGlzICBhY2hpZXZlZCBieSBhbGxvd2luZyBzdHJhdGVnaWVzCm9ubHkgYXMg
c2Vjb25kIGFyZ3VtZW50cyB0byBAJHxAIGFuZCBAJHx8QC4KCi0tQGNpbmRl
eCAkfAotLUBjaW5kZXggJHx8Cgo+ICgkfCksICgkfHwpIDo6IChhIC0+IGIp
IC0+IFN0cmF0ZWd5IGEgLT4gYSAtPiBiCgo8PiBmICR8IHMgID0gXCB4IC0+
IGYgeCBgdXNpbmdgIFwgXyAtPiBzIHggYHNlcWAgKCkKPD4gZiAkfHwgcyA9
IFwgeCAtPiBmIHggYHVzaW5nYCBcIF8gLT4gcyB4IGBwYXJgICgpCgo+IGYg
JHwgcyAgPSBcIHggLT4gZiB4IGBkZW1hbmRpbmdgIHMgeAo+IGYgJHx8IHMg
PSBcIHggLT4gZiB4IGBzcGFya2luZ2AgIHMgeAoKVGhlIHNhbWUgdGhpbmcg
Zm9yIGZ1bmN0aW9uIGNvbXBvc2l0aW9uICgufCBhbmQgLnx8KSBhbmQgaW52
ZXJzZSBmdW5jdGlvbgpjb21wb3NpdGlvbiAoLXwgYW5kIC18fCkgZm9yIHRo
b3NlIHdobyByZWFkIHRoZWlyIHByb2dyYW1zIGZyb20gbGVmdCB0byAKcmln
aHQuCgotLUBjaW5kZXggLnwKLS1AY2luZGV4IC58fAotLUBjaW5kZXggLXwK
LS1AY2luZGV4IC18fAoKPiAoLnwpLCAoLnx8KSA6OiAoYiAtPiBjKSAtPiBT
dHJhdGVneSBiIC0+IChhIC0+IGIpIC0+IChhIC0+IGMpCj4gKC18KSwgKC18
fCkgOjogKGEgLT4gYikgLT4gU3RyYXRlZ3kgYiAtPiAoYiAtPiBjKSAtPiAo
YSAtPiBjKQoKPiAoLnwpIGYgcyBnID0gXCB4IC0+IGxldCAgZ3ggPSBnIHgg
Cj4gICAgICAgICAgICAgICAgICAgICBpbiAgIGYgZ3ggYGRlbWFuZGluZ2Ag
cyBneAo+ICgufHwpIGYgcyBnID0gXCB4IC0+IGxldCAgZ3ggPSBnIHggCj4g
ICAgICAgICAgICAgICAgICAgICAgaW4gICBmIGd4IGBzcGFya2luZ2AgcyBn
eAoKPiAoLXwpIGYgcyBnID0gXCB4IC0+IGxldCAgZnggPSBmIHggCj4gICAg
ICAgICAgICAgICAgICAgICBpbiAgIGcgZnggYGRl
bWFuZGluZ2AgcyBmeAo+ICgtfHwpIGYgcyBnID0gXCB4IC0+IGxldCAgZngg
PSBmIHggCj4gICAgICAgICAgICAgICAgICAgICAgaW4gICBnIGZ4IGBzcGFy
a2luZ2AgcyBmeCAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQoJCQlNYXJraW5nIGEgU3RyYXRlZ3kKLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0tQG5vZGUgTWFya2luZyBhIFN0cmF0ZWd5LCBTdHJh
dGVneSBJbnN0YW5jZXMsIFN0cmF0ZWdpYyBGdW5jdGlvbiBBcHBsaWNhdGlv
biwgRXZhbHVhdGlvbiBTdHJhdGVnaWVzCi0tQHNlY3Rpb24gTWFya2luZyBh
IFN0cmF0ZWd5CgpNYXJraW5nIGEgc3RyYXRlZ3kuCgpBY3R1YWxseSwgQG1h
cmtTdHJhdEAgIHN0aWNrcyBhIGxhYmVsIEBuQCAgaW50byB0aGUgc3Bhcmtu
YW1lICBmaWVsZCBvZiB0aGUKdGhyZWFkIGV4ZWN1dGluZyBzdHJhdGVneSBA
c0AuIFRvZ2V0aGVyIHdpdGggYSBydW50aW1lLXN5c3RlbSB0aGF0IHN1cHBv
cnRzCnByb3BhZ2F0aW9uIG9mIHNwYXJrbmFtZXMgdG8gdGhlIGNoaWxkcmVu
IHRoaXMgbWVhbnMgdGhhdCB0aGlzIHN0cmF0ZWd5IGFuZAphbGwgaXRzIGNo
aWxkcmVuIGhhdmUgIHRoZSBzcGFya25hbWUgQG5AIChpZiB0aGUgIHN0YXRp
YyBzcGFya25hbWUgZmllbGQgaW4KdGhlIEBwYXJHbG9iYWxAIGFubm90YXRp
b24gY29udGFpbnMgdGhlIHZhbHVlIDEpLiBOb3RlLCB0aGF0IHRoZSBAU05A
IGZpZWxkCm9mIHN0YXJ0aW5nIHRoZSBtYXJrZWQgc3RyYXRlZ3kgaXRzZWxm
IGNvbnRhaW5zIHRoZSBzcGFya25hbWUgb2YgdGhlIHBhcmVudAp0aHJlYWQu
IFRoZSBFTkQgZXZlbnQgY29udGFpbnMgQG5AIGFzIHNwYXJrbmFtZS4KCi0t
QGNpbmRleCBtYXJrU3RyYXQKCj4jaWYgZGVmaW5lZChHUkFOKSAmJiAhKF9f
SEFTS0VMTDFfXz49NCkKPiBtYXJrU3RyYXQgOjogSW50IC0+IFN0cmF0ZWd5
IGEgLT4gU3RyYXRlZ3kgYSAKPiBtYXJrU3RyYXQgbiBzIHggPSB1bnNhZmVQ
ZXJmb3JtUHJpbUlPICgKPiAgICAgIF9jYXNtXyBgYCVyID0gc2V0X3NwYXJr
bmFtZShDdXJyZW50VFNPLCAlMCk7JycgbiBgdGhlblByaW1JT2AgXCB6IC0+
Cj4gICAgICByZXR1cm5QcmltSU8gKHMgeCkpCj4jZW5kaWYKCi0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCVN0cmF0ZWd5IEluc3RhbmNl
cyBhbmQgRnVuY3Rpb25zCQkgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotLUBub2RlIFN0cmF0ZWd5IEluc3RhbmNlcywgTG9saXRh
LXNwZWNpZmljIFN0cmF0ZWdpZXMsIE1hcmtpbmcgYSBTdHJhdGVneSwgRXZh
bHVhdGlvbiBTdHJhdGVnaWVzCi0tQHNlY3Rpb24gU3RyYXRlZ3kgSW5zdGFu
Y2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgICAg
ICAgICAgICAgVHVwbGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0tQG1lbnUKLS0qIFR1cGxlczo6CQkJCi0tKiBOdW1iZXJzOjoJCQkK
LS0qIENoYXJhY3RlcnM6OgkJCi0tKiBCb29sZWFuczo6CQkJCi0tKiBVbml0
OjoJCQkKLS0qIExpc3RzOjoJCQkKLS0qIEFycmF5czo6CQkJCi0tQGVuZCBt
ZW51CgotLUBub2RlIFR1cGxlcywgTnVtYmVycywgU3RyYXRlZ3kgSW5zdGFu
Y2VzLCBTdHJhdGVneSBJbnN0YW5jZXMKLS1Ac3Vic2VjdGlvbiBUdXBsZXMK
CldlIGN1cnJlbnRseSBzdXBwb3J0IHVwIHRvIDktdHVwbGVzLiBJZiB5b3Ug
bmVlZCBsb25nZXIgdHVwbGVzIHlvdSBoYXZlIHRvIAphZGQgdGhlIGluc3Rh
bmNlIGV4cGxpY2l0bHkgdG8geW91ciBwcm9ncmFtLgoKPiBpbnN0YW5jZSAo
TkZEYXRhIGEsIE5GRGF0YSBiKSA9PiBORkRhdGEgKGEsYikgd2hlcmUKPiAg
IHJuZiAoeCx5KSA9IHJuZiB4IGBzZXFgIHJuZiB5Cgo+IGluc3RhbmNlIChO
RkRhdGEgYSwgTkZEYXRhIGIsIE5GRGF0YSBjKSA9PiBORkRhdGEgKGEsYixj
KSB3aGVyZQo+ICAgcm5mICh4LHkseikgPSBybmYgeCBgc2VxYCBybmYgeSBg
c2VxYCBybmYgeiAKCj4gaW5zdGFuY2UgKE5GRGF0YSBhLCBORkRhdGEgYiwg
TkZEYXRhIGMsIE5GRGF0YSBkKSA9PiBORkRhdGEgKGEsYixjLGQpIHdoZXJl
Cj4gICBybmYgKHgxLHgyLHgzLHg0KSA9IHJuZiB4MSBgc2VxYCAKPiAJCSAg
ICAgICAgcm5mIHgyIGBzZXFgIAo+IAkJICAgICAgICBybmYgeDMgYHNlcWAg
Cj4gCQkgICAgICAgIHJuZiB4NCAKCj4gLS0gY29kZSBhdXRvbWF0aWNhbGx5
IGluc2VydGVkIGJ5IGBod2wtaW5zZXJ0LU5GRGF0YS1uLXR1cGxlJwo+IGlu
c3RhbmNlIChORkRhdGEgYTEsIE5GRGF0YSBhMiwgTkZEYXRhIGEzLCBORkRh
dGEgYTQsIE5GRGF0YSBhNSkgPT4gCj4gICAgICAgICAgTkZEYXRhIChhMSwg
YTIsIGEzLCBhNCwgYTUpIHdoZXJlCj4gICBybmYgKHgxLCB4MiwgeDMsIHg0
LCB4NSkgPQo+ICAgICAgICAgICAgICAgICAgIHJuZiB4MSBgc2VxYAo+ICAg
ICAgICAgICAgICAgICAgIHJuZiB4MiBgc2VxYAo+ICAgICAgICAgICAgICAg
ICAgIHJuZiB4MyBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NCBg
c2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NQoKPiAtLSBjb2RlIGF1
dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgYnkgYGh3bC1pbnNlcnQtTkZEYXRhLW4t
dHVwbGUnCj4gaW5zdGFuY2UgKE5GRGF0YSBhMSwgTkZEYXRhIGEyLCBORkRh
dGEgYTMsIE5GRGF0YSBhNCwgTkZEYXRhIGE1LCBORkRhdGEgYTYpID0+IAo+
ICAgICAgICAgIE5GRGF0YSAoYTEsIGEyLCBhMywg
YTQsIGE1LCBhNikgd2hlcmUKPiAgIHJuZiAoeDEsIHgyLCB4MywgeDQsIHg1
LCB4NikgPQo+ICAgICAgICAgICAgICAgICAgIHJuZiB4MSBgc2VxYAo+ICAg
ICAgICAgICAgICAgICAgIHJuZiB4MiBgc2VxYAo+ICAgICAgICAgICAgICAg
ICAgIHJuZiB4MyBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NCBg
c2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NSBgc2VxYAo+ICAgICAg
ICAgICAgICAgICAgIHJuZiB4NgoKPiAtLSBjb2RlIGF1dG9tYXRpY2FsbHkg
aW5zZXJ0ZWQgYnkgYGh3bC1pbnNlcnQtTkZEYXRhLW4tdHVwbGUnCj4gaW5z
dGFuY2UgKE5GRGF0YSBhMSwgTkZEYXRhIGEyLCBORkRhdGEgYTMsIE5GRGF0
YSBhNCwgTkZEYXRhIGE1LCBORkRhdGEgYTYsIE5GRGF0YSBhNykgPT4gCj4g
ICAgICAgICAgTkZEYXRhIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykg
d2hlcmUKPiAgIHJuZiAoeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcpID0K
PiAgICAgICAgICAgICAgICAgICBybmYgeDEgYHNlcWAKPiAgICAgICAgICAg
ICAgICAgICBybmYgeDIgYHNlcWAKPiAgICAgICAgICAgICAgICAgICBybmYg
eDMgYHNlcWAKPiAgICAgICAgICAgICAgICAgICBybmYgeDQgYHNlcWAKPiAg
ICAgICAgICAgICAgICAgICBybmYgeDUgYHNlcWAKPiAgICAgICAgICAgICAg
ICAgICBybmYgeDYgYHNlcWAKPiAgICAgICAgICAgICAgICAgICBybmYgeDcK
Cj4gLS0gY29kZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGJ5IGBod2wtaW5z
ZXJ0LU5GRGF0YS1uLXR1cGxlJwo+IGluc3RhbmNlIChORkRhdGEgYTEsIE5G
RGF0YSBhMiwgTkZEYXRhIGEzLCBORkRhdGEgYTQsIE5GRGF0YSBhNSwgTkZE
YXRhIGE2LCBORkRhdGEgYTcsIE5GRGF0YSBhOCkgPT4gCj4gICAgICAgICAg
TkZEYXRhIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHdoZXJl
Cj4gICBybmYgKHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCkgPQo+
ICAgICAgICAgICAgICAgICAgIHJuZiB4MSBgc2VxYAo+ICAgICAgICAgICAg
ICAgICAgIHJuZiB4MiBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4
MyBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NCBgc2VxYAo+ICAg
ICAgICAgICAgICAgICAgIHJuZiB4NSBgc2VxYAo+ICAgICAgICAgICAgICAg
ICAgIHJuZiB4NiBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NyBg
c2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4OAoKPiAtLSBjb2RlIGF1
dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgYnkgYGh3bC1pbnNlcnQtTkZEYXRhLW4t
dHVwbGUnCj4gaW5zdGFuY2UgKE5GRGF0YSBhMSwgTkZEYXRhIGEyLCBORkRh
dGEgYTMsIE5GRGF0YSBhNCwgTkZEYXRhIGE1LCBORkRhdGEgYTYsIE5GRGF0
YSBhNywgTkZEYXRhIGE4LCBORkRhdGEgYTkpID0+IAo+ICAgICAgICAgIE5G
RGF0YSAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkgd2hl
cmUKPiAgIHJuZiAoeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4LCB4
OSkgPQo+ICAgICAgICAgICAgICAgICAgIHJuZiB4MSBgc2VxYAo+ICAgICAg
ICAgICAgICAgICAgIHJuZiB4MiBgc2VxYAo+ICAgICAgICAgICAgICAgICAg
IHJuZiB4MyBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NCBgc2Vx
YAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4NSBgc2VxYAo+ICAgICAgICAg
ICAgICAgICAgIHJuZiB4NiBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJu
ZiB4NyBgc2VxYAo+ICAgICAgICAgICAgICAgICAgIHJuZiB4OCBgc2VxYAo+
ICAgICAgICAgICAgICAgICAgIHJuZiB4OQoKLS1AY2luZGV4IHNlcVBhaXIK
Cj4gc2VxUGFpciA6OiBTdHJhdGVneSBhIC0+IFN0cmF0ZWd5IGIgLT4gU3Ry
YXRlZ3kgKGEsYikKPiBzZXFQYWlyIHN0cmF0YSBzdHJhdGIgKHgseSkgPSBz
dHJhdGEgeCBgc2VxYCBzdHJhdGIgeSAKCi0tQGNpbmRleCBwYXJQYWlyCgo+
IHBhclBhaXIgOjogU3RyYXRlZ3kgYSAtPiBTdHJhdGVneSBiIC0+IFN0cmF0
ZWd5IChhLGIpCj4gcGFyUGFpciBzdHJhdGEgc3RyYXRiICh4LHkpID0gc3Ry
YXRhIHggYHBhcmAgc3RyYXRiIHkgYHBhcmAgKCkKClRoZSByZWFzb24gZm9y
IHRoZSAgc2Vjb25kIGBwYXJgIGlzIHNvIHRoYXQgdGhlIHN0cmF0ZWd5IHRl
cm1pbmF0ZXMgCnF1aWNrbHkuIFRoaXMgaXMgaW1wb3J0YW50IGlmIHRoZSBz
dHJhdGVneSBpcyB1c2VkIGFzIHRoZSAxc3QgYXJndW1lbnQgb2YgYSBzZXEK
Ci0tQGNpbmRleCBzZXFUcmlwbGUKCj4gc2VxVHJpcGxlIDo6IFN0cmF0ZWd5
IGEgLT4gU3RyYXRlZ3kgYiAtPiBTdHJhdGVneSBjIC0+IFN0cmF0ZWd5IChh
LGIsYykKPiBzZXFUcmlwbGUgc3RyYXRhIHN0cmF0YiBzdHJhdGMgcEAoeCx5
LHopID0gCj4gICBzdHJhdGEgeCBgc2VxYCAKPiAgIHN0cmF0YiB5IGBzZXFg
Cj4gICBzdHJhdGMgeiAKCi0tQGNpbmRleCBwYXJUcmlwbGUKCj4gcGFyVHJp
cGxlIDo6IFN0cmF0ZWd5IGEgLT4gU3RyYXRlZ3kgYiAtPiBTdHJhdGVneSBj
IC0+IFN0cmF0ZWd5IChhLGIsYykKPiBwYXJUcmlwbGUgc3RyYXRhIHN0cmF0
YiBzdHJhdGMgKHgseSx6KSA9IAo+ICAgc3RyYXRhIHggYHBhcmAgCj4gICBz
dHJhdGIgeSBgcGFyYCAKPiAgIHN0cmF0YyB6IGBwYXJgCj4gICAoKQoKLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJTnVtYmVycwkJCQkJ
CSAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tQG5v
ZGUgTnVtYmVycywgQ2hhcmFjdGVycywgVHVwbGVzLCBTdHJhdGVneSBJbnN0
YW5jZXMKLS1Ac3Vic2VjdGlvbiBOdW1iZXJzCgpXZWFrIGhlYWQgbm9ybWFs
IGZvcm0gYW5kIG5vcm1hbCBmb3JtIGFyZSBpZGVudGljYWwgZm9yIGludGVn
ZXJzLCBzbyB0aGUgCmRlZmF1bHQgcm5mIGlzIHN1
ZmZpY2llbnQuIAoKPiBpbnN0YW5jZSBORkRhdGEgSW50IAo+IGluc3RhbmNl
IE5GRGF0YSBJbnRlZ2VyCj4gaW5zdGFuY2UgTkZEYXRhIEZsb2F0Cj4gaW5z
dGFuY2UgTkZEYXRhIERvdWJsZQoKPiBpbnN0YW5jZSBORkRhdGFJbnRlZ3Jh
bCBJbnQKPiBpbnN0YW5jZSBORkRhdGFPcmQgSW50CgpSYXRpb25hbCBhbmQg
Y29tcGxleCBudW1iZXJzLgoKPiNpZiAhKF9fSEFTS0VMTDFfXz49NCkKPiBp
bnN0YW5jZSAoTkZEYXRhIGEpID0+IE5GRGF0YSAoUmF0aW8gYSkgd2hlcmUK
PiAgIHJuZiAoeDoleSkgPSBybmYgeCBgc2VxYCAKPiAgICAgICAgICAgICAg
ICBybmYgeSBgc2VxYAo+ICAgICAgICAgICAgICAgICgpCgo+IGluc3RhbmNl
IChORkRhdGEgYSkgPT4gTkZEYXRhIChDb21wbGV4IGEpIHdoZXJlCj4gICBy
bmYgKHg6K3kpID0gcm5mIHggYHNlcWAgCj4gCSAgICAgICAgIHJuZiB5IGBz
ZXFgCj4gICAgICAgICAgICAgICAgKCkKPiNlbmRpZgoKLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KCQkJQ2hhcmFjdGVycwkJCQkJICAgICAg
Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tQG5vZGUgQ2hh
cmFjdGVycywgQm9vbGVhbnMsIE51bWJlcnMsIFN0cmF0ZWd5IEluc3RhbmNl
cwotLUBzdWJzZWN0aW9uIENoYXJhY3RlcnMKCj4gaW5zdGFuY2UgTkZEYXRh
IENoYXIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJCUJv
b2xzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tQG5vZGUg
Qm9vbGVhbnMsIFVuaXQsIENoYXJhY3RlcnMsIFN0cmF0ZWd5IEluc3RhbmNl
cwotLUBzdWJzZWN0aW9uIEJvb2xlYW5zCgo+IGluc3RhbmNlIE5GRGF0YSBC
b29sCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQlVbml0
CQkJCQkJICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LS1Abm9kZSBVbml0LCBMaXN0cywgQm9vbGVhbnMsIFN0cmF0ZWd5IEluc3Rh
bmNlcwotLUBzdWJzZWN0aW9uIFVuaXQKCj4gaW5zdGFuY2UgTkZEYXRhICgp
CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQlMaXN0cwkJ
CQkJCSAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLUBu
b2RlIExpc3RzLCBBcnJheXMsIFVuaXQsIFN0cmF0ZWd5IEluc3RhbmNlcwot
LUBzdWJzZWN0aW9uIExpc3RzCgo+IGluc3RhbmNlIE5GRGF0YSBhID0+IE5G
RGF0YSBbYV0gd2hlcmUKPiAgIHJuZiBbXSA9ICgpCj4gICBybmYgKHg6eHMp
ID0gcm5mIHggYHNlcWAgcm5mIHhzCgotLUBtZW51Ci0tKiBQYXJhbGxlbCBT
dHJhdGVnaWVzIGZvciBMaXN0czo6ICAKLS0qIFNlcXVlbnRpYWwgU3RyYXRl
Z2llcyBmb3IgTGlzdHM6OiAgCi0tQGVuZCBtZW51CgotLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIExp
c3RzOiBQYXJhbGxlbCBTdHJhdGVnaWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLS1Abm9kZSBQYXJhbGxlbCBTdHJhdGVnaWVzIGZvciBM
aXN0cywgU2VxdWVudGlhbCBTdHJhdGVnaWVzIGZvciBMaXN0cywgTGlzdHMs
IExpc3RzCi0tQHN1YnN1YnNlY3Rpb24gUGFyYWxsZWwgU3RyYXRlZ2llcyBm
b3IgTGlzdHMKCkFwcGxpZXMgYSBzdHJhdGVneSB0byBldmVyeSBlbGVtZW50
IG9mIGEgbGlzdCBpbiBwYXJhbGxlbAoKLS1AY2luZGV4IHBhckxpc3QKCj4g
cGFyTGlzdCA6OiBTdHJhdGVneSBhIC0+IFN0cmF0ZWd5IFthXQo+IHBhckxp
c3Qgc3RyYXQgW10gICAgID0gKCkKPiBwYXJMaXN0IHN0cmF0ICh4OnhzKSA9
IHN0cmF0IHggYHBhcmAgKHBhckxpc3Qgc3RyYXQgeHMpCgpBcHBsaWVzIGEg
c3RyYXRlZ3kgdG8gdGhlIGZpcnN0ICBuIGVsZW1lbnRzIG9mIGEgbGlzdCAg
aW4gcGFyYWxsZWwKCi0tQGNpbmRleCBwYXJMaXN0TgoKPiBwYXJMaXN0TiA6
OiAoSW50ZWdyYWwgYikgPT4gYiAtPiBTdHJhdGVneSBhIC0+IFN0cmF0ZWd5
IFthXQo+IHBhckxpc3ROIG4gc3RyYXQgW10gICAgID0gKCkKPiBwYXJMaXN0
TiAwIHN0cmF0IHhzICAgICA9ICgpCj4gcGFyTGlzdE4gbiBzdHJhdCAoeDp4
cykgPSBzdHJhdCB4IGBwYXJgIChwYXJMaXN0TiAobi0xKSBzdHJhdCB4cykK
CkV2YWx1YXRlcyBOIGVsZW1lbnRzIG9mIHRoZSBzcGluZSBvZiB0aGUgYXJn
dW1lbnQgbGlzdCBhbmQgYXBwbGllcwpgc3RyYXQnIHRvIHRoZSBOdGggZWxl
bWVudCAoaWYgdGhlcmUgaXMgb25lKSBpbiBwYXJhbGxlbCB3aXRoIHRoZQpy
ZXN1bHQuIGUuZy4gcGFyTGlzdE50aCAyIFtlMSwgZTIsIGUzXSBldmFsdWF0
ZXMgZTIKCi0tQGNpbmRleCBwYXJMaXN0TnRoCgo+IHBhckxpc3ROdGggOjog
SW50IC0+IFN0cmF0ZWd5IGEgLT4gU3RyYXRlZ3kgW2FdCj4gcGFyTGlzdE50
aCBuIHN0cmF0IHhzIAo+ICAgfCBudWxsIHJlc3QgPSAoKQo+ICAgfCBvdGhl
cndpc2UgPSBzdHJhdCAoaGVhZCByZXN0KSBgcGFyYCAoKQo+ICAgd2hlcmUK
PiAgICAgcmVzdCA9IGRyb3AgbiB4cwoKcGFyTGlzdENodW5rIHNlcXVlbnRp
YWxseSBhcHBsaWVzIGEgc3RyYXRlZ3kgdG8gY2h1
bmtzCihzdWItc2VxdWVuY2VzKSBvZiBhIGxpc3QgaW4gcGFyYWxsZWwuIFVz
ZWZ1bCB0byBpbmNyZWFzZSBncmFpbiBzaXplCgotLUBjaW5kZXggcGFyTGlz
dENodW5rCgo+IHBhckxpc3RDaHVuayA6OiBJbnQgLT4gU3RyYXRlZ3kgYSAt
PiBTdHJhdGVneSBbYV0KPiBwYXJMaXN0Q2h1bmsgbiBzdHJhdCBbXSA9ICgp
Cj4gcGFyTGlzdENodW5rIG4gc3RyYXQgeHMgPSBzZXFMaXN0TiBuIHN0cmF0
IHhzIGBwYXJgIAo+IAkJCSAgICBwYXJMaXN0Q2h1bmsgbiBzdHJhdCAoZHJv
cCBuIHhzKQoKcGFyTWFwIGFwcGxpZXMgYSBmdW5jdGlvbiB0byBlYWNoIGVs
ZW1lbnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QgaW4KcGFyYWxsZWwuICBUaGUg
cmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBpcyBldmFsdWF0ZWQgdXNpbmcgYHN0
cmF0JwoKLS1AY2luZGV4IHBhck1hcAoKPiBwYXJNYXAgOjogU3RyYXRlZ3kg
YiAtPiAoYSAtPiBiKSAtPiBbYV0gLT4gW2JdCj4gcGFyTWFwIHN0cmF0IGYg
eHMgCT0gbWFwIGYgeHMgYHVzaW5nYCBwYXJMaXN0IHN0cmF0CgpwYXJGbGF0
TWFwIHVzZXMgcGFyTWFwIHRvIGFwcGx5IGEgbGlzdC12YWx1ZWQgZnVuY3Rp
b24gdG8gZWFjaAplbGVtZW50IG9mIHRoZSBhcmd1bWVudCBsaXN0IGluIHBh
cmFsbGVsLiAgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24KaXMgZXZhbHVh
dGVkIHVzaW5nIGBzdHJhdCcKCi0tQGNpbmRleCBwYXJGbGF0TWFwCgo+IHBh
ckZsYXRNYXAgOjogU3RyYXRlZ3kgW2JdIC0+IChhIC0+IFtiXSkgLT4gW2Fd
IC0+IFtiXQo+IHBhckZsYXRNYXAgc3RyYXQgZiB4cyA9IGNvbmNhdCAocGFy
TWFwIHN0cmF0IGYgeHMpCgpwYXJaaXBXaXRoIHppcHMgdG9nZXRoZXIgdHdv
IGxpc3RzIHdpdGggYSBmdW5jdGlvbiB6IGluIHBhcmFsbGVsCgotLUBjaW5k
ZXggcGFyWmlwV2l0aAoKPiBwYXJaaXBXaXRoIDo6IFN0cmF0ZWd5IGMgLT4g
KGEgLT4gYiAtPiBjKSAtPiBbYV0gLT4gW2JdIC0+IFtjXQo+IHBhclppcFdp
dGggc3RyYXQgeiBhcyBicyA9IAo+ICAgemlwV2l0aCB6IGFzIGJzIGB1c2lu
Z2AgcGFyTGlzdCBzdHJhdAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQogICAgICAgICAgICAgICAgICAgICAgICBMaXN0czogU2VxdWVudGlh
bCBTdHJhdGVnaWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LS1Abm9kZSBTZXF1ZW50aWFsIFN0cmF0ZWdpZXMgZm9yIExpc3RzLCAgLCBQ
YXJhbGxlbCBTdHJhdGVnaWVzIGZvciBMaXN0cywgTGlzdHMKLS1Ac3Vic3Vi
c2VjdGlvbiBTZXF1ZW50aWFsIFN0cmF0ZWdpZXMgZm9yIExpc3RzCgpTZXF1
ZW50aWFsbHkgYXBwbGllcyBhIHN0cmF0ZWd5IHRvIGVhY2ggZWxlbWVudCBv
ZiBhIGxpc3QKCi0tQGNpbmRleCBzZXFMaXN0Cgo+IHNlcUxpc3QgOjogU3Ry
YXRlZ3kgYSAtPiBTdHJhdGVneSBbYV0KPiBzZXFMaXN0IHN0cmF0IFtdICAg
ICA9ICgpCj4gc2VxTGlzdCBzdHJhdCAoeDp4cykgPSBzdHJhdCB4IGBzZXFg
IChzZXFMaXN0IHN0cmF0IHhzKQoKU2VxdWVudGlhbGx5IGFwcGxpZXMgYSBz
dHJhdGVneSB0byB0aGUgZmlyc3QgIG4gZWxlbWVudHMgb2YgYSBsaXN0Cgot
LUBjaW5kZXggc2VxTGlzdE4KCj4gc2VxTGlzdE4gOjogKEludGVncmFsIGEp
ID0+IGEgLT4gU3RyYXRlZ3kgYiAtPiBTdHJhdGVneSBbYl0KPiBzZXFMaXN0
TiBuIHN0cmF0IFtdICAgICA9ICgpCj4gc2VxTGlzdE4gMCBzdHJhdCB4cyAg
ICAgPSAoKQo+IHNlcUxpc3ROIG4gc3RyYXQgKHg6eHMpID0gc3RyYXQgeCBg
c2VxYCAoc2VxTGlzdE4gKG4tMSkgc3RyYXQgeHMpCgpzZXFMaXN0TnRoIGFw
cGxpZXMgYSBzdHJhdGVneSB0byB0aGUgTnRoIGVsZW1lbnQgb2YgaXQncyBh
cmd1bWVudAooaWYgdGhlcmUgaXMgb25lKSBiZWZvcmUgcmV0dXJuaW5nIHRo
ZSByZXN1bHQuIGUuZy4gc2VxTGlzdE50aCAyIFtlMSwKZTIsIGUzXSBldmFs
dWF0ZXMgZTIKCi0tQGNpbmRleCBzZXFMaXN0TnRoCgo+I2lmIChfX0hBU0tF
TEwxX18+PTQpCj4gc2VxTGlzdE50aCA6OiBJbnQgLT4gU3RyYXRlZ3kgYiAt
PiBTdHJhdGVneSBbYl0KPiNlbHNlCj4gc2VxTGlzdE50aCA6OiAoSW50ZWdy
YWwgYSkgPT4gYSAtPiBTdHJhdGVneSBiIC0+IFN0cmF0ZWd5IFtiXQo+I2Vu
ZGlmCj4gc2VxTGlzdE50aCBuIHN0cmF0IHhzIAo+ICAgfCBudWxsIHJlc3Qg
PSAoKQo+ICAgfCBvdGhlcndpc2UgPSBzdHJhdCAoaGVhZCByZXN0KSAKPiAg
IHdoZXJlCj4gICAgIHJlc3QgPSBkcm9wIG4geHMKClBhcmFsbGVsIG4tYnVm
ZmVyIGZ1bmN0aW9uIGFkZGVkIGZvciB0aGUgcmV2aXNlZCB2ZXJzaW9uIG9m
IHRoZSBzdHJhdGVnaWVzCnBhcGVyLiBAcGFyQnVmZmVyQCBzdXBlcnNlZGVz
IHRoZSBvbGRlciBAZnJpbmdlTGlzdEAuIEl0IGhhcyB0aGUgc2FtZQpzZW1h
bnRpY3MuCgotLUBjaW5kZXggcGFyQnVmZmVyCgo+IHBhckJ1ZmZlciA6OiBJ
bnQgLT4gU3RyYXRlZ3kgYSAtPiBbYV0gLT4gW2FdCj4gcGFyQnVmZmVyIG4g
cyB4cyA9IAo+ICAgcmV0dXJuIHhzIChzdGFydCBuIHhzKQo+ICAgd2hlcmUK
PiAgICAgcmV0dXJuICh4OnhzKSAoeTp5cykgPSAoeDpyZXR1cm4geHMgeXMp
IGBzcGFya2luZ2AgcyB5Cj4gICAgIHJldHVybiB4cyAgICAgW10gICAgID0g
eHMKPgo+ICAgICBzdGFydCBuIFtdICAgICA9IFtdCj4gICAgIHN0YXJ0IDAg
eXMgICAgID0geXMKPiAgICAgc3RhcnQgbiAoeTp5cykgPSBzdGFydCAobi0x
KSB5cyBgc3BhcmtpbmdgIHMgeQoKZnJpbmdlTGlzdCBpbXBsZW1lbnRzIGEg
YHJvbGxpbmcgYnVmZmVyJyBvZiBsZW5ndGggbiwgaS5lLmFwcGxpZXMgYQpz
dHJhdGVneSB0byB0aGUgbnRoIGVsZW1lbnQgb2YgbGlzdCB3aGVuIHRoZSBo
ZWFkIGlzIGRlbWFuZGVkLiBNb3JlCnByZWNpc2VseToKCiAgIHNlbWFudGlj
czogICAgICAgICBmcmluZ2VMaXN0IG4gcyA9IGlk
IDo6IFtiXSAtPiBbYl0KICAgZHluYW1pYyBiZWhhdmlvdXI6IGV2YWx1dGF0
ZXMgdGhlIG50aCBlbGVtZW50IG9mIHRoZSBsaXN0IHdoZW4gdGhlCgkJICAg
ICAgaGVhZCBpcyBkZW1hbmRlZC4KICAgClRoZSBpZGVhIGlzIHRvIHByb3Zp
ZGUgYSBgcm9sbGluZyBidWZmZXInIG9mIGxlbmd0aCBuLgoKLS1AY2luZGV4
IGZyaW5nZUxpc3QKCjw+IGZyaW5nZUxpc3QgOjogKEludGVncmFsIGEpID0+
IGEgLT4gU3RyYXRlZ3kgYiAtPiBbYl0gLT4gW2JdCjw+IGZyaW5nZUxpc3Qg
biBzdHJhdCBbXSA9IFtdCjw+IGZyaW5nZUxpc3QgbiBzdHJhdCAocjpycykg
PSAKPD4gICBzZXFMaXN0TnRoIG4gc3RyYXQgcnMgYHBhcmAKPD4gICByOmZy
aW5nZUxpc3QgbiBzdHJhdCBycwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCgkJCUFycmF5cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLS1Abm9kZSBBcnJheXMsICAsIExpc3RzLCBTdHJhdGVneSBJ
bnN0YW5jZXMKLS1Ac3Vic2VjdGlvbiBBcnJheXMKCj4gaW5zdGFuY2UgKEl4
IGEsIE5GRGF0YSBhLCBORkRhdGEgYikgPT4gTkZEYXRhIChBcnJheSBhIGIp
IHdoZXJlCj4gICBybmYgeCA9IHJuZiAoYm91bmRzIHgpIGBzZXFgIHNlcUxp
c3Qgcm5mIChlbGVtcyB4KSBgc2VxYCAoKQoKQXBwbHkgYSBzdHJhdGVneSB0
byBhbGwgZWxlbWVudHMgb2YgYW4gYXJyYXkgaW4gcGFyYWxsZWwuIFRoaXMg
Y2FuIGJlIGRvbmUgCmVpdGhlciBpbiBzZXF1ZW50aWFsbHkgb3IgaW4gcGFy
YWxsZWwgKHNhbWUgYXMgd2l0aCBsaXN0cywgcmVhbGx5KS4KCj4gc2VxQXJy
IDo6IChJeCBiKSA9PiBTdHJhdGVneSBhIC0+IFN0cmF0ZWd5IChBcnJheSBi
IGEpCj4gc2VxQXJyIHMgYXJyID0gc2VxTGlzdCBzIChlbGVtcyBhcnIpCgo+
IHBhckFyciA6OiAoSXggYikgPT4gU3RyYXRlZ3kgYSAtPiBTdHJhdGVneSAo
QXJyYXkgYiBhKQo+IHBhckFyciBzIGFyciA9IHBhckxpc3QgcyAoZWxlbXMg
YXJyKQoKQXNzb2NpYXRpb25zIG1heWJlIHVzZWZ1bCBldmVuIHdpdGhvdSBt
ZW50aW9uaW5nIEFycmF5cy4KClNlZTogLi4uL2xpYi9wcmVsdWRlL1R5QXJy
YXlzLmhzOgpkYXRhICBBc3NvYyBhIGIgPSAgYSA6PSBiICBkZXJpdmluZyAo
KQoKPiNpZiAoX19IQVNLRUxMMV9fPDQpCj4gaW5zdGFuY2UgKE5GRGF0YSBh
LCBORkRhdGEgYikgPT4gTkZEYXRhIChBc3NvYyBhIGIpIHdoZXJlCj4gICBy
bmYgKHggOj0geSkgPSBybmYgeCBgc2VxYCBybmYgeSBgc2VxYCAoKQo+I2Vu
ZGlmCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAg
ICAgICAgICAgICBTb21lIHN0cmF0ZWdpZXMgc3BlY2lmaWMgZm9yIExvbGl0
YQkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tQG5vZGUg
TG9saXRhLXNwZWNpZmljIFN0cmF0ZWdpZXMsIEluZGV4LCBTdHJhdGVneSBJ
bnN0YW5jZXMsIEV2YWx1YXRpb24gU3RyYXRlZ2llcwotLUBzZWN0aW9uIExv
bGl0YS1zcGVjaWZpYyBTdHJhdGVnaWVzCgpUaGUgZm9sbG93aW5nIGlzIHVz
ZWZ1bCBpbiBtZXJnZVBlbkdyb3VwcwoKLS1AY2luZGV4IGZzdFBhaXJGc3RM
aXN0Cgo+IGZzdFBhaXJGc3RMaXN0IDo6IChORkRhdGEgYSkgPT4gU3RyYXRl
Z3kgWyhhLGIpXQo+IGZzdFBhaXJGc3RMaXN0ID0gc2VxTGlzdE4gMSAoc2Vx
UGFpciByd2huZiByMCkKClNvbWUgSEFDS3MgZm9yIExvbGl0YS4gQUZBSUsg
Zm9yY2UgaXMganVzdCBhbm90aGVyIG5hbWUgZm9yIG91ciBybmYgYW5kCnNm
b3JjZSBpcyBhIHNob3J0Y3V0IChkZWZpbml0aW9uIGhlcmUgaXMgaWRlbnRp
Y2FsIHRvIHRoZSBvbmUgaW4gRm9yY2UubGhzKQoKPiBmb3JjZSA6OiAoTkZE
YXRhIGEpID0+IGEgLT4gYSAKPiBzZm9yY2UgOjogKE5GRGF0YSBhKSA9PiBh
IC0+IGIgLT4gYgoKU2FtZSBhcyBkZWZpbml0aW9uIGJlbG93Cgo8PiBmb3Jj
ZSB4ID0gcm5mIHggYHNlcWAgeAoKPiBmb3JjZSA9IGlkICR8IHJuZgo+I2lm
IChfX0hBU0tFTEwxX18+PTQpCj4gc2ZvcmNlIHggeSA9IGZvcmNlIHggYHNl
cWAgeQo+I2Vsc2UKPiBzZm9yY2UgeCB5ID0gZm9yY2UgeCBgc2VxX2Zyb21f
UGFyYWxsZWxgIHkKPiNlbmRpZgoKLS1Abm9kZSBCb3dpbmctYWxnIHNwZWNp
ZmljIHN0cmF0ZWdpZXMKLS1Ac2VjdGlvbiBCb3dpbmctYWxnIHNwZWNpZmlj
IHN0cmF0ZWdpZXMKCk5COiB0aGlzIHN0cmF0ZWd5IGN1cnJlbnRseSBuZWVk
cyB0aGUgcXVpY2tzb3J0IGltcGxlbWVudGF0aW9uIGZyb20gdGhlIGhiYyBz
eXNsaWIgCgo+I2lmIGRlZmluZWQoUEFSX0dSQU5fTElTVCkKPiBwYXJHcmFu
TGlzdCA6OiBTdHJhdGVneSBhIC0+IChhIC0+IEludCkgLT4gW2FdIC0+IFN0
cmF0ZWd5IFthXQo+IHBhckdyYW5MaXN0IHMgZ3Jhbl9lc3RpbSBsX2luID0g
XCBsX291dCAtPgo+ICAgcGFyTGlzdEJ5SWR4IHMgbF9vdXQgJAo+ICAgc29y
dGVkSWR4IGdyYW5fbGlzdCAoc29ydExlICggXCAoaSxfKSAoaixfKSAtPiBp
PmopIGdyYW5fbGlzdCkKPiAgIHdoZXJlIC0tIHNwYXJrIGxpc3QgZWxlbXMg
b2YgbCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5ICAoaTppZHhzKQo+CSAg
cGFyTGlzdEJ5SWR4IHMgbCBbXSA9ICgpCj4JICBwYXJMaXN0QnlJZHggcyBs
IChpOmlkeHMpID0gcGFyTGlzdEJ5SWR4IHMgbCBpZHhzIGBzcGFya2luZ2Ag
cyAobCEhaSkKPgkgIC0tIGdldCB0aGUgaW5kZXggb2YgeSBpbiB0aGUgbGlz
dAo+CSAgaWR4IHkgW10gPSBlcnJvciAiaWR4OiB4IG5vdCBpbiBsIgo+CSAg
aWR4IHkgKCh4LF8pOnhzKSB8IHk9PXggICAgICA9IDAKPgkJCSAgfCBvdGhl
cndpc2UgPSAoaWR4IHkgeHMpKzEKPgkgIC0tIHRo
ZSBgc2NoZWR1bGUnIGZvciBzcGFya2luZzogbGlzdCBvZiBpbmRpY2VzIG9m
IHNvcnRlZCBpbnB1dCBsaXN0Cj4JICBzb3J0ZWRJZHggbCBpZHhzID0gWyBp
ZHggeCBsIHwgKHgsXykgPC0gaWR4cyBdCj4JICAtLSBhZGQgZ3JhbnVsYXJp
dHkgaW5mbyB0byBlbGVtcyBvZiB0aGUgaW5wdXQgbGlzdAo+CSAgZ3Jhbl9s
aXN0ID0gbWFwIChcIGwgLT4gKGdyYW5fZXN0aW0gbCwgbCkpIGxfaW4gIAo+
I2VuZGlmCgotLUBub2RlIEluZGV4LCAgLCBMb2xpdGEtc3BlY2lmaWMgU3Ry
YXRlZ2llcywgRXZhbHVhdGlvbiBTdHJhdGVnaWVzCi0tQHNlY3Rpb24gSW5k
ZXgKCi0tQGluZGV4Ci0tKiAkfDo6ICBAY2luZGV4XHMtKyR8Ci0tKiAkfHw6
OiAgQGNpbmRleFxzLSskfHwKLS0qIC18OjogIEBjaW5kZXhccy0rLXwKLS0q
IC18fDo6ICBAY2luZGV4XHMtKy18fAotLSogLnw6OiAgQGNpbmRleFxzLSsu
fAotLSogLnx8OjogIEBjaW5kZXhccy0rLnx8Ci0tKiBORkRhdGE6OiAgQGNp
bmRleFxzLStORkRhdGEKLS0qIFN0cmF0ZWd5OjogIEBjaW5kZXhccy0rU3Ry
YXRlZ3kKLS0qIGRlbWFuZGluZzo6ICBAY2luZGV4XHMtK2RlbWFuZGluZwot
LSogZnJpbmdlTGlzdDo6ICBAY2luZGV4XHMtK2ZyaW5nZUxpc3QKLS0qIGZz
dFBhaXJGc3RMaXN0OjogIEBjaW5kZXhccy0rZnN0UGFpckZzdExpc3QKLS0q
IG1hcmtTdHJhdDo6ICBAY2luZGV4XHMtK21hcmtTdHJhdAotLSogcGFyQnVm
ZmVyOjogIEBjaW5kZXhccy0rcGFyQnVmZmVyCi0tKiBwYXJGbGF0TWFwOjog
IEBjaW5kZXhccy0rcGFyRmxhdE1hcAotLSogcGFyTGlzdDo6ICBAY2luZGV4
XHMtK3Bhckxpc3QKLS0qIHBhckxpc3RDaHVuazo6ICBAY2luZGV4XHMtK3Bh
ckxpc3RDaHVuawotLSogcGFyTGlzdE46OiAgQGNpbmRleFxzLStwYXJMaXN0
TgotLSogcGFyTGlzdE50aDo6ICBAY2luZGV4XHMtK3Bhckxpc3ROdGgKLS0q
IHBhck1hcDo6ICBAY2luZGV4XHMtK3Bhck1hcAotLSogcGFyUGFpcjo6ICBA
Y2luZGV4XHMtK3BhclBhaXIKLS0qIHBhclRyaXBsZTo6ICBAY2luZGV4XHMt
K3BhclRyaXBsZQotLSogcGFyWmlwV2l0aDo6ICBAY2luZGV4XHMtK3Bhclpp
cFdpdGgKLS0qIHIwOjogIEBjaW5kZXhccy0rcjAKLS0qIHJuZjo6ICBAY2lu
ZGV4XHMtK3JuZgotLSogcndobmY6OiAgQGNpbmRleFxzLStyd2huZgotLSog
c2VxTGlzdDo6ICBAY2luZGV4XHMtK3NlcUxpc3QKLS0qIHNlcUxpc3ROOjog
IEBjaW5kZXhccy0rc2VxTGlzdE4KLS0qIHNlcUxpc3ROdGg6OiAgQGNpbmRl
eFxzLStzZXFMaXN0TnRoCi0tKiBzZXFQYWlyOjogIEBjaW5kZXhccy0rc2Vx
UGFpcgotLSogc2VxVHJpcGxlOjogIEBjaW5kZXhccy0rc2VxVHJpcGxlCi0t
KiBzcGFya2luZzo6ICBAY2luZGV4XHMtK3NwYXJraW5nCi0tKiB1c2luZzo6
ICBAY2luZGV4XHMtK3VzaW5nCi0tQGVuZCBpbmRleAo=

--Part10111191349.I--