From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wayne Gong Subject: Re: Error restoring DomU when using GPLPV Date: Tue, 25 Aug 2009 18:02:30 +0800 Message-ID: <4A93B6B6.2080903@oracle.com> References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------070001090300020905000106" Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: James Harper Cc: Joshua West , xen-devel@lists.xensource.com, Keir Fraser List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------070001090300020905000106 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit James Harper wrote: > > I added some more debugging... > > batch 1024 [1] > Allocating 1024 mfns [2] > 197600 allocated [3] > batch 1024 > Allocating 33 mfns > Failed allocation for dom 24: 33 extents of order 0 (err = 32) [4] > > [1] is just after 'j' is read in xc_domain_restore > [2] is just before the call to populate_physmap > [3] is just after the call to populate_physmap > [4] is the error message in the memory_op function in libxc modified to > give the value of err > > According to the a total of 197632 are being allocated and the last page > cannot be (could be more pages required the next time around the loop > too...) I've also added some debugging in xc_domain_save.c and xc_domain_restore.c. Attach has those two files which I am using and xend.log. Those two files are modified based on Xen 3.4.0-xx. What I've done is: 1, Create a Windows Server 2008 32bit with PV drivers which can support migration on Xen 3.1.x. 2, Save windows DomU then restore it. Error log is the same as the first mail of this thread. 3, Create a fresh install Windows 2008 32bit VM with almost the same vm.cfg file. 4, Save and restore windows DomU. Here is some xend logs. I am not very sure if it's fine as I didn't know the whole process of save/restore in Xen. If you need any more information, please let me know. Line 100: [2009-08-26 01:34:24 2883] INFO (XendCheckpoint:418) shared_info_frame: 0x41ec Line 167: [2009-08-26 01:34:39 2883] INFO (XendCheckpoint:418) shared_info_frame: 0xffffffff Line 581: [2009-08-26 02:10:47 2883] INFO (XendCheckpoint:418) shared_info_frame: 0xfffff Line 649: [2009-08-26 02:11:01 2883] INFO (XendCheckpoint:418) shared_info_frame: 0xffffffff <-- is this OK for a PVHVM when restoring. Line 169: [2009-08-26 01:34:39 2883] INFO (XendCheckpoint:418) Reloading memory pages: 0% Line 170: [2009-08-26 01:34:39 2883] INFO (XendCheckpoint:418) batch 1024 Line 171: [2009-08-26 01:34:39 2883] INFO (XendCheckpoint:418) nr_mfns: 991 <---- Line 651: [2009-08-26 02:11:01 2883] INFO (XendCheckpoint:418) Reloading memory pages: 0% Line 652: [2009-08-26 02:11:01 2883] INFO (XendCheckpoint:418) batch 1024 Line 653: [2009-08-26 02:11:01 2883] INFO (XendCheckpoint:418) nr_mfns: 992 <---- nf_mfns of HVM is one more lager then PVHVM's Line 472: [2009-08-26 01:34:46 2883] INFO (XendCheckpoint:418) batch 1024 Line 473: [2009-08-26 01:34:46 2883] INFO (XendCheckpoint:418) nr_mfns: 31 <---Restore a PVHVM will allocate 31 more nf_mfns then HVM. thanks wayne --------------070001090300020905000106 Content-Type: text/plain; name="xend.log" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="xend.log" WzIwMDktMDgtMjYgMDE6MjU6NDAgMjkwN10gSU5GTyAoU3J2RGFlbW9uOjIyMCkgWGVuZCBl eGl0ZWQgd2l0aCBzdGF0dXMgMC4KWzIwMDktMDgtMjYgMDE6Mjc6MjkgMjg4M10gSU5GTyAo U3J2RGFlbW9uOjMzMikgWGVuZCBEYWVtb24gc3RhcnRlZApbMjAwOS0wOC0yNiAwMToyNzoy OSAyODgzXSBJTkZPIChTcnZEYWVtb246MzM2KSBYZW5kIGNoYW5nZXNldDogdW5hdmFpbGFi bGUuClsyMDA5LTA4LTI2IDAxOjI3OjI5IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzox NDEpIFhlbmREb21haW5JbmZvLnJlY3JlYXRlKHsnbWF4X3ZjcHVfaWQnOiAxLCAnY3B1X3Rp bWUnOiA5MzIyOTI0NDQzTCwgJ3NzaWRyZWYnOiAwLCAnaHZtJzogMCwgJ3NodXRkb3duX3Jl YXNvbic6IDAsICdkeWluZyc6IDAsICdvbmxpbmVfdmNwdXMnOiAyLCAnZG9taWQnOiAwLCAn cGF1c2VkJzogMCwgJ2NyYXNoZWQnOiAwLCAncnVubmluZyc6IDEsICdtYXhtZW1fa2InOiA0 Mjk0OTY3MjkyTCwgJ3NodXRkb3duJzogMCwgJ21lbV9rYic6IDU1NTAwOEwsICdoYW5kbGUn OiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0sICdi bG9ja2VkJzogMCwgJ25hbWUnOiAnRG9tYWluLTAnfSkKWzIwMDktMDgtMjYgMDE6Mjc6Mjkg Mjg4M10gSU5GTyAoWGVuZERvbWFpbkluZm86MTU4KSBSZWNyZWF0aW5nIGRvbWFpbiAwLCBV VUlEIDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMC4gYXQgL2xvY2FsL2Rv bWFpbi8wClsyMDA5LTA4LTI2IDAxOjI3OjI5IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5m bzozMDgyKSBTdG9yaW5nIFZNIGRldGFpbHM6IHsnb25feGVuZF9zdG9wJzogJ2lnbm9yZScs ICdzaGFkb3dfbWVtb3J5JzogJzAnLCAndXVpZCc6ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAw MC0wMDAwMDAwMDAwMDAnLCAnb25fcmVib290JzogJ3Jlc3RhcnQnLCAnaW1hZ2UnOiAnKGxp bnV4IChrZXJuZWwgKSknLCAnb25fcG93ZXJvZmYnOiAnZGVzdHJveScsICdib290bG9hZGVy X2FyZ3MnOiAnJywgJ29uX3hlbmRfc3RhcnQnOiAnaWdub3JlJywgJ29uX2NyYXNoJzogJ3Jl c3RhcnQnLCAneGVuZC9yZXN0YXJ0X2NvdW50JzogJzAnLCAndmNwdXMnOiAnMicsICd2Y3B1 X2F2YWlsJzogJzMnLCAnYm9vdGxvYWRlcic6ICcnLCAnbmFtZSc6ICdEb21haW4tMCd9Clsy MDA5LTA4LTI2IDAxOjI3OjI5IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoxNjM4KSBT dG9yaW5nIGRvbWFpbiBkZXRhaWxzOiB7J25hbWUnOiAnRG9tYWluLTAnLCAnY29uc29sZS9s aW1pdCc6ICcxMDQ4NTc2JywgJ21lbW9yeS90YXJnZXQnOiAnNTU1MDA4JywgJ3ZtJzogJy92 bS8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnLCAnZG9taWQnOiAnMCcs ICdjcHUvMC9hdmFpbGFiaWxpdHknOiAnb25saW5lJywgJ2NwdS8xL2F2YWlsYWJpbGl0eSc6 ICdvbmxpbmUnLCAnY29udHJvbC9wbGF0Zm9ybS1mZWF0dXJlLW11bHRpcHJvY2Vzc29yLXN1 c3BlbmQnOiAnMScsICdjb25zb2xlL3R5cGUnOiAneGVuY29uc29sZWQnfQpbMjAwOS0wOC0y NiAwMToyNzoyOSAyODgzXSBERUJVRyAoWGVuZERvbWFpbjo0NTIpIEFkZGluZyBEb21haW46 IDAKWzIwMDktMDgtMjYgMDE6Mjc6MjkgMjg4M10gREVCVUcgKFhlbmREb21haW46Mzg2KSBu dW1iZXIgb2YgdmNwdXMgdG8gdXNlIGlzIDAKWzIwMDktMDgtMjYgMDE6Mjc6MzAgMjg4M10g SU5GTyAoU3J2U2VydmVyOjE3NykgdW5peCBwYXRoPS92YXIvbGliL3hlbmQveGVuZC1zb2Nr ZXQKWzIwMDktMDgtMjYgMDE6Mjc6MzAgMjg4M10gV0FSTklORyAoWGVuZEFQSTo2OTUpIEFQ SSBjYWxsOiBWQkQuc2V0X2RldmljZSBub3QgZm91bmQKWzIwMDktMDgtMjYgMDE6Mjc6MzAg Mjg4M10gV0FSTklORyAoWGVuZEFQSTo2OTUpIEFQSSBjYWxsOiBWQkQuc2V0X3R5cGUgbm90 IGZvdW5kClsyMDA5LTA4LTI2IDAxOjI3OjMwIDI4ODNdIFdBUk5JTkcgKFhlbmRBUEk6Njk1 KSBBUEkgY2FsbDogc2Vzc2lvbi5nZXRfYWxsX3JlY29yZHMgbm90IGZvdW5kClsyMDA5LTA4 LTI2IDAxOjI3OjMwIDI4ODNdIFdBUk5JTkcgKFhlbmRBUEk6Njk1KSBBUEkgY2FsbDogZXZl bnQuZ2V0X3JlY29yZCBub3QgZm91bmQKWzIwMDktMDgtMjYgMDE6Mjc6MzAgMjg4M10gV0FS TklORyAoWGVuZEFQSTo2OTUpIEFQSSBjYWxsOiBldmVudC5nZXRfYWxsIG5vdCBmb3VuZApb MjAwOS0wOC0yNiAwMToyNzozMCAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86MTcyNSkg WGVuZERvbWFpbkluZm8uaGFuZGxlU2h1dGRvd25XYXRjaApbMjAwOS0wOC0yNiAwMToyNzoz MCAyODgzXSBXQVJOSU5HIChYZW5kQVBJOjY5NSkgQVBJIGNhbGw6IFZJRi5nZXRfbmV0d29y ayBub3QgZm91bmQKWzIwMDktMDgtMjYgMDE6Mjc6MzAgMjg4M10gV0FSTklORyAoWGVuZEFQ STo2OTUpIEFQSSBjYWxsOiBWSUYuc2V0X2RldmljZSBub3QgZm91bmQKWzIwMDktMDgtMjYg MDE6Mjc6MzAgMjg4M10gV0FSTklORyAoWGVuZEFQSTo2OTUpIEFQSSBjYWxsOiBWSUYuc2V0 X01BQyBub3QgZm91bmQKWzIwMDktMDgtMjYgMDE6Mjc6MzAgMjg4M10gV0FSTklORyAoWGVu ZEFQSTo2OTUpIEFQSSBjYWxsOiBWSUYuc2V0X01UVSBub3QgZm91bmQKWzIwMDktMDgtMjYg MDE6Mjc6MzAgMjg4M10gV0FSTklORyAoWGVuZEFQSTo2OTUpIEFQSSBjYWxsOiBkZWJ1Zy5n ZXRfYWxsIG5vdCBmb3VuZApbMjAwOS0wOC0yNiAwMToyNzozMCAyODgzXSBJTkZPIChYTUxS UENTZXJ2ZXI6MTU2KSBPcGVuaW5nIFVuaXggZG9tYWluIHNvY2tldCBYTUwtUlBDIHNlcnZl ciBvbiAvdmFyL3J1bi94ZW5kL3hlbi1hcGkuc29jazsgYXV0aGVudGljYXRpb24gaGFzIGJl ZW4gZGlzYWJsZWQgZm9yIHRoaXMgc2VydmVyLgpbMjAwOS0wOC0yNiAwMToyNzozMCAyODgz XSBJTkZPIChYTUxSUENTZXJ2ZXI6MTU2KSBPcGVuaW5nIFVuaXggZG9tYWluIHNvY2tldCBY TUwtUlBDIHNlcnZlciBvbiAvdmFyL3J1bi94ZW5kL3htbHJwYy5zb2NrLgpbMjAwOS0wOC0y NiAwMTozMjo0OCAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86OTMpIFhlbmREb21haW5J bmZvLmNyZWF0ZShbJ3ZtJywgWyduYW1lJywgJ3NydjIwMDhfZnJlZSddLCBbJ21lbW9yeScs ICc2MDAnXSwgWydvbl9yZWJvb3QnLCAncmVzdGFydCddLCBbJ29uX2NyYXNoJywgJ3Jlc3Rh cnQnXSwgWyd2Y3B1cycsIDFdLCBbJ29uX3hlbmRfc3RhcnQnLCAnaWdub3JlJ10sIFsnb25f eGVuZF9zdG9wJywgJ2lnbm9yZSddLCBbJ2Jvb3Rsb2FkZXInLCAnL3Vzci9iaW4vcHlncnVi J10sIFsnYm9vdGxvYWRlcl9hcmdzJywgJy1xJ10sIFsnaW1hZ2UnLCBbJ2h2bScsIFsna2Vy bmVsJywgJy91c3IvbGliL3hlbi9ib290L2h2bWxvYWRlciddLCBbJ3ZpZGVvcmFtJywgNF0s IFsnZGV2aWNlX21vZGVsJywgJy91c3IvbGliL3hlbi9iaW4vcWVtdS1kbSddLCBbJ3BhZScs IDFdLCBbJ3ZjcHVzJywgMV0sIFsnYm9vdCcsICdjJ10sIFsnZmRhJywgJyddLCBbJ2ZkYics ICcnXSwgWyd0aW1lcl9tb2RlJywgMV0sIFsnbG9jYWx0aW1lJywgMF0sIFsnc2VyaWFsJywg J3B0eSddLCBbJ3N0ZHZnYScsIDBdLCBbJ2lzYScsIDBdLCBbJ25vZ3JhcGhpYycsIDBdLCBb J3NvdW5kaHcnLCAnJ10sIFsndm5jJywgMV0sIFsndm5jdW51c2VkJywgMV0sIFsndm5jY29u c29sZScsIDFdLCBbJ3ZuY2xpc3RlbicsICcwLjAuMC4wJ10sIFsneGF1dGhvcml0eScsICcv cm9vdC8uWGF1dGhvcml0eSddLCBbJ3J0Y190aW1lb2Zmc2V0JywgMF0sIFsnbW9uaXRvcics IDBdLCBbJ2FjcGknLCAxXSwgWydhcGljJywgMV0sIFsndXNiJywgMF0sIFsndXNiZGV2aWNl JywgJ3RhYmxldCddLCBbJ2tleW1hcCcsICcnXSwgWydwY2knLCBbXV0sIFsnaHBldCcsIDBd LCBbJ2d1ZXN0X29zX3R5cGUnLCAnZGVmYXVsdCddLCBbJ2hhcCcsIDFdLCBbJ2NwdWlkJywg W11dLCBbJ2NwdWlkX2NoZWNrJywgW11dLCBbJ3ZpcmlkaWFuJywgMF0sIFsncGNpX21zaXRy YW5zbGF0ZScsIDFdLCBbJ3ZwdF9hbGlnbicsIDFdLCBbJ3BjaV9wb3dlcl9tZ210JywgMF0s IFsneGVuX3BsYXRmb3JtX3BjaScsIDFdLCBbJ3ZuY3Bhc3N3ZCcsICdYWFhYWFhYWCddXV0s IFsnczNfaW50ZWdyaXR5JywgMV0sIFsnZGV2aWNlJywgWyd2YmQnLCBbJ3VuYW1lJywgJ2Zp bGU6L21udC9kYXRhL21naS9zcnYyMDA4L1N5c3RlbS5pbWcnXSwgWydkZXYnLCAnaGRhJ10s IFsnbW9kZScsICd3ISddXV0sIFsnZGV2aWNlJywgWyd2aWYnLCBbJ2JyaWRnZScsICd4ZW5i cjAnXSwgWydtYWMnLCAnMDA6MTY6M0U6NTU6RDE6QUEnXV1dXSkKWzIwMDktMDgtMjYgMDE6 MzI6NDggMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIzMTcpIFhlbmREb21haW5JbmZv LmNvbnN0cnVjdERvbWFpbgpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoYmFs bG9vbjoxODEpIEJhbGxvb246IDE0NzI3NzYgS2lCIGZyZWU7IG5lZWQgNDA5NjsgZG9uZS4K WzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKFhlbmREb21haW46NDUyKSBBZGRp bmcgRG9tYWluOiAxClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4ODNdIERFQlVHIChYZW5kRG9t YWluSW5mbzoyNTE4KSBYZW5kRG9tYWluSW5mby5pbml0RG9tYWluOiAxIDI1NgpbMjAwOS0w OC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoaW1hZ2U6MzE5KSBObyBWTkMgcGFzc3dkIGNv bmZpZ3VyZWQgZm9yIHZmYiBhY2Nlc3MKWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVC VUcgKGltYWdlOjgwNikgYXJnczogYm9vdCwgdmFsOiBjClsyMDA5LTA4LTI2IDAxOjMyOjQ4 IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGZkYSwgdmFsOiBOb25lClsyMDA5LTA4 LTI2IDAxOjMyOjQ4IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGZkYiwgdmFsOiBO b25lClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6 IHNvdW5kaHcsIHZhbDogTm9uZQpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAo aW1hZ2U6ODA2KSBhcmdzOiBsb2NhbHRpbWUsIHZhbDogMApbMjAwOS0wOC0yNiAwMTozMjo0 OCAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBzZXJpYWwsIHZhbDogWydwdHknXQpb MjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBzdGQt dmdhLCB2YWw6IDAKWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKGltYWdlOjgw NikgYXJnczogaXNhLCB2YWw6IDAKWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcg KGltYWdlOjgwNikgYXJnczogYWNwaSwgdmFsOiAxClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4 ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IHVzYiwgdmFsOiAwClsyMDA5LTA4LTI2IDAx OjMyOjQ4IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IHVzYmRldmljZSwgdmFsOiB0 YWJsZXQKWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gSU5GTyAoaW1hZ2U6NzQyKSBOZWVk IHRvIGNyZWF0ZSBwbGF0Zm9ybSBkZXZpY2UuW2RvbWlkOjFdClsyMDA5LTA4LTI2IDAxOjMy OjQ4IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoyNTQyKSBfaW5pdERvbWFpbjpzaGFk b3dfbWVtb3J5PTB4MCwgbWVtb3J5X3N0YXRpY19tYXg9MHgyNTgwMDAwMCwgbWVtb3J5X3N0 YXRpY19taW49MHgwLgpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoYmFsbG9v bjoxODEpIEJhbGxvb246IDE0NzEzNjQgS2lCIGZyZWU7IG5lZWQgNjI3NzEyOyBkb25lLgpb MjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBJTkZPIChpbWFnZToxNzApIGJ1aWxkRG9tYWlu IG9zPWh2bSBkb209MSB2Y3B1cz0xClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4ODNdIERFQlVH IChpbWFnZTo4NTkpIGRvbWlkICAgICAgICAgID0gMQpbMjAwOS0wOC0yNiAwMTozMjo0OCAy ODgzXSBERUJVRyAoaW1hZ2U6ODYwKSBpbWFnZSAgICAgICAgICA9IC91c3IvbGliL3hlbi9i b290L2h2bWxvYWRlcgpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoaW1hZ2U6 ODYxKSBzdG9yZV9ldnRjaG4gICA9IDIKWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVC VUcgKGltYWdlOjg2MikgbWVtc2l6ZSAgICAgICAgPSA2MDAKWzIwMDktMDgtMjYgMDE6MzI6 NDggMjg4M10gREVCVUcgKGltYWdlOjg2MykgdGFyZ2V0ICAgICAgICAgPSA2MDAKWzIwMDkt MDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKGltYWdlOjg2NCkgdmNwdXMgICAgICAgICAg PSAxClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4ODNdIERFQlVHIChpbWFnZTo4NjUpIGFjcGkg ICAgICAgICAgID0gMQpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoaW1hZ2U6 ODY2KSBhcGljICAgICAgICAgICA9IDEKWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gSU5G TyAoWGVuZERvbWFpbkluZm86MjE3OCkgY3JlYXRlRGV2aWNlOiB2ZmIgOiB7J3ZuY3VudXNl ZCc6IDEsICd2bmNsaXN0ZW4nOiAnMC4wLjAuMCcsICd2bmMnOiAnMScsICd1dWlkJzogJzVm Yzc5ODA0LTZkMzAtNGIzYS03ZGVlLWI2ZjZmMDc3NzRlMycsICdvdGhlcl9jb25maWcnOiB7 J3ZuY3VudXNlZCc6IDEsICd2bmNsaXN0ZW4nOiAnMC4wLjAuMCcsICd2bmMnOiAnMSd9fQpb MjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NSkgRGV2 Q29udHJvbGxlcjogd3JpdGluZyB7J3N0YXRlJzogJzEnLCAnYmFja2VuZC1pZCc6ICcwJywg J2JhY2tlbmQnOiAnL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmZiLzEvMCd9IHRvIC9sb2Nh bC9kb21haW4vMS9kZXZpY2UvdmZiLzAuClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4ODNdIERF QlVHIChEZXZDb250cm9sbGVyOjk3KSBEZXZDb250cm9sbGVyOiB3cml0aW5nIHsndm5jdW51 c2VkJzogJzEnLCAnZG9tYWluJzogJ3NydjIwMDhfZnJlZScsICdmcm9udGVuZCc6ICcvbG9j YWwvZG9tYWluLzEvZGV2aWNlL3ZmYi8wJywgJ3V1aWQnOiAnNWZjNzk4MDQtNmQzMC00YjNh LTdkZWUtYjZmNmYwNzc3NGUzJywgJ2Zyb250ZW5kLWlkJzogJzEnLCAndm5jbGlzdGVuJzog JzAuMC4wLjAnLCAnc3RhdGUnOiAnMScsICdvbmxpbmUnOiAnMScsICd2bmMnOiAnMSd9IHRv IC9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZmYi8xLzAuClsyMDA5LTA4LTI2IDAxOjMyOjQ4 IDI4ODNdIElORk8gKFhlbmREb21haW5JbmZvOjIxNzgpIGNyZWF0ZURldmljZTogdmJkIDog eyd1dWlkJzogJzBkMTFlYThiLTM1OGYtMGJkYi01YWEzLTE5M2NiOTQ0ZGQyNScsICdib290 YWJsZSc6IDEsICdkcml2ZXInOiAncGFyYXZpcnR1YWxpc2VkJywgJ2Rldic6ICdoZGEnLCAn dW5hbWUnOiAnZmlsZTovbW50L2RhdGEvbWdpL3NydjIwMDgvU3lzdGVtLmltZycsICdtb2Rl JzogJ3chJ30KWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKERldkNvbnRyb2xs ZXI6OTUpIERldkNvbnRyb2xsZXI6IHdyaXRpbmcgeydiYWNrZW5kLWlkJzogJzAnLCAndmly dHVhbC1kZXZpY2UnOiAnNzY4JywgJ2RldmljZS10eXBlJzogJ2Rpc2snLCAnc3RhdGUnOiAn MScsICdiYWNrZW5kJzogJy9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZiZC8xLzc2OCd9IHRv IC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmJkLzc2OC4KWzIwMDktMDgtMjYgMDE6MzI6NDgg Mjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6OTcpIERldkNvbnRyb2xsZXI6IHdyaXRpbmcg eydkb21haW4nOiAnc3J2MjAwOF9mcmVlJywgJ2Zyb250ZW5kJzogJy9sb2NhbC9kb21haW4v MS9kZXZpY2UvdmJkLzc2OCcsICd1dWlkJzogJzBkMTFlYThiLTM1OGYtMGJkYi01YWEzLTE5 M2NiOTQ0ZGQyNScsICdib290YWJsZSc6ICcxJywgJ2Rldic6ICdoZGEnLCAnc3RhdGUnOiAn MScsICdwYXJhbXMnOiAnL21udC9kYXRhL21naS9zcnYyMDA4L1N5c3RlbS5pbWcnLCAnbW9k ZSc6ICd3IScsICdvbmxpbmUnOiAnMScsICdmcm9udGVuZC1pZCc6ICcxJywgJ3R5cGUnOiAn ZmlsZSd9IHRvIC9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZiZC8xLzc2OC4KWzIwMDktMDgt MjYgMDE6MzI6NDggMjg4M10gSU5GTyAoWGVuZERvbWFpbkluZm86MjE3OCkgY3JlYXRlRGV2 aWNlOiB2aWYgOiB7J2JyaWRnZSc6ICd4ZW5icjAnLCAnbWFjJzogJzAwOjE2OjNFOjU1OkQx OkFBJywgJ3V1aWQnOiAnZGQxM2ZmNWMtMmFjMy1iYmFhLTIwMTktYjAyMDFhMTMzZjZhJ30K WzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6OTUpIERl dkNvbnRyb2xsZXI6IHdyaXRpbmcgeydiYWNrZW5kLWlkJzogJzAnLCAnbWFjJzogJzAwOjE2 OjNFOjU1OkQxOkFBJywgJ2hhbmRsZSc6ICcwJywgJ3N0YXRlJzogJzEnLCAnYmFja2VuZCc6 ICcvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92aWYvMS8wJ30gdG8gL2xvY2FsL2RvbWFpbi8x L2RldmljZS92aWYvMC4KWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKERldkNv bnRyb2xsZXI6OTcpIERldkNvbnRyb2xsZXI6IHdyaXRpbmcgeydicmlkZ2UnOiAneGVuYnIw JywgJ2RvbWFpbic6ICdzcnYyMDA4X2ZyZWUnLCAnaGFuZGxlJzogJzAnLCAndXVpZCc6ICdk ZDEzZmY1Yy0yYWMzLWJiYWEtMjAxOS1iMDIwMWExMzNmNmEnLCAnc2NyaXB0JzogJy9ldGMv eGVuL3NjcmlwdHMvdmlmLWJyaWRnZScsICdtYWMnOiAnMDA6MTY6M0U6NTU6RDE6QUEnLCAn ZnJvbnRlbmQtaWQnOiAnMScsICdzdGF0ZSc6ICcxJywgJ29ubGluZSc6ICcxJywgJ2Zyb250 ZW5kJzogJy9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmlmLzAnfSB0byAvbG9jYWwvZG9tYWlu LzAvYmFja2VuZC92aWYvMS8wLgpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBJTkZPIChp bWFnZTozOTEpIHNwYXduaW5nIGRldmljZSBtb2RlbHM6IC91c3IvbGliL3hlbi9iaW4vcWVt dS1kbSBbJy91c3IvbGliL3hlbi9iaW4vcWVtdS1kbScsICctZCcsICcxJywgJy1kb21haW4t bmFtZScsICdzcnYyMDA4X2ZyZWUnLCAnLXZpZGVvcmFtJywgJzQnLCAnLXZuYycsICcwLjAu MC4wOjAnLCAnLXZuY3VudXNlZCcsICctdmNwdXMnLCAnMScsICctYm9vdCcsICdjJywgJy1z ZXJpYWwnLCAncHR5JywgJy1hY3BpJywgJy11c2JkZXZpY2UnLCAndGFibGV0JywgJy1uZXQn LCAnbmljLHZsYW49MSxtYWNhZGRyPTAwOjE2OjNFOjU1OkQxOkFBLG1vZGVsPXJ0bDgxMzkn LCAnLW5ldCcsICd0YXAsdmxhbj0xLGlmbmFtZT10YXAxLjAsYnJpZGdlPXhlbmJyMCcsICct TScsICd4ZW5mdiddClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4ODNdIElORk8gKGltYWdlOjQ0 MCkgZGV2aWNlIG1vZGVsIHBpZDogMzMyMQpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBJ TkZPIChpbWFnZTo1MjgpIHdhaXRpbmcgZm9yIHNlbnRpbmVsX2ZpZm8KWzIwMDktMDgtMjYg MDE6MzI6NDggMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjMwODIpIFN0b3JpbmcgVk0g ZGV0YWlsczogeydvbl94ZW5kX3N0b3AnOiAnaWdub3JlJywgJ3NoYWRvd19tZW1vcnknOiAn NicsICd1dWlkJzogJzE2NmYxNWE2LTZlMWQtNGQ1Yy01NTE3LTQwNjRmZDgxMDk1MScsICdv bl9yZWJvb3QnOiAncmVzdGFydCcsICdzdGFydF90aW1lJzogJzEyNTEyMjE1NjguNjYnLCAn b25fcG93ZXJvZmYnOiAnZGVzdHJveScsICdib290bG9hZGVyX2FyZ3MnOiAnLXEnLCAnb25f eGVuZF9zdGFydCc6ICdpZ25vcmUnLCAnb25fY3Jhc2gnOiAncmVzdGFydCcsICd4ZW5kL3Jl c3RhcnRfY291bnQnOiAnMCcsICd2Y3B1cyc6ICcxJywgJ3ZjcHVfYXZhaWwnOiAnMScsICdi b290bG9hZGVyJzogJy91c3IvYmluL3B5Z3J1YicsICdpbWFnZSc6ICcoaHZtIChrZXJuZWwg KSAodmlkZW9yYW0gNCkgKGhwZXQgMCkgKHN0ZHZnYSAwKSAodm5jbGlzdGVuIDAuMC4wLjAp IChsb2FkZXIgL3Vzci9saWIveGVuL2Jvb3QvaHZtbG9hZGVyKSAodm5jY29uc29sZSAxKSAo c2VyaWFsIHB0eSkgKHZuY3VudXNlZCAxKSAoeGVuX3BsYXRmb3JtX3BjaSAxKSAoYm9vdCBj KSAocnRjX3RpbWVvZmZzZXQgMCkgKHBjaSAoKSkgKHBhZSAxKSAodnB0X2FsaWduIDEpICho YXAgMSkgKHZpcmlkaWFuIDApIChhY3BpIDEpIChsb2NhbHRpbWUgMCkgKHRpbWVyX21vZGUg MSkgKHZuYyAxKSAobm9ncmFwaGljIDApIChndWVzdF9vc190eXBlIGRlZmF1bHQpIChwY2lf bXNpdHJhbnNsYXRlIDEpIChhcGljIDEpIChtb25pdG9yIDApICh1c2JkZXZpY2UgdGFibGV0 KSAoZGV2aWNlX21vZGVsIC91c3IvbGliL3hlbi9iaW4vcWVtdS1kbSkgKHBjaV9wb3dlcl9t Z210IDApICh1c2IgMCkgKHhhdXRob3JpdHkgL3Jvb3QvLlhhdXRob3JpdHkpIChpc2EgMCkg KG5vdGVzIChTVVNQRU5EX0NBTkNFTCAxKSkpJywgJ25hbWUnOiAnc3J2MjAwOF9mcmVlJ30K WzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjE2Mzgp IFN0b3JpbmcgZG9tYWluIGRldGFpbHM6IHsnY29uc29sZS9wb3J0JzogJzMnLCAnbmFtZSc6 ICdzcnYyMDA4X2ZyZWUnLCAnY29uc29sZS9saW1pdCc6ICcxMDQ4NTc2JywgJ3N0b3JlL3Bv cnQnOiAnMicsICd2bSc6ICcvdm0vMTY2ZjE1YTYtNmUxZC00ZDVjLTU1MTctNDA2NGZkODEw OTUxJywgJ2RvbWlkJzogJzEnLCAnaW1hZ2Uvc3VzcGVuZC1jYW5jZWwnOiAnMScsICdjcHUv MC9hdmFpbGFiaWxpdHknOiAnb25saW5lJywgJ21lbW9yeS90YXJnZXQnOiAnNjE0NDAwJywg J2NvbnRyb2wvcGxhdGZvcm0tZmVhdHVyZS1tdWx0aXByb2Nlc3Nvci1zdXNwZW5kJzogJzEn LCAnc3RvcmUvcmluZy1yZWYnOiAnMTA0NDQ3NicsICdjb25zb2xlL3R5cGUnOiAnaW9lbXUn fQpbMjAwOS0wOC0yNiAwMTozMjo0OCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NSkg RGV2Q29udHJvbGxlcjogd3JpdGluZyB7J3N0YXRlJzogJzEnLCAnYmFja2VuZC1pZCc6ICcw JywgJ2JhY2tlbmQnOiAnL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvY29uc29sZS8xLzAnfSB0 byAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL2NvbnNvbGUvMC4KWzIwMDktMDgtMjYgMDE6MzI6 NDggMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6OTcpIERldkNvbnRyb2xsZXI6IHdyaXRp bmcgeydkb21haW4nOiAnc3J2MjAwOF9mcmVlJywgJ2Zyb250ZW5kJzogJy9sb2NhbC9kb21h aW4vMS9kZXZpY2UvY29uc29sZS8wJywgJ3V1aWQnOiAnZjVhNDBkN2ItOGJjMS00OGJkLWQ0 ZjItNmM3YzJiYjllNzIzJywgJ2Zyb250ZW5kLWlkJzogJzEnLCAnc3RhdGUnOiAnMScsICds b2NhdGlvbic6ICczJywgJ29ubGluZSc6ICcxJywgJ3Byb3RvY29sJzogJ3Z0MTAwJ30gdG8g L2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvY29uc29sZS8xLzAuClsyMDA5LTA4LTI2IDAxOjMy OjQ4IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoxNzI1KSBYZW5kRG9tYWluSW5mby5o YW5kbGVTaHV0ZG93bldhdGNoClsyMDA5LTA4LTI2IDAxOjMyOjQ4IDI4ODNdIERFQlVHIChE ZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3IgZGV2aWNlcyB2aWYuClsyMDA5LTA4LTI2 IDAxOjMyOjQ4IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjE0NCkgV2FpdGluZyBmb3Ig MC4KWzIwMDktMDgtMjYgMDE6MzI6NDggMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6NjI5 KSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sgL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmlmLzEv MC9ob3RwbHVnLXN0YXR1cy4KWzIwMDktMDgtMjYgMDE6MzI6NDkgMjg4M10gREVCVUcgKERl dkNvbnRyb2xsZXI6NjI5KSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sgL2xvY2FsL2RvbWFpbi8w L2JhY2tlbmQvdmlmLzEvMC9ob3RwbHVnLXN0YXR1cy4KWzIwMDktMDgtMjYgMDE6MzI6NDkg Mjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6NjQzKSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sg MS4KWzIwMDktMDgtMjYgMDE6MzI6NDkgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6MTM5 KSBXYWl0aW5nIGZvciBkZXZpY2VzIHZzY3NpLgpbMjAwOS0wOC0yNiAwMTozMjo0OSAyODgz XSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMgdmJkLgpb MjAwOS0wOC0yNiAwMTozMjo0OSAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxNDQpIFdh aXRpbmcgZm9yIDc2OC4KWzIwMDktMDgtMjYgMDE6MzI6NDkgMjg4M10gREVCVUcgKERldkNv bnRyb2xsZXI6NjI5KSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sgL2xvY2FsL2RvbWFpbi8wL2Jh Y2tlbmQvdmJkLzEvNzY4L2hvdHBsdWctc3RhdHVzLgpbMjAwOS0wOC0yNiAwMTozMjo0OSAy ODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo2MjkpIGhvdHBsdWdTdGF0dXNDYWxsYmFjayAv bG9jYWwvZG9tYWluLzAvYmFja2VuZC92YmQvMS83NjgvaG90cGx1Zy1zdGF0dXMuClsyMDA5 LTA4LTI2IDAxOjMyOjQ5IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjY0MykgaG90cGx1 Z1N0YXR1c0NhbGxiYWNrIDEuClsyMDA5LTA4LTI2IDAxOjMyOjQ5IDI4ODNdIERFQlVHIChE ZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3IgZGV2aWNlcyBpcnEuClsyMDA5LTA4LTI2 IDAxOjMyOjQ5IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3Ig ZGV2aWNlcyB2a2JkLgpbMjAwOS0wOC0yNiAwMTozMjo0OSAyODgzXSBERUJVRyAoRGV2Q29u dHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMgdmZiLgpbMjAwOS0wOC0yNiAwMToz Mjo0OSAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmlj ZXMgY29uc29sZS4KWzIwMDktMDgtMjYgMDE6MzI6NDkgMjg4M10gREVCVUcgKERldkNvbnRy b2xsZXI6MTQ0KSBXYWl0aW5nIGZvciAwLgpbMjAwOS0wOC0yNiAwMTozMjo0OSAyODgzXSBE RUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMgcGNpLgpbMjAw OS0wOC0yNiAwMTozMjo0OSAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRp bmcgZm9yIGRldmljZXMgaW9wb3J0cy4KWzIwMDktMDgtMjYgMDE6MzI6NDkgMjg4M10gREVC VUcgKERldkNvbnRyb2xsZXI6MTM5KSBXYWl0aW5nIGZvciBkZXZpY2VzIHRhcC4KWzIwMDkt MDgtMjYgMDE6MzI6NDkgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6MTM5KSBXYWl0aW5n IGZvciBkZXZpY2VzIHZ0cG0uClsyMDA5LTA4LTI2IDAxOjMyOjQ5IDI4ODNdIElORk8gKFhl bmREb21haW46MTE4MCkgRG9tYWluIHNydjIwMDhfZnJlZSAoMSkgdW5wYXVzZWQuClsyMDA5 LTA4LTI2IDAxOjM0OjI0IDI4ODNdIERFQlVHIChYZW5kQ2hlY2twb2ludDoxMTApIFt4Y19z YXZlXTogL3Vzci9saWIveGVuL2Jpbi94Y19zYXZlIDMxIDEgMCAwIDQKWzIwMDktMDgtMjYg MDE6MzQ6MjQgMjg4M10gREVCVUcgKFhlbmRDaGVja3BvaW50OjM4OSkgc3VzcGVuZApbMjAw OS0wOC0yNiAwMTozNDoyNCAyODgzXSBERUJVRyAoWGVuZENoZWNrcG9pbnQ6MTEzKSBJbiBz YXZlSW5wdXRIYW5kbGVyIHN1c3BlbmQKWzIwMDktMDgtMjYgMDE6MzQ6MjQgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSB4Y19zYXZlOiBmYWlsZWQgdG8gZ2V0IHRoZSBzdXNw ZW5kIGV2dGNobiBwb3J0ClsyMDA5LTA4LTI2IDAxOjM0OjI0IDI4ODNdIERFQlVHIChYZW5k Q2hlY2twb2ludDoxMTUpIFN1c3BlbmRpbmcgMSAuLi4KWzIwMDktMDgtMjYgMDE6MzQ6MjQg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSAKWzIwMDktMDgtMjYgMDE6MzQ6MjQg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSAtLT54Y19kb21haW5fc2F2ZSgpClsy MDA5LTA4LTI2IDAxOjM0OjI0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgcGxh dGZvcm0gaW5mbywgbWF4X21mbjogN2Q0YjAsIGh2aXJ0X3N0YXJ0IGZmYzAwMDAwLCBwdF9s dmV2ZWwgNCwgZ3Vlc3Rfd2lkdGggOApbMjAwOS0wOC0yNiAwMTozNDoyNCAyODgzXSBERUJV RyAoWGVuZERvbWFpbkluZm86NTE4KSBYZW5kRG9tYWluSW5mby5zaHV0ZG93bihzdXNwZW5k KQpbMjAwOS0wOC0yNiAwMTozNDoyNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IHNoYXJlZF9pbmZvX2ZyYW1lOiAweDQxZWMKWzIwMDktMDgtMjYgMDE6MzQ6MjQgMjg4M10g REVCVUcgKFhlbmREb21haW5JbmZvOjE3MjUpIFhlbmREb21haW5JbmZvLmhhbmRsZVNodXRk b3duV2F0Y2gKWzIwMDktMDgtMjYgMDE6MzQ6MjQgMjg4M10gSU5GTyAoWGVuZERvbWFpbklu Zm86MTkxMykgRG9tYWluIGhhcyBzaHV0ZG93bjogbmFtZT1taWdyYXRpbmctc3J2MjAwOF9m cmVlIGlkPTEgcmVhc29uPXN1c3BlbmQuClsyMDA5LTA4LTI2IDAxOjM0OjI0IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjEyMSkgRG9tYWluIDEgc3VzcGVuZGVkLgpbMjAwOS0wOC0y NiAwMTozNDoyNCAyODgzXSBJTkZPIChpbWFnZTo0NzYpIHNpZ25hbERldmljZU1vZGVsOnJl c3RvcmUgZG0gc3RhdGUgdG8gcnVubmluZwpbMjAwOS0wOC0yNiAwMTozNDoyNCAyODgzXSBE RUJVRyAoWGVuZENoZWNrcG9pbnQ6MTMwKSBXcml0dGVuIGRvbmUKWzIwMDktMDgtMjYgMDE6 MzQ6MjQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBwMm1fc2l6ZTogMHgxMDAw MDBOZWVkIGFub3RoZXIgYnVmZmVyIGZvciBIVk0gY29udGV4dApbMjAwOS0wOC0yNiAwMToz NDoyNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIFNldHVwIHRoZSBtZm5fdG9f cGZuIHRhYmxlIG1hcHBpbmcKWzIwMDktMDgtMjYgMDE6MzQ6MjQgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBTdGFydCB3cml0aW5nIG91dCB0aGUgc2F2ZWQtZG9tYWluIHJl Y29yZC4KWzIwMDktMDgtMjYgMDE6MzQ6MzEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBTYXZpbmcgbWVtb3J5IHBhZ2VzOiBpdGVyIDEgICAwJQgICAggIDUlCAgICCAxMCUI CAgIIDE1JQgICAggMjAlCAgICCAyNSUICAgIIDMwJQgICAggMzUlCAgICCA0MCUICAgIIDQ1 JQgICAggNTAlCAgICCA1NSUICAgIIDYwJQgICAggNjUlCAgICCA3MCUICAgIIDc1JQgICAgg ODAlCAgICCA4NSUICAgIIDkwJQgICAggOTUlDSAxOiBzZW50IDE1NzY5Niwgc2tpcHBlZCAw LCBkZWx0YSA2OTEwbXMsIGRvbTAgNTclLCB0YXJnZXQgMCUsIHNlbnQgNzQ3TWIvcywgZGly dGllZCAwTWIvcyAwIHBhZ2VzClsyMDA5LTA4LTI2IDAxOjM0OjMxIDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgVG90YWwgcGFnZXMgc2VudD0gMTU3Njk2ICgwLjE1eCkKWzIw MDktMDgtMjYgMDE6MzQ6MzEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSAob2Yg d2hpY2ggMCB3ZXJlIGZpeHVwcykKWzIwMDktMDgtMjYgMDE6MzQ6MzEgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBBbGwgbWVtb3J5IGlzIHNhdmVkClsyMDA5LTA4LTI2IDAx OjM0OjMzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgU2F2ZSBleGl0IHJjPTAK WzIwMDktMDgtMjYgMDE6MzQ6MzMgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjI3NTAp IFhlbmREb21haW5JbmZvLmRlc3Ryb3k6IGRvbWlkPTEKWzIwMDktMDgtMjYgMDE6MzQ6MzMg Mjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIyMjApIERlc3Ryb3lpbmcgZGV2aWNlIG1v ZGVsClsyMDA5LTA4LTI2IDAxOjM0OjMzIDI4ODNdIElORk8gKGltYWdlOjU1MykgbWlncmF0 aW5nLXNydjIwMDhfZnJlZSBkZXZpY2UgbW9kZWwgdGVybWluYXRlZApbMjAwOS0wOC0yNiAw MTozNDozMyAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86MjIyNykgUmVsZWFzaW5nIGRl dmljZXMKWzIwMDktMDgtMjYgMDE6MzQ6MzMgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZv OjIyNDApIFJlbW92aW5nIHZpZi8wClsyMDA5LTA4LTI2IDAxOjM0OjMzIDI4ODNdIERFQlVH IChYZW5kRG9tYWluSW5mbzoxMTQyKSBYZW5kRG9tYWluSW5mby5kZXN0cm95RGV2aWNlOiBk ZXZpY2VDbGFzcyA9IHZpZiwgZGV2aWNlID0gdmlmLzAKWzIwMDktMDgtMjYgMDE6MzQ6MzMg Mjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIyNDApIFJlbW92aW5nIHZiZC83NjgKWzIw MDktMDgtMjYgMDE6MzQ6MzMgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjExNDIpIFhl bmREb21haW5JbmZvLmRlc3Ryb3lEZXZpY2U6IGRldmljZUNsYXNzID0gdmJkLCBkZXZpY2Ug PSB2YmQvNzY4ClsyMDA5LTA4LTI2IDAxOjM0OjMzIDI4ODNdIERFQlVHIChYZW5kRG9tYWlu SW5mbzoyMjQwKSBSZW1vdmluZyB2ZmIvMApbMjAwOS0wOC0yNiAwMTozNDozMyAyODgzXSBE RUJVRyAoWGVuZERvbWFpbkluZm86MTE0MikgWGVuZERvbWFpbkluZm8uZGVzdHJveURldmlj ZTogZGV2aWNlQ2xhc3MgPSB2ZmIsIGRldmljZSA9IHZmYi8wClsyMDA5LTA4LTI2IDAxOjM0 OjMzIDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoyMjQwKSBSZW1vdmluZyBjb25zb2xl LzAKWzIwMDktMDgtMjYgMDE6MzQ6MzMgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjEx NDIpIFhlbmREb21haW5JbmZvLmRlc3Ryb3lEZXZpY2U6IGRldmljZUNsYXNzID0gY29uc29s ZSwgZGV2aWNlID0gY29uc29sZS8wClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNdIERFQlVH IChYZW5kRG9tYWluSW5mbzoyMjcpIFhlbmREb21haW5JbmZvLnJlc3RvcmUoWydkb21haW4n LCBbJ2RvbWlkJywgJzEnXSwgWydvbl9jcmFzaCcsICdyZXN0YXJ0J10sIFsndXVpZCcsICcx NjZmMTVhNi02ZTFkLTRkNWMtNTUxNy00MDY0ZmQ4MTA5NTEnXSwgWydib290bG9hZGVyX2Fy Z3MnLCAnLXEnXSwgWyd2Y3B1cycsICcxJ10sIFsnbmFtZScsICdzcnYyMDA4X2ZyZWUnXSwg Wydvbl9wb3dlcm9mZicsICdkZXN0cm95J10sIFsnb25fcmVib290JywgJ3Jlc3RhcnQnXSwg WydjcHVzJywgW1tdXV0sIFsnYm9vdGxvYWRlcicsICcvdXNyL2Jpbi9weWdydWInXSwgWydt YXhtZW0nLCAnNjAwJ10sIFsnbWVtb3J5JywgJzYwMCddLCBbJ3NoYWRvd19tZW1vcnknLCAn NiddLCBbJ3ZjcHVfYXZhaWwnLCAnMSddLCBbJ2ZlYXR1cmVzJ10sIFsnb25feGVuZF9zdGFy dCcsICdpZ25vcmUnXSwgWydvbl94ZW5kX3N0b3AnLCAnaWdub3JlJ10sIFsnc3RhcnRfdGlt ZScsICcxMjUxMjIxNTY4LjY2J10sIFsnY3B1X3RpbWUnLCAnMC4wMDgwOTc1MzcnXSwgWydv bmxpbmVfdmNwdXMnLCAnMSddLCBbJ2ltYWdlJywgWydodm0nLCBbJ2tlcm5lbCddLCBbJ3Zp ZGVvcmFtJywgJzQnXSwgWydocGV0JywgJzAnXSwgWydzdGR2Z2EnLCAnMCddLCBbJ3ZuY2xp c3RlbicsICcwLjAuMC4wJ10sIFsnbG9hZGVyJywgJy91c3IvbGliL3hlbi9ib290L2h2bWxv YWRlciddLCBbJ3ZuY2NvbnNvbGUnLCAnMSddLCBbJ3NlcmlhbCcsICdwdHknXSwgWyd2bmN1 bnVzZWQnLCAnMSddLCBbJ3hlbl9wbGF0Zm9ybV9wY2knLCAnMSddLCBbJ2Jvb3QnLCAnYydd LCBbJ3J0Y190aW1lb2Zmc2V0JywgJzAnXSwgWydwY2knLCBbXV0sIFsncGFlJywgJzEnXSwg Wyd2cHRfYWxpZ24nLCAnMSddLCBbJ2hhcCcsICcxJ10sIFsndmlyaWRpYW4nLCAnMCddLCBb J2FjcGknLCAnMSddLCBbJ2xvY2FsdGltZScsICcwJ10sIFsndGltZXJfbW9kZScsICcxJ10s IFsndm5jJywgJzEnXSwgWydub2dyYXBoaWMnLCAnMCddLCBbJ2d1ZXN0X29zX3R5cGUnLCAn ZGVmYXVsdCddLCBbJ3BjaV9tc2l0cmFuc2xhdGUnLCAnMSddLCBbJ2FwaWMnLCAnMSddLCBb J21vbml0b3InLCAnMCddLCBbJ3VzYmRldmljZScsICd0YWJsZXQnXSwgWydkZXZpY2VfbW9k ZWwnLCAnL3Vzci9saWIveGVuL2Jpbi9xZW11LWRtJ10sIFsncGNpX3Bvd2VyX21nbXQnLCAn MCddLCBbJ3VzYicsICcwJ10sIFsneGF1dGhvcml0eScsICcvcm9vdC8uWGF1dGhvcml0eSdd LCBbJ2lzYScsICcwJ10sIFsnbm90ZXMnLCBbJ1NVU1BFTkRfQ0FOQ0VMJywgJzEnXV1dXSwg WydzdGF0dXMnLCAnMiddLCBbJ3N0YXRlJywgJy0tLS0tLSddLCBbJ3N0b3JlX21mbicsICcx MDQ0NDc2J10sIFsnZGV2aWNlJywgWyd2aWYnLCBbJ2JyaWRnZScsICd4ZW5icjAnXSwgWydt YWMnLCAnMDA6MTY6M0U6NTU6RDE6QUEnXSwgWydzY3JpcHQnLCAnL2V0Yy94ZW4vc2NyaXB0 cy92aWYtYnJpZGdlJ10sIFsndXVpZCcsICdkZDEzZmY1Yy0yYWMzLWJiYWEtMjAxOS1iMDIw MWExMzNmNmEnXSwgWydiYWNrZW5kJywgJzAnXV1dLCBbJ2RldmljZScsIFsndmJkJywgWyd1 dWlkJywgJzBkMTFlYThiLTM1OGYtMGJkYi01YWEzLTE5M2NiOTQ0ZGQyNSddLCBbJ2Jvb3Rh YmxlJywgJzEnXSwgWydkZXYnLCAnaGRhOmRpc2snXSwgWyd1bmFtZScsICdmaWxlOi9tbnQv ZGF0YS9tZ2kvc3J2MjAwOC9TeXN0ZW0uaW1nJ10sIFsnbW9kZScsICd3ISddLCBbJ2JhY2tl bmQnLCAnMCddLCBbJ2Jvb3RhYmxlJywgJzEnXSwgWydWREknXV1dLCBbJ2RldmljZScsIFsn dmZiJywgWyd2bmN1bnVzZWQnLCAnMSddLCBbJ3ZuY2xpc3RlbicsICcwLjAuMC4wJ10sIFsn dm5jJywgJzEnXSwgWyd1dWlkJywgJzVmYzc5ODA0LTZkMzAtNGIzYS03ZGVlLWI2ZjZmMDc3 NzRlMyddLCBbJ2xvY2F0aW9uJywgJzAuMC4wLjA6NTkwMCddXV0sIFsnZGV2aWNlJywgWydj b25zb2xlJywgWydwcm90b2NvbCcsICd2dDEwMCddLCBbJ2xvY2F0aW9uJywgJzMnXSwgWyd1 dWlkJywgJ2Y1YTQwZDdiLThiYzEtNDhiZC1kNGYyLTZjN2MyYmI5ZTcyMyddXV1dKQpbMjAw OS0wOC0yNiAwMTozNDozOCAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86MjMxNykgWGVu ZERvbWFpbkluZm8uY29uc3RydWN0RG9tYWluClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNd IERFQlVHIChiYWxsb29uOjE4MSkgQmFsbG9vbjogMTQ3Mjc3NiBLaUIgZnJlZTsgbmVlZCA0 MDk2OyBkb25lLgpbMjAwOS0wOC0yNiAwMTozNDozOCAyODgzXSBERUJVRyAoWGVuZERvbWFp bjo0NTIpIEFkZGluZyBEb21haW46IDIKWzIwMDktMDgtMjYgMDE6MzQ6MzggMjg4M10gREVC VUcgKFhlbmREb21haW5JbmZvOjMwODIpIFN0b3JpbmcgVk0gZGV0YWlsczogeydvbl94ZW5k X3N0b3AnOiAnaWdub3JlJywgJ3NoYWRvd19tZW1vcnknOiAnNicsICd1dWlkJzogJzE2NmYx NWE2LTZlMWQtNGQ1Yy01NTE3LTQwNjRmZDgxMDk1MScsICdvbl9yZWJvb3QnOiAncmVzdGFy dCcsICdzdGFydF90aW1lJzogJzEyNTEyMjE1NjguNjYnLCAnb25fcG93ZXJvZmYnOiAnZGVz dHJveScsICdib290bG9hZGVyX2FyZ3MnOiAnLXEnLCAnb25feGVuZF9zdGFydCc6ICdpZ25v cmUnLCAnb25fY3Jhc2gnOiAncmVzdGFydCcsICd4ZW5kL3Jlc3RhcnRfY291bnQnOiAnMCcs ICd2Y3B1cyc6ICcxJywgJ3ZjcHVfYXZhaWwnOiAnMScsICdib290bG9hZGVyJzogJy91c3Iv YmluL3B5Z3J1YicsICdpbWFnZSc6ICcoaHZtIChrZXJuZWwgKSAodmlkZW9yYW0gNCkgKGhw ZXQgMCkgKHN0ZHZnYSAwKSAodm5jbGlzdGVuIDAuMC4wLjApIChsb2FkZXIgL3Vzci9saWIv eGVuL2Jvb3QvaHZtbG9hZGVyKSAodm5jY29uc29sZSAxKSAoc2VyaWFsIHB0eSkgKHZuY3Vu dXNlZCAxKSAoeGVuX3BsYXRmb3JtX3BjaSAxKSAoYm9vdCBjKSAocnRjX3RpbWVvZmZzZXQg MCkgKHBjaSAoKSkgKHBhZSAxKSAodnB0X2FsaWduIDEpIChoYXAgMSkgKHZpcmlkaWFuIDAp IChhY3BpIDEpIChsb2NhbHRpbWUgMCkgKHRpbWVyX21vZGUgMSkgKHZuYyAxKSAobm9ncmFw aGljIDApIChndWVzdF9vc190eXBlIGRlZmF1bHQpIChwY2lfbXNpdHJhbnNsYXRlIDEpIChh cGljIDEpIChtb25pdG9yIDApICh1c2JkZXZpY2UgdGFibGV0KSAoZGV2aWNlX21vZGVsIC91 c3IvbGliL3hlbi9iaW4vcWVtdS1kbSkgKHBjaV9wb3dlcl9tZ210IDApICh1c2IgMCkgKHhh dXRob3JpdHkgL3Jvb3QvLlhhdXRob3JpdHkpIChpc2EgMCkgKG5vdGVzIChTVVNQRU5EX0NB TkNFTCAxKSkpJywgJ25hbWUnOiAnc3J2MjAwOF9mcmVlJ30KWzIwMDktMDgtMjYgMDE6MzQ6 MzggMjg4M10gSU5GTyAoWGVuZERvbWFpbkluZm86MjE3OCkgY3JlYXRlRGV2aWNlOiB2ZmIg OiB7J3ZuY3VudXNlZCc6ICcxJywgJ290aGVyX2NvbmZpZyc6IHsndm5jdW51c2VkJzogJzEn LCAndm5jbGlzdGVuJzogJzAuMC4wLjAnLCAndm5jJzogJzEnfSwgJ3ZuYyc6ICcxJywgJ3V1 aWQnOiAnNWZjNzk4MDQtNmQzMC00YjNhLTdkZWUtYjZmNmYwNzc3NGUzJywgJ3ZuY2xpc3Rl bic6ICcwLjAuMC4wJywgJ2xvY2F0aW9uJzogJzAuMC4wLjA6NTkwMCd9ClsyMDA5LTA4LTI2 IDAxOjM0OjM4IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk1KSBEZXZDb250cm9sbGVy OiB3cml0aW5nIHsnc3RhdGUnOiAnMScsICdiYWNrZW5kLWlkJzogJzAnLCAnYmFja2VuZCc6 ICcvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92ZmIvMi8wJ30gdG8gL2xvY2FsL2RvbWFpbi8y L2RldmljZS92ZmIvMC4KWzIwMDktMDgtMjYgMDE6MzQ6MzggMjg4M10gREVCVUcgKERldkNv bnRyb2xsZXI6OTcpIERldkNvbnRyb2xsZXI6IHdyaXRpbmcgeyd2bmN1bnVzZWQnOiAnMScs ICdkb21haW4nOiAnc3J2MjAwOF9mcmVlJywgJ2Zyb250ZW5kJzogJy9sb2NhbC9kb21haW4v Mi9kZXZpY2UvdmZiLzAnLCAndXVpZCc6ICc1ZmM3OTgwNC02ZDMwLTRiM2EtN2RlZS1iNmY2 ZjA3Nzc0ZTMnLCAnZnJvbnRlbmQtaWQnOiAnMicsICd2bmNsaXN0ZW4nOiAnMC4wLjAuMCcs ICdzdGF0ZSc6ICcxJywgJ2xvY2F0aW9uJzogJzAuMC4wLjA6NTkwMCcsICdvbmxpbmUnOiAn MScsICd2bmMnOiAnMSd9IHRvIC9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZmYi8yLzAuClsy MDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNdIElORk8gKFhlbmREb21haW5JbmZvOjIxNzgpIGNy ZWF0ZURldmljZTogY29uc29sZSA6IHsncHJvdG9jb2wnOiAndnQxMDAnLCAnbG9jYXRpb24n OiAnMycsICd1dWlkJzogJ2Y1YTQwZDdiLThiYzEtNDhiZC1kNGYyLTZjN2MyYmI5ZTcyMyd9 ClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk1KSBE ZXZDb250cm9sbGVyOiB3cml0aW5nIHsnc3RhdGUnOiAnMScsICdiYWNrZW5kLWlkJzogJzAn LCAnYmFja2VuZCc6ICcvbG9jYWwvZG9tYWluLzAvYmFja2VuZC9jb25zb2xlLzIvMCd9IHRv IC9sb2NhbC9kb21haW4vMi9kZXZpY2UvY29uc29sZS8wLgpbMjAwOS0wOC0yNiAwMTozNDoz OCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NykgRGV2Q29udHJvbGxlcjogd3JpdGlu ZyB7J2RvbWFpbic6ICdzcnYyMDA4X2ZyZWUnLCAnZnJvbnRlbmQnOiAnL2xvY2FsL2RvbWFp bi8yL2RldmljZS9jb25zb2xlLzAnLCAndXVpZCc6ICdmNWE0MGQ3Yi04YmMxLTQ4YmQtZDRm Mi02YzdjMmJiOWU3MjMnLCAnZnJvbnRlbmQtaWQnOiAnMicsICdzdGF0ZSc6ICcxJywgJ2xv Y2F0aW9uJzogJzMnLCAnb25saW5lJzogJzEnLCAncHJvdG9jb2wnOiAndnQxMDAnfSB0byAv bG9jYWwvZG9tYWluLzAvYmFja2VuZC9jb25zb2xlLzIvMC4KWzIwMDktMDgtMjYgMDE6MzQ6 MzggMjg4M10gSU5GTyAoWGVuZERvbWFpbkluZm86MjE3OCkgY3JlYXRlRGV2aWNlOiB2YmQg OiB7J3V1aWQnOiAnMGQxMWVhOGItMzU4Zi0wYmRiLTVhYTMtMTkzY2I5NDRkZDI1JywgJ2Jv b3RhYmxlJzogJzEnLCAnZHJpdmVyJzogJ3BhcmF2aXJ0dWFsaXNlZCcsICdkZXYnOiAnaGRh OmRpc2snLCAndW5hbWUnOiAnZmlsZTovbW50L2RhdGEvbWdpL3NydjIwMDgvU3lzdGVtLmlt ZycsICdtb2RlJzogJ3chJywgJ2JhY2tlbmQnOiAnMCd9ClsyMDA5LTA4LTI2IDAxOjM0OjM4 IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk1KSBEZXZDb250cm9sbGVyOiB3cml0aW5n IHsnYmFja2VuZC1pZCc6ICcwJywgJ3ZpcnR1YWwtZGV2aWNlJzogJzc2OCcsICdkZXZpY2Ut dHlwZSc6ICdkaXNrJywgJ3N0YXRlJzogJzEnLCAnYmFja2VuZCc6ICcvbG9jYWwvZG9tYWlu LzAvYmFja2VuZC92YmQvMi83NjgnfSB0byAvbG9jYWwvZG9tYWluLzIvZGV2aWNlL3ZiZC83 NjguClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk3 KSBEZXZDb250cm9sbGVyOiB3cml0aW5nIHsnZG9tYWluJzogJ3NydjIwMDhfZnJlZScsICdm cm9udGVuZCc6ICcvbG9jYWwvZG9tYWluLzIvZGV2aWNlL3ZiZC83NjgnLCAndXVpZCc6ICcw ZDExZWE4Yi0zNThmLTBiZGItNWFhMy0xOTNjYjk0NGRkMjUnLCAnYm9vdGFibGUnOiAnMScs ICdkZXYnOiAnaGRhJywgJ3N0YXRlJzogJzEnLCAncGFyYW1zJzogJy9tbnQvZGF0YS9tZ2kv c3J2MjAwOC9TeXN0ZW0uaW1nJywgJ21vZGUnOiAndyEnLCAnb25saW5lJzogJzEnLCAnZnJv bnRlbmQtaWQnOiAnMicsICd0eXBlJzogJ2ZpbGUnfSB0byAvbG9jYWwvZG9tYWluLzAvYmFj a2VuZC92YmQvMi83NjguClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNdIElORk8gKFhlbmRE b21haW5JbmZvOjIxNzgpIGNyZWF0ZURldmljZTogdmlmIDogeydicmlkZ2UnOiAneGVuYnIw JywgJ21hYyc6ICcwMDoxNjozRTo1NTpEMTpBQScsICdzY3JpcHQnOiAnL2V0Yy94ZW4vc2Ny aXB0cy92aWYtYnJpZGdlJywgJ3V1aWQnOiAnZGQxM2ZmNWMtMmFjMy1iYmFhLTIwMTktYjAy MDFhMTMzZjZhJywgJ2JhY2tlbmQnOiAnMCd9ClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNd IERFQlVHIChEZXZDb250cm9sbGVyOjk1KSBEZXZDb250cm9sbGVyOiB3cml0aW5nIHsnYmFj a2VuZC1pZCc6ICcwJywgJ21hYyc6ICcwMDoxNjozRTo1NTpEMTpBQScsICdoYW5kbGUnOiAn MCcsICdzdGF0ZSc6ICcxJywgJ2JhY2tlbmQnOiAnL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQv dmlmLzIvMCd9IHRvIC9sb2NhbC9kb21haW4vMi9kZXZpY2UvdmlmLzAuClsyMDA5LTA4LTI2 IDAxOjM0OjM4IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk3KSBEZXZDb250cm9sbGVy OiB3cml0aW5nIHsnYnJpZGdlJzogJ3hlbmJyMCcsICdkb21haW4nOiAnc3J2MjAwOF9mcmVl JywgJ2hhbmRsZSc6ICcwJywgJ3V1aWQnOiAnZGQxM2ZmNWMtMmFjMy1iYmFhLTIwMTktYjAy MDFhMTMzZjZhJywgJ3NjcmlwdCc6ICcvZXRjL3hlbi9zY3JpcHRzL3ZpZi1icmlkZ2UnLCAn bWFjJzogJzAwOjE2OjNFOjU1OkQxOkFBJywgJ2Zyb250ZW5kLWlkJzogJzInLCAnc3RhdGUn OiAnMScsICdvbmxpbmUnOiAnMScsICdmcm9udGVuZCc6ICcvbG9jYWwvZG9tYWluLzIvZGV2 aWNlL3ZpZi8wJ30gdG8gL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmlmLzIvMC4KWzIwMDkt MDgtMjYgMDE6MzQ6MzggMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjE2MzgpIFN0b3Jp bmcgZG9tYWluIGRldGFpbHM6IHsnY29uc29sZS9wb3J0JzogJzMnLCAnbmFtZSc6ICdzcnYy MDA4X2ZyZWUnLCAnY29uc29sZS9saW1pdCc6ICcxMDQ4NTc2JywgJ2ltYWdlL3N1c3BlbmQt Y2FuY2VsJzogJzEnLCAnZG9taWQnOiAnMicsICd2bSc6ICcvdm0vMTY2ZjE1YTYtNmUxZC00 ZDVjLTU1MTctNDA2NGZkODEwOTUxJywgJ2NwdS8wL2F2YWlsYWJpbGl0eSc6ICdvbmxpbmUn LCAnbWVtb3J5L3RhcmdldCc6ICc2MTQ0MDAnLCAnY29udHJvbC9wbGF0Zm9ybS1mZWF0dXJl LW11bHRpcHJvY2Vzc29yLXN1c3BlbmQnOiAnMScsICdjb25zb2xlL3R5cGUnOiAnaW9lbXUn LCAnc3RvcmUvcG9ydCc6ICcyJ30KWzIwMDktMDgtMjYgMDE6MzQ6MzggMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6MjQzKSByZXN0b3JlIGh2bSBkb21haW4gMiwgYXBpYz0xLCBwYWU9 MQpbMjAwOS0wOC0yNiAwMTozNDozOCAyODgzXSBERUJVRyAoaW1hZ2U6MzE5KSBObyBWTkMg cGFzc3dkIGNvbmZpZ3VyZWQgZm9yIHZmYiBhY2Nlc3MKWzIwMDktMDgtMjYgMDE6MzQ6Mzgg Mjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogYm9vdCwgdmFsOiBjClsyMDA5LTA4LTI2 IDAxOjM0OjM4IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGZkYSwgdmFsOiBOb25l ClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGZk YiwgdmFsOiBOb25lClsyMDA5LTA4LTI2IDAxOjM0OjM4IDI4ODNdIERFQlVHIChpbWFnZTo4 MDYpIGFyZ3M6IHNvdW5kaHcsIHZhbDogTm9uZQpbMjAwOS0wOC0yNiAwMTozNDozOCAyODgz XSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBsb2NhbHRpbWUsIHZhbDogMApbMjAwOS0wOC0y NiAwMTozNDozOCAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBzZXJpYWwsIHZhbDog WydwdHknXQpbMjAwOS0wOC0yNiAwMTozNDozOCAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBh cmdzOiBzdGQtdmdhLCB2YWw6IDAKWzIwMDktMDgtMjYgMDE6MzQ6MzggMjg4M10gREVCVUcg KGltYWdlOjgwNikgYXJnczogaXNhLCB2YWw6IDAKWzIwMDktMDgtMjYgMDE6MzQ6MzggMjg4 M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogYWNwaSwgdmFsOiAxClsyMDA5LTA4LTI2IDAx OjM0OjM4IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IHVzYiwgdmFsOiAwClsyMDA5 LTA4LTI2IDAxOjM0OjM4IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IHVzYmRldmlj ZSwgdmFsOiB0YWJsZXQKWzIwMDktMDgtMjYgMDE6MzQ6MzggMjg4M10gSU5GTyAoaW1hZ2U6 NzQyKSBOZWVkIHRvIGNyZWF0ZSBwbGF0Zm9ybSBkZXZpY2UuW2RvbWlkOjJdClsyMDA5LTA4 LTI2IDAxOjM0OjM4IDI4ODNdIERFQlVHIChYZW5kQ2hlY2twb2ludDoyNjEpIHJlc3RvcmU6 c2hhZG93PTB4NiwgX3N0YXRpY19tYXg9MHgyNTgwMDAwMCwgX3N0YXRpY19taW49MHgwLCAK WzIwMDktMDgtMjYgMDE6MzQ6MzggMjg4M10gREVCVUcgKGJhbGxvb246MTgxKSBCYWxsb29u OiAxNDcxMzY0IEtpQiBmcmVlOyBuZWVkIDYyNDY0MDsgZG9uZS4KWzIwMDktMDgtMjYgMDE6 MzQ6MzggMjg4M10gREVCVUcgKFhlbmRDaGVja3BvaW50OjI3OCkgW3hjX3Jlc3RvcmVdOiAv dXNyL2xpYi94ZW4vYmluL3hjX3Jlc3RvcmUgMzEgMiAyIDMgMSAxIDEKWzIwMDktMDgtMjYg MDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSAtLT54Y19kb21haW5f cmVzdG9yZSgpClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgeGNfZG9tYWluX3Jlc3RvcmUgc3RhcnQ6IHAybV9zaXplID0gMTAwMDAwClsy MDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgcGxh dGZvcm0gaW5mbywgbWF4X21mbjogN2Q0YjAsIGh2aXJ0X3N0YXJ0IGZmYzAwMDAwLCBwdF9s dmV2ZWwgNCwgZ3Vlc3Rfd2lkdGggOApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIG1lbW9yeSBhbGxvYyBzdWNjZXNzClsyMDA5LTA4LTI2 IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbG9jayByZWdpbl9t Zm4gYW5kIHAybV9iYXRjaCBzdWNjZXNzClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgc2hhcmVkX2luZm9fZnJhbWU6IDB4ZmZmZmZmZmYK WzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBh bGwgUEZOcyBhcmUgbWFya2VkIGFzIGludmFsaWQKWzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBSZWxvYWRpbmcgbWVtb3J5IHBhZ2VzOiAg IDAlClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIG5yX21mbnM6IDk5MQpbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6 MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5 LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2gg MTAyNApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAw MTozNDozOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIw MDktMDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9t Zm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6Mzkg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2 IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAy NApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDoz OSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDkt MDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAx MDI0ClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAx OjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAw OS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21m bnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDozOSAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYg MDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0 ClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg YmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjM5 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0w OC0yNiAwMTozNDozOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEw MjQKWzIwMDktMDgtMjYgMDE6MzQ6MzkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBucl9tZm5zOiAxMDIzClsyMDA5LTA4LTI2IDAxOjM0OjM5IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDozOSAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6 MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5 LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZu czogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDAgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQwIDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAw MTozNDo0MCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQK WzIwMDktMDgtMjYgMDE6MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBi YXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MCAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDAg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4 LTI2IDAxOjM0OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAy NApbMjAwOS0wOC0yNiAwMTozNDo0MCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMToz NDo0MCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDkt MDgtMjYgMDE6MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5z OiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MCAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDAgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAx OjM0OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApb MjAwOS0wOC0yNiAwMTozNDo0MCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJh dGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MCAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgt MjYgMDE6MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0 ClsyMDA5LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg bnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MCAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDAgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0 OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0w OC0yNiAwMTozNDo0MCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6 IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MCAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6 MzQ6NDAgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0Clsy MDA5LTA4LTI2IDAxOjM0OjQwIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0 Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0y NiAwMTozNDo0MSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQK WzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBu cl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MSAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6 NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4 LTI2IDAxOjM0OjQxIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczog MTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMToz NDo0MSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIw MDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRj aCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MSAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2 IDAxOjM0OjQxIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApb MjAwOS0wOC0yNiAwMTozNDo0MSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5y X21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0 MSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgt MjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAx MDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MSAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0 OjQxIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAw OS0wOC0yNiAwMTozNDo0MSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNo IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MSAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYg MDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0Clsy MDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJf bWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MSAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQx IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0y NiAwMTozNDo0MSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEw MjQKWzIwMDktMDgtMjYgMDE6MzQ6NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQxIDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MSAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6 NDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5 LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2gg MTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAw MTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIw MDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9t Zm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2 IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAy NApbMjAwOS0wOC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0 MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDkt MDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAx MDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAx OjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAw OS0wOC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21m bnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MiAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYg MDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0 ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg YmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQy IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0w OC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEw MjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MiAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6 MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5 LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZu czogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAw MTozNDo0MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQK WzIwMDktMDgtMjYgMDE6MzQ6NDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBi YXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQyIDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4 LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAy NApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMToz NDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDkt MDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5z OiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAx OjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApb MjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJh dGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgt MjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0 ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg bnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0 OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0w OC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6 IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6 MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0Clsy MDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0 Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0y NiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQK WzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBu cl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6 NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4 LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczog MTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMToz NDo0MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIw MDktMDgtMjYgMDE6MzQ6NDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRj aCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0MyAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDMgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2 IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApb MjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5y X21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0 NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgt MjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAx MDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0 OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAw OS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNo IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYg MDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0Clsy MDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJf bWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0y NiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEw MjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6 NDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5 LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2gg MTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAw MTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIw MDktMDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9t Zm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2 IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAy NApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0 NCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDkt MDgtMjYgMDE6MzQ6NDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAx MDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NCAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDQgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAx OjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAw OS0wOC0yNiAwMTozNDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21m bnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NSAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYg MDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0 ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg YmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0w OC0yNiAwMTozNDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEw MjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NSAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6 MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5 LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZu czogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAw MTozNDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQK WzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBi YXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NSAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4 LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAy NApbMjAwOS0wOC0yNiAwMTozNDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMToz NDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDkt MDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5z OiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NSAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAx OjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApb MjAwOS0wOC0yNiAwMTozNDo0NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJh dGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NSAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgt MjYgMDE6MzQ6NDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0 ClsyMDA5LTA4LTI2IDAxOjM0OjQ1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg bnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0 OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0w OC0yNiAwMTozNDo0NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6 IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6 MzQ6NDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0Clsy MDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0 Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0y NiAwMTozNDo0NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQK WzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBu cl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6 NDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4 LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczog MTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMToz NDo0NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIw MDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRj aCAxMDI0ClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAzMQpbMjAwOS0wOC0yNiAw MTozNDo0NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIw MDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9t Zm5zOiA3ClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgRmFpbGVkIGFsbG9jYXRpb24gZm9yIGRvbSAyOiA3IGV4dGVudHMgb2Ygb3JkZXIg MApbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IEVSUk9SIEludGVybmFsIGVycm9yOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBi YXRjaC4hClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgUmVzdG9yZSBleGl0IHdpdGggcmM9MQpbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgz XSBERUJVRyAoWGVuZERvbWFpbkluZm86Mjc1MCkgWGVuZERvbWFpbkluZm8uZGVzdHJveTog ZG9taWQ9MgpbMjAwOS0wOC0yNiAwMTozNDo0NiAyODgzXSBFUlJPUiAoWGVuZERvbWFpbklu Zm86Mjc2NCkgWGVuZERvbWFpbkluZm8uZGVzdHJveTogZG9tYWluIGRlc3RydWN0aW9uIGZh aWxlZC4KVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogIEZpbGUgIi91c3Iv bGliL3B5dGhvbjIuNC9zaXRlLXBhY2thZ2VzL3hlbi94ZW5kL1hlbmREb21haW5JbmZvLnB5 IiwgbGluZSAyNzU3LCBpbiBkZXN0cm95CiAgICB4Yy5kb21haW5fcGF1c2Uoc2VsZi5kb21p ZCkKRXJyb3I6ICgzLCAnTm8gc3VjaCBwcm9jZXNzJykKWzIwMDktMDgtMjYgMDE6MzQ6NDYg Mjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIyMjUpIE5vIGRldmljZSBtb2RlbApbMjAw OS0wOC0yNiAwMTozNDo0NiAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86MjIyNykgUmVs ZWFzaW5nIGRldmljZXMKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gREVCVUcgKFhlbmRE b21haW5JbmZvOjIyNDApIFJlbW92aW5nIHZpZi8wClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4 ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoxMTQyKSBYZW5kRG9tYWluSW5mby5kZXN0cm95 RGV2aWNlOiBkZXZpY2VDbGFzcyA9IHZpZiwgZGV2aWNlID0gdmlmLzAKWzIwMDktMDgtMjYg MDE6MzQ6NDYgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIyNDApIFJlbW92aW5nIHZi ZC83NjgKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZv OjExNDIpIFhlbmREb21haW5JbmZvLmRlc3Ryb3lEZXZpY2U6IGRldmljZUNsYXNzID0gdmJk LCBkZXZpY2UgPSB2YmQvNzY4ClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4ODNdIERFQlVHIChY ZW5kRG9tYWluSW5mbzoyMjQwKSBSZW1vdmluZyB2ZmIvMApbMjAwOS0wOC0yNiAwMTozNDo0 NiAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86MTE0MikgWGVuZERvbWFpbkluZm8uZGVz dHJveURldmljZTogZGV2aWNlQ2xhc3MgPSB2ZmIsIGRldmljZSA9IHZmYi8wClsyMDA5LTA4 LTI2IDAxOjM0OjQ2IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoyMjQwKSBSZW1vdmlu ZyBjb25zb2xlLzAKWzIwMDktMDgtMjYgMDE6MzQ6NDYgMjg4M10gREVCVUcgKFhlbmREb21h aW5JbmZvOjExNDIpIFhlbmREb21haW5JbmZvLmRlc3Ryb3lEZXZpY2U6IGRldmljZUNsYXNz ID0gY29uc29sZSwgZGV2aWNlID0gY29uc29sZS8wClsyMDA5LTA4LTI2IDAxOjM0OjQ2IDI4 ODNdIEVSUk9SIChYZW5kRG9tYWluOjExNDkpIFJlc3RvcmUgZmFpbGVkClRyYWNlYmFjayAo bW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICBGaWxlICIvdXNyL2xpYi9weXRob24yLjQvc2l0 ZS1wYWNrYWdlcy94ZW4veGVuZC9YZW5kRG9tYWluLnB5IiwgbGluZSAxMTQ3LCBpbiBkb21h aW5fcmVzdG9yZV9mZAogICAgcmV0dXJuIFhlbmRDaGVja3BvaW50LnJlc3RvcmUoc2VsZiwg ZmQsIHBhdXNlZD1wYXVzZWQsIHJlbG9jYXRpbmc9cmVsb2NhdGluZykKICBGaWxlICIvdXNy L2xpYi9weXRob24yLjQvc2l0ZS1wYWNrYWdlcy94ZW4veGVuZC9YZW5kQ2hlY2twb2ludC5w eSIsIGxpbmUgMjgyLCBpbiByZXN0b3JlCiAgICBmb3JrSGVscGVyKGNtZCwgZmQsIGhhbmRs ZXIuaGFuZGxlciwgVHJ1ZSkKICBGaWxlICIvdXNyL2xpYi9weXRob24yLjQvc2l0ZS1wYWNr YWdlcy94ZW4veGVuZC9YZW5kQ2hlY2twb2ludC5weSIsIGxpbmUgNDA2LCBpbiBmb3JrSGVs cGVyCiAgICByYWlzZSBYZW5kRXJyb3IoIiVzIGZhaWxlZCIgJSBzdHJpbmcuam9pbihjbWQp KQpYZW5kRXJyb3I6IC91c3IvbGliL3hlbi9iaW4veGNfcmVzdG9yZSAzMSAyIDIgMyAxIDEg MSBmYWlsZWQKWzIwMDktMDgtMjYgMDI6MDg6MDQgMjg4M10gREVCVUcgKFhlbmREb21haW5J bmZvOjkzKSBYZW5kRG9tYWluSW5mby5jcmVhdGUoWyd2bScsIFsnbmFtZScsICdXaW5kb3dz X1NlcnZlcjIwMDgnXSwgWydtZW1vcnknLCAnNjAwJ10sIFsnb25fcmVib290JywgJ3Jlc3Rh cnQnXSwgWydvbl9jcmFzaCcsICdyZXN0YXJ0J10sIFsndmNwdXMnLCAxXSwgWydvbl94ZW5k X3N0YXJ0JywgJ2lnbm9yZSddLCBbJ29uX3hlbmRfc3RvcCcsICdpZ25vcmUnXSwgWydib290 bG9hZGVyJywgJy91c3IvYmluL3B5Z3J1YiddLCBbJ2Jvb3Rsb2FkZXJfYXJncycsICctcSdd LCBbJ2ltYWdlJywgWydodm0nLCBbJ2tlcm5lbCcsICcvdXNyL2xpYi94ZW4vYm9vdC9odm1s b2FkZXInXSwgWyd2aWRlb3JhbScsIDRdLCBbJ2RldmljZV9tb2RlbCcsICcvdXNyL2xpYi94 ZW4vYmluL3FlbXUtZG0nXSwgWydwYWUnLCAxXSwgWyd2Y3B1cycsIDFdLCBbJ2Jvb3QnLCAn ZGMnXSwgWydmZGEnLCAnJ10sIFsnZmRiJywgJyddLCBbJ3RpbWVyX21vZGUnLCAxXSwgWyds b2NhbHRpbWUnLCAwXSwgWydzZXJpYWwnLCAncHR5J10sIFsnc3RkdmdhJywgMF0sIFsnaXNh JywgMF0sIFsnbm9ncmFwaGljJywgMF0sIFsnc291bmRodycsICcnXSwgWyd2bmMnLCAxXSwg Wyd2bmN1bnVzZWQnLCAxXSwgWyd2bmNsaXN0ZW4nLCAnMC4wLjAuMCddLCBbJ3hhdXRob3Jp dHknLCAnL3Jvb3QvLlhhdXRob3JpdHknXSwgWydydGNfdGltZW9mZnNldCcsIDBdLCBbJ21v bml0b3InLCAwXSwgWydhY3BpJywgMV0sIFsnYXBpYycsIDFdLCBbJ3VzYicsIDBdLCBbJ3Vz YmRldmljZScsICd0YWJsZXQnXSwgWydrZXltYXAnLCAnJ10sIFsncGNpJywgW11dLCBbJ2hw ZXQnLCAwXSwgWydndWVzdF9vc190eXBlJywgJ2RlZmF1bHQnXSwgWydoYXAnLCAxXSwgWydj cHVpZCcsIFtdXSwgWydjcHVpZF9jaGVjaycsIFtdXSwgWyd2aXJpZGlhbicsIDBdLCBbJ3Bj aV9tc2l0cmFuc2xhdGUnLCAxXSwgWyd2cHRfYWxpZ24nLCAxXSwgWydwY2lfcG93ZXJfbWdt dCcsIDBdLCBbJ3hlbl9wbGF0Zm9ybV9wY2knLCAxXSwgWyd2bmNwYXNzd2QnLCAnWFhYWFhY WFgnXV1dLCBbJ3MzX2ludGVncml0eScsIDFdLCBbJ2RldmljZScsIFsndmJkJywgWyd1bmFt ZScsICdmaWxlOi9tbnQvZGF0YS92bS9zcnYyMDA4L1N5c3RlbS5pbWcnXSwgWydkZXYnLCAn aGRhJ10sIFsnbW9kZScsICd3J11dXSwgWydkZXZpY2UnLCBbJ3ZpZicsIFsnYnJpZGdlJywg J3hlbmJyMCddXV1dKQpbMjAwOS0wOC0yNiAwMjowODowNCAyODgzXSBERUJVRyAoWGVuZERv bWFpbkluZm86MjMxNykgWGVuZERvbWFpbkluZm8uY29uc3RydWN0RG9tYWluClsyMDA5LTA4 LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChiYWxsb29uOjE4MSkgQmFsbG9vbjogMTQ3Mjc3 NiBLaUIgZnJlZTsgbmVlZCA0MDk2OyBkb25lLgpbMjAwOS0wOC0yNiAwMjowODowNCAyODgz XSBERUJVRyAoWGVuZERvbWFpbjo0NTIpIEFkZGluZyBEb21haW46IDMKWzIwMDktMDgtMjYg MDI6MDg6MDQgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjI1MTgpIFhlbmREb21haW5J bmZvLmluaXREb21haW46IDMgMjU2ClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVH IChpbWFnZTozMTkpIE5vIFZOQyBwYXNzd2QgY29uZmlndXJlZCBmb3IgdmZiIGFjY2Vzcwpb MjAwOS0wOC0yNiAwMjowODowNCAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBib290 LCB2YWw6IGRjClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChpbWFnZTo4MDYp IGFyZ3M6IGZkYSwgdmFsOiBOb25lClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVH IChpbWFnZTo4MDYpIGFyZ3M6IGZkYiwgdmFsOiBOb25lClsyMDA5LTA4LTI2IDAyOjA4OjA0 IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IHNvdW5kaHcsIHZhbDogTm9uZQpbMjAw OS0wOC0yNiAwMjowODowNCAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBsb2NhbHRp bWUsIHZhbDogMApbMjAwOS0wOC0yNiAwMjowODowNCAyODgzXSBERUJVRyAoaW1hZ2U6ODA2 KSBhcmdzOiBzZXJpYWwsIHZhbDogWydwdHknXQpbMjAwOS0wOC0yNiAwMjowODowNCAyODgz XSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBzdGQtdmdhLCB2YWw6IDAKWzIwMDktMDgtMjYg MDI6MDg6MDQgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogaXNhLCB2YWw6IDAKWzIw MDktMDgtMjYgMDI6MDg6MDQgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogYWNwaSwg dmFsOiAxClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFy Z3M6IHVzYiwgdmFsOiAwClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChpbWFn ZTo4MDYpIGFyZ3M6IHVzYmRldmljZSwgdmFsOiB0YWJsZXQKWzIwMDktMDgtMjYgMDI6MDg6 MDQgMjg4M10gSU5GTyAoaW1hZ2U6NzQyKSBOZWVkIHRvIGNyZWF0ZSBwbGF0Zm9ybSBkZXZp Y2UuW2RvbWlkOjNdClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChYZW5kRG9t YWluSW5mbzoyNTQyKSBfaW5pdERvbWFpbjpzaGFkb3dfbWVtb3J5PTB4MCwgbWVtb3J5X3N0 YXRpY19tYXg9MHgyNTgwMDAwMCwgbWVtb3J5X3N0YXRpY19taW49MHgwLgpbMjAwOS0wOC0y NiAwMjowODowNCAyODgzXSBERUJVRyAoYmFsbG9vbjoxODEpIEJhbGxvb246IDE0NzEzNjQg S2lCIGZyZWU7IG5lZWQgNjI3NzEyOyBkb25lLgpbMjAwOS0wOC0yNiAwMjowODowNCAyODgz XSBJTkZPIChpbWFnZToxNzApIGJ1aWxkRG9tYWluIG9zPWh2bSBkb209MyB2Y3B1cz0xClsy MDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChpbWFnZTo4NTkpIGRvbWlkICAgICAg ICAgID0gMwpbMjAwOS0wOC0yNiAwMjowODowNCAyODgzXSBERUJVRyAoaW1hZ2U6ODYwKSBp bWFnZSAgICAgICAgICA9IC91c3IvbGliL3hlbi9ib290L2h2bWxvYWRlcgpbMjAwOS0wOC0y NiAwMjowODowNCAyODgzXSBERUJVRyAoaW1hZ2U6ODYxKSBzdG9yZV9ldnRjaG4gICA9IDIK WzIwMDktMDgtMjYgMDI6MDg6MDQgMjg4M10gREVCVUcgKGltYWdlOjg2MikgbWVtc2l6ZSAg ICAgICAgPSA2MDAKWzIwMDktMDgtMjYgMDI6MDg6MDQgMjg4M10gREVCVUcgKGltYWdlOjg2 MykgdGFyZ2V0ICAgICAgICAgPSA2MDAKWzIwMDktMDgtMjYgMDI6MDg6MDQgMjg4M10gREVC VUcgKGltYWdlOjg2NCkgdmNwdXMgICAgICAgICAgPSAxClsyMDA5LTA4LTI2IDAyOjA4OjA0 IDI4ODNdIERFQlVHIChpbWFnZTo4NjUpIGFjcGkgICAgICAgICAgID0gMQpbMjAwOS0wOC0y NiAwMjowODowNCAyODgzXSBERUJVRyAoaW1hZ2U6ODY2KSBhcGljICAgICAgICAgICA9IDEK WzIwMDktMDgtMjYgMDI6MDg6MDQgMjg4M10gSU5GTyAoWGVuZERvbWFpbkluZm86MjE3OCkg Y3JlYXRlRGV2aWNlOiB2ZmIgOiB7J3ZuY3VudXNlZCc6IDEsICd2bmNsaXN0ZW4nOiAnMC4w LjAuMCcsICd2bmMnOiAnMScsICd1dWlkJzogJ2EzNGQyZDBiLThiZmYtNWJiYy03MGZjLWZh M2I1YzZmODI2MicsICdvdGhlcl9jb25maWcnOiB7J3ZuY3VudXNlZCc6IDEsICd2bmNsaXN0 ZW4nOiAnMC4wLjAuMCcsICd2bmMnOiAnMSd9fQpbMjAwOS0wOC0yNiAwMjowODowNCAyODgz XSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NSkgRGV2Q29udHJvbGxlcjogd3JpdGluZyB7J3N0 YXRlJzogJzEnLCAnYmFja2VuZC1pZCc6ICcwJywgJ2JhY2tlbmQnOiAnL2xvY2FsL2RvbWFp bi8wL2JhY2tlbmQvdmZiLzMvMCd9IHRvIC9sb2NhbC9kb21haW4vMy9kZXZpY2UvdmZiLzAu ClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk3KSBE ZXZDb250cm9sbGVyOiB3cml0aW5nIHsndm5jdW51c2VkJzogJzEnLCAnZG9tYWluJzogJ1dp bmRvd3NfU2VydmVyMjAwOCcsICdmcm9udGVuZCc6ICcvbG9jYWwvZG9tYWluLzMvZGV2aWNl L3ZmYi8wJywgJ3V1aWQnOiAnYTM0ZDJkMGItOGJmZi01YmJjLTcwZmMtZmEzYjVjNmY4MjYy JywgJ2Zyb250ZW5kLWlkJzogJzMnLCAndm5jbGlzdGVuJzogJzAuMC4wLjAnLCAnc3RhdGUn OiAnMScsICdvbmxpbmUnOiAnMScsICd2bmMnOiAnMSd9IHRvIC9sb2NhbC9kb21haW4vMC9i YWNrZW5kL3ZmYi8zLzAuClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIElORk8gKFhlbmRE b21haW5JbmZvOjIxNzgpIGNyZWF0ZURldmljZTogdmJkIDogeyd1dWlkJzogJ2VkMDU0MGZj LTYwMjEtNTNmZS03NWU4LWIyZTcyY2QzMzVlMicsICdib290YWJsZSc6IDEsICdkcml2ZXIn OiAncGFyYXZpcnR1YWxpc2VkJywgJ2Rldic6ICdoZGEnLCAndW5hbWUnOiAnZmlsZTovbW50 L2RhdGEvdm0vc3J2MjAwOC9TeXN0ZW0uaW1nJywgJ21vZGUnOiAndyd9ClsyMDA5LTA4LTI2 IDAyOjA4OjA0IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk1KSBEZXZDb250cm9sbGVy OiB3cml0aW5nIHsnYmFja2VuZC1pZCc6ICcwJywgJ3ZpcnR1YWwtZGV2aWNlJzogJzc2OCcs ICdkZXZpY2UtdHlwZSc6ICdkaXNrJywgJ3N0YXRlJzogJzEnLCAnYmFja2VuZCc6ICcvbG9j YWwvZG9tYWluLzAvYmFja2VuZC92YmQvMy83NjgnfSB0byAvbG9jYWwvZG9tYWluLzMvZGV2 aWNlL3ZiZC83NjguClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIERFQlVHIChEZXZDb250 cm9sbGVyOjk3KSBEZXZDb250cm9sbGVyOiB3cml0aW5nIHsnZG9tYWluJzogJ1dpbmRvd3Nf U2VydmVyMjAwOCcsICdmcm9udGVuZCc6ICcvbG9jYWwvZG9tYWluLzMvZGV2aWNlL3ZiZC83 NjgnLCAndXVpZCc6ICdlZDA1NDBmYy02MDIxLTUzZmUtNzVlOC1iMmU3MmNkMzM1ZTInLCAn Ym9vdGFibGUnOiAnMScsICdkZXYnOiAnaGRhJywgJ3N0YXRlJzogJzEnLCAncGFyYW1zJzog Jy9tbnQvZGF0YS92bS9zcnYyMDA4L1N5c3RlbS5pbWcnLCAnbW9kZSc6ICd3JywgJ29ubGlu ZSc6ICcxJywgJ2Zyb250ZW5kLWlkJzogJzMnLCAndHlwZSc6ICdmaWxlJ30gdG8gL2xvY2Fs L2RvbWFpbi8wL2JhY2tlbmQvdmJkLzMvNzY4LgpbMjAwOS0wOC0yNiAwMjowODowNCAyODgz XSBJTkZPIChYZW5kRG9tYWluSW5mbzoyMTc4KSBjcmVhdGVEZXZpY2U6IHZpZiA6IHsnYnJp ZGdlJzogJ3hlbmJyMCcsICdtYWMnOiAnMDA6MTY6M2U6MjE6MGY6OGUnLCAndXVpZCc6ICdj MTcyOWM4OS02Y2E3LTA0YmItMWVhYS0yMjVjMDE0NGQ1ZmQnfQpbMjAwOS0wOC0yNiAwMjow ODowNCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NSkgRGV2Q29udHJvbGxlcjogd3Jp dGluZyB7J2JhY2tlbmQtaWQnOiAnMCcsICdtYWMnOiAnMDA6MTY6M2U6MjE6MGY6OGUnLCAn aGFuZGxlJzogJzAnLCAnc3RhdGUnOiAnMScsICdiYWNrZW5kJzogJy9sb2NhbC9kb21haW4v MC9iYWNrZW5kL3ZpZi8zLzAnfSB0byAvbG9jYWwvZG9tYWluLzMvZGV2aWNlL3ZpZi8wLgpb MjAwOS0wOC0yNiAwMjowODowNCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NykgRGV2 Q29udHJvbGxlcjogd3JpdGluZyB7J2JyaWRnZSc6ICd4ZW5icjAnLCAnZG9tYWluJzogJ1dp bmRvd3NfU2VydmVyMjAwOCcsICdoYW5kbGUnOiAnMCcsICd1dWlkJzogJ2MxNzI5Yzg5LTZj YTctMDRiYi0xZWFhLTIyNWMwMTQ0ZDVmZCcsICdzY3JpcHQnOiAnL2V0Yy94ZW4vc2NyaXB0 cy92aWYtYnJpZGdlJywgJ21hYyc6ICcwMDoxNjozZToyMTowZjo4ZScsICdmcm9udGVuZC1p ZCc6ICczJywgJ3N0YXRlJzogJzEnLCAnb25saW5lJzogJzEnLCAnZnJvbnRlbmQnOiAnL2xv Y2FsL2RvbWFpbi8zL2RldmljZS92aWYvMCd9IHRvIC9sb2NhbC9kb21haW4vMC9iYWNrZW5k L3ZpZi8zLzAuClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIElORk8gKGltYWdlOjM5MSkg c3Bhd25pbmcgZGV2aWNlIG1vZGVsczogL3Vzci9saWIveGVuL2Jpbi9xZW11LWRtIFsnL3Vz ci9saWIveGVuL2Jpbi9xZW11LWRtJywgJy1kJywgJzMnLCAnLWRvbWFpbi1uYW1lJywgJ1dp bmRvd3NfU2VydmVyMjAwOCcsICctdmlkZW9yYW0nLCAnNCcsICctdm5jJywgJzAuMC4wLjA6 MCcsICctdm5jdW51c2VkJywgJy12Y3B1cycsICcxJywgJy1ib290JywgJ2RjJywgJy1zZXJp YWwnLCAncHR5JywgJy1hY3BpJywgJy11c2JkZXZpY2UnLCAndGFibGV0JywgJy1uZXQnLCAn bmljLHZsYW49MSxtYWNhZGRyPTAwOjE2OjNlOjIxOjBmOjhlLG1vZGVsPXJ0bDgxMzknLCAn LW5ldCcsICd0YXAsdmxhbj0xLGlmbmFtZT10YXAzLjAsYnJpZGdlPXhlbmJyMCcsICctTScs ICd4ZW5mdiddClsyMDA5LTA4LTI2IDAyOjA4OjA0IDI4ODNdIElORk8gKGltYWdlOjQ0MCkg ZGV2aWNlIG1vZGVsIHBpZDogNjY1MApbMjAwOS0wOC0yNiAwMjowODowNSAyODgzXSBJTkZP IChpbWFnZTo1MjgpIHdhaXRpbmcgZm9yIHNlbnRpbmVsX2ZpZm8KWzIwMDktMDgtMjYgMDI6 MDg6MDUgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjMwODIpIFN0b3JpbmcgVk0gZGV0 YWlsczogeydvbl94ZW5kX3N0b3AnOiAnaWdub3JlJywgJ3NoYWRvd19tZW1vcnknOiAnNics ICd1dWlkJzogJzY3ZjI3YmNmLTk2ZDgtYTM2NS0wZjVhLWQ2ODNiZDM2ZTI4MScsICdvbl9y ZWJvb3QnOiAncmVzdGFydCcsICdzdGFydF90aW1lJzogJzEyNTEyMjM2ODUuMCcsICdvbl9w b3dlcm9mZic6ICdkZXN0cm95JywgJ2Jvb3Rsb2FkZXJfYXJncyc6ICctcScsICdvbl94ZW5k X3N0YXJ0JzogJ2lnbm9yZScsICdvbl9jcmFzaCc6ICdyZXN0YXJ0JywgJ3hlbmQvcmVzdGFy dF9jb3VudCc6ICcwJywgJ3ZjcHVzJzogJzEnLCAndmNwdV9hdmFpbCc6ICcxJywgJ2Jvb3Rs b2FkZXInOiAnL3Vzci9iaW4vcHlncnViJywgJ2ltYWdlJzogJyhodm0gKGtlcm5lbCApICh2 aWRlb3JhbSA0KSAoaHBldCAwKSAoc3RkdmdhIDApICh2bmNsaXN0ZW4gMC4wLjAuMCkgKGxv YWRlciAvdXNyL2xpYi94ZW4vYm9vdC9odm1sb2FkZXIpIChzZXJpYWwgcHR5KSAodm5jdW51 c2VkIDEpICh4ZW5fcGxhdGZvcm1fcGNpIDEpIChib290IGRjKSAocnRjX3RpbWVvZmZzZXQg MCkgKHBjaSAoKSkgKHBhZSAxKSAodnB0X2FsaWduIDEpIChoYXAgMSkgKHZpcmlkaWFuIDAp IChhY3BpIDEpIChsb2NhbHRpbWUgMCkgKHRpbWVyX21vZGUgMSkgKHZuYyAxKSAobm9ncmFw aGljIDApIChndWVzdF9vc190eXBlIGRlZmF1bHQpIChwY2lfbXNpdHJhbnNsYXRlIDEpIChh cGljIDEpIChtb25pdG9yIDApICh1c2JkZXZpY2UgdGFibGV0KSAoZGV2aWNlX21vZGVsIC91 c3IvbGliL3hlbi9iaW4vcWVtdS1kbSkgKHBjaV9wb3dlcl9tZ210IDApICh1c2IgMCkgKHhh dXRob3JpdHkgL3Jvb3QvLlhhdXRob3JpdHkpIChpc2EgMCkgKG5vdGVzIChTVVNQRU5EX0NB TkNFTCAxKSkpJywgJ25hbWUnOiAnV2luZG93c19TZXJ2ZXIyMDA4J30KWzIwMDktMDgtMjYg MDI6MDg6MDUgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjE2MzgpIFN0b3JpbmcgZG9t YWluIGRldGFpbHM6IHsnY29uc29sZS9wb3J0JzogJzMnLCAnbmFtZSc6ICdXaW5kb3dzX1Nl cnZlcjIwMDgnLCAnY29uc29sZS9saW1pdCc6ICcxMDQ4NTc2JywgJ3N0b3JlL3BvcnQnOiAn MicsICd2bSc6ICcvdm0vNjdmMjdiY2YtOTZkOC1hMzY1LTBmNWEtZDY4M2JkMzZlMjgxJywg J2RvbWlkJzogJzMnLCAnaW1hZ2Uvc3VzcGVuZC1jYW5jZWwnOiAnMScsICdjcHUvMC9hdmFp bGFiaWxpdHknOiAnb25saW5lJywgJ21lbW9yeS90YXJnZXQnOiAnNjE0NDAwJywgJ2NvbnRy b2wvcGxhdGZvcm0tZmVhdHVyZS1tdWx0aXByb2Nlc3Nvci1zdXNwZW5kJzogJzEnLCAnc3Rv cmUvcmluZy1yZWYnOiAnMTA0NDQ3NicsICdjb25zb2xlL3R5cGUnOiAnaW9lbXUnfQpbMjAw OS0wOC0yNiAwMjowODowNSAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NSkgRGV2Q29u dHJvbGxlcjogd3JpdGluZyB7J3N0YXRlJzogJzEnLCAnYmFja2VuZC1pZCc6ICcwJywgJ2Jh Y2tlbmQnOiAnL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvY29uc29sZS8zLzAnfSB0byAvbG9j YWwvZG9tYWluLzMvZGV2aWNlL2NvbnNvbGUvMC4KWzIwMDktMDgtMjYgMDI6MDg6MDUgMjg4 M10gREVCVUcgKERldkNvbnRyb2xsZXI6OTcpIERldkNvbnRyb2xsZXI6IHdyaXRpbmcgeydk b21haW4nOiAnV2luZG93c19TZXJ2ZXIyMDA4JywgJ2Zyb250ZW5kJzogJy9sb2NhbC9kb21h aW4vMy9kZXZpY2UvY29uc29sZS8wJywgJ3V1aWQnOiAnNjE5YjQxMWItYmU4Yi1jY2QxLTA3 ZWQtZTgxMTY5NjllYjE4JywgJ2Zyb250ZW5kLWlkJzogJzMnLCAnc3RhdGUnOiAnMScsICds b2NhdGlvbic6ICczJywgJ29ubGluZSc6ICcxJywgJ3Byb3RvY29sJzogJ3Z0MTAwJ30gdG8g L2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvY29uc29sZS8zLzAuClsyMDA5LTA4LTI2IDAyOjA4 OjA1IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoxNzI1KSBYZW5kRG9tYWluSW5mby5o YW5kbGVTaHV0ZG93bldhdGNoClsyMDA5LTA4LTI2IDAyOjA4OjA1IDI4ODNdIERFQlVHIChE ZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3IgZGV2aWNlcyB2aWYuClsyMDA5LTA4LTI2 IDAyOjA4OjA1IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjE0NCkgV2FpdGluZyBmb3Ig MC4KWzIwMDktMDgtMjYgMDI6MDg6MDUgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6NjI5 KSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sgL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmlmLzMv MC9ob3RwbHVnLXN0YXR1cy4KWzIwMDktMDgtMjYgMDI6MDg6MDYgMjg4M10gREVCVUcgKERl dkNvbnRyb2xsZXI6NjI5KSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sgL2xvY2FsL2RvbWFpbi8w L2JhY2tlbmQvdmlmLzMvMC9ob3RwbHVnLXN0YXR1cy4KWzIwMDktMDgtMjYgMDI6MDg6MDYg Mjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6NjQzKSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sg MS4KWzIwMDktMDgtMjYgMDI6MDg6MDYgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6MTM5 KSBXYWl0aW5nIGZvciBkZXZpY2VzIHZzY3NpLgpbMjAwOS0wOC0yNiAwMjowODowNiAyODgz XSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMgdmJkLgpb MjAwOS0wOC0yNiAwMjowODowNiAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxNDQpIFdh aXRpbmcgZm9yIDc2OC4KWzIwMDktMDgtMjYgMDI6MDg6MDYgMjg4M10gREVCVUcgKERldkNv bnRyb2xsZXI6NjI5KSBob3RwbHVnU3RhdHVzQ2FsbGJhY2sgL2xvY2FsL2RvbWFpbi8wL2Jh Y2tlbmQvdmJkLzMvNzY4L2hvdHBsdWctc3RhdHVzLgpbMjAwOS0wOC0yNiAwMjowODowNiAy ODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo2MjkpIGhvdHBsdWdTdGF0dXNDYWxsYmFjayAv bG9jYWwvZG9tYWluLzAvYmFja2VuZC92YmQvMy83NjgvaG90cGx1Zy1zdGF0dXMuClsyMDA5 LTA4LTI2IDAyOjA4OjA2IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjY0MykgaG90cGx1 Z1N0YXR1c0NhbGxiYWNrIDEuClsyMDA5LTA4LTI2IDAyOjA4OjA2IDI4ODNdIERFQlVHIChE ZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3IgZGV2aWNlcyBpcnEuClsyMDA5LTA4LTI2 IDAyOjA4OjA2IDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3Ig ZGV2aWNlcyB2a2JkLgpbMjAwOS0wOC0yNiAwMjowODowNiAyODgzXSBERUJVRyAoRGV2Q29u dHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMgdmZiLgpbMjAwOS0wOC0yNiAwMjow ODowNiAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmlj ZXMgY29uc29sZS4KWzIwMDktMDgtMjYgMDI6MDg6MDYgMjg4M10gREVCVUcgKERldkNvbnRy b2xsZXI6MTQ0KSBXYWl0aW5nIGZvciAwLgpbMjAwOS0wOC0yNiAwMjowODowNiAyODgzXSBE RUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMgcGNpLgpbMjAw OS0wOC0yNiAwMjowODowNiAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRp bmcgZm9yIGRldmljZXMgaW9wb3J0cy4KWzIwMDktMDgtMjYgMDI6MDg6MDYgMjg4M10gREVC VUcgKERldkNvbnRyb2xsZXI6MTM5KSBXYWl0aW5nIGZvciBkZXZpY2VzIHRhcC4KWzIwMDkt MDgtMjYgMDI6MDg6MDYgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6MTM5KSBXYWl0aW5n IGZvciBkZXZpY2VzIHZ0cG0uClsyMDA5LTA4LTI2IDAyOjA4OjA2IDI4ODNdIElORk8gKFhl bmREb21haW46MTE4MCkgRG9tYWluIFdpbmRvd3NfU2VydmVyMjAwOCAoMykgdW5wYXVzZWQu ClsyMDA5LTA4LTI2IDAyOjEwOjQ3IDI4ODNdIERFQlVHIChYZW5kQ2hlY2twb2ludDoxMTAp IFt4Y19zYXZlXTogL3Vzci9saWIveGVuL2Jpbi94Y19zYXZlIDMxIDMgMCAwIDQKWzIwMDkt MDgtMjYgMDI6MTA6NDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSB4Y19zYXZl OiBmYWlsZWQgdG8gZ2V0IHRoZSBzdXNwZW5kIGV2dGNobiBwb3J0ClsyMDA5LTA4LTI2IDAy OjEwOjQ3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgClsyMDA5LTA4LTI2IDAy OjEwOjQ3IDI4ODNdIERFQlVHIChYZW5kQ2hlY2twb2ludDozODkpIHN1c3BlbmQKWzIwMDkt MDgtMjYgMDI6MTA6NDcgMjg4M10gREVCVUcgKFhlbmRDaGVja3BvaW50OjExMykgSW4gc2F2 ZUlucHV0SGFuZGxlciBzdXNwZW5kClsyMDA5LTA4LTI2IDAyOjEwOjQ3IDI4ODNdIERFQlVH IChYZW5kQ2hlY2twb2ludDoxMTUpIFN1c3BlbmRpbmcgMyAuLi4KWzIwMDktMDgtMjYgMDI6 MTA6NDcgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjUxOCkgWGVuZERvbWFpbkluZm8u c2h1dGRvd24oc3VzcGVuZCkKWzIwMDktMDgtMjYgMDI6MTA6NDcgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSAtLT54Y19kb21haW5fc2F2ZSgpClsyMDA5LTA4LTI2IDAyOjEw OjQ3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgcGxhdGZvcm0gaW5mbywgbWF4 X21mbjogN2Q0YjAsIGh2aXJ0X3N0YXJ0IGZmYzAwMDAwLCBwdF9sdmV2ZWwgNCwgZ3Vlc3Rf d2lkdGggOApbMjAwOS0wOC0yNiAwMjoxMDo0NyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIHNoYXJlZF9pbmZvX2ZyYW1lOiAweGZmZmZmClsyMDA5LTA4LTI2IDAyOjEwOjQ3 IDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoxNzI1KSBYZW5kRG9tYWluSW5mby5oYW5k bGVTaHV0ZG93bldhdGNoClsyMDA5LTA4LTI2IDAyOjEwOjQ3IDI4ODNdIElORk8gKFhlbmRE b21haW5JbmZvOjUzNSkgSFZNIHNhdmU6cmVtb3RlIHNodXRkb3duIGRvbSAzIQpbMjAwOS0w OC0yNiAwMjoxMDo0NyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDoxMjEpIERvbWFpbiAz IHN1c3BlbmRlZC4KWzIwMDktMDgtMjYgMDI6MTA6NDcgMjg4M10gSU5GTyAoWGVuZERvbWFp bkluZm86MTkxMykgRG9tYWluIGhhcyBzaHV0ZG93bjogbmFtZT1taWdyYXRpbmctV2luZG93 c19TZXJ2ZXIyMDA4IGlkPTMgcmVhc29uPXN1c3BlbmQuClsyMDA5LTA4LTI2IDAyOjEwOjQ3 IDI4ODNdIElORk8gKGltYWdlOjQ3Nikgc2lnbmFsRGV2aWNlTW9kZWw6cmVzdG9yZSBkbSBz dGF0ZSB0byBydW5uaW5nClsyMDA5LTA4LTI2IDAyOjEwOjQ3IDI4ODNdIERFQlVHIChYZW5k Q2hlY2twb2ludDoxMzApIFdyaXR0ZW4gZG9uZQpbMjAwOS0wOC0yNiAwMjoxMDo0NyAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIHAybV9zaXplOiAweDEwMDAwME5lZWQgYW5v dGhlciBidWZmZXIgZm9yIEhWTSBjb250ZXh0ClsyMDA5LTA4LTI2IDAyOjEwOjQ3IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgU2V0dXAgdGhlIG1mbl90b19wZm4gdGFibGUg bWFwcGluZwpbMjAwOS0wOC0yNiAwMjoxMDo0NyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIFN0YXJ0IHdyaXRpbmcgb3V0IHRoZSBzYXZlZC1kb21haW4gcmVjb3JkLgpbMjAw OS0wOC0yNiAwMjoxMDo1NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIFNhdmlu ZyBtZW1vcnkgcGFnZXM6IGl0ZXIgMSAgIDAlCAgICCAgNSUICAgIIDEwJQgICAggMTUlCAgI CCAyMCUICAgIIDI1JQgICAggMzAlCAgICCAzNSUICAgIIDQwJQgICAggNDUlCAgICCA1MCUI CAgIIDU1JQgICAggNjAlCAgICCA2NSUICAgIIDcwJQgICAggNzUlCAgICCA4MCUICAgIIDg1 JQgICAggOTAlCAgICCA5NSUNIDE6IHNlbnQgMTU3Njk2LCBza2lwcGVkIDAsIGRlbHRhIDgw MjJtcywgZG9tMCA1MCUsIHRhcmdldCAwJSwgc2VudCA2NDRNYi9zLCBkaXJ0aWVkIDBNYi9z IDAgcGFnZXMKWzIwMDktMDgtMjYgMDI6MTA6NTUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBUb3RhbCBwYWdlcyBzZW50PSAxNTc2OTYgKDAuMTV4KQpbMjAwOS0wOC0yNiAw MjoxMDo1NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIChvZiB3aGljaCAwIHdl cmUgZml4dXBzKQpbMjAwOS0wOC0yNiAwMjoxMDo1NSAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIEFsbCBtZW1vcnkgaXMgc2F2ZWQKWzIwMDktMDgtMjYgMDI6MTA6NTYgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBTYXZlIGV4aXQgcmM9MApbMjAwOS0wOC0y NiAwMjoxMDo1NiAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86Mjc1MCkgWGVuZERvbWFp bkluZm8uZGVzdHJveTogZG9taWQ9MwpbMjAwOS0wOC0yNiAwMjoxMDo1NiAyODgzXSBERUJV RyAoWGVuZERvbWFpbkluZm86MjIyMCkgRGVzdHJveWluZyBkZXZpY2UgbW9kZWwKWzIwMDkt MDgtMjYgMDI6MTA6NTYgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIyMjcpIFJlbGVh c2luZyBkZXZpY2VzClsyMDA5LTA4LTI2IDAyOjEwOjU2IDI4ODNdIERFQlVHIChYZW5kRG9t YWluSW5mbzoyMjQwKSBSZW1vdmluZyB2aWYvMApbMjAwOS0wOC0yNiAwMjoxMDo1NiAyODgz XSBERUJVRyAoWGVuZERvbWFpbkluZm86MTE0MikgWGVuZERvbWFpbkluZm8uZGVzdHJveURl dmljZTogZGV2aWNlQ2xhc3MgPSB2aWYsIGRldmljZSA9IHZpZi8wClsyMDA5LTA4LTI2IDAy OjEwOjU2IDI4ODNdIElORk8gKGltYWdlOjU1MykgbWlncmF0aW5nLVdpbmRvd3NfU2VydmVy MjAwOCBkZXZpY2UgbW9kZWwgdGVybWluYXRlZApbMjAwOS0wOC0yNiAwMjoxMDo1NiAyODgz XSBERUJVRyAoWGVuZERvbWFpbkluZm86MjI0MCkgUmVtb3ZpbmcgdmJkLzc2OApbMjAwOS0w OC0yNiAwMjoxMDo1NiAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86MTE0MikgWGVuZERv bWFpbkluZm8uZGVzdHJveURldmljZTogZGV2aWNlQ2xhc3MgPSB2YmQsIGRldmljZSA9IHZi ZC83NjgKWzIwMDktMDgtMjYgMDI6MTA6NTYgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZv OjIyNDApIFJlbW92aW5nIHZmYi8wClsyMDA5LTA4LTI2IDAyOjEwOjU2IDI4ODNdIERFQlVH IChYZW5kRG9tYWluSW5mbzoxMTQyKSBYZW5kRG9tYWluSW5mby5kZXN0cm95RGV2aWNlOiBk ZXZpY2VDbGFzcyA9IHZmYiwgZGV2aWNlID0gdmZiLzAKWzIwMDktMDgtMjYgMDI6MTA6NTYg Mjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIyNDApIFJlbW92aW5nIGNvbnNvbGUvMApb MjAwOS0wOC0yNiAwMjoxMDo1NiAyODgzXSBERUJVRyAoWGVuZERvbWFpbkluZm86MTE0Mikg WGVuZERvbWFpbkluZm8uZGVzdHJveURldmljZTogZGV2aWNlQ2xhc3MgPSBjb25zb2xlLCBk ZXZpY2UgPSBjb25zb2xlLzAKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKFhl bmREb21haW5JbmZvOjIyNykgWGVuZERvbWFpbkluZm8ucmVzdG9yZShbJ2RvbWFpbicsIFsn ZG9taWQnLCAnMyddLCBbJ29uX2NyYXNoJywgJ3Jlc3RhcnQnXSwgWyd1dWlkJywgJzY3ZjI3 YmNmLTk2ZDgtYTM2NS0wZjVhLWQ2ODNiZDM2ZTI4MSddLCBbJ2Jvb3Rsb2FkZXJfYXJncycs ICctcSddLCBbJ3ZjcHVzJywgJzEnXSwgWyduYW1lJywgJ1dpbmRvd3NfU2VydmVyMjAwOCdd LCBbJ29uX3Bvd2Vyb2ZmJywgJ2Rlc3Ryb3knXSwgWydvbl9yZWJvb3QnLCAncmVzdGFydCdd LCBbJ2NwdXMnLCBbW11dXSwgWydib290bG9hZGVyJywgJy91c3IvYmluL3B5Z3J1YiddLCBb J21heG1lbScsICc2MDAnXSwgWydtZW1vcnknLCAnNjAwJ10sIFsnc2hhZG93X21lbW9yeScs ICc2J10sIFsndmNwdV9hdmFpbCcsICcxJ10sIFsnZmVhdHVyZXMnXSwgWydvbl94ZW5kX3N0 YXJ0JywgJ2lnbm9yZSddLCBbJ29uX3hlbmRfc3RvcCcsICdpZ25vcmUnXSwgWydzdGFydF90 aW1lJywgJzEyNTEyMjM2ODUuMCddLCBbJ2NwdV90aW1lJywgJzAuMCddLCBbJ29ubGluZV92 Y3B1cycsICcxJ10sIFsnaW1hZ2UnLCBbJ2h2bScsIFsna2VybmVsJ10sIFsndmlkZW9yYW0n LCAnNCddLCBbJ2hwZXQnLCAnMCddLCBbJ3N0ZHZnYScsICcwJ10sIFsndm5jbGlzdGVuJywg JzAuMC4wLjAnXSwgWydsb2FkZXInLCAnL3Vzci9saWIveGVuL2Jvb3QvaHZtbG9hZGVyJ10s IFsnc2VyaWFsJywgJ3B0eSddLCBbJ3ZuY3VudXNlZCcsICcxJ10sIFsneGVuX3BsYXRmb3Jt X3BjaScsICcxJ10sIFsnYm9vdCcsICdkYyddLCBbJ3J0Y190aW1lb2Zmc2V0JywgJzAnXSwg WydwY2knLCBbXV0sIFsncGFlJywgJzEnXSwgWyd2cHRfYWxpZ24nLCAnMSddLCBbJ2hhcCcs ICcxJ10sIFsndmlyaWRpYW4nLCAnMCddLCBbJ2FjcGknLCAnMSddLCBbJ2xvY2FsdGltZScs ICcwJ10sIFsndGltZXJfbW9kZScsICcxJ10sIFsndm5jJywgJzEnXSwgWydub2dyYXBoaWMn LCAnMCddLCBbJ2d1ZXN0X29zX3R5cGUnLCAnZGVmYXVsdCddLCBbJ3BjaV9tc2l0cmFuc2xh dGUnLCAnMSddLCBbJ2FwaWMnLCAnMSddLCBbJ21vbml0b3InLCAnMCddLCBbJ3VzYmRldmlj ZScsICd0YWJsZXQnXSwgWydkZXZpY2VfbW9kZWwnLCAnL3Vzci9saWIveGVuL2Jpbi9xZW11 LWRtJ10sIFsncGNpX3Bvd2VyX21nbXQnLCAnMCddLCBbJ3VzYicsICcwJ10sIFsneGF1dGhv cml0eScsICcvcm9vdC8uWGF1dGhvcml0eSddLCBbJ2lzYScsICcwJ10sIFsnbm90ZXMnLCBb J1NVU1BFTkRfQ0FOQ0VMJywgJzEnXV1dXSwgWydzdGF0dXMnLCAnMiddLCBbJ3N0YXRlJywg Jy0tcC0tLSddLCBbJ3N0b3JlX21mbicsICcxMDQ0NDc2J10sIFsnZGV2aWNlJywgWyd2aWYn LCBbJ2JyaWRnZScsICd4ZW5icjAnXSwgWydtYWMnLCAnMDA6MTY6M2U6MjE6MGY6OGUnXSwg WydzY3JpcHQnLCAnL2V0Yy94ZW4vc2NyaXB0cy92aWYtYnJpZGdlJ10sIFsndXVpZCcsICdj MTcyOWM4OS02Y2E3LTA0YmItMWVhYS0yMjVjMDE0NGQ1ZmQnXSwgWydiYWNrZW5kJywgJzAn XV1dLCBbJ2RldmljZScsIFsndmJkJywgWyd1dWlkJywgJ2VkMDU0MGZjLTYwMjEtNTNmZS03 NWU4LWIyZTcyY2QzMzVlMiddLCBbJ2Jvb3RhYmxlJywgJzEnXSwgWydkZXYnLCAnaGRhOmRp c2snXSwgWyd1bmFtZScsICdmaWxlOi9tbnQvZGF0YS92bS9zcnYyMDA4L1N5c3RlbS5pbWcn XSwgWydtb2RlJywgJ3cnXSwgWydiYWNrZW5kJywgJzAnXSwgWydib290YWJsZScsICcxJ10s IFsnVkRJJ11dXSwgWydkZXZpY2UnLCBbJ3ZmYicsIFsndm5jdW51c2VkJywgJzEnXSwgWyd2 bmNsaXN0ZW4nLCAnMC4wLjAuMCddLCBbJ3ZuYycsICcxJ10sIFsndXVpZCcsICdhMzRkMmQw Yi04YmZmLTViYmMtNzBmYy1mYTNiNWM2ZjgyNjInXV1dLCBbJ2RldmljZScsIFsnY29uc29s ZScsIFsncHJvdG9jb2wnLCAndnQxMDAnXSwgWydsb2NhdGlvbicsICczJ10sIFsndXVpZCcs ICc2MTliNDExYi1iZThiLWNjZDEtMDdlZC1lODExNjk2OWViMTgnXV1dXSkKWzIwMDktMDgt MjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKFhlbmREb21haW5JbmZvOjIzMTcpIFhlbmREb21h aW5JbmZvLmNvbnN0cnVjdERvbWFpbgpbMjAwOS0wOC0yNiAwMjoxMTowMSAyODgzXSBERUJV RyAoYmFsbG9vbjoxODEpIEJhbGxvb246IDE0NzI3NzYgS2lCIGZyZWU7IG5lZWQgNDA5Njsg ZG9uZS4KWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKFhlbmREb21haW46NDUy KSBBZGRpbmcgRG9tYWluOiA0ClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIERFQlVHIChY ZW5kRG9tYWluSW5mbzozMDgyKSBTdG9yaW5nIFZNIGRldGFpbHM6IHsnb25feGVuZF9zdG9w JzogJ2lnbm9yZScsICdzaGFkb3dfbWVtb3J5JzogJzYnLCAndXVpZCc6ICc2N2YyN2JjZi05 NmQ4LWEzNjUtMGY1YS1kNjgzYmQzNmUyODEnLCAnb25fcmVib290JzogJ3Jlc3RhcnQnLCAn c3RhcnRfdGltZSc6ICcxMjUxMjIzNjg1LjAnLCAnb25fcG93ZXJvZmYnOiAnZGVzdHJveScs ICdib290bG9hZGVyX2FyZ3MnOiAnLXEnLCAnb25feGVuZF9zdGFydCc6ICdpZ25vcmUnLCAn b25fY3Jhc2gnOiAncmVzdGFydCcsICd4ZW5kL3Jlc3RhcnRfY291bnQnOiAnMCcsICd2Y3B1 cyc6ICcxJywgJ3ZjcHVfYXZhaWwnOiAnMScsICdib290bG9hZGVyJzogJy91c3IvYmluL3B5 Z3J1YicsICdpbWFnZSc6ICcoaHZtIChrZXJuZWwgKSAodmlkZW9yYW0gNCkgKGhwZXQgMCkg KHN0ZHZnYSAwKSAodm5jbGlzdGVuIDAuMC4wLjApIChsb2FkZXIgL3Vzci9saWIveGVuL2Jv b3QvaHZtbG9hZGVyKSAoc2VyaWFsIHB0eSkgKHZuY3VudXNlZCAxKSAoeGVuX3BsYXRmb3Jt X3BjaSAxKSAoYm9vdCBkYykgKHJ0Y190aW1lb2Zmc2V0IDApIChwY2kgKCkpIChwYWUgMSkg KHZwdF9hbGlnbiAxKSAoaGFwIDEpICh2aXJpZGlhbiAwKSAoYWNwaSAxKSAobG9jYWx0aW1l IDApICh0aW1lcl9tb2RlIDEpICh2bmMgMSkgKG5vZ3JhcGhpYyAwKSAoZ3Vlc3Rfb3NfdHlw ZSBkZWZhdWx0KSAocGNpX21zaXRyYW5zbGF0ZSAxKSAoYXBpYyAxKSAobW9uaXRvciAwKSAo dXNiZGV2aWNlIHRhYmxldCkgKGRldmljZV9tb2RlbCAvdXNyL2xpYi94ZW4vYmluL3FlbXUt ZG0pIChwY2lfcG93ZXJfbWdtdCAwKSAodXNiIDApICh4YXV0aG9yaXR5IC9yb290Ly5YYXV0 aG9yaXR5KSAoaXNhIDApIChub3RlcyAoU1VTUEVORF9DQU5DRUwgMSkpKScsICduYW1lJzog J1dpbmRvd3NfU2VydmVyMjAwOCd9ClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIElORk8g KFhlbmREb21haW5JbmZvOjIxNzgpIGNyZWF0ZURldmljZTogdmZiIDogeyd2bmN1bnVzZWQn OiAnMScsICd2bmNsaXN0ZW4nOiAnMC4wLjAuMCcsICd2bmMnOiAnMScsICd1dWlkJzogJ2Ez NGQyZDBiLThiZmYtNWJiYy03MGZjLWZhM2I1YzZmODI2MicsICdvdGhlcl9jb25maWcnOiB7 J3ZuY3VudXNlZCc6ICcxJywgJ3ZuY2xpc3Rlbic6ICcwLjAuMC4wJywgJ3ZuYyc6ICcxJ319 ClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk1KSBE ZXZDb250cm9sbGVyOiB3cml0aW5nIHsnc3RhdGUnOiAnMScsICdiYWNrZW5kLWlkJzogJzAn LCAnYmFja2VuZCc6ICcvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92ZmIvNC8wJ30gdG8gL2xv Y2FsL2RvbWFpbi80L2RldmljZS92ZmIvMC4KWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10g REVCVUcgKERldkNvbnRyb2xsZXI6OTcpIERldkNvbnRyb2xsZXI6IHdyaXRpbmcgeyd2bmN1 bnVzZWQnOiAnMScsICdkb21haW4nOiAnV2luZG93c19TZXJ2ZXIyMDA4JywgJ2Zyb250ZW5k JzogJy9sb2NhbC9kb21haW4vNC9kZXZpY2UvdmZiLzAnLCAndXVpZCc6ICdhMzRkMmQwYi04 YmZmLTViYmMtNzBmYy1mYTNiNWM2ZjgyNjInLCAnZnJvbnRlbmQtaWQnOiAnNCcsICd2bmNs aXN0ZW4nOiAnMC4wLjAuMCcsICdzdGF0ZSc6ICcxJywgJ29ubGluZSc6ICcxJywgJ3ZuYyc6 ICcxJ30gdG8gL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmZiLzQvMC4KWzIwMDktMDgtMjYg MDI6MTE6MDEgMjg4M10gSU5GTyAoWGVuZERvbWFpbkluZm86MjE3OCkgY3JlYXRlRGV2aWNl OiBjb25zb2xlIDogeydwcm90b2NvbCc6ICd2dDEwMCcsICdsb2NhdGlvbic6ICczJywgJ3V1 aWQnOiAnNjE5YjQxMWItYmU4Yi1jY2QxLTA3ZWQtZTgxMTY5NjllYjE4J30KWzIwMDktMDgt MjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6OTUpIERldkNvbnRyb2xs ZXI6IHdyaXRpbmcgeydzdGF0ZSc6ICcxJywgJ2JhY2tlbmQtaWQnOiAnMCcsICdiYWNrZW5k JzogJy9sb2NhbC9kb21haW4vMC9iYWNrZW5kL2NvbnNvbGUvNC8wJ30gdG8gL2xvY2FsL2Rv bWFpbi80L2RldmljZS9jb25zb2xlLzAuClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIERF QlVHIChEZXZDb250cm9sbGVyOjk3KSBEZXZDb250cm9sbGVyOiB3cml0aW5nIHsnZG9tYWlu JzogJ1dpbmRvd3NfU2VydmVyMjAwOCcsICdmcm9udGVuZCc6ICcvbG9jYWwvZG9tYWluLzQv ZGV2aWNlL2NvbnNvbGUvMCcsICd1dWlkJzogJzYxOWI0MTFiLWJlOGItY2NkMS0wN2VkLWU4 MTE2OTY5ZWIxOCcsICdmcm9udGVuZC1pZCc6ICc0JywgJ3N0YXRlJzogJzEnLCAnbG9jYXRp b24nOiAnMycsICdvbmxpbmUnOiAnMScsICdwcm90b2NvbCc6ICd2dDEwMCd9IHRvIC9sb2Nh bC9kb21haW4vMC9iYWNrZW5kL2NvbnNvbGUvNC8wLgpbMjAwOS0wOC0yNiAwMjoxMTowMSAy ODgzXSBJTkZPIChYZW5kRG9tYWluSW5mbzoyMTc4KSBjcmVhdGVEZXZpY2U6IHZiZCA6IHsn dXVpZCc6ICdlZDA1NDBmYy02MDIxLTUzZmUtNzVlOC1iMmU3MmNkMzM1ZTInLCAnYm9vdGFi bGUnOiAnMScsICdkcml2ZXInOiAncGFyYXZpcnR1YWxpc2VkJywgJ2Rldic6ICdoZGE6ZGlz aycsICd1bmFtZSc6ICdmaWxlOi9tbnQvZGF0YS92bS9zcnYyMDA4L1N5c3RlbS5pbWcnLCAn bW9kZSc6ICd3JywgJ2JhY2tlbmQnOiAnMCd9ClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNd IERFQlVHIChEZXZDb250cm9sbGVyOjk1KSBEZXZDb250cm9sbGVyOiB3cml0aW5nIHsnYmFj a2VuZC1pZCc6ICcwJywgJ3ZpcnR1YWwtZGV2aWNlJzogJzc2OCcsICdkZXZpY2UtdHlwZSc6 ICdkaXNrJywgJ3N0YXRlJzogJzEnLCAnYmFja2VuZCc6ICcvbG9jYWwvZG9tYWluLzAvYmFj a2VuZC92YmQvNC83NjgnfSB0byAvbG9jYWwvZG9tYWluLzQvZGV2aWNlL3ZiZC83NjguClsy MDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjk3KSBEZXZD b250cm9sbGVyOiB3cml0aW5nIHsnZG9tYWluJzogJ1dpbmRvd3NfU2VydmVyMjAwOCcsICdm cm9udGVuZCc6ICcvbG9jYWwvZG9tYWluLzQvZGV2aWNlL3ZiZC83NjgnLCAndXVpZCc6ICdl ZDA1NDBmYy02MDIxLTUzZmUtNzVlOC1iMmU3MmNkMzM1ZTInLCAnYm9vdGFibGUnOiAnMScs ICdkZXYnOiAnaGRhJywgJ3N0YXRlJzogJzEnLCAncGFyYW1zJzogJy9tbnQvZGF0YS92bS9z cnYyMDA4L1N5c3RlbS5pbWcnLCAnbW9kZSc6ICd3JywgJ29ubGluZSc6ICcxJywgJ2Zyb250 ZW5kLWlkJzogJzQnLCAndHlwZSc6ICdmaWxlJ30gdG8gL2xvY2FsL2RvbWFpbi8wL2JhY2tl bmQvdmJkLzQvNzY4LgpbMjAwOS0wOC0yNiAwMjoxMTowMSAyODgzXSBJTkZPIChYZW5kRG9t YWluSW5mbzoyMTc4KSBjcmVhdGVEZXZpY2U6IHZpZiA6IHsnYnJpZGdlJzogJ3hlbmJyMCcs ICdtYWMnOiAnMDA6MTY6M2U6MjE6MGY6OGUnLCAnc2NyaXB0JzogJy9ldGMveGVuL3Njcmlw dHMvdmlmLWJyaWRnZScsICd1dWlkJzogJ2MxNzI5Yzg5LTZjYTctMDRiYi0xZWFhLTIyNWMw MTQ0ZDVmZCcsICdiYWNrZW5kJzogJzAnfQpbMjAwOS0wOC0yNiAwMjoxMTowMSAyODgzXSBE RUJVRyAoRGV2Q29udHJvbGxlcjo5NSkgRGV2Q29udHJvbGxlcjogd3JpdGluZyB7J2JhY2tl bmQtaWQnOiAnMCcsICdtYWMnOiAnMDA6MTY6M2U6MjE6MGY6OGUnLCAnaGFuZGxlJzogJzAn LCAnc3RhdGUnOiAnMScsICdiYWNrZW5kJzogJy9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3Zp Zi80LzAnfSB0byAvbG9jYWwvZG9tYWluLzQvZGV2aWNlL3ZpZi8wLgpbMjAwOS0wOC0yNiAw MjoxMTowMSAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjo5NykgRGV2Q29udHJvbGxlcjog d3JpdGluZyB7J2JyaWRnZSc6ICd4ZW5icjAnLCAnZG9tYWluJzogJ1dpbmRvd3NfU2VydmVy MjAwOCcsICdoYW5kbGUnOiAnMCcsICd1dWlkJzogJ2MxNzI5Yzg5LTZjYTctMDRiYi0xZWFh LTIyNWMwMTQ0ZDVmZCcsICdzY3JpcHQnOiAnL2V0Yy94ZW4vc2NyaXB0cy92aWYtYnJpZGdl JywgJ21hYyc6ICcwMDoxNjozZToyMTowZjo4ZScsICdmcm9udGVuZC1pZCc6ICc0JywgJ3N0 YXRlJzogJzEnLCAnb25saW5lJzogJzEnLCAnZnJvbnRlbmQnOiAnL2xvY2FsL2RvbWFpbi80 L2RldmljZS92aWYvMCd9IHRvIC9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZpZi80LzAuClsy MDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoxNjM4KSBT dG9yaW5nIGRvbWFpbiBkZXRhaWxzOiB7J2NvbnNvbGUvcG9ydCc6ICczJywgJ25hbWUnOiAn V2luZG93c19TZXJ2ZXIyMDA4JywgJ2NvbnNvbGUvbGltaXQnOiAnMTA0ODU3NicsICdpbWFn ZS9zdXNwZW5kLWNhbmNlbCc6ICcxJywgJ2RvbWlkJzogJzQnLCAndm0nOiAnL3ZtLzY3ZjI3 YmNmLTk2ZDgtYTM2NS0wZjVhLWQ2ODNiZDM2ZTI4MScsICdjcHUvMC9hdmFpbGFiaWxpdHkn OiAnb25saW5lJywgJ21lbW9yeS90YXJnZXQnOiAnNjE0NDAwJywgJ2NvbnRyb2wvcGxhdGZv cm0tZmVhdHVyZS1tdWx0aXByb2Nlc3Nvci1zdXNwZW5kJzogJzEnLCAnY29uc29sZS90eXBl JzogJ2lvZW11JywgJ3N0b3JlL3BvcnQnOiAnMid9ClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjI0MykgcmVzdG9yZSBodm0gZG9tYWluIDQsIGFw aWM9MSwgcGFlPTEKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKGltYWdlOjMx OSkgTm8gVk5DIHBhc3N3ZCBjb25maWd1cmVkIGZvciB2ZmIgYWNjZXNzClsyMDA5LTA4LTI2 IDAyOjExOjAxIDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGJvb3QsIHZhbDogZGMK WzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogZmRh LCB2YWw6IE5vbmUKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKGltYWdlOjgw NikgYXJnczogZmRiLCB2YWw6IE5vbmUKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVC VUcgKGltYWdlOjgwNikgYXJnczogc291bmRodywgdmFsOiBOb25lClsyMDA5LTA4LTI2IDAy OjExOjAxIDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGxvY2FsdGltZSwgdmFsOiAw ClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IHNl cmlhbCwgdmFsOiBbJ3B0eSddClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIERFQlVHIChp bWFnZTo4MDYpIGFyZ3M6IHN0ZC12Z2EsIHZhbDogMApbMjAwOS0wOC0yNiAwMjoxMTowMSAy ODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBpc2EsIHZhbDogMApbMjAwOS0wOC0yNiAw MjoxMTowMSAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBhY3BpLCB2YWw6IDEKWzIw MDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogdXNiLCB2 YWw6IDAKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJn czogdXNiZGV2aWNlLCB2YWw6IHRhYmxldApbMjAwOS0wOC0yNiAwMjoxMTowMSAyODgzXSBJ TkZPIChpbWFnZTo3NDIpIE5lZWQgdG8gY3JlYXRlIHBsYXRmb3JtIGRldmljZS5bZG9taWQ6 NF0KWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gREVCVUcgKFhlbmRDaGVja3BvaW50OjI2 MSkgcmVzdG9yZTpzaGFkb3c9MHg2LCBfc3RhdGljX21heD0weDI1ODAwMDAwLCBfc3RhdGlj X21pbj0weDAsIApbMjAwOS0wOC0yNiAwMjoxMTowMSAyODgzXSBERUJVRyAoYmFsbG9vbjox ODEpIEJhbGxvb246IDE0NzEzNjQgS2lCIGZyZWU7IG5lZWQgNjI0NjQwOyBkb25lLgpbMjAw OS0wOC0yNiAwMjoxMTowMSAyODgzXSBERUJVRyAoWGVuZENoZWNrcG9pbnQ6Mjc4KSBbeGNf cmVzdG9yZV06IC91c3IvbGliL3hlbi9iaW4veGNfcmVzdG9yZSAzMSA0IDIgMyAxIDEgMQpb MjAwOS0wOC0yNiAwMjoxMTowMSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIC0t PnhjX2RvbWFpbl9yZXN0b3JlKCkKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSB4Y19kb21haW5fcmVzdG9yZSBzdGFydDogcDJtX3NpemUg PSAxMDAwMDAKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBwbGF0Zm9ybSBpbmZvLCBtYXhfbWZuOiA3ZDRiMCwgaHZpcnRfc3RhcnQgZmZj MDAwMDAsIHB0X2x2ZXZlbCA0LCBndWVzdF93aWR0aCA4ClsyMDA5LTA4LTI2IDAyOjExOjAx IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbWVtb3J5IGFsbG9jIHN1Y2Nlc3MK WzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBs b2NrIHJlZ2luX21mbiBhbmQgcDJtX2JhdGNoIHN1Y2Nlc3MKWzIwMDktMDgtMjYgMDI6MTE6 MDEgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBzaGFyZWRfaW5mb19mcmFtZTog MHhmZmZmZmZmZgpbMjAwOS0wOC0yNiAwMjoxMTowMSAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIGFsbCBQRk5zIGFyZSBtYXJrZWQgYXMgaW52YWxpZApbMjAwOS0wOC0yNiAw MjoxMTowMSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIFJlbG9hZGluZyBtZW1v cnkgcGFnZXM6ICAgMCUKWzIwMDktMDgtMjYgMDI6MTE6MDEgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAxIDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogOTkyClsyMDA5LTA4LTI2IDAyOjEx OjAyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0w OC0yNiAwMjoxMTowMiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6 IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAyIDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMiAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6 MTE6MDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0Clsy MDA5LTA4LTI2IDAyOjExOjAyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0 Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAyIDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0y NiAwMjoxMTowMiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQK WzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBu cl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAyIDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMiAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6 MDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4 LTI2IDAyOjExOjAyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczog MTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAyIDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjox MTowMiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIw MDktMDgtMjYgMDI6MTE6MDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRj aCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMiAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2 IDAyOjExOjAyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApb MjAwOS0wOC0yNiAwMjoxMTowMiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5y X21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAyIDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTow MiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgt MjYgMDI6MTE6MDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAx MDI0ClsyMDA5LTA4LTI2IDAyOjExOjAyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMiAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjEx OjAyIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAw OS0wOC0yNiAwMjoxMTowMiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNo IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDIgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAzIDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMyAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYg MDI6MTE6MDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0Clsy MDA5LTA4LTI2IDAyOjExOjAzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJf bWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMyAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDMgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAz IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0y NiAwMjoxMTowMyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEw MjQKWzIwMDktMDgtMjYgMDI6MTE6MDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAzIDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMyAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6 MDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5 LTA4LTI2IDAyOjExOjAzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2gg MTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDMgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAzIDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAw MjoxMTowMyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIw MDktMDgtMjYgMDI6MTE6MDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9t Zm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAzIDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMyAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDMg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2 IDAyOjExOjAzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAy NApbMjAwOS0wOC0yNiAwMjoxMTowMyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDMgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAzIDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTow MyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDkt MDgtMjYgMDI6MTE6MDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAx MDI0ClsyMDA5LTA4LTI2IDAyOjExOjAzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowMyAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDMgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAy OjExOjAzIDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAw OS0wOC0yNiAwMjoxMTowMyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21m bnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDMgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjAzIDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYg MDI6MTE6MDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0 ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg YmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA0 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0w OC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEw MjQKWzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6 MTE6MDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5 LTA4LTI2IDAyOjExOjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZu czogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAw MjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQK WzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBi YXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDQg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4 LTI2IDAyOjExOjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAy NApbMjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjox MTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDkt MDgtMjYgMDI6MTE6MDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5z OiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAy OjExOjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApb MjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJh dGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgt MjYgMDI6MTE6MDQgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0 ClsyMDA5LTA4LTI2IDAyOjExOjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg bnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDQgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjEx OjA0IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0w OC0yNiAwMjoxMTowNCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6 IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6 MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0Clsy MDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0 Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0y NiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQK WzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBu cl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6 MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4 LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczog MTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjox MTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIw MDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRj aCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2 IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApb MjAwOS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5y X21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTow NSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgt MjYgMDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAx MDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjEx OjA1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAw OS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNo IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYg MDI6MTE6MDUgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0Clsy MDA5LTA4LTI2IDAyOjExOjA1IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJf bWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDUgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA1 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0y NiAwMjoxMTowNSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEw MjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6 MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5 LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2gg MTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAw MjoxMTowNiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIw MDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9t Zm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDYg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2 IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAy NApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTow NiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDkt MDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAx MDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAy OjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAw OS0wOC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21m bnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYg MDI6MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0 ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg YmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0w OC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEw MjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6 MTE6MDYgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5 LTA4LTI2IDAyOjExOjA2IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZu czogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNiAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDYgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAw MjoxMTowNyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQK WzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBi YXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNyAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDcg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4 LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAy NApbMjAwOS0wOC0yNiAwMjoxMTowNyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjox MTowNyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDkt MDgtMjYgMDI6MTE6MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5z OiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNyAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAy OjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApb MjAwOS0wOC0yNiAwMjoxMTowNyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJh dGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNyAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgt MjYgMDI6MTE6MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0 ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg bnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNyAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjEx OjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0w OC0yNiAwMjoxMTowNyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6 IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNyAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6 MTE6MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0Clsy MDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0 Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0y NiAwMjoxMTowNyAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQK WzIwMDktMDgtMjYgMDI6MTE6MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBu cl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowNyAyODgzXSBJTkZP IChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6 MDcgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4 LTI2IDAyOjExOjA3IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczog MTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENo ZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjox MTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIw MDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRj aCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOCAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4 M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2 IDAyOjExOjA4IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApb MjAwOS0wOC0yNiAwMjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5y X21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4IDI4ODNdIElORk8g KFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTow OCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgt MjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAx MDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjEx OjA4IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAw OS0wOC0yNiAwMjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNo IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6 NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4IDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOCAyODgz XSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYg MDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0Clsy MDA5LTA4LTI2IDAyOjExOjA4IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJf bWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAo WGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0y NiAwMjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEw MjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4IDI4ODNdIElORk8gKFhlbmRDaGVj a3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOCAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6 MDggMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5 LTA4LTI2IDAyOjExOjA4IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2gg MTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0 MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA4IDI4ODNd IElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAw MjoxMTowOCAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIw MDktMDgtMjYgMDI6MTE6MDggMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9t Zm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3Bv aW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChY ZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDkg Mjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2 IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAy NApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgp IGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNr cG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElO Rk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTow OSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDkt MDgtMjYgMDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAx MDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQx OCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAy OjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAw OS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21m bnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9p bnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhl bmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOSAy ODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYg MDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0 ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkg YmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hlY2tw b2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gSU5G TyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5 IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZuczogMTAyNApbMjAwOS0w OC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJhdGNoIDEw MjQKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4 KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRD aGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJ TkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDEwMjQKWzIwMDktMDgtMjYgMDI6 MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAxMDI0ClsyMDA5 LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgbnJfbWZu czogMTAyNApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2lu dDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gSU5GTyAoWGVu ZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4 ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggMTAyNApbMjAwOS0wOC0yNiAw MjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIG5yX21mbnM6IDcKWzIw MDktMDgtMjYgMDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRj aCAxMDI0ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgbnJfbWZuczogNApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5k Q2hlY2twb2ludDo0MTgpIGJhdGNoIDEwMjQKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10g SU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBucl9tZm5zOiAxClsyMDA5LTA4LTI2IDAyOjEx OjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50OjQxOCkgYmF0Y2ggLTIKWzIwMDktMDgt MjYgMDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBiYXRjaCAtMwpb MjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hlY2twb2ludDo0MTgpIGJh dGNoIC00ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIElORk8gKFhlbmRDaGVja3BvaW50 OjQxOCkgYmF0Y2ggMApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBJTkZPIChYZW5kQ2hl Y2twb2ludDo0MTgpIFJlY2VpdmVkIGFsbCBwYWdlcyAoMCByYWNlcykKWzIwMDktMDgtMjYg MDI6MTE6MDkgMjg4M10gSU5GTyAoWGVuZENoZWNrcG9pbnQ6NDE4KSBSZXN0b3JlIGV4aXQg d2l0aCByYz0wClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIERFQlVHIChYZW5kQ2hlY2tw b2ludDozODkpIHN0b3JlLW1mbiAxMDQ0NDc2ClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNd IERFQlVHIChYZW5kRG9tYWluSW5mbzoyNjg4KSBYZW5kRG9tYWluSW5mby5jb21wbGV0ZVJl c3RvcmUKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gREVCVUcgKGltYWdlOjMxOSkgTm8g Vk5DIHBhc3N3ZCBjb25maWd1cmVkIGZvciB2ZmIgYWNjZXNzClsyMDA5LTA4LTI2IDAyOjEx OjA5IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGJvb3QsIHZhbDogZGMKWzIwMDkt MDgtMjYgMDI6MTE6MDkgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogZmRhLCB2YWw6 IE5vbmUKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJn czogZmRiLCB2YWw6IE5vbmUKWzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gREVCVUcgKGlt YWdlOjgwNikgYXJnczogc291bmRodywgdmFsOiBOb25lClsyMDA5LTA4LTI2IDAyOjExOjA5 IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IGxvY2FsdGltZSwgdmFsOiAwClsyMDA5 LTA4LTI2IDAyOjExOjA5IDI4ODNdIERFQlVHIChpbWFnZTo4MDYpIGFyZ3M6IHNlcmlhbCwg dmFsOiBbJ3B0eSddClsyMDA5LTA4LTI2IDAyOjExOjA5IDI4ODNdIERFQlVHIChpbWFnZTo4 MDYpIGFyZ3M6IHN0ZC12Z2EsIHZhbDogMApbMjAwOS0wOC0yNiAwMjoxMTowOSAyODgzXSBE RUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBpc2EsIHZhbDogMApbMjAwOS0wOC0yNiAwMjoxMTow OSAyODgzXSBERUJVRyAoaW1hZ2U6ODA2KSBhcmdzOiBhY3BpLCB2YWw6IDEKWzIwMDktMDgt MjYgMDI6MTE6MDkgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogdXNiLCB2YWw6IDAK WzIwMDktMDgtMjYgMDI6MTE6MDkgMjg4M10gREVCVUcgKGltYWdlOjgwNikgYXJnczogdXNi ZGV2aWNlLCB2YWw6IHRhYmxldApbMjAwOS0wOC0yNiAwMjoxMToxMCAyODgzXSBJTkZPIChp bWFnZTo3NDIpIE5lZWQgdG8gY3JlYXRlIHBsYXRmb3JtIGRldmljZS5bZG9taWQ6NF0KWzIw MDktMDgtMjYgMDI6MTE6MTAgMjg4M10gSU5GTyAoaW1hZ2U6MzkxKSBzcGF3bmluZyBkZXZp Y2UgbW9kZWxzOiAvdXNyL2xpYi94ZW4vYmluL3FlbXUtZG0gWycvdXNyL2xpYi94ZW4vYmlu L3FlbXUtZG0nLCAnLWQnLCAnNCcsICctZG9tYWluLW5hbWUnLCAnV2luZG93c19TZXJ2ZXIy MDA4JywgJy12aWRlb3JhbScsICc0JywgJy12bmMnLCAnMC4wLjAuMDowJywgJy12bmN1bnVz ZWQnLCAnLXZjcHVzJywgJzEnLCAnLWJvb3QnLCAnZGMnLCAnLXNlcmlhbCcsICdwdHknLCAn LWFjcGknLCAnLXVzYmRldmljZScsICd0YWJsZXQnLCAnLW5ldCcsICduaWMsdmxhbj0xLG1h Y2FkZHI9MDA6MTY6M2U6MjE6MGY6OGUsbW9kZWw9cnRsODEzOScsICctbmV0JywgJ3RhcCx2 bGFuPTEsaWZuYW1lPXRhcDQuMCxicmlkZ2U9eGVuYnIwJywgJy1NJywgJ3hlbmZ2JywgJy1s b2Fkdm0nLCAnL3Zhci9saWIveGVuL3FlbXUtc2F2ZS40J10KWzIwMDktMDgtMjYgMDI6MTE6 MTAgMjg4M10gSU5GTyAoaW1hZ2U6NDQwKSBkZXZpY2UgbW9kZWwgcGlkOiA4MTA5ClsyMDA5 LTA4LTI2IDAyOjExOjEwIDI4ODNdIERFQlVHIChYZW5kRG9tYWluSW5mbzoxNjM4KSBTdG9y aW5nIGRvbWFpbiBkZXRhaWxzOiB7J2NvbnNvbGUvcG9ydCc6ICczJywgJ25hbWUnOiAnV2lu ZG93c19TZXJ2ZXIyMDA4JywgJ2NvbnNvbGUvbGltaXQnOiAnMTA0ODU3NicsICdzdG9yZS9w b3J0JzogJzInLCAndm0nOiAnL3ZtLzY3ZjI3YmNmLTk2ZDgtYTM2NS0wZjVhLWQ2ODNiZDM2 ZTI4MScsICdkb21pZCc6ICc0JywgJ2ltYWdlL3N1c3BlbmQtY2FuY2VsJzogJzEnLCAnY3B1 LzAvYXZhaWxhYmlsaXR5JzogJ29ubGluZScsICdtZW1vcnkvdGFyZ2V0JzogJzYxNDQwMCcs ICdjb250cm9sL3BsYXRmb3JtLWZlYXR1cmUtbXVsdGlwcm9jZXNzb3Itc3VzcGVuZCc6ICcx JywgJ3N0b3JlL3JpbmctcmVmJzogJzEwNDQ0NzYnLCAnY29uc29sZS90eXBlJzogJ2lvZW11 J30KWzIwMDktMDgtMjYgMDI6MTE6MTAgMjg4M10gSU5GTyAoaW1hZ2U6NTI4KSB3YWl0aW5n IGZvciBzZW50aW5lbF9maWZvClsyMDA5LTA4LTI2IDAyOjExOjEwIDI4ODNdIERFQlVHIChY ZW5kRG9tYWluSW5mbzoyNzAxKSBYZW5kRG9tYWluSW5mby5jb21wbGV0ZVJlc3RvcmUgZG9u ZQpbMjAwOS0wOC0yNiAwMjoxMToxMCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkp IFdhaXRpbmcgZm9yIGRldmljZXMgdmlmLgpbMjAwOS0wOC0yNiAwMjoxMToxMCAyODgzXSBE RUJVRyAoWGVuZERvbWFpbkluZm86MTcyNSkgWGVuZERvbWFpbkluZm8uaGFuZGxlU2h1dGRv d25XYXRjaApbMjAwOS0wOC0yNiAwMjoxMToxMCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxl cjoxNDQpIFdhaXRpbmcgZm9yIDAuClsyMDA5LTA4LTI2IDAyOjExOjEwIDI4ODNdIERFQlVH IChEZXZDb250cm9sbGVyOjYyOSkgaG90cGx1Z1N0YXR1c0NhbGxiYWNrIC9sb2NhbC9kb21h aW4vMC9iYWNrZW5kL3ZpZi80LzAvaG90cGx1Zy1zdGF0dXMuClsyMDA5LTA4LTI2IDAyOjEx OjEwIDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjY0MykgaG90cGx1Z1N0YXR1c0NhbGxi YWNrIDEuClsyMDA5LTA4LTI2IDAyOjExOjEwIDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVy OjEzOSkgV2FpdGluZyBmb3IgZGV2aWNlcyB2c2NzaS4KWzIwMDktMDgtMjYgMDI6MTE6MTAg Mjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6MTM5KSBXYWl0aW5nIGZvciBkZXZpY2VzIHZi ZC4KWzIwMDktMDgtMjYgMDI6MTE6MTAgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6MTQ0 KSBXYWl0aW5nIGZvciA3NjguClsyMDA5LTA4LTI2IDAyOjExOjEwIDI4ODNdIERFQlVHIChE ZXZDb250cm9sbGVyOjYyOSkgaG90cGx1Z1N0YXR1c0NhbGxiYWNrIC9sb2NhbC9kb21haW4v MC9iYWNrZW5kL3ZiZC80Lzc2OC9ob3RwbHVnLXN0YXR1cy4KWzIwMDktMDgtMjYgMDI6MTE6 MTAgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6NjQzKSBob3RwbHVnU3RhdHVzQ2FsbGJh Y2sgMS4KWzIwMDktMDgtMjYgMDI6MTE6MTAgMjg4M10gREVCVUcgKERldkNvbnRyb2xsZXI6 MTM5KSBXYWl0aW5nIGZvciBkZXZpY2VzIGlycS4KWzIwMDktMDgtMjYgMDI6MTE6MTAgMjg4 M10gREVCVUcgKERldkNvbnRyb2xsZXI6MTM5KSBXYWl0aW5nIGZvciBkZXZpY2VzIHZrYmQu ClsyMDA5LTA4LTI2IDAyOjExOjEwIDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjEzOSkg V2FpdGluZyBmb3IgZGV2aWNlcyB2ZmIuClsyMDA5LTA4LTI2IDAyOjExOjEwIDI4ODNdIERF QlVHIChEZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3IgZGV2aWNlcyBjb25zb2xlLgpb MjAwOS0wOC0yNiAwMjoxMToxMCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxNDQpIFdh aXRpbmcgZm9yIDAuClsyMDA5LTA4LTI2IDAyOjExOjEwIDI4ODNdIERFQlVHIChEZXZDb250 cm9sbGVyOjEzOSkgV2FpdGluZyBmb3IgZGV2aWNlcyBwY2kuClsyMDA5LTA4LTI2IDAyOjEx OjEwIDI4ODNdIERFQlVHIChEZXZDb250cm9sbGVyOjEzOSkgV2FpdGluZyBmb3IgZGV2aWNl cyBpb3BvcnRzLgpbMjAwOS0wOC0yNiAwMjoxMToxMCAyODgzXSBERUJVRyAoRGV2Q29udHJv bGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMgdGFwLgpbMjAwOS0wOC0yNiAwMjoxMTox MCAyODgzXSBERUJVRyAoRGV2Q29udHJvbGxlcjoxMzkpIFdhaXRpbmcgZm9yIGRldmljZXMg dnRwbS4K --------------070001090300020905000106 Content-Type: text/plain; name="xc_domain_restore.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xc_domain_restore.c" /****************************************************************************** * xc_domain_restore.c * * Restore the state of a guest session. * * Copyright (c) 2003, K A Fraser. * Copyright (c) 2006, Intel Corporation * Copyright (c) 2007, XenSource Inc. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307 USA. * */ #include #include #include "xg_private.h" #include "xg_save_restore.h" #include "xc_dom.h" #include #include /* max mfn of the current host machine */ static unsigned long max_mfn; /* virtual starting address of the hypervisor */ static unsigned long hvirt_start; /* #levels of page tables used by the current guest */ static unsigned int pt_levels; /* number of pfns this guest has (i.e. number of entries in the P2M) */ static unsigned long p2m_size; /* number of 'in use' pfns in the guest (i.e. #P2M entries with a valid mfn) */ static unsigned long nr_pfns; /* Live mapping of the table mapping each PFN to its current MFN. */ static xen_pfn_t *live_p2m = NULL; /* A table mapping each PFN to its new MFN. */ static xen_pfn_t *p2m = NULL; /* A table of P2M mappings in the current region */ static xen_pfn_t *p2m_batch = NULL; /* Address size of the guest, in bytes */ unsigned int guest_width; /* ** In the state file (or during transfer), all page-table pages are ** converted into a 'canonical' form where references to actual mfns ** are replaced with references to the corresponding pfns. ** This function inverts that operation, replacing the pfn values with ** the (now known) appropriate mfn values. */ static int uncanonicalize_pagetable(int xc_handle, uint32_t dom, unsigned long type, void *page) { int i, pte_last; unsigned long pfn; uint64_t pte; int nr_mfns = 0; pte_last = PAGE_SIZE / ((pt_levels == 2)? 4 : 8); /* First pass: work out how many (if any) MFNs we need to alloc */ for ( i = 0; i < pte_last; i++ ) { if ( pt_levels == 2 ) pte = ((uint32_t *)page)[i]; else pte = ((uint64_t *)page)[i]; /* XXX SMH: below needs fixing for PROT_NONE etc */ if ( !(pte & _PAGE_PRESENT) ) continue; pfn = (pte >> PAGE_SHIFT) & MFN_MASK_X86; if ( pfn >= p2m_size ) { /* This "page table page" is probably not one; bail. */ ERROR("Frame number in type %lu page table is out of range: " "i=%d pfn=0x%lx p2m_size=%lu", type >> 28, i, pfn, p2m_size); return 0; } if ( p2m[pfn] == INVALID_P2M_ENTRY ) { /* Have a 'valid' PFN without a matching MFN - need to alloc */ p2m_batch[nr_mfns++] = pfn; p2m[pfn]--; } } /* Allocate the requisite number of mfns. */ if ( nr_mfns && (xc_domain_memory_populate_physmap(xc_handle, dom, nr_mfns, 0, 0, p2m_batch) != 0) ) { ERROR("Failed to allocate memory for batch.!\n"); errno = ENOMEM; return 0; } /* Second pass: uncanonicalize each present PTE */ nr_mfns = 0; for ( i = 0; i < pte_last; i++ ) { if ( pt_levels == 2 ) pte = ((uint32_t *)page)[i]; else pte = ((uint64_t *)page)[i]; /* XXX SMH: below needs fixing for PROT_NONE etc */ if ( !(pte & _PAGE_PRESENT) ) continue; pfn = (pte >> PAGE_SHIFT) & MFN_MASK_X86; if ( p2m[pfn] == (INVALID_P2M_ENTRY-1) ) p2m[pfn] = p2m_batch[nr_mfns++]; pte &= ~MADDR_MASK_X86; pte |= (uint64_t)p2m[pfn] << PAGE_SHIFT; if ( pt_levels == 2 ) ((uint32_t *)page)[i] = (uint32_t)pte; else ((uint64_t *)page)[i] = (uint64_t)pte; } return 1; } /* Load the p2m frame list, plus potential extended info chunk */ static xen_pfn_t *load_p2m_frame_list( int io_fd, int *pae_extended_cr3, int *ext_vcpucontext) { xen_pfn_t *p2m_frame_list; vcpu_guest_context_any_t ctxt; xen_pfn_t p2m_fl_zero; /* Read first entry of P2M list, or extended-info signature (~0UL). */ if ( read_exact(io_fd, &p2m_fl_zero, sizeof(long)) ) { ERROR("read extended-info signature failed"); return NULL; } if ( p2m_fl_zero == ~0UL ) { uint32_t tot_bytes; /* Next 4 bytes: total size of following extended info. */ if ( read_exact(io_fd, &tot_bytes, sizeof(tot_bytes)) ) { ERROR("read extended-info size failed"); return NULL; } while ( tot_bytes ) { uint32_t chunk_bytes; char chunk_sig[4]; /* 4-character chunk signature + 4-byte remaining chunk size. */ if ( read_exact(io_fd, chunk_sig, sizeof(chunk_sig)) || read_exact(io_fd, &chunk_bytes, sizeof(chunk_bytes)) || (tot_bytes < (chunk_bytes + 8)) ) { ERROR("read extended-info chunk signature failed"); return NULL; } tot_bytes -= 8; /* VCPU context structure? */ if ( !strncmp(chunk_sig, "vcpu", 4) ) { /* Pick a guest word-size and PT depth from the ctxt size */ if ( chunk_bytes == sizeof (ctxt.x32) ) { guest_width = 4; if ( pt_levels > 2 ) pt_levels = 3; } else if ( chunk_bytes == sizeof (ctxt.x64) ) { guest_width = 8; pt_levels = 4; } else { ERROR("bad extended-info context size %d", chunk_bytes); return NULL; } if ( read_exact(io_fd, &ctxt, chunk_bytes) ) { ERROR("read extended-info vcpu context failed"); return NULL; } tot_bytes -= chunk_bytes; chunk_bytes = 0; if ( GET_FIELD(&ctxt, vm_assist) & (1UL << VMASST_TYPE_pae_extended_cr3) ) *pae_extended_cr3 = 1; } else if ( !strncmp(chunk_sig, "extv", 4) ) { *ext_vcpucontext = 1; } /* Any remaining bytes of this chunk: read and discard. */ while ( chunk_bytes ) { unsigned long sz = MIN(chunk_bytes, sizeof(xen_pfn_t)); if ( read_exact(io_fd, &p2m_fl_zero, sz) ) { ERROR("read-and-discard extended-info chunk bytes failed"); return NULL; } chunk_bytes -= sz; tot_bytes -= sz; } } /* Now read the real first entry of P2M list. */ if ( read_exact(io_fd, &p2m_fl_zero, sizeof(xen_pfn_t)) ) { ERROR("read first entry of p2m_frame_list failed"); return NULL; } } /* Now that we know the guest's word-size, can safely allocate * the p2m frame list */ if ( (p2m_frame_list = malloc(P2M_TOOLS_FL_SIZE)) == NULL ) { ERROR("Couldn't allocate p2m_frame_list array"); return NULL; } /* First entry has already been read. */ p2m_frame_list[0] = p2m_fl_zero; if ( read_exact(io_fd, &p2m_frame_list[1], (P2M_FL_ENTRIES - 1) * sizeof(xen_pfn_t)) ) { ERROR("read p2m_frame_list failed"); return NULL; } return p2m_frame_list; } int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom, unsigned int store_evtchn, unsigned long *store_mfn, unsigned int console_evtchn, unsigned long *console_mfn, unsigned int hvm, unsigned int pae) { DECLARE_DOMCTL; int rc = 1, frc, i, j, n, m, pae_extended_cr3 = 0, ext_vcpucontext = 0; unsigned long mfn, pfn; unsigned int prev_pc, this_pc; int verify = 0; int nraces = 0; /* The new domain's shared-info frame number. */ unsigned long shared_info_frame; unsigned char shared_info_page[PAGE_SIZE]; /* saved contents from file */ shared_info_any_t *old_shared_info = (shared_info_any_t *)shared_info_page; shared_info_any_t *new_shared_info; /* A copy of the CPU context of the guest. */ vcpu_guest_context_any_t ctxt; /* A table containing the type of each PFN (/not/ MFN!). */ unsigned long *pfn_type = NULL; /* A table of MFNs to map in the current region */ xen_pfn_t *region_mfn = NULL; /* Types of the pfns in the current region */ unsigned long region_pfn_type[MAX_BATCH_SIZE]; /* A copy of the pfn-to-mfn table frame list. */ xen_pfn_t *p2m_frame_list = NULL; /* A temporary mapping of the guest's start_info page. */ start_info_any_t *start_info; /* Our mapping of the current region (batch) */ char *region_base; struct xc_mmu *mmu = NULL; /* used by debug verify code */ unsigned long buf[PAGE_SIZE/sizeof(unsigned long)]; struct mmuext_op pin[MAX_PIN_BATCH]; unsigned int nr_pins; uint64_t vcpumap = 1ULL; unsigned int max_vcpu_id = 0; int new_ctxt_format = 0; /* Magic frames in HVM guests: ioreqs and xenstore comms. */ uint64_t magic_pfns[3]; /* ioreq_pfn, bufioreq_pfn, store_pfn */ /* Buffer for holding HVM context */ uint8_t *hvm_buf = NULL; /* For info only */ nr_pfns = 0; DPRINTF("-->xc_domain_restore()\n"); if ( read_exact(io_fd, &p2m_size, sizeof(unsigned long)) ) { ERROR("read: p2m_size"); goto out; } DPRINTF("xc_domain_restore start: p2m_size = %lx\n", p2m_size); if ( !get_platform_info(xc_handle, dom, &max_mfn, &hvirt_start, &pt_levels, &guest_width) ) { ERROR("Unable to get platform info."); return 1; } DPRINTF("platform info, max_mfn: %lx, hvirt_start %lx, pt_lvevel %x, guest_width %x\n", max_mfn, hvirt_start, pt_levels, guest_width); /* The *current* word size of the guest isn't very interesting; for now * assume the guest will be the same as we are. We'll fix that later * if we discover otherwise. */ guest_width = sizeof(unsigned long); pt_levels = (guest_width == 8) ? 4 : (pt_levels == 2) ? 2 : 3; if ( !hvm ) { /* Load the p2m frame list, plus potential extended info chunk */ p2m_frame_list = load_p2m_frame_list( io_fd, &pae_extended_cr3, &ext_vcpucontext); if ( !p2m_frame_list ) goto out; /* Now that we know the word size, tell Xen about it */ memset(&domctl, 0, sizeof(domctl)); domctl.domain = dom; domctl.cmd = XEN_DOMCTL_set_address_size; domctl.u.address_size.size = guest_width * 8; frc = do_domctl(xc_handle, &domctl); if ( frc != 0 ) { ERROR("Unable to set guest address size."); goto out; } } /* We want zeroed memory so use calloc rather than malloc. */ p2m = calloc(p2m_size, sizeof(xen_pfn_t)); pfn_type = calloc(p2m_size, sizeof(unsigned long)); region_mfn = xg_memalign(PAGE_SIZE, ROUNDUP( MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT)); p2m_batch = xg_memalign(PAGE_SIZE, ROUNDUP( MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT)); if ( (p2m == NULL) || (pfn_type == NULL) || (region_mfn == NULL) || (p2m_batch == NULL) ) { ERROR("memory alloc failed"); errno = ENOMEM; goto out; } DPRINTF("memory alloc success\n"); memset(region_mfn, 0, ROUNDUP(MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT)); memset(p2m_batch, 0, ROUNDUP(MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT)); if ( lock_pages(region_mfn, sizeof(xen_pfn_t) * MAX_BATCH_SIZE) ) { ERROR("Could not lock region_mfn"); goto out; } if ( lock_pages(p2m_batch, sizeof(xen_pfn_t) * MAX_BATCH_SIZE) ) { ERROR("Could not lock p2m_batch"); goto out; } DPRINTF("lock regin_mfn and p2m_batch success\n"); /* Get the domain's shared-info frame. */ domctl.cmd = XEN_DOMCTL_getdomaininfo; domctl.domain = (domid_t)dom; if ( xc_domctl(xc_handle, &domctl) < 0 ) { ERROR("Could not get information on new domain"); goto out; } shared_info_frame = domctl.u.getdomaininfo.shared_info_frame; DPRINTF("shared_info_frame: 0x%lx\n", shared_info_frame); /* Mark all PFNs as invalid; we allocate on demand */ for ( pfn = 0; pfn < p2m_size; pfn++ ) p2m[pfn] = INVALID_P2M_ENTRY; DPRINTF("all PFNs are marked as invalid\n"); mmu = xc_alloc_mmu_updates(xc_handle, dom); if ( mmu == NULL ) { ERROR("Could not initialise for MMU updates"); goto out; } DPRINTF("Reloading memory pages: 0%%\n"); /* * Now simply read each saved frame into its new machine frame. * We uncanonicalise page tables as we go. */ prev_pc = 0; n = m = 0; for ( ; ; ) { int j, nr_mfns = 0; this_pc = (n * 100) / p2m_size; if ( (this_pc - prev_pc) >= 5 ) { PPRINTF("\b\b\b\b%3d%%", this_pc); prev_pc = this_pc; } if ( read_exact(io_fd, &j, sizeof(int)) ) { ERROR("Error when reading batch size"); goto out; } PPRINTF("batch %d\n",j); DPRINTF ("batch %d\n",j); if ( j == -1 ) { verify = 1; DPRINTF("Entering page verify mode\n"); continue; } if ( j == -2 ) { new_ctxt_format = 1; if ( read_exact(io_fd, &max_vcpu_id, sizeof(int)) || (max_vcpu_id >= 64) || read_exact(io_fd, &vcpumap, sizeof(uint64_t)) ) { ERROR("Error when reading max_vcpu_id"); goto out; } continue; } if ( j == -3 ) { uint64_t ident_pt; /* Skip padding 4 bytes then read the EPT identity PT location. */ if ( read_exact(io_fd, &ident_pt, sizeof(uint32_t)) || read_exact(io_fd, &ident_pt, sizeof(uint64_t)) ) { ERROR("error read the address of the EPT identity map"); goto out; } xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IDENT_PT, ident_pt); continue; } if ( j == -4 ) { uint64_t vm86_tss; /* Skip padding 4 bytes then read the vm86 TSS location. */ if ( read_exact(io_fd, &vm86_tss, sizeof(uint32_t)) || read_exact(io_fd, &vm86_tss, sizeof(uint64_t)) ) { ERROR("error read the address of the vm86 TSS"); goto out; } xc_set_hvm_param(xc_handle, dom, HVM_PARAM_VM86_TSS, vm86_tss); continue; } if ( j == -5 ) { DPRINTF("xc_domain_restore start tmem\n"); if ( xc_tmem_restore(xc_handle, dom, io_fd) ) { ERROR("error reading/restoring tmem"); goto out; } continue; } if ( j == -6 ) { if ( xc_tmem_restore_extra(xc_handle, dom, io_fd) ) { ERROR("error reading/restoring tmem extra"); goto out; } continue; } if ( j == 0 ) break; /* our work here is done */ if ( (j > MAX_BATCH_SIZE) || (j < 0) ) { ERROR("Max batch size exceeded. Giving up."); goto out; } if ( read_exact(io_fd, region_pfn_type, j*sizeof(unsigned long)) ) { ERROR("Error when reading region pfn types"); goto out; } /* First pass for this batch: work out how much memory to alloc */ nr_mfns = 0; for ( i = 0; i < j; i++ ) { unsigned long pfn, pagetype; pfn = region_pfn_type[i] & ~XEN_DOMCTL_PFINFO_LTAB_MASK; pagetype = region_pfn_type[i] & XEN_DOMCTL_PFINFO_LTAB_MASK; if ( (pagetype != XEN_DOMCTL_PFINFO_XTAB) && (p2m[pfn] == INVALID_P2M_ENTRY) ) { /* Have a live PFN which hasn't had an MFN allocated */ p2m_batch[nr_mfns++] = pfn; p2m[pfn]--; } } DPRINTF("nr_mfns: %d \n",nr_mfns); /* Now allocate a bunch of mfns for this batch */ if ( nr_mfns && (xc_domain_memory_populate_physmap(xc_handle, dom, nr_mfns, 0, 0, p2m_batch) != 0) ) { ERROR("Failed to allocate memory for batch.!\n"); errno = ENOMEM; goto out; } /* Second pass for this batch: update p2m[] and region_mfn[] */ nr_mfns = 0; for ( i = 0; i < j; i++ ) { unsigned long pfn, pagetype; pfn = region_pfn_type[i] & ~XEN_DOMCTL_PFINFO_LTAB_MASK; pagetype = region_pfn_type[i] & XEN_DOMCTL_PFINFO_LTAB_MASK; if ( pagetype == XEN_DOMCTL_PFINFO_XTAB ) region_mfn[i] = ~0UL; /* map will fail but we don't care */ else { if ( p2m[pfn] == (INVALID_P2M_ENTRY-1) ) { /* We just allocated a new mfn above; update p2m */ p2m[pfn] = p2m_batch[nr_mfns++]; nr_pfns++; } /* setup region_mfn[] for batch map. * For HVM guests, this interface takes PFNs, not MFNs */ region_mfn[i] = hvm ? pfn : p2m[pfn]; } } /* Map relevant mfns */ region_base = xc_map_foreign_batch( xc_handle, dom, PROT_WRITE, region_mfn, j); if ( region_base == NULL ) { ERROR("map batch failed"); goto out; } for ( i = 0; i < j; i++ ) { void *page; unsigned long pagetype; pfn = region_pfn_type[i] & ~XEN_DOMCTL_PFINFO_LTAB_MASK; pagetype = region_pfn_type[i] & XEN_DOMCTL_PFINFO_LTAB_MASK; if ( pagetype == XEN_DOMCTL_PFINFO_XTAB ) /* a bogus/unmapped page: skip it */ continue; if ( pfn > p2m_size ) { ERROR("pfn out of range"); goto out; } pfn_type[pfn] = pagetype; mfn = p2m[pfn]; /* In verify mode, we use a copy; otherwise we work in place */ page = verify ? (void *)buf : (region_base + i*PAGE_SIZE); if ( read_exact(io_fd, page, PAGE_SIZE) ) { ERROR("Error when reading page (type was %lx)", pagetype); goto out; } pagetype &= XEN_DOMCTL_PFINFO_LTABTYPE_MASK; if ( (pagetype >= XEN_DOMCTL_PFINFO_L1TAB) && (pagetype <= XEN_DOMCTL_PFINFO_L4TAB) ) { /* ** A page table page - need to 'uncanonicalize' it, i.e. ** replace all the references to pfns with the corresponding ** mfns for the new domain. ** ** On PAE we need to ensure that PGDs are in MFNs < 4G, and ** so we may need to update the p2m after the main loop. ** Hence we defer canonicalization of L1s until then. */ if ((pt_levels != 3) || pae_extended_cr3 || (pagetype != XEN_DOMCTL_PFINFO_L1TAB)) { DPRINTF("call uncanonicalize_pagetable \n"); if (!uncanonicalize_pagetable(xc_handle, dom, pagetype, page)) { /* ** Failing to uncanonicalize a page table can be ok ** under live migration since the pages type may have ** changed by now (and we'll get an update later). */ DPRINTF("PT L%ld race on pfn=%08lx mfn=%08lx\n", pagetype >> 28, pfn, mfn); nraces++; continue; } } } else if ( pagetype != XEN_DOMCTL_PFINFO_NOTAB ) { ERROR("Bogus page type %lx page table is out of range: " "i=%d p2m_size=%lu", pagetype, i, p2m_size); goto out; } if ( verify ) { int res = memcmp(buf, (region_base + i*PAGE_SIZE), PAGE_SIZE); if ( res ) { int v; DPRINTF("************** pfn=%lx type=%lx gotcs=%08lx " "actualcs=%08lx\n", pfn, pfn_type[pfn], csum_page(region_base + i*PAGE_SIZE), csum_page(buf)); for ( v = 0; v < 4; v++ ) { unsigned long *p = (unsigned long *) (region_base + i*PAGE_SIZE); if ( buf[v] != p[v] ) DPRINTF(" %d: %08lx %08lx\n", v, buf[v], p[v]); } } } if ( !hvm && xc_add_mmu_update(xc_handle, mmu, (((unsigned long long)mfn) << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE, pfn) ) { ERROR("failed machpys update mfn=%lx pfn=%lx", mfn, pfn); goto out; } } /* end of 'batch' for loop */ munmap(region_base, j*PAGE_SIZE); n+= j; /* crude stats */ /* * Discard cache for portion of file read so far up to last * page boundary every 16MB or so. */ m += j; if ( m > MAX_PAGECACHE_USAGE ) { discard_file_cache(io_fd, 0 /* no flush */); m = 0; } } /* * Ensure we flush all machphys updates before potential PAE-specific * reallocations below. */ if ( !hvm && xc_flush_mmu_updates(xc_handle, mmu) ) { ERROR("Error doing flush_mmu_updates()"); goto out; } DPRINTF("Received all pages (%d races)\n", nraces); if ( hvm ) { uint32_t rec_len; /* Set HVM-specific parameters */ if ( read_exact(io_fd, magic_pfns, sizeof(magic_pfns)) ) { ERROR("error reading magic page addresses"); goto out; } /* These comms pages need to be zeroed at the start of day */ if ( xc_clear_domain_page(xc_handle, dom, magic_pfns[0]) || xc_clear_domain_page(xc_handle, dom, magic_pfns[1]) || xc_clear_domain_page(xc_handle, dom, magic_pfns[2]) ) { ERROR("error zeroing magic pages"); goto out; } if ( (frc = xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IOREQ_PFN, magic_pfns[0])) || (frc = xc_set_hvm_param(xc_handle, dom, HVM_PARAM_BUFIOREQ_PFN, magic_pfns[1])) || (frc = xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN, magic_pfns[2])) || (frc = xc_set_hvm_param(xc_handle, dom, HVM_PARAM_PAE_ENABLED, pae)) || (frc = xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_EVTCHN, store_evtchn)) ) { ERROR("error setting HVM params: %i", frc); goto out; } *store_mfn = magic_pfns[2]; /* Read HVM context */ if ( read_exact(io_fd, &rec_len, sizeof(uint32_t)) ) { ERROR("error read hvm context size!\n"); goto out; } hvm_buf = malloc(rec_len); if ( hvm_buf == NULL ) { ERROR("memory alloc for hvm context buffer failed"); errno = ENOMEM; goto out; } if ( read_exact(io_fd, hvm_buf, rec_len) ) { ERROR("error loading the HVM context"); goto out; } frc = xc_domain_hvm_setcontext(xc_handle, dom, hvm_buf, rec_len); if ( frc ) { ERROR("error setting the HVM context"); goto out; } /* HVM success! */ rc = 0; goto out; } /* Non-HVM guests only from here on */ if ( (pt_levels == 3) && !pae_extended_cr3 ) { /* ** XXX SMH on PAE we need to ensure PGDs are in MFNs < 4G. This ** is a little awkward and involves (a) finding all such PGDs and ** replacing them with 'lowmem' versions; (b) upating the p2m[] ** with the new info; and (c) canonicalizing all the L1s using the ** (potentially updated) p2m[]. ** ** This is relatively slow (and currently involves two passes through ** the pfn_type[] array), but at least seems to be correct. May wish ** to consider more complex approaches to optimize this later. */ int j, k; /* First pass: find all L3TABs current in > 4G mfns and get new mfns */ for ( i = 0; i < p2m_size; i++ ) { if ( ((pfn_type[i] & XEN_DOMCTL_PFINFO_LTABTYPE_MASK) == XEN_DOMCTL_PFINFO_L3TAB) && (p2m[i] > 0xfffffUL) ) { unsigned long new_mfn; uint64_t l3ptes[4]; uint64_t *l3tab; l3tab = (uint64_t *) xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, PROT_READ, p2m[i]); for ( j = 0; j < 4; j++ ) l3ptes[j] = l3tab[j]; munmap(l3tab, PAGE_SIZE); new_mfn = xc_make_page_below_4G(xc_handle, dom, p2m[i]); if ( !new_mfn ) { ERROR("Couldn't get a page below 4GB :-("); goto out; } p2m[i] = new_mfn; if ( xc_add_mmu_update(xc_handle, mmu, (((unsigned long long)new_mfn) << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE, i) ) { ERROR("Couldn't m2p on PAE root pgdir"); goto out; } l3tab = (uint64_t *) xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, p2m[i]); for ( j = 0; j < 4; j++ ) l3tab[j] = l3ptes[j]; munmap(l3tab, PAGE_SIZE); } } /* Second pass: find all L1TABs and uncanonicalize them */ j = 0; for ( i = 0; i < p2m_size; i++ ) { if ( ((pfn_type[i] & XEN_DOMCTL_PFINFO_LTABTYPE_MASK) == XEN_DOMCTL_PFINFO_L1TAB) ) { region_mfn[j] = p2m[i]; j++; } if ( (i == (p2m_size-1)) || (j == MAX_BATCH_SIZE) ) { region_base = xc_map_foreign_batch( xc_handle, dom, PROT_READ | PROT_WRITE, region_mfn, j); if ( region_base == NULL ) { ERROR("map batch failed"); goto out; } for ( k = 0; k < j; k++ ) { if ( !uncanonicalize_pagetable( xc_handle, dom, XEN_DOMCTL_PFINFO_L1TAB, region_base + k*PAGE_SIZE) ) { ERROR("failed uncanonicalize pt!"); goto out; } } munmap(region_base, j*PAGE_SIZE); j = 0; } } if ( xc_flush_mmu_updates(xc_handle, mmu) ) { ERROR("Error doing xc_flush_mmu_updates()"); goto out; } } /* * Pin page tables. Do this after writing to them as otherwise Xen * will barf when doing the type-checking. */ nr_pins = 0; for ( i = 0; i < p2m_size; i++ ) { if ( (pfn_type[i] & XEN_DOMCTL_PFINFO_LPINTAB) == 0 ) continue; switch ( pfn_type[i] & XEN_DOMCTL_PFINFO_LTABTYPE_MASK ) { case XEN_DOMCTL_PFINFO_L1TAB: pin[nr_pins].cmd = MMUEXT_PIN_L1_TABLE; break; case XEN_DOMCTL_PFINFO_L2TAB: pin[nr_pins].cmd = MMUEXT_PIN_L2_TABLE; break; case XEN_DOMCTL_PFINFO_L3TAB: pin[nr_pins].cmd = MMUEXT_PIN_L3_TABLE; break; case XEN_DOMCTL_PFINFO_L4TAB: pin[nr_pins].cmd = MMUEXT_PIN_L4_TABLE; break; default: continue; } pin[nr_pins].arg1.mfn = p2m[i]; nr_pins++; /* Batch full? Then flush. */ if ( nr_pins == MAX_PIN_BATCH ) { if ( xc_mmuext_op(xc_handle, pin, nr_pins, dom) < 0 ) { ERROR("Failed to pin batch of %d page tables", nr_pins); goto out; } nr_pins = 0; } } /* Flush final partial batch. */ if ( (nr_pins != 0) && (xc_mmuext_op(xc_handle, pin, nr_pins, dom) < 0) ) { ERROR("Failed to pin batch of %d page tables", nr_pins); goto out; } DPRINTF("\b\b\b\b100%%\n"); DPRINTF("Memory reloaded (%ld pages)\n", nr_pfns); /* Get the list of PFNs that are not in the psuedo-phys map */ { unsigned int count = 0; unsigned long *pfntab; int nr_frees; if ( read_exact(io_fd, &count, sizeof(count)) || (count > (1U << 28)) ) /* up to 1TB of address space */ { ERROR("Error when reading pfn count (= %u)", count); goto out; } if ( !(pfntab = malloc(sizeof(unsigned long) * count)) ) { ERROR("Out of memory"); goto out; } if ( read_exact(io_fd, pfntab, sizeof(unsigned long)*count) ) { ERROR("Error when reading pfntab"); goto out; } nr_frees = 0; for ( i = 0; i < count; i++ ) { unsigned long pfn = pfntab[i]; if ( p2m[pfn] != INVALID_P2M_ENTRY ) { /* pfn is not in physmap now, but was at some point during the save/migration process - need to free it */ pfntab[nr_frees++] = p2m[pfn]; p2m[pfn] = INVALID_P2M_ENTRY; /* not in pseudo-physical map */ } } if ( nr_frees > 0 ) { struct xen_memory_reservation reservation = { .nr_extents = nr_frees, .extent_order = 0, .domid = dom }; set_xen_guest_handle(reservation.extent_start, pfntab); if ( (frc = xc_memory_op(xc_handle, XENMEM_decrease_reservation, &reservation)) != nr_frees ) { ERROR("Could not decrease reservation : %d", frc); goto out; } else DPRINTF("Decreased reservation by %d pages\n", count); } } if ( lock_pages(&ctxt, sizeof(ctxt)) ) { ERROR("Unable to lock ctxt"); return 1; } for ( i = 0; i <= max_vcpu_id; i++ ) { if ( !(vcpumap & (1ULL << i)) ) continue; if ( read_exact(io_fd, &ctxt, ((guest_width == 8) ? sizeof(ctxt.x64) : sizeof(ctxt.x32))) ) { ERROR("Error when reading ctxt %d", i); goto out; } if ( !new_ctxt_format ) SET_FIELD(&ctxt, flags, GET_FIELD(&ctxt, flags) | VGCF_online); if ( i == 0 ) { /* * Uncanonicalise the suspend-record frame number and poke * resume record. */ pfn = GET_FIELD(&ctxt, user_regs.edx); if ( (pfn >= p2m_size) || (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) ) { ERROR("Suspend record frame number is bad"); goto out; } mfn = p2m[pfn]; SET_FIELD(&ctxt, user_regs.edx, mfn); start_info = xc_map_foreign_range( xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, mfn); SET_FIELD(start_info, nr_pages, p2m_size); SET_FIELD(start_info, shared_info, shared_info_frame< 8192 ) { ERROR("GDT entry count out of range"); goto out; } for ( j = 0; (512*j) < GET_FIELD(&ctxt, gdt_ents); j++ ) { pfn = GET_FIELD(&ctxt, gdt_frames[j]); if ( (pfn >= p2m_size) || (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) ) { ERROR("GDT frame number %i (0x%lx) is bad", j, (unsigned long)pfn); goto out; } SET_FIELD(&ctxt, gdt_frames[j], p2m[pfn]); } /* Uncanonicalise the page table base pointer. */ pfn = UNFOLD_CR3(GET_FIELD(&ctxt, ctrlreg[3])); if ( pfn >= p2m_size ) { ERROR("PT base is bad: pfn=%lu p2m_size=%lu type=%08lx", pfn, p2m_size, pfn_type[pfn]); goto out; } if ( (pfn_type[pfn] & XEN_DOMCTL_PFINFO_LTABTYPE_MASK) != ((unsigned long)pt_levels<= p2m_size ) { ERROR("User PT base is bad: pfn=%lu p2m_size=%lu", pfn, p2m_size); goto out; } if ( (pfn_type[pfn] & XEN_DOMCTL_PFINFO_LTABTYPE_MASK) != ((unsigned long)pt_levels<= p2m_size) || (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) ) { ERROR("PFN-to-MFN frame number %i (%#lx) is bad", i, pfn); goto out; } p2m_frame_list[i] = p2m[pfn]; } /* Copy the P2M we've constructed to the 'live' P2M */ if ( !(live_p2m = xc_map_foreign_batch(xc_handle, dom, PROT_WRITE, p2m_frame_list, P2M_FL_ENTRIES)) ) { ERROR("Couldn't map p2m table"); goto out; } /* If the domain we're restoring has a different word size to ours, * we need to adjust the live_p2m assignment appropriately */ if ( guest_width > sizeof (xen_pfn_t) ) for ( i = p2m_size - 1; i >= 0; i-- ) ((int64_t *)live_p2m)[i] = (long)p2m[i]; else if ( guest_width < sizeof (xen_pfn_t) ) for ( i = 0; i < p2m_size; i++ ) ((uint32_t *)live_p2m)[i] = p2m[i]; else memcpy(live_p2m, p2m, p2m_size * sizeof(xen_pfn_t)); munmap(live_p2m, P2M_FL_ENTRIES * PAGE_SIZE); DPRINTF("Domain ready to be built.\n"); rc = 0; out: if ( (rc != 0) && (dom != 0) ) xc_domain_destroy(xc_handle, dom); free(mmu); free(p2m); free(pfn_type); free(hvm_buf); /* discard cache for save file */ discard_file_cache(io_fd, 1 /*flush*/); DPRINTF("Restore exit with rc=%d\n", rc); return rc; } --------------070001090300020905000106 Content-Type: text/plain; name="xc_domain_save.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xc_domain_save.c" /****************************************************************************** * xc_linux_save.c * * Save the state of a running Linux session. * * Copyright (c) 2003, K A Fraser. */ #include #include #include #include #include #include "xc_private.h" #include "xc_dom.h" #include "xg_private.h" #include "xg_save_restore.h" #include #include "xc_e820.h" /* ** Default values for important tuning parameters. Can override by passing ** non-zero replacement values to xc_domain_save(). ** ** XXX SMH: should consider if want to be able to override MAX_MBIT_RATE too. ** */ #define DEF_MAX_ITERS 29 /* limit us to 30 times round loop */ #define DEF_MAX_FACTOR 3 /* never send more than 3x p2m_size */ /* max mfn of the whole machine */ static unsigned long max_mfn; /* virtual starting address of the hypervisor */ static unsigned long hvirt_start; /* #levels of page tables used by the current guest */ static unsigned int pt_levels; /* HVM: shared-memory bitmaps for getting log-dirty bits from qemu-dm */ static unsigned long *qemu_bitmaps[2]; static int qemu_active; static int qemu_non_active; /* number of pfns this guest has (i.e. number of entries in the P2M) */ static unsigned long p2m_size; /* Live mapping of the table mapping each PFN to its current MFN. */ static xen_pfn_t *live_p2m = NULL; /* Live mapping of system MFN to PFN table. */ static xen_pfn_t *live_m2p = NULL; static unsigned long m2p_mfn0; /* Address size of the guest */ unsigned int guest_width; /* grep fodder: machine_to_phys */ #define mfn_to_pfn(_mfn) (live_m2p[(_mfn)]) #define pfn_to_mfn(_pfn) \ ((xen_pfn_t) ((guest_width==8) \ ? (((uint64_t *)live_p2m)[(_pfn)]) \ : ((((uint32_t *)live_p2m)[(_pfn)]) == 0xffffffffU \ ? (-1UL) : (((uint32_t *)live_p2m)[(_pfn)])))) /* * Returns TRUE if the given machine frame number has a unique mapping * in the guest's pseudophysical map. */ #define MFN_IS_IN_PSEUDOPHYS_MAP(_mfn) \ (((_mfn) < (max_mfn)) && \ ((mfn_to_pfn(_mfn) < (p2m_size)) && \ (pfn_to_mfn(mfn_to_pfn(_mfn)) == (_mfn)))) /* ** During (live) save/migrate, we maintain a number of bitmaps to track ** which pages we have to send, to fixup, and to skip. */ #define BITS_PER_LONG (sizeof(unsigned long) * 8) #define BITS_TO_LONGS(bits) (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG) #define BITMAP_SIZE (BITS_TO_LONGS(p2m_size) * sizeof(unsigned long)) #define BITMAP_ENTRY(_nr,_bmap) \ ((volatile unsigned long *)(_bmap))[(_nr)/BITS_PER_LONG] #define BITMAP_SHIFT(_nr) ((_nr) % BITS_PER_LONG) static inline int test_bit (int nr, volatile void * addr) { return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1; } static inline void clear_bit (int nr, volatile void * addr) { BITMAP_ENTRY(nr, addr) &= ~(1UL << BITMAP_SHIFT(nr)); } static inline void set_bit ( int nr, volatile void * addr) { BITMAP_ENTRY(nr, addr) |= (1UL << BITMAP_SHIFT(nr)); } /* Returns the hamming weight (i.e. the number of bits set) in a N-bit word */ static inline unsigned int hweight32(unsigned int w) { unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); res = (res & 0x33333333) + ((res >> 2) & 0x33333333); res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); } static inline int count_bits ( int nr, volatile void *addr) { int i, count = 0; volatile unsigned long *p = (volatile unsigned long *)addr; /* We know that the array is padded to unsigned long. */ for ( i = 0; i < (nr / (sizeof(unsigned long)*8)); i++, p++ ) count += hweight32(*p); return count; } static uint64_t tv_to_us(struct timeval *new) { return (new->tv_sec * 1000000) + new->tv_usec; } static uint64_t llgettimeofday(void) { struct timeval now; gettimeofday(&now, NULL); return tv_to_us(&now); } static uint64_t tv_delta(struct timeval *new, struct timeval *old) { return (((new->tv_sec - old->tv_sec)*1000000) + (new->tv_usec - old->tv_usec)); } static int noncached_write(int fd, int live, void *buffer, int len) { static int write_count = 0; int rc = (write_exact(fd, buffer, len) == 0) ? len : -1; write_count += len; if ( write_count >= (MAX_PAGECACHE_USAGE * PAGE_SIZE) ) { /* Time to discard cache - dont care if this fails */ discard_file_cache(fd, 0 /* no flush */); write_count = 0; } return rc; } #ifdef ADAPTIVE_SAVE /* ** We control the rate at which we transmit (or save) to minimize impact ** on running domains (including the target if we're doing live migrate). */ #define MAX_MBIT_RATE 500 /* maximum transmit rate for migrate */ #define START_MBIT_RATE 100 /* initial transmit rate for migrate */ /* Scaling factor to convert between a rate (in Mb/s) and time (in usecs) */ #define RATE_TO_BTU 781250 /* Amount in bytes we allow ourselves to send in a burst */ #define BURST_BUDGET (100*1024) /* We keep track of the current and previous transmission rate */ static int mbit_rate, ombit_rate = 0; /* Have we reached the maximum transmission rate? */ #define RATE_IS_MAX() (mbit_rate == MAX_MBIT_RATE) static inline void initialize_mbit_rate() { mbit_rate = START_MBIT_RATE; } static int ratewrite(int io_fd, int live, void *buf, int n) { static int budget = 0; static int burst_time_us = -1; static struct timeval last_put = { 0 }; struct timeval now; struct timespec delay; long long delta; if ( START_MBIT_RATE == 0 ) return noncached_write(io_fd, live, buf, n); budget -= n; if ( budget < 0 ) { if ( mbit_rate != ombit_rate ) { burst_time_us = RATE_TO_BTU / mbit_rate; ombit_rate = mbit_rate; DPRINTF("rate limit: %d mbit/s burst budget %d slot time %d\n", mbit_rate, BURST_BUDGET, burst_time_us); } if ( last_put.tv_sec == 0 ) { budget += BURST_BUDGET; gettimeofday(&last_put, NULL); } else { while ( budget < 0 ) { gettimeofday(&now, NULL); delta = tv_delta(&now, &last_put); while ( delta > burst_time_us ) { budget += BURST_BUDGET; last_put.tv_usec += burst_time_us; if ( last_put.tv_usec > 1000000 ) { last_put.tv_usec -= 1000000; last_put.tv_sec++; } delta -= burst_time_us; } if ( budget > 0 ) break; delay.tv_sec = 0; delay.tv_nsec = 1000 * (burst_time_us - delta); while ( delay.tv_nsec > 0 ) if ( nanosleep(&delay, &delay) == 0 ) break; } } } return noncached_write(io_fd, live, buf, n); } #else /* ! ADAPTIVE SAVE */ #define RATE_IS_MAX() (0) #define ratewrite(_io_fd, _live, _buf, _n) noncached_write((_io_fd), (_live), (_buf), (_n)) #define initialize_mbit_rate() #endif static int print_stats(int xc_handle, uint32_t domid, int pages_sent, xc_shadow_op_stats_t *stats, int print) { static struct timeval wall_last; static long long d0_cpu_last; static long long d1_cpu_last; struct timeval wall_now; long long wall_delta; long long d0_cpu_now, d0_cpu_delta; long long d1_cpu_now, d1_cpu_delta; gettimeofday(&wall_now, NULL); d0_cpu_now = xc_domain_get_cpu_usage(xc_handle, 0, /* FIXME */ 0)/1000; d1_cpu_now = xc_domain_get_cpu_usage(xc_handle, domid, /* FIXME */ 0)/1000; if ( (d0_cpu_now == -1) || (d1_cpu_now == -1) ) DPRINTF("ARRHHH!!\n"); wall_delta = tv_delta(&wall_now,&wall_last)/1000; if ( wall_delta == 0 ) wall_delta = 1; d0_cpu_delta = (d0_cpu_now - d0_cpu_last)/1000; d1_cpu_delta = (d1_cpu_now - d1_cpu_last)/1000; if ( print ) DPRINTF("delta %lldms, dom0 %d%%, target %d%%, sent %dMb/s, " "dirtied %dMb/s %" PRId32 " pages\n", wall_delta, (int)((d0_cpu_delta*100)/wall_delta), (int)((d1_cpu_delta*100)/wall_delta), (int)((pages_sent*PAGE_SIZE)/(wall_delta*(1000/8))), (int)((stats->dirty_count*PAGE_SIZE)/(wall_delta*(1000/8))), stats->dirty_count); #ifdef ADAPTIVE_SAVE if ( ((stats->dirty_count*PAGE_SIZE)/(wall_delta*(1000/8))) > mbit_rate ) { mbit_rate = (int)((stats->dirty_count*PAGE_SIZE)/(wall_delta*(1000/8))) + 50; if ( mbit_rate > MAX_MBIT_RATE ) mbit_rate = MAX_MBIT_RATE; } #endif d0_cpu_last = d0_cpu_now; d1_cpu_last = d1_cpu_now; wall_last = wall_now; return 0; } static int analysis_phase(int xc_handle, uint32_t domid, int p2m_size, unsigned long *arr, int runs) { long long start, now; xc_shadow_op_stats_t stats; int j; start = llgettimeofday(); for ( j = 0; j < runs; j++ ) { int i; xc_shadow_control(xc_handle, domid, XEN_DOMCTL_SHADOW_OP_CLEAN, arr, p2m_size, NULL, 0, NULL); DPRINTF("#Flush\n"); for ( i = 0; i < 40; i++ ) { usleep(50000); now = llgettimeofday(); xc_shadow_control(xc_handle, domid, XEN_DOMCTL_SHADOW_OP_PEEK, NULL, 0, NULL, 0, &stats); DPRINTF("now= %lld faults= %"PRId32" dirty= %"PRId32"\n", ((now-start)+500)/1000, stats.fault_count, stats.dirty_count); } } return -1; } static int suspend_and_state(int (*suspend)(void), int xc_handle, int io_fd, int dom, xc_dominfo_t *info) { if ( !(*suspend)() ) { ERROR("Suspend request failed"); return -1; } if ( (xc_domain_getinfo(xc_handle, dom, 1, info) != 1) || !info->shutdown || (info->shutdown_reason != SHUTDOWN_suspend) ) { ERROR("Domain not in suspended state"); return -1; } return 0; } /* ** Map the top-level page of MFNs from the guest. The guest might not have ** finished resuming from a previous restore operation, so we wait a while for ** it to update the MFN to a reasonable value. */ static void *map_frame_list_list(int xc_handle, uint32_t dom, shared_info_any_t *shinfo) { int count = 100; void *p; uint64_t fll = GET_FIELD(shinfo, arch.pfn_to_mfn_frame_list_list); while ( count-- && (fll == 0) ) { usleep(10000); fll = GET_FIELD(shinfo, arch.pfn_to_mfn_frame_list_list); } if ( fll == 0 ) { ERROR("Timed out waiting for frame list updated."); return NULL; } p = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, PROT_READ, fll); if ( p == NULL ) ERROR("Couldn't map p2m_frame_list_list (errno %d)", errno); return p; } /* ** During transfer (or in the state file), all page-table pages must be ** converted into a 'canonical' form where references to actual mfns ** are replaced with references to the corresponding pfns. ** ** This function performs the appropriate conversion, taking into account ** which entries do not require canonicalization (in particular, those ** entries which map the virtual address reserved for the hypervisor). */ static int canonicalize_pagetable(unsigned long type, unsigned long pfn, const void *spage, void *dpage) { int i, pte_last, xen_start, xen_end, race = 0; uint64_t pte; /* ** We need to determine which entries in this page table hold ** reserved hypervisor mappings. This depends on the current ** page table type as well as the number of paging levels. */ xen_start = xen_end = pte_last = PAGE_SIZE / ((pt_levels == 2) ? 4 : 8); if ( (pt_levels == 2) && (type == XEN_DOMCTL_PFINFO_L2TAB) ) xen_start = (hvirt_start >> L2_PAGETABLE_SHIFT); if ( (pt_levels == 3) && (type == XEN_DOMCTL_PFINFO_L3TAB) ) xen_start = L3_PAGETABLE_ENTRIES_PAE; /* ** In PAE only the L2 mapping the top 1GB contains Xen mappings. ** We can spot this by looking for the guest's mappingof the m2p. ** Guests must ensure that this check will fail for other L2s. */ if ( (pt_levels == 3) && (type == XEN_DOMCTL_PFINFO_L2TAB) ) { int hstart; uint64_t he; hstart = (hvirt_start >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff; he = ((const uint64_t *) spage)[hstart]; if ( ((he >> PAGE_SHIFT) & MFN_MASK_X86) == m2p_mfn0 ) { /* hvirt starts with xen stuff... */ xen_start = hstart; } else if ( hvirt_start != 0xf5800000 ) { /* old L2s from before hole was shrunk... */ hstart = (0xf5800000 >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff; he = ((const uint64_t *) spage)[hstart]; if ( ((he >> PAGE_SHIFT) & MFN_MASK_X86) == m2p_mfn0 ) xen_start = hstart; } } if ( (pt_levels == 4) && (type == XEN_DOMCTL_PFINFO_L4TAB) ) { /* ** XXX SMH: should compute these from hvirt_start (which we have) ** and hvirt_end (which we don't) */ xen_start = 256; xen_end = 272; } /* Now iterate through the page table, canonicalizing each PTE */ for (i = 0; i < pte_last; i++ ) { unsigned long pfn, mfn; if ( pt_levels == 2 ) pte = ((const uint32_t*)spage)[i]; else pte = ((const uint64_t*)spage)[i]; if ( (i >= xen_start) && (i < xen_end) ) pte = 0; if ( pte & _PAGE_PRESENT ) { mfn = (pte >> PAGE_SHIFT) & MFN_MASK_X86; if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) ) { /* This will happen if the type info is stale which is quite feasible under live migration */ pfn = 0; /* zap it - we'll retransmit this page later */ /* XXX: We can't spot Xen mappings in compat-mode L2es * from 64-bit tools, but the only thing in them is the * compat m2p, so we quietly zap them. This doesn't * count as a race, so don't report it. */ if ( !(type == XEN_DOMCTL_PFINFO_L2TAB && sizeof (unsigned long) > guest_width) ) race = 1; /* inform the caller; fatal if !live */ } else pfn = mfn_to_pfn(mfn); pte &= ~MADDR_MASK_X86; pte |= (uint64_t)pfn << PAGE_SHIFT; /* * PAE guest L3Es can contain these flags when running on * a 64bit hypervisor. We zap these here to avoid any * surprise at restore time... */ if ( (pt_levels == 3) && (type == XEN_DOMCTL_PFINFO_L3TAB) && (pte & (_PAGE_USER|_PAGE_RW|_PAGE_ACCESSED)) ) pte &= ~(_PAGE_USER|_PAGE_RW|_PAGE_ACCESSED); } if ( pt_levels == 2 ) ((uint32_t*)dpage)[i] = pte; else ((uint64_t*)dpage)[i] = pte; } return race; } static xen_pfn_t *xc_map_m2p(int xc_handle, unsigned long max_mfn, int prot) { struct xen_machphys_mfn_list xmml; privcmd_mmap_entry_t *entries; unsigned long m2p_chunks, m2p_size; xen_pfn_t *m2p; xen_pfn_t *extent_start; int i; m2p = NULL; m2p_size = M2P_SIZE(max_mfn); m2p_chunks = M2P_CHUNKS(max_mfn); xmml.max_extents = m2p_chunks; extent_start = calloc(m2p_chunks, sizeof(xen_pfn_t)); if ( !extent_start ) { ERROR("failed to allocate space for m2p mfns"); goto err0; } set_xen_guest_handle(xmml.extent_start, extent_start); if ( xc_memory_op(xc_handle, XENMEM_machphys_mfn_list, &xmml) || (xmml.nr_extents != m2p_chunks) ) { ERROR("xc_get_m2p_mfns"); goto err1; } entries = calloc(m2p_chunks, sizeof(privcmd_mmap_entry_t)); if (entries == NULL) { ERROR("failed to allocate space for mmap entries"); goto err1; } for ( i = 0; i < m2p_chunks; i++ ) entries[i].mfn = extent_start[i]; m2p = xc_map_foreign_ranges(xc_handle, DOMID_XEN, m2p_size, prot, M2P_CHUNK_SIZE, entries, m2p_chunks); if (m2p == NULL) { ERROR("xc_mmap_foreign_ranges failed"); goto err2; } m2p_mfn0 = entries[0].mfn; err2: free(entries); err1: free(extent_start); err0: return m2p; } static xen_pfn_t *map_and_save_p2m_table(int xc_handle, int io_fd, uint32_t dom, unsigned long p2m_size, shared_info_any_t *live_shinfo) { vcpu_guest_context_any_t ctxt; /* Double and single indirect references to the live P2M table */ void *live_p2m_frame_list_list = NULL; void *live_p2m_frame_list = NULL; /* Copies of the above. */ xen_pfn_t *p2m_frame_list_list = NULL; xen_pfn_t *p2m_frame_list = NULL; /* The mapping of the live p2m table itself */ xen_pfn_t *p2m = NULL; int i, success = 0; live_p2m_frame_list_list = map_frame_list_list(xc_handle, dom, live_shinfo); if ( !live_p2m_frame_list_list ) goto out; /* Get a local copy of the live_P2M_frame_list_list */ if ( !(p2m_frame_list_list = malloc(PAGE_SIZE)) ) { ERROR("Couldn't allocate p2m_frame_list_list array"); goto out; } memcpy(p2m_frame_list_list, live_p2m_frame_list_list, PAGE_SIZE); /* Canonicalize guest's unsigned long vs ours */ if ( guest_width > sizeof(unsigned long) ) for ( i = 0; i < PAGE_SIZE/sizeof(unsigned long); i++ ) if ( i < PAGE_SIZE/guest_width ) p2m_frame_list_list[i] = ((uint64_t *)p2m_frame_list_list)[i]; else p2m_frame_list_list[i] = 0; else if ( guest_width < sizeof(unsigned long) ) for ( i = PAGE_SIZE/sizeof(unsigned long) - 1; i >= 0; i-- ) p2m_frame_list_list[i] = ((uint32_t *)p2m_frame_list_list)[i]; live_p2m_frame_list = xc_map_foreign_batch(xc_handle, dom, PROT_READ, p2m_frame_list_list, P2M_FLL_ENTRIES); if ( !live_p2m_frame_list ) { ERROR("Couldn't map p2m_frame_list"); goto out; } /* Get a local copy of the live_P2M_frame_list */ if ( !(p2m_frame_list = malloc(P2M_TOOLS_FL_SIZE)) ) { ERROR("Couldn't allocate p2m_frame_list array"); goto out; } memset(p2m_frame_list, 0, P2M_TOOLS_FL_SIZE); memcpy(p2m_frame_list, live_p2m_frame_list, P2M_GUEST_FL_SIZE); /* Canonicalize guest's unsigned long vs ours */ if ( guest_width > sizeof(unsigned long) ) for ( i = 0; i < P2M_FL_ENTRIES; i++ ) p2m_frame_list[i] = ((uint64_t *)p2m_frame_list)[i]; else if ( guest_width < sizeof(unsigned long) ) for ( i = P2M_FL_ENTRIES - 1; i >= 0; i-- ) p2m_frame_list[i] = ((uint32_t *)p2m_frame_list)[i]; /* Map all the frames of the pfn->mfn table. For migrate to succeed, the guest must not change which frames are used for this purpose. (its not clear why it would want to change them, and we'll be OK from a safety POV anyhow. */ p2m = xc_map_foreign_batch(xc_handle, dom, PROT_READ, p2m_frame_list, P2M_FL_ENTRIES); if ( !p2m ) { ERROR("Couldn't map p2m table"); goto out; } live_p2m = p2m; /* So that translation macros will work */ /* Canonicalise the pfn-to-mfn table frame-number list. */ for ( i = 0; i < p2m_size; i += FPP ) { if ( !MFN_IS_IN_PSEUDOPHYS_MAP(p2m_frame_list[i/FPP]) ) { ERROR("Frame# in pfn-to-mfn frame list is not in pseudophys"); ERROR("entry %d: p2m_frame_list[%ld] is 0x%"PRIx64", max 0x%lx", i, i/FPP, (uint64_t)p2m_frame_list[i/FPP], max_mfn); if ( p2m_frame_list[i/FPP] < max_mfn ) { ERROR("m2p[0x%"PRIx64"] = 0x%"PRIx64, (uint64_t)p2m_frame_list[i/FPP], (uint64_t)live_m2p[p2m_frame_list[i/FPP]]); ERROR("p2m[0x%"PRIx64"] = 0x%"PRIx64, (uint64_t)live_m2p[p2m_frame_list[i/FPP]], (uint64_t)p2m[live_m2p[p2m_frame_list[i/FPP]]]); } goto out; } p2m_frame_list[i/FPP] = mfn_to_pfn(p2m_frame_list[i/FPP]); } if ( xc_vcpu_getcontext(xc_handle, dom, 0, &ctxt) ) { ERROR("Could not get vcpu context"); goto out; } /* * Write an extended-info structure to inform the restore code that * a PAE guest understands extended CR3 (PDPTs above 4GB). Turns off * slow paths in the restore code. */ { unsigned long signature = ~0UL; uint32_t chunk1_sz = ((guest_width==8) ? sizeof(ctxt.x64) : sizeof(ctxt.x32)); uint32_t chunk2_sz = 0; uint32_t tot_sz = (chunk1_sz + 8) + (chunk2_sz + 8); if ( write_exact(io_fd, &signature, sizeof(signature)) || write_exact(io_fd, &tot_sz, sizeof(tot_sz)) || write_exact(io_fd, "vcpu", 4) || write_exact(io_fd, &chunk1_sz, sizeof(chunk1_sz)) || write_exact(io_fd, &ctxt, chunk1_sz) || write_exact(io_fd, "extv", 4) || write_exact(io_fd, &chunk2_sz, sizeof(chunk2_sz)) ) { PERROR("write: extended info"); goto out; } } if ( write_exact(io_fd, p2m_frame_list, P2M_FL_ENTRIES * sizeof(xen_pfn_t)) ) { PERROR("write: p2m_frame_list"); goto out; } success = 1; out: if ( !success && p2m ) munmap(p2m, P2M_FLL_ENTRIES * PAGE_SIZE); if ( live_p2m_frame_list_list ) munmap(live_p2m_frame_list_list, PAGE_SIZE); if ( live_p2m_frame_list ) munmap(live_p2m_frame_list, P2M_FLL_ENTRIES * PAGE_SIZE); if ( p2m_frame_list_list ) free(p2m_frame_list_list); if ( p2m_frame_list ) free(p2m_frame_list); return success ? p2m : NULL; } int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters, uint32_t max_factor, uint32_t flags, int (*suspend)(void), int hvm, void *(*init_qemu_maps)(int, unsigned), void (*qemu_flip_buffer)(int, int)) { xc_dominfo_t info; DECLARE_DOMCTL; int rc = 1, frc, i, j, last_iter, iter = 0; int live = (flags & XCFLAGS_LIVE); int debug = (flags & XCFLAGS_DEBUG); int race = 0, sent_last_iter, skip_this_iter; int tmem_saved = 0; /* The new domain's shared-info frame number. */ unsigned long shared_info_frame; /* A copy of the CPU context of the guest. */ vcpu_guest_context_any_t ctxt; /* A table containing the type of each PFN (/not/ MFN!). */ unsigned long *pfn_type = NULL; unsigned long *pfn_batch = NULL; /* A copy of one frame of guest memory. */ char page[PAGE_SIZE]; /* Live mapping of shared info structure */ shared_info_any_t *live_shinfo = NULL; /* base of the region in which domain memory is mapped */ unsigned char *region_base = NULL; /* bitmap of pages: - that should be sent this iteration (unless later marked as skip); - to skip this iteration because already dirty; - to fixup by sending at the end if not already resent; */ unsigned long *to_send = NULL, *to_skip = NULL, *to_fix = NULL; xc_shadow_op_stats_t stats; unsigned long needed_to_fix = 0; unsigned long total_sent = 0; uint64_t vcpumap = 1ULL; /* HVM: a buffer for holding HVM context */ uint32_t hvm_buf_size = 0; uint8_t *hvm_buf = NULL; /* HVM: magic frames for ioreqs and xenstore comms. */ uint64_t magic_pfns[3]; /* ioreq_pfn, bufioreq_pfn, store_pfn */ unsigned long mfn; /* If no explicit control parameters given, use defaults */ max_iters = max_iters ? : DEF_MAX_ITERS; max_factor = max_factor ? : DEF_MAX_FACTOR; initialize_mbit_rate(); DPRINTF("-->xc_domain_save()\n"); if ( !get_platform_info(xc_handle, dom, &max_mfn, &hvirt_start, &pt_levels, &guest_width) ) { ERROR("Unable to get platform info."); return 1; } DPRINTF("platform info, max_mfn: %lx, hvirt_start %lx, pt_lvevel %x, guest_width %x\n", max_mfn, hvirt_start, pt_levels, guest_width); if ( xc_domain_getinfo(xc_handle, dom, 1, &info) != 1 ) { ERROR("Could not get domain info"); return 1; } shared_info_frame = info.shared_info_frame; DPRINTF("shared_info_frame: 0x%lx\n", shared_info_frame); /* Map the shared info frame */ if ( !hvm ) { live_shinfo = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, PROT_READ, shared_info_frame); if ( !live_shinfo ) { ERROR("Couldn't map live_shinfo"); goto out; } } /* Get the size of the P2M table */ p2m_size = xc_memory_op(xc_handle, XENMEM_maximum_gpfn, &dom) + 1; DPRINTF("p2m_size: 0x%lx", p2m_size); /* Domain is still running at this point */ if ( live ) { DPRINTF("live suspend\n"); /* Live suspend. Enable log-dirty mode. */ if ( xc_shadow_control(xc_handle, dom, XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY, NULL, 0, NULL, 0, NULL) < 0 ) { /* log-dirty already enabled? There's no test op, so attempt to disable then reenable it */ frc = xc_shadow_control(xc_handle, dom, XEN_DOMCTL_SHADOW_OP_OFF, NULL, 0, NULL, 0, NULL); if ( frc >= 0 ) { frc = xc_shadow_control(xc_handle, dom, XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY, NULL, 0, NULL, 0, NULL); } if ( frc < 0 ) { ERROR("Couldn't enable shadow mode (rc %d) (errno %d)", frc, errno ); goto out; } } if ( hvm ) { /* Get qemu-dm logging dirty pages too */ void *seg = init_qemu_maps(dom, BITMAP_SIZE); qemu_bitmaps[0] = seg; qemu_bitmaps[1] = seg + BITMAP_SIZE; qemu_active = 0; qemu_non_active = 1; } } else { /* This is a non-live suspend. Suspend the domain .*/ if ( suspend_and_state(suspend, xc_handle, io_fd, dom, &info) ) { ERROR("Domain appears not to have suspended"); goto out; } } last_iter = !live; /* pretend we sent all the pages last iteration */ sent_last_iter = p2m_size; /* Setup to_send / to_fix and to_skip bitmaps */ to_send = xg_memalign(PAGE_SIZE, ROUNDUP(BITMAP_SIZE, PAGE_SHIFT)); to_fix = calloc(1, BITMAP_SIZE); to_skip = xg_memalign(PAGE_SIZE, ROUNDUP(BITMAP_SIZE, PAGE_SHIFT)); if ( !to_send || !to_fix || !to_skip ) { ERROR("Couldn't allocate to_send array"); goto out; } memset(to_send, 0xff, BITMAP_SIZE); if ( lock_pages(to_send, BITMAP_SIZE) ) { ERROR("Unable to lock to_send"); return 1; } /* (to fix is local only) */ if ( lock_pages(to_skip, BITMAP_SIZE) ) { ERROR("Unable to lock to_skip"); return 1; } if ( hvm ) { DPRINTF("Need another buffer for HVM context\n"); /* Need another buffer for HVM context */ hvm_buf_size = xc_domain_hvm_getcontext(xc_handle, dom, 0, 0); if ( hvm_buf_size == -1 ) { ERROR("Couldn't get HVM context size from Xen"); goto out; } hvm_buf = malloc(hvm_buf_size); if ( !hvm_buf ) { ERROR("Couldn't allocate memory"); goto out; } } analysis_phase(xc_handle, dom, p2m_size, to_skip, 0); pfn_type = xg_memalign(PAGE_SIZE, ROUNDUP( MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT)); pfn_batch = calloc(MAX_BATCH_SIZE, sizeof(*pfn_batch)); if ( (pfn_type == NULL) || (pfn_batch == NULL) ) { ERROR("failed to alloc memory for pfn_type and/or pfn_batch arrays"); errno = ENOMEM; goto out; } memset(pfn_type, 0, ROUNDUP(MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT)); if ( lock_pages(pfn_type, MAX_BATCH_SIZE * sizeof(*pfn_type)) ) { ERROR("Unable to lock pfn_type array"); goto out; } DPRINTF("Setup the mfn_to_pfn table mapping\n"); /* Setup the mfn_to_pfn table mapping */ if ( !(live_m2p = xc_map_m2p(xc_handle, max_mfn, PROT_READ)) ) { ERROR("Failed to map live M2P table"); goto out; } DPRINTF("Start writing out the saved-domain record.\n"); /* Start writing out the saved-domain record. */ if ( write_exact(io_fd, &p2m_size, sizeof(unsigned long)) ) { PERROR("write: p2m_size"); goto out; } if ( !hvm ) { int err = 0; /* Map the P2M table, and write the list of P2M frames */ live_p2m = map_and_save_p2m_table(xc_handle, io_fd, dom, p2m_size, live_shinfo); if ( live_p2m == NULL ) { ERROR("Failed to map/save the p2m frame list"); goto out; } /* * Quick belt and braces sanity check. */ for ( i = 0; i < p2m_size; i++ ) { mfn = pfn_to_mfn(i); if( (mfn != INVALID_P2M_ENTRY) && (mfn_to_pfn(mfn) != i) ) { DPRINTF("i=0x%x mfn=%lx live_m2p=%lx\n", i, mfn, mfn_to_pfn(mfn)); err++; } } DPRINTF("Had %d unexplained entries in p2m table\n", err); } print_stats(xc_handle, dom, 0, &stats, 0); tmem_saved = xc_tmem_save(xc_handle, dom, io_fd, live, -5); if ( tmem_saved == -1 ) { ERROR("Error when writing to state file (tmem)"); goto out; } /* Now write out each data page, canonicalising page tables as we go... */ for ( ; ; ) { unsigned int prev_pc, sent_this_iter, N, batch, run; iter++; sent_this_iter = 0; skip_this_iter = 0; prev_pc = 0; N = 0; DPRINTF("Saving memory pages: iter %d 0%%", iter); while ( N < p2m_size ) { unsigned int this_pc = (N * 100) / p2m_size; if ( (this_pc - prev_pc) >= 5 ) { DPRINTF("\b\b\b\b%3d%%", this_pc); prev_pc = this_pc; } if ( !last_iter ) { /* Slightly wasteful to peek the whole array evey time, but this is fast enough for the moment. */ frc = xc_shadow_control( xc_handle, dom, XEN_DOMCTL_SHADOW_OP_PEEK, to_skip, p2m_size, NULL, 0, NULL); if ( frc != p2m_size ) { ERROR("Error peeking shadow bitmap"); goto out; } } /* load pfn_type[] with the mfn of all the pages we're doing in this batch. */ for ( batch = 0; (batch < MAX_BATCH_SIZE) && (N < p2m_size); N++ ) { int n = N; if ( debug ) { DPRINTF("%d pfn= %08lx mfn= %08lx %d", iter, (unsigned long)n, hvm ? 0 : pfn_to_mfn(n), test_bit(n, to_send)); if ( !hvm && is_mapped(pfn_to_mfn(n)) ) DPRINTF(" [mfn]= %08lx", mfn_to_pfn(pfn_to_mfn(n)&0xFFFFF)); DPRINTF("\n"); } if ( !last_iter && test_bit(n, to_send) && test_bit(n, to_skip) ) skip_this_iter++; /* stats keeping */ if ( !((test_bit(n, to_send) && !test_bit(n, to_skip)) || (test_bit(n, to_send) && last_iter) || (test_bit(n, to_fix) && last_iter)) ) continue; /* ** we get here if: ** 1. page is marked to_send & hasn't already been re-dirtied ** 2. (ignore to_skip in last iteration) ** 3. add in pages that still need fixup (net bufs) */ pfn_batch[batch] = n; /* Hypercall interfaces operate in PFNs for HVM guests * and MFNs for PV guests */ if ( hvm ) pfn_type[batch] = n; else pfn_type[batch] = pfn_to_mfn(n); if ( !is_mapped(pfn_type[batch]) ) { /* ** not currently in psuedo-physical map -- set bit ** in to_fix since we must send this page in last_iter ** unless its sent sooner anyhow, or it never enters ** pseudo-physical map (e.g. for ballooned down doms) */ set_bit(n, to_fix); continue; } if ( last_iter && test_bit(n, to_fix) && !test_bit(n, to_send) ) { needed_to_fix++; DPRINTF("Fix! iter %d, pfn %x. mfn %lx\n", iter, n, pfn_type[batch]); } clear_bit(n, to_fix); batch++; } if ( batch == 0 ) goto skip; /* vanishingly unlikely... */ region_base = xc_map_foreign_batch( xc_handle, dom, PROT_READ, pfn_type, batch); if ( region_base == NULL ) { ERROR("map batch failed"); goto out; } if ( hvm ) { /* Look for and skip completely empty batches. */ for ( j = 0; j < batch; j++ ) if ( (pfn_type[j] & XEN_DOMCTL_PFINFO_LTAB_MASK) != XEN_DOMCTL_PFINFO_XTAB ) break; if ( j == batch ) { munmap(region_base, batch*PAGE_SIZE); continue; /* bail on this batch: no valid pages */ } } else { /* Get page types */ for ( j = 0; j < batch; j++ ) ((uint32_t *)pfn_type)[j] = pfn_type[j]; if ( xc_get_pfn_type_batch(xc_handle, dom, batch, (uint32_t *)pfn_type) ) { ERROR("get_pfn_type_batch failed"); goto out; } for ( j = batch-1; j >= 0; j-- ) pfn_type[j] = ((uint32_t *)pfn_type)[j]; for ( j = 0; j < batch; j++ ) { if ( (pfn_type[j] & XEN_DOMCTL_PFINFO_LTAB_MASK) == XEN_DOMCTL_PFINFO_XTAB ) { DPRINTF("type fail: page %i mfn %08lx\n", j, pfn_type[j]); continue; } if ( debug ) DPRINTF("%d pfn= %08lx mfn= %08lx [mfn]= %08lx" " sum= %08lx\n", iter, (pfn_type[j] & XEN_DOMCTL_PFINFO_LTAB_MASK) | pfn_batch[j], pfn_type[j], mfn_to_pfn(pfn_type[j] & ~XEN_DOMCTL_PFINFO_LTAB_MASK), csum_page(region_base + (PAGE_SIZE*j))); /* canonicalise mfn->pfn */ pfn_type[j] = (pfn_type[j] & XEN_DOMCTL_PFINFO_LTAB_MASK) | pfn_batch[j]; } } if ( write_exact(io_fd, &batch, sizeof(unsigned int)) ) { PERROR("Error when writing to state file (2)"); goto out; } if ( write_exact(io_fd, pfn_type, sizeof(unsigned long)*batch) ) { PERROR("Error when writing to state file (3)"); goto out; } /* entering this loop, pfn_type is now in pfns (Not mfns) */ run = 0; for ( j = 0; j < batch; j++ ) { unsigned long pfn, pagetype; void *spage = (char *)region_base + (PAGE_SIZE*j); pfn = pfn_type[j] & ~XEN_DOMCTL_PFINFO_LTAB_MASK; pagetype = pfn_type[j] & XEN_DOMCTL_PFINFO_LTAB_MASK; if ( pagetype != 0 ) { /* If the page is not a normal data page, write out any run of pages we may have previously acumulated */ if ( run ) { if ( ratewrite(io_fd, live, (char*)region_base+(PAGE_SIZE*(j-run)), PAGE_SIZE*run) != PAGE_SIZE*run ) { ERROR("Error when writing to state file (4a)" " (errno %d)", errno); goto out; } run = 0; } } /* skip pages that aren't present */ if ( pagetype == XEN_DOMCTL_PFINFO_XTAB ) continue; pagetype &= XEN_DOMCTL_PFINFO_LTABTYPE_MASK; if ( (pagetype >= XEN_DOMCTL_PFINFO_L1TAB) && (pagetype <= XEN_DOMCTL_PFINFO_L4TAB) ) { /* We have a pagetable page: need to rewrite it. */ DPRINTF(" We have a pagetable page: need to rewrite it\n"); race = canonicalize_pagetable(pagetype, pfn, spage, page); if ( race && !live ) { ERROR("Fatal PT race (pfn %lx, type %08lx)", pfn, pagetype); goto out; } if ( ratewrite(io_fd, live, page, PAGE_SIZE) != PAGE_SIZE ) { ERROR("Error when writing to state file (4b)" " (errno %d)", errno); goto out; } } else { /* We have a normal page: accumulate it for writing. */ run++; } } /* end of the write out for this batch */ if ( run ) { /* write out the last accumulated run of pages */ if ( ratewrite(io_fd, live, (char*)region_base+(PAGE_SIZE*(j-run)), PAGE_SIZE*run) != PAGE_SIZE*run ) { ERROR("Error when writing to state file (4c)" " (errno %d)", errno); goto out; } } sent_this_iter += batch; munmap(region_base, batch*PAGE_SIZE); } /* end of this while loop for this iteration */ skip: total_sent += sent_this_iter; DPRINTF("\r %d: sent %d, skipped %d, ", iter, sent_this_iter, skip_this_iter ); if ( last_iter ) { print_stats( xc_handle, dom, sent_this_iter, &stats, 1); DPRINTF("Total pages sent= %ld (%.2fx)\n", total_sent, ((float)total_sent)/p2m_size ); DPRINTF("(of which %ld were fixups)\n", needed_to_fix ); } if ( last_iter && debug ) { int minusone = -1; memset(to_send, 0xff, BITMAP_SIZE); debug = 0; DPRINTF("Entering debug resend-all mode\n"); /* send "-1" to put receiver into debug mode */ if ( write_exact(io_fd, &minusone, sizeof(int)) ) { PERROR("Error when writing to state file (6)"); goto out; } continue; } if ( last_iter ) break; if ( live ) { if ( ((sent_this_iter > sent_last_iter) && RATE_IS_MAX()) || (iter >= max_iters) || (sent_this_iter+skip_this_iter < 50) || (total_sent > p2m_size*max_factor) ) { DPRINTF("Start last iteration\n"); last_iter = 1; if ( suspend_and_state(suspend, xc_handle, io_fd, dom, &info) ) { ERROR("Domain appears not to have suspended"); goto out; } DPRINTF("SUSPEND shinfo %08lx\n", info.shared_info_frame); if ( (tmem_saved > 0) && (xc_tmem_save_extra(xc_handle,dom,io_fd,-6) == -1) ) { ERROR("Error when writing to state file (tmem)"); goto out; } } if ( xc_shadow_control(xc_handle, dom, XEN_DOMCTL_SHADOW_OP_CLEAN, to_send, p2m_size, NULL, 0, &stats) != p2m_size ) { ERROR("Error flushing shadow PT"); goto out; } if ( hvm ) { /* Pull in the dirty bits from qemu-dm too */ if ( !last_iter ) { qemu_active = qemu_non_active; qemu_non_active = qemu_active ? 0 : 1; qemu_flip_buffer(dom, qemu_active); for ( j = 0; j < BITMAP_SIZE / sizeof(unsigned long); j++ ) { to_send[j] |= qemu_bitmaps[qemu_non_active][j]; qemu_bitmaps[qemu_non_active][j] = 0; } } else { for ( j = 0; j < BITMAP_SIZE / sizeof(unsigned long); j++ ) to_send[j] |= qemu_bitmaps[qemu_active][j]; } } sent_last_iter = sent_this_iter; print_stats(xc_handle, dom, sent_this_iter, &stats, 1); } } /* end of infinite for loop */ DPRINTF("All memory is saved\n"); { struct { int minustwo; int max_vcpu_id; uint64_t vcpumap; } chunk = { -2, info.max_vcpu_id }; if ( info.max_vcpu_id >= 64 ) { ERROR("Too many VCPUS in guest!"); goto out; } for ( i = 1; i <= info.max_vcpu_id; i++ ) { xc_vcpuinfo_t vinfo; if ( (xc_vcpu_getinfo(xc_handle, dom, i, &vinfo) == 0) && vinfo.online ) vcpumap |= 1ULL << i; } chunk.vcpumap = vcpumap; if ( write_exact(io_fd, &chunk, sizeof(chunk)) ) { PERROR("Error when writing to state file"); goto out; } } if ( hvm ) { struct { int id; uint32_t pad; uint64_t data; } chunk = { 0, }; chunk.id = -3; xc_get_hvm_param(xc_handle, dom, HVM_PARAM_IDENT_PT, (unsigned long *)&chunk.data); if ( (chunk.data != 0) && write_exact(io_fd, &chunk, sizeof(chunk)) ) { PERROR("Error when writing the ident_pt for EPT guest"); goto out; } chunk.id = -4; xc_get_hvm_param(xc_handle, dom, HVM_PARAM_VM86_TSS, (unsigned long *)&chunk.data); if ( (chunk.data != 0) && write_exact(io_fd, &chunk, sizeof(chunk)) ) { PERROR("Error when writing the vm86 TSS for guest"); goto out; } } /* Zero terminate */ i = 0; if ( write_exact(io_fd, &i, sizeof(int)) ) { PERROR("Error when writing to state file (6')"); goto out; } if ( hvm ) { uint32_t rec_size; /* Save magic-page locations. */ memset(magic_pfns, 0, sizeof(magic_pfns)); xc_get_hvm_param(xc_handle, dom, HVM_PARAM_IOREQ_PFN, (unsigned long *)&magic_pfns[0]); xc_get_hvm_param(xc_handle, dom, HVM_PARAM_BUFIOREQ_PFN, (unsigned long *)&magic_pfns[1]); xc_get_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN, (unsigned long *)&magic_pfns[2]); if ( write_exact(io_fd, magic_pfns, sizeof(magic_pfns)) ) { PERROR("Error when writing to state file (7)"); goto out; } /* Get HVM context from Xen and save it too */ if ( (rec_size = xc_domain_hvm_getcontext(xc_handle, dom, hvm_buf, hvm_buf_size)) == -1 ) { ERROR("HVM:Could not get hvm buffer"); goto out; } if ( write_exact(io_fd, &rec_size, sizeof(uint32_t)) ) { PERROR("error write hvm buffer size"); goto out; } if ( write_exact(io_fd, hvm_buf, rec_size) ) { PERROR("write HVM info failed!\n"); goto out; } /* HVM guests are done now */ rc = 0; goto out; } /* PV guests only from now on */ /* Send through a list of all the PFNs that were not in map at the close */ { unsigned int i,j; unsigned long pfntab[1024]; for ( i = 0, j = 0; i < p2m_size; i++ ) { if ( !is_mapped(pfn_to_mfn(i)) ) j++; } if ( write_exact(io_fd, &j, sizeof(unsigned int)) ) { PERROR("Error when writing to state file (6a)"); goto out; } for ( i = 0, j = 0; i < p2m_size; ) { if ( !is_mapped(pfn_to_mfn(i)) ) pfntab[j++] = i; i++; if ( (j == 1024) || (i == p2m_size) ) { if ( write_exact(io_fd, &pfntab, sizeof(unsigned long)*j) ) { PERROR("Error when writing to state file (6b)"); goto out; } j = 0; } } } if ( xc_vcpu_getcontext(xc_handle, dom, 0, &ctxt) ) { ERROR("Could not get vcpu context"); goto out; } /* Canonicalise the suspend-record frame number. */ mfn = GET_FIELD(&ctxt, user_regs.edx); if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) ) { ERROR("Suspend record is not in range of pseudophys map"); goto out; } SET_FIELD(&ctxt, user_regs.edx, mfn_to_pfn(mfn)); for ( i = 0; i <= info.max_vcpu_id; i++ ) { if ( !(vcpumap & (1ULL << i)) ) continue; if ( (i != 0) && xc_vcpu_getcontext(xc_handle, dom, i, &ctxt) ) { ERROR("No context for VCPU%d", i); goto out; } /* Canonicalise each GDT frame number. */ for ( j = 0; (512*j) < GET_FIELD(&ctxt, gdt_ents); j++ ) { mfn = GET_FIELD(&ctxt, gdt_frames[j]); if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) ) { ERROR("GDT frame is not in range of pseudophys map"); goto out; } SET_FIELD(&ctxt, gdt_frames[j], mfn_to_pfn(mfn)); } /* Canonicalise the page table base pointer. */ if ( !MFN_IS_IN_PSEUDOPHYS_MAP(UNFOLD_CR3( GET_FIELD(&ctxt, ctrlreg[3]))) ) { ERROR("PT base is not in range of pseudophys map"); goto out; } SET_FIELD(&ctxt, ctrlreg[3], FOLD_CR3(mfn_to_pfn(UNFOLD_CR3(GET_FIELD(&ctxt, ctrlreg[3]))))); /* Guest pagetable (x86/64) stored in otherwise-unused CR1. */ if ( (pt_levels == 4) && ctxt.x64.ctrlreg[1] ) { if ( !MFN_IS_IN_PSEUDOPHYS_MAP(UNFOLD_CR3(ctxt.x64.ctrlreg[1])) ) { ERROR("PT base is not in range of pseudophys map"); goto out; } /* Least-significant bit means 'valid PFN'. */ ctxt.x64.ctrlreg[1] = 1 | FOLD_CR3(mfn_to_pfn(UNFOLD_CR3(ctxt.x64.ctrlreg[1]))); } if ( write_exact(io_fd, &ctxt, ((guest_width==8) ? sizeof(ctxt.x64) : sizeof(ctxt.x32))) ) { PERROR("Error when writing to state file (1)"); goto out; } domctl.cmd = XEN_DOMCTL_get_ext_vcpucontext; domctl.domain = dom; domctl.u.ext_vcpucontext.vcpu = i; if ( xc_domctl(xc_handle, &domctl) < 0 ) { ERROR("No extended context for VCPU%d", i); goto out; } if ( write_exact(io_fd, &domctl.u.ext_vcpucontext, 128) ) { PERROR("Error when writing to state file (2)"); goto out; } } /* * Reset the MFN to be a known-invalid value. See map_frame_list_list(). */ memcpy(page, live_shinfo, PAGE_SIZE); SET_FIELD(((shared_info_any_t *)page), arch.pfn_to_mfn_frame_list_list, 0); if ( write_exact(io_fd, page, PAGE_SIZE) ) { PERROR("Error when writing to state file (1)"); goto out; } /* Success! */ rc = 0; out: if ( tmem_saved != 0 && live ) xc_tmem_save_done(xc_handle, dom); if ( live ) { if ( xc_shadow_control(xc_handle, dom, XEN_DOMCTL_SHADOW_OP_OFF, NULL, 0, NULL, 0, NULL) < 0 ) DPRINTF("Warning - couldn't disable shadow mode"); } /* Flush last write and discard cache for file. */ discard_file_cache(io_fd, 1 /* flush */); if ( live_shinfo ) munmap(live_shinfo, PAGE_SIZE); if ( live_p2m ) munmap(live_p2m, P2M_FLL_ENTRIES * PAGE_SIZE); if ( live_m2p ) munmap(live_m2p, M2P_SIZE(max_mfn)); free(pfn_type); free(pfn_batch); free(to_send); free(to_fix); free(to_skip); DPRINTF("Save exit rc=%d\n",rc); return !!rc; } /* * Local variables: * mode: C * c-set-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil * End: */ --------------070001090300020905000106 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------070001090300020905000106--