SU5UUk9EVUNUSU9OCgogIFRoZSBVU0Igc2VyaWFsIGRyaXZlciBjdXJyZW50bHkgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IFVTQiB0bwogIHNlcmlhbCBjb252ZXJ0ZXIgcHJvZHVjdHMsIGFzIHdlbGwgYXMgc29tZSBkZXZpY2VzIHRoYXQgdXNlIGEgc2VyaWFsCiAgaW50ZXJmYWNlIGZyb20gdXNlcnNwYWNlIHRvIHRhbGsgdG8gdGhlIGRldmljZS4KCiAgU2VlIHRoZSBpbmRpdmlkdWFsIHByb2R1Y3Qgc2VjdGlvbiBiZWxvdyBmb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQKICB0aGUgZGlmZmVyZW50IGRldmljZXMuCgoKQ09ORklHVVJBVElPTgoKICBDdXJyZW50bHkgdGhlIGRyaXZlciBjYW4gaGFuZGxlIHVwIHRvIDI1NiBkaWZmZXJlbnQgc2VyaWFsIGludGVyZmFjZXMgYXQKICBvbmUgdGltZS4gCgogIElmIHlvdSBhcmUgbm90IHVzaW5nIGRldmZzOgogICAgVGhlIG1ham9yIG51bWJlciB0aGF0IHRoZSBkcml2ZXIgdXNlcyBpcyAxODggc28gdG8gdXNlIHRoZSBkcml2ZXIsCiAgICBjcmVhdGUgdGhlIGZvbGxvd2luZyBub2RlczoKCW1rbm9kIC9kZXYvdHR5VVNCMCBjIDE4OCAwCglta25vZCAvZGV2L3R0eVVTQjEgYyAxODggMQoJbWtub2QgL2Rldi90dHlVU0IyIGMgMTg4IDIKCW1rbm9kIC9kZXYvdHR5VVNCMyBjIDE4OCAzCgkJLgoJCS4KCQkuCglta25vZCAvZGV2L3R0eVVTQjI1NCBjIDE4OCAyNTQKCW1rbm9kIC9kZXYvdHR5VVNCMjU1IGMgMTg4IDI1NQoKICBJZiB5b3UgYXJlIHVzaW5nIGRldmZzOgogICAgVGhlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyIHdpbGwgc2hvdyB1cCBhcwogICAgL2Rldi91c2IvdHRzL3swLDEsLi4ufQoKICBXaGVuIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGFuZCByZWNvZ25pemVkIGJ5IHRoZSBkcml2ZXIsIHRoZSBkcml2ZXIKICB3aWxsIHByaW50IHRvIHRoZSBzeXN0ZW0gbG9nLCB3aGljaCBub2RlKHMpIHRoZSBkZXZpY2UgaGFzIGJlZW4gYm91bmQKICB0by4KICAKClNQRUNJRklDIERFVklDRVMgU1VQUE9SVEVECgoKQ29ubmVjdFRlY2ggV2hpdGVIRUFUIDQgcG9ydCBjb252ZXJ0ZXIKCiAgQ29ubmVjdFRlY2ggaGFzIGJlZW4gdmVyeSBmb3J0aGNvbWluZyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyCiAgZGV2aWNlLCBpbmNsdWRpbmcgcHJvdmlkaW5nIGEgdW5pdCB0byB0ZXN0IHdpdGguCgogIFRoZSBkcml2ZXIgaXMgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgYnkgQ29ubmVjdCBUZWNoIEluYy4KICBodHRwOi8vd3d3LmNvbm5lY3R0ZWNoLmNvbQoKICBGb3IgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoaXMgZHJpdmVyLCBwbGVhc2UgY29udGFjdAogIFN0dWFydCBNYWNEb25hbGQgYXQgc3R1YXJ0bUBjb25uZWN0dGVjaC5jb20KCgpIYW5kU3ByaW5nIFZpc29yLCBQYWxtIFVTQiwgYW5kIENsaekgVVNCIGRyaXZlcgoKICBUaGlzIGRyaXZlciB3b3JrcyB3aXRoIGFsbCBIYW5kU3ByaW5nIFVTQiwgUGFsbSBVU0IsIGFuZCBTb255IENsaekgVVNCCiAgZGV2aWNlcy4KCiAgT25seSB3aGVuIHRoZSBkZXZpY2UgdHJpZXMgdG8gY29ubmVjdCB0byB0aGUgaG9zdCwgd2lsbCB0aGUgZGV2aWNlIHNob3cKICB1cCB0byB0aGUgaG9zdCBhcyBhIHZhbGlkIFVTQiBkZXZpY2UuIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgZGV2aWNlIGlzCiAgcHJvcGVybHkgZW51bWVyYXRlZCwgYXNzaWduZWQgYSBwb3J0LCBhbmQgdGhlbiBjb21tdW5pY2F0aW9uIF9zaG91bGRfIGJlCiAgcG9zc2libGUuIFRoZSBkcml2ZXIgY2xlYW5zIHVwIHByb3Blcmx5IHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkLCBvcgogIHRoZSBjb25uZWN0aW9uIGlzIGNhbmNlbGVkIG9uIHRoZSBkZXZpY2UuCgogIE5PVEU6CiAgICBUaGlzIG1lYW5zIHRoYXQgaW4gb3JkZXIgdG8gdGFsayB0byB0aGUgZGV2aWNlLCB0aGUgc3luYyBidXR0b24gbXVzdCBiZQogICAgcHJlc3NlZCBCRUZPUkUgdHJ5aW5nIHRvIGdldCBhbnkgcHJvZ3JhbSB0byBjb21tdW5pY2F0ZSB0byB0aGUgZGV2aWNlLgogICAgVGhpcyBnb2VzIGFnYWluc3QgdGhlIGN1cnJlbnQgZG9jdW1lbnRhdGlvbiBmb3IgcGlsb3QteGZlciBhbmQgb3RoZXIKICAgIHBhY2thZ2VzLCBidXQgaXMgdGhlIG9ubHkgd2F5IHRoYXQgaXQgd2lsbCB3b3JrIGR1ZSB0byB0aGUgaGFyZHdhcmUKICAgIGluIHRoZSBkZXZpY2UuCiAgCiAgV2hlbiB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCwgdHJ5IHRhbGtpbmcgdG8gaXQgb24gdGhlIHNlY29uZCBwb3J0CiAgKHRoaXMgaXMgdXN1YWxseSAvZGV2L3R0eVVTQjEgaWYgeW91IGRvIG5vdCBoYXZlIGFueSBvdGhlciB1c2Itc2VyaWFsCiAgZGV2aWNlcyBpbiB0aGUgc3lzdGVtLikgVGhlIHN5c3RlbSBsb2cgc2hvdWxkIHRlbGwgeW91IHdoaWNoIHBvcnQgaXMKICB0aGUgcG9ydCB0byB1c2UgZm9yIHRoZSBIb3RTeW5jIHRyYW5zZmVyLiBUaGUgIkdlbmVyaWMiIHBvcnQgY2FuIGJlIHVzZWQKICBmb3Igb3RoZXIgZGV2aWNlIGNvbW11bmljYXRpb24sIHN1Y2ggYXMgYSBQUFAgbGluay4KCiAgRm9yIHNvbWUgU29ueSBDbGnpIGRldmljZXMsIC9kZXYvdHR5VVNCMCBtdXN0IGJlIHVzZWQgdG8gdGFsayB0byB0aGUKICBkZXZpY2UuICBUaGlzIGlzIHRydWUgZm9yIGFsbCBPUyB2ZXJzaW9uIDMuNSBkZXZpY2VzLCBhbmQgbW9zdCBkZXZpY2VzCiAgdGhhdCBoYXZlIGhhZCBhIGZsYXNoIHVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBPUy4gIFNlZSB0aGUKICBrZXJuZWwgc3lzdGVtIGxvZyBmb3IgaW5mb3JtYXRpb24gb24gd2hpY2ggaXMgdGhlIGNvcnJlY3QgcG9ydCB0byB1c2UuCgogIElmIGFmdGVyIHByZXNzaW5nIHRoZSBzeW5jIGJ1dHRvbiwgbm90aGluZyBzaG93cyB1cCBpbiB0aGUgc3lzdGVtIGxvZywKICB0cnkgcmVzZXR0aW5nIHRoZSBkZXZpY2UsIGZpcnN0IGEgaG90IHJlc2V0LCBhbmQgdGhlbiBhIGNvbGQgcmVzZXQgaWYKICBuZWNlc3NhcnkuICBTb21lIGRldmljZXMgbmVlZCB0aGlzIGJlZm9yZSB0aGV5IGNhbiB0YWxrIHRvIHRoZSBVU0IgcG9ydAogIHByb3Blcmx5LgogIAogIERldmljZXMgdGhhdCBhcmUgbm90IGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbCBjYW4gYmUgc3BlY2lmaWVkIHdpdGggbW9kdWxlCiAgcGFyYW1ldGVycy4gIGUuZy4gbW9kcHJvYmUgdmlzb3IgdmVuZG9yPTB4NTRjIHByb2R1Y3Q9MHg2NgogIAogIFRoZXJlIGlzIGEgd2VicGFnZSBhbmQgbWFpbGluZyBsaXN0cyBmb3IgdGhpcyBwb3J0aW9uIG9mIHRoZSBkcml2ZXIgYXQ6CiAgaHR0cDovL3VzYnZpc29yLnNvdXJjZWZvcmdlLm5ldC8KCiAgRm9yIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMgd2l0aCB0aGlzIGRyaXZlciwgcGxlYXNlIGNvbnRhY3QgR3JlZwogIEtyb2FoLUhhcnRtYW4gYXQgZ3JlZ0Brcm9haC5jb20KCgpQb2NrZXRQQyBQREEgRHJpdmVyCgogIFRoaXMgZHJpdmVyIGNhbiBiZSB1c2VkIHRvIGNvbm5lY3QgdG8gQ29tcGFxIGlQQVEsIEhQIEpvcm5hZGEsIENhc2lvIEVNNTAwCiAgYW5kIG90aGVyIFBEQXMgcnVubmluZyBXaW5kb3dzIENFIDMuMCBvciBQb2NrZXRQQyAyMDAyIHVzaW5nIGEgVVNCCiAgY2FibGUvY3JhZGxlLgogIE1vc3QgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgQWN0aXZlU3luYyBhcmUgc3VwcG9ydGVkIG91dCBvZiB0aGUgYm94LgogIEZvciBvdGhlcnMsIHBsZWFzZSB1c2UgbW9kdWxlIHBhcmFtZXRlcnMgdG8gc3BlY2lmeSB0aGUgcHJvZHVjdCBhbmQgdmVuZG9yCiAgaWQuIGUuZy4gbW9kcHJvYmUgaXBhcSB2ZW5kb3I9MHgzZjAgcHJvZHVjdD0weDExMjUKCiAgVGhlIGRyaXZlciBwcmVzZW50cyBhIHNlcmlhbCBpbnRlcmZhY2UgKHVzdWFsbHkgb24gL2Rldi90dHlVU0IwKSBvdmVyCiAgd2hpY2ggb25lIG1heSBydW4gcHBwIGFuZCBlc3RhYmxpc2ggYSBUQ1AvSVAgbGluayB0byB0aGUgUERBLiBPbmNlIHRoaXMKICBpcyBkb25lLCB5b3UgY2FuIHRyYW5zZmVyIGZpbGVzLCBiYWNrdXAsIGRvd25sb2FkIGVtYWlsIGV0Yy4gVGhlIG1vc3QKICBzaWduaWZpY2FudCBhZHZhbnRhZ2Ugb2YgdXNpbmcgVVNCIGlzIHNwZWVkIC0gSSBjYW4gZ2V0IDczIHRvIDExMwogIGtieXRlcy9zZWMgZm9yIGRvd25sb2FkL3VwbG9hZCB0byBteSBpUEFRLgoKICBUaGlzIGRyaXZlciBpcyBvbmx5IG9uZSBvZiBhIHNldCBvZiBjb21wb25lbnRzIHJlcXVpcmVkIHRvIHV0aWxpemUKICB0aGUgVVNCIGNvbm5lY3Rpb24uIFBsZWFzZSB2aXNpdCBodHRwOi8vc3luY2Uuc291cmNlZm9yZ2UubmV0IHdoaWNoCiAgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBwYWNrYWdlcyBhbmQgYSBzaW1wbGUgc3RlcC1ieS1zdGVwIGhvd3RvLgoKICBPbmNlIGNvbm5lY3RlZCwgeW91IGNhbiB1c2UgV2luIENFIHByb2dyYW1zIGxpa2UgZnRwVmlldywgUG9ja2V0IE91dGxvb2sKICBmcm9tIHRoZSBQREEgYW5kIHhjZXJkaXNwLCBzeW5jZSB1dGlsaXRpZXMgZnJvbSB0aGUgTGludXggc2lkZS4KCiAgVG8gdXNlIFBvY2tldCBJRSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZ2l2ZW4gYXQKICBodHRwOi8vd3d3LnRla2d1cnUuY28udWsvRU01MDAvdXNidG9uZXQuaHRtIHRvIGFjaGlldmUgdGhlIHNhbWUgdGhpbmcKICBvbiBXaW45OC4gT21pdCB0aGUgcHJveHkgc2VydmVyIHBhcnQ7IExpbnV4IGlzIHF1aXRlIGNhcGFibGUgb2YgZm9yd2FyZGluZwogIHBhY2tldHMgdW5saWtlIFdpbjk4LiBBbm90aGVyIG1vZGlmaWNhdGlvbiBpcyByZXF1aXJlZCBhdCBsZWFzdCBmb3IgdGhlCiAgaVBBUSAtIGRpc2FibGUgYXV0b3N5bmMgYnkgZ29pbmcgdG8gdGhlIFN0YXJ0L1NldHRpbmdzL0Nvbm5lY3Rpb25zIG1lbnUKICBhbmQgdW5jaGVja2luZyB0aGUgIkF1dG9tYXRpY2FsbHkgc3luY2hyb25pemUgLi4uIiBib3guIEdvIHRvCiAgU3RhcnQvUHJvZ3JhbXMvQ29ubmVjdGlvbnMsIGNvbm5lY3QgdGhlIGNhYmxlIGFuZCBzZWxlY3QgInVzYmRpYWwiIChvcgogIHdoYXRldmVyIHlvdSBuYW1lZCB5b3VyIG5ldyBVU0IgY29ubmVjdGlvbikuIFlvdSBzaG91bGQgZmluYWxseSB3aW5kCiAgdXAgd2l0aCBhICJDb25uZWN0ZWQgdG8gdXNiZGlhbCIgd2luZG93IHdpdGggc3RhdHVzIHNob3duIGFzIGNvbm5lY3RlZC4KICBOb3cgc3RhcnQgdXAgUElFIGFuZCBicm93c2UgYXdheS4KCiAgSWYgaXQgZG9lc24ndCB3b3JrIGZvciBzb21lIHJlYXNvbiwgbG9hZCBib3RoIHRoZSB1c2JzZXJpYWwgYW5kIGlwYXEgbW9kdWxlCiAgd2l0aCB0aGUgbW9kdWxlIHBhcmFtZXRlciAiZGVidWciIHNldCB0byAxIGFuZCBleGFtaW5lIHRoZSBzeXN0ZW0gbG9nLgogIFlvdSBjYW4gYWxzbyB0cnkgc29mdC1yZXNldHRpbmcgeW91ciBQREEgYmVmb3JlIGF0dGVtcHRpbmcgYSBjb25uZWN0aW9uLgoKICBPdGhlciBmdW5jdGlvbmFsaXR5IG1heSBiZSBwb3NzaWJsZSBkZXBlbmRpbmcgb24geW91ciBQREEuIEFjY29yZGluZyB0bwogIFdlcyBDaWxsZGhhaXJlIDxiaWxseWJvYmpvZWhlbnJ5Ym9iQGhvdG1haWwuY29tPiwgd2l0aCB0aGUgVG9zaGliYSBFNTcwLAogIC4uLmlmIHlvdSBib290IGludG8gdGhlIGJvb3Rsb2FkZXIgKGhvbGQgZG93biB0aGUgcG93ZXIgd2hlbiBoaXR0aW5nIHRoZQogIHJlc2V0IGJ1dHRvbiwgY29udGludWluZyB0byBob2xkIG9udG8gdGhlIHBvd2VyIHVudGlsIHRoZSBib290bG9hZGVyIHNjcmVlbgogIGlzIGRpc3BsYXllZCksIHRoZW4gcHV0IGl0IGluIHRoZSBjcmFkbGUgd2l0aCB0aGUgaXBhcSBkcml2ZXIgbG9hZGVkLCBvcGVuCiAgYSB0ZXJtaW5hbCBvbiAvZGV2L3R0eVVTQjAsIGl0IGdpdmVzIHlvdSBhICJVU0IgUmVmbGFzaCIgdGVybWluYWwsIHdoaWNoIGNhbgogIGJlIHVzZWQgdG8gZmxhc2ggdGhlIFJPTSwgYXMgd2VsbCBhcyB0aGUgbWljcm9QIGNvZGUuLiAgc28gbXVjaCBmb3IgbmVlZGluZwogIFRvc2hpYmEncyAkMzUwIHNlcmlhbCBjYWJsZSBmb3IgZmxhc2hpbmchISA6RAogIE5PVEU6IFRoaXMgaGFzIE5PVCBiZWVuIHRlc3RlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCiAKICBGb3IgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoZSBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEdhbmVzaAogIFZhcmFkYXJhamFuIDxnYW5lc2hAdmVyaXRhcy5jb20+CgoKS2V5c3BhbiBQREEgU2VyaWFsIEFkYXB0ZXIKCiAgU2luZ2xlIHBvcnQgREItOSBzZXJpYWwgYWRhcHRlciwgcHVzaGVkIGFzIGEgUERBIGFkYXB0ZXIgZm9yIGlNYWNzIChtb3N0bHkKICBzb2xkIGluIE1hY2ludG9zaCBjYXRhbG9ncywgY29tZXMgaW4gYSB0cmFuc2x1Y2VudCB3aGl0ZS9ncmVlbiBkb25nbGUpLgogIEZhaXJseSBzaW1wbGUgZGV2aWNlLiBGaXJtd2FyZSBpcyBob21lYnJldy4KICBUaGlzIGRyaXZlciBhbHNvIHdvcmtzIGZvciB0aGUgWGlyY29tL0VudHJncmEgc2luZ2xlIHBvcnQgc2VyaWFsIGFkYXB0ZXIuCgogIEN1cnJlbnQgc3RhdHVzOgogICBUaGluZ3MgdGhhdCB3b3JrOgogICAgIGJhc2ljIGlucHV0L291dHB1dCAodGVzdGVkIHdpdGggJ2N1JykKICAgICBibG9ja2luZyB3cml0ZSB3aGVuIHNlcmlhbCBsaW5lIGNhbid0IGtlZXAgdXAKICAgICBjaGFuZ2luZyBiYXVkIHJhdGVzICh1cCB0byAxMTUyMDApCiAgICAgZ2V0dGluZy9zZXR0aW5nIG1vZGVtIGNvbnRyb2wgcGlucyAoVElPQ017R0VULFNFVCxCSVMsQklDfSkKICAgICBzZW5kaW5nIGJyZWFrIChhbHRob3VnaCBkdXJhdGlvbiBsb29rcyBzdXNwZWN0KQogICBUaGluZ3MgdGhhdCBkb24ndDoKICAgICBkZXZpY2Ugc3RyaW5ncyAoYXMgbG9nZ2VkIGJ5IGtlcm5lbCkgaGF2ZSB0cmFpbGluZyBiaW5hcnkgZ2FyYmFnZQogICAgIGRldmljZSBJRCBpc24ndCByaWdodCwgbWlnaHQgY29sbGlkZSB3aXRoIG90aGVyIEtleXNwYW4gcHJvZHVjdHMKICAgICBjaGFuZ2luZyBiYXVkIHJhdGVzIG91Z2h0IHRvIGZsdXNoIHR4L3J4IHRvIGF2b2lkIG1hbmdsZWQgaGFsZiBjaGFyYWN0ZXJzCiAgIEJpZyBUaGluZ3Mgb24gdGhlIHRvZG8gbGlzdDoKICAgICBwYXJpdHksIDcgdnMgOCBiaXRzIHBlciBjaGFyLCAxIG9yIDIgc3RvcCBiaXRzCiAgICAgSFcgZmxvdyBjb250cm9sCiAgICAgbm90IGFsbCBvZiB0aGUgc3RhbmRhcmQgVVNCIGRlc2NyaXB0b3JzIGFyZSBoYW5kbGVkOiBHZXRfU3RhdHVzLCBTZXRfRmVhdHVyZQogICAgIE9fTk9OQkxPQ0ssIHNlbGVjdCgpCgogIEZvciBhbnkgcXVlc3Rpb25zIG9yIHByb2JsZW1zIHdpdGggdGhpcyBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEJyaWFuCiAgV2FybmVyIGF0IHdhcm5lckBsb3RoYXIuY29tIAoKCktleXNwYW4gVVNBLXNlcmllcyBTZXJpYWwgQWRhcHRlcnMKCiAgU2luZ2xlLCBEdWFsIGFuZCBRdWFkIHBvcnQgYWRhcHRlcnMgLSBkcml2ZXIgdXNlcyBLZXlzcGFuIHN1cHBsaWVkIAogIGZpcm13YXJlIGFuZCBpcyBiZWluZyBkZXZlbG9wZWQgd2l0aCB0aGVpciBzdXBwb3J0LgogIAogIEN1cnJlbnQgc3RhdHVzOgogICAgVGhlIFVTQS0xOFgsIFVTQS0yOFgsIFVTQS0xOSwgVVNBLTE5VyBhbmQgVVNBLTQ5VyBhcmUgc3VwcG9ydGVkIGFuZAogICAgaGF2ZSBiZWVuIHByZXR0eSB0aHJvdWdobHkgdGVzdGVkIGF0IHZhcmlvdXMgYmF1ZCByYXRlcyB3aXRoIDgtTi0xCiAgICBjaGFyYWN0ZXIgc2V0dGluZ3MuICBPdGhlciBjaGFyYWN0ZXIgbGVuZ3RocyBhbmQgcGFyaXR5IHNldHVwcyBhcmUKICAgIHByZXNlbnRseSB1bnRlc3RlZC4KCiAgICBUaGUgVVNBLTI4IGlzbid0IHlldCBzdXBwb3J0ZWQgdGhvdWdoIGRvaW5nIHNvIHNob3VsZCBiZSBwcmV0dHkKICAgIHN0cmFpZ2h0Zm9yd2FyZC4gIENvbnRhY3QgdGhlIG1haW50YWluZXIgaWYgeW91IHJlcXVpcmUgdGhpcwogICAgZnVuY3Rpb25hbGl0eS4KICAKICBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdDoKICAgICAgICBodHRwOi8vbWlzYy5udS9odWdoL2tleXNwYW4uaHRtbAogICAKICBGb3IgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoaXMgZHJpdmVyLCBwbGVhc2UgY29udGFjdCBIdWdoCiAgQmxlbWluZ3MgYXQgaHVnaEBtaXNjLm51CgoKRlRESSBTaW5nbGUgUG9ydCBTZXJpYWwgRHJpdmVyCgogIFRoaXMgaXMgYSBzaW5nbGUgcG9ydCBEQi0yNSBzZXJpYWwgYWRhcHRlci4gTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzCiAgZGV2aWNlIGFuZCB0aGUgTGludXggZHJpdmVyIGNhbiBiZSBmb3VuZCBhdDoKCWh0dHA6Ly9yZWFsaXR5LnNnaS5jb20vYnJ5ZGVyX3dlbGxpbmd0b24vZnRkaV9zaW8vCgogIEZvciBhbnkgcXVlc3Rpb25zIG9yIHByb2JsZW1zIHdpdGggdGhpcyBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEJpbGwgUnlkZXIKICBhdCBicnlkZXJAc2dpLmNvbQoKClp5WEVMIG9tbmkubmV0IGxjZCBwbHVzIElTRE4gVEEKCiAgVGhpcyBpcyBhbiBJU0ROIFRBLiBQbGVhc2UgcmVwb3J0IGJvdGggc3VjY2Vzc2VzIGFuZCB0cm91YmxlcyB0bwogIGF6dW1tb0B0b3dlcnRlY2guaXQKCgpDeXByZXNzIE04IENZNDYwMSBGYW1pbHkgU2VyaWFsIERyaXZlcgoKICBUaGlzIGRyaXZlciB3YXMgaW4gbW9zdCBwYXJ0IGRldmVsb3BlZCBieSBOZWlsICJrb3lhbWEiIFdoZWxjaGVsLiAgSXQKICBoYXMgYmVlbiBpbXByb3ZlZCBzaW5jZSB0aGF0IHByZXZpb3VzIGZvcm0gdG8gc3VwcG9ydCBkeW5hbWljIHNlcmlhbAogIGxpbmUgc2V0dGluZ3MgYW5kIGltcHJvdmVkIGxpbmUgaGFuZGxpbmcuICBUaGUgZHJpdmVyIGlzIGZvciB0aGUgbW9zdAogIHBhcnQgc3RhYmxlIGFuZCBoYXMgYmVlbiB0ZXN0ZWQgb24gYW4gc21wIG1hY2hpbmUuIChkdWFsIHAyKQoKICAgIENoaXBzZXRzIHN1cHBvcnRlZCB1bmRlciBDWTQ2MDEgZmFtaWx5OgoJCgkJQ1k3QzYzNzIzLCBDWTdDNjM3NDIsIENZN0M2Mzc0MywgQ1k3QzY0MDEzCgogICAgRGV2aWNlcyBzdXBwb3J0ZWQ6CgoJCS1EZUxvcm1lJ3MgVVNCIEVhcnRobWF0ZSAoU2lSRiBTdGFyIElJIGxwIGFyY2gpCgkJLUN5cHJlc3MgSElELT5DT00gUlMyMzIgYWRhcHRlcgoJCgkJTm90ZTogQ3lwcmVzcyBTZW1pY29uZHVjdG9yIGNsYWltcyBubyBhZmZpbGlhdGlvbiB3aXRoIHRoZQoJCQl0aGUgaGlkLT5jb20gZGV2aWNlLgoKCU1vc3QgZGV2aWNlcyB1c2luZyBjaGlwc2V0cyB1bmRlciB0aGUgQ1k0NjAxIGZhbWlseSBzaG91bGQKICAgICB3b3JrIHdpdGggdGhlIGRyaXZlci4gIEFzIGxvbmcgYXMgdGhleSBzdGF5IHRydWUgdG8gdGhlIENZNDYwMQogICAgIHVzYnNlcmlhbCBzcGVjaWZpY2F0aW9uLgoKICAgIFRlY2huaWNhbCBub3RlczoKCiAgICAgICAgVGhlIEVhcnRobWF0ZSBzdGFydHMgb3V0IGF0IDQ4MDAgOE4xIGJ5IGRlZmF1bHQuLi4gdGhlIGRyaXZlciB3aWxsCgl1cG9uIHN0YXJ0IGluaXQgdG8gdGhpcyBzZXR0aW5nLiAgdXNic2VyaWFsIGNvcmUgcHJvdmlkZXMgdGhlIHJlc3QKCW9mIHRoZSB0ZXJtaW9zIHNldHRpbmdzLCBhbG9uZyB3aXRoIHNvbWUgY3VzdG9tIHRlcm1pb3Mgc28gdGhhdCB0aGUKCW91dHB1dCBpcyBpbiBwcm9wZXIgZm9ybWF0IGFuZCBwYXJzYWJsZS4KCQoJVGhlIGRldmljZSBjYW4gYmUgcHV0IGludG8gc2lyZiBtb2RlIGJ5IGlzc3VpbmcgTk1FQSBjb21tYW5kOgoJCSRQU1JGMTAwLDxwcm90b2NvbD4sPGJhdWQ+LDxkYXRhYml0cz4sPHN0b3BiaXRzPiw8cGFyaXR5PipDSEVDS1NVTQoJCSRQU1JGMTAwLDAsOTYwMCw4LDEsMCowQwoKCQlJdCBzaG91bGQgdGhlbiBiZSBzdWZmaWNpZW50IHRvIGNoYW5nZSB0aGUgcG9ydCB0ZXJtaW9zIHRvIG1hdGNoIHRoaXMKCQl0byBiZWdpbiBjb21tdW5pY2F0aW5nLgoKCUFzIGZhciBhcyBJIGNhbiB0ZWxsIGl0IHN1cHBvcnRzIHByZXR0eSBtdWNoIGV2ZXJ5IHNpcmYgY29tbWFuZCBhcwoJZG9jdW1lbnRlZCBvbmxpbmUgYXZhaWxhYmxlIHdpdGggZmlybXdhcmUgMi4zMSwgd2l0aCBzb21lIHVua25vd24KCW1lc3NhZ2UgaWRzLgoKCVRoZSBoaWQtPmNvbSBhZGFwdGVyIGNhbiBydW4gYXQgYSBtYXhpbXVtIGJhdWQgb2YgMTE1MjAwYnBzLiAgUGxlYXNlIG5vdGUKCXRoYXQgdGhlIGRldmljZSBoYXMgdHJvdWJsZSBvciBpcyBpbmNhcGFibGUgb2YgcmFpc2luZyBsaW5lIHZvbHRhZ2UgcHJvcGVybHkuCglJdCB3aWxsIGJlIGZpbmUgd2l0aCBudWxsIG1vZGVtIGxpbmtzLCBhcyBsb25nIGFzIHlvdSBkbyBub3QgdHJ5IHRvIGxpbmsgdHdvCgl0b2dldGhlciB3aXRob3V0IGhhY2tpbmcgdGhlIGFkYXB0ZXIgdG8gc2V0IHRoZSBsaW5lIGhpZ2guCgoJVGhlIGRyaXZlciBpcyBzbXAgc2FmZS4gIFBlcmZvcm1hbmNlIHdpdGggdGhlIGRyaXZlciBpcyByYXRoZXIgbG93IHdoZW4gdXNpbmcKCWl0IGZvciB0cmFuc2ZlcmluZyBmaWxlcy4gIFRoaXMgaXMgYmVpbmcgd29ya2VkIG9uLCBidXQgSSB3b3VsZCBiZSB3aWxsaW5nIHRvCglhY2NlcHQgcGF0Y2hlcy4gIEFuIHVyYiBxdWV1ZSBvciBwYWNrZXQgYnVmZmVyIHdvdWxkIGxpa2VseSBmaXQgdGhlIGJpbGwgaGVyZS4KCglJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLCBwcm9ibGVtcywgcGF0Y2hlcywgZmVhdHVyZSByZXF1ZXN0cywgZXRjLiB5b3UgY2FuCgljb250YWN0IG1lIGhlcmUgdmlhIGVtYWlsOgoJCQkJCWRpZ25vbWVAZ21haWwuY29tCgkJKHlvdXIgcHJvYmxlbXMvcGF0Y2hlcyBjYW4gYWx0ZXJuYXRlbHkgYmUgc3VibWl0dGVkIHRvIHVzYi1kZXZlbCkKCgpEaWdpIEFjY2VsZVBvcnQgRHJpdmVyCgogIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBEaWdpIEFjY2VsZVBvcnQgVVNCIDIgYW5kIDQgZGV2aWNlcywgMiBwb3J0CiAgKHBsdXMgYSBwYXJhbGxlbCBwb3J0KSBhbmQgNCBwb3J0IFVTQiBzZXJpYWwgY29udmVydGVycy4gIFRoZSBkcml2ZXIKICBkb2VzIE5PVCB5ZXQgc3VwcG9ydCB0aGUgRGlnaSBBY2NlbGVQb3J0IFVTQiA4LgoKICBUaGlzIGRyaXZlciB3b3JrcyB1bmRlciBTTVAgd2l0aCB0aGUgdXNiLXVoY2kgZHJpdmVyLiAgSXQgZG9lcyBub3QKICB3b3JrIHVuZGVyIFNNUCB3aXRoIHRoZSB1aGNpIGRyaXZlci4KCiAgVGhlIGRyaXZlciBpcyBnZW5lcmFsbHkgd29ya2luZywgdGhvdWdoIHdlIHN0aWxsIGhhdmUgYSBmZXcgbW9yZSBpb2N0bHMKICB0byBpbXBsZW1lbnQgYW5kIGZpbmFsIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyB0byBkby4gIFRoZSBwYXJhbGxlZCBwb3J0CiAgb24gdGhlIFVTQiAyIGlzIHN1cHBvcnRlZCBhcyBhIHNlcmlhbCB0byBwYXJhbGxlbCBjb252ZXJ0ZXI7IGluIG90aGVyCiAgd29yZHMsIGl0IGFwcGVhcnMgYXMgYW5vdGhlciBVU0Igc2VyaWFsIHBvcnQgb24gTGludXgsIGV2ZW4gdGhvdWdoCiAgcGh5c2ljYWxseSBpdCBpcyByZWFsbHkgYSBwYXJhbGxlbCBwb3J0LiAgVGhlIERpZ2kgQWNjZWxlcG9ydCBVU0IgOAogIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgoKICBQbGVhc2UgY29udGFjdCBQZXRlciBCZXJnZXIgKHBiZXJnZXJAYnJpbXNvbi5jb20pIG9yIEFsIEJvcmNoZXJzCiAgKGFsYm9yY2hlcnNAc3RlaW5lcnBvaW50LmNvbSkgZm9yIHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoaXMKICBkcml2ZXIuCgoKQmVsa2luIFVTQiBTZXJpYWwgQWRhcHRlciBGNVUxMDMKCiAgU2luZ2xlIHBvcnQgREItOS9QUy0yIHNlcmlhbCBhZGFwdGVyIGZyb20gQmVsa2luIHdpdGggZmlybXdhcmUgYnkgZVRFSyBMYWJzLgogIFRoZSBQZXJhY29tIHNpbmdsZSBwb3J0IHNlcmlhbCBhZGFwdGVyIGFsc28gd29ya3Mgd2l0aCB0aGlzIGRyaXZlciwgYXMKICB3ZWxsIGFzIHRoZSBHb0h1YnMgYWRhcHRlci4KCiAgQ3VycmVudCBzdGF0dXM6CiAgICBUaGUgZm9sbG93aW5nIGhhdmUgYmVlbiB0ZXN0ZWQgYW5kIHdvcms6CiAgICAgIEJhdWQgcmF0ZSAgICAzMDAtMjMwNDAwICAgICAgICAgICAgICAgCiAgICAgIERhdGEgYml0cyAgICA1LTgKICAgICAgU3RvcCBiaXRzICAgIDEtMgogICAgICBQYXJpdHkgICAgICAgTixFLE8sTSxTCiAgICAgIEhhbmRzaGFrZSAgICBOb25lLCBTb2Z0d2FyZSAoWE9OL1hPRkYpLCBIYXJkd2FyZSAoQ1RTUlRTLENUU0RUUikqCiAgICAgIEJyZWFrICAgICAgICBTZXQgYW5kIGNsZWFyCiAgICAgIExpbmUgY29udHJsICBJbnB1dC9PdXRwdXQgcXVlcnkgYW5kIGNvbnRyb2wgKioKCiAgICAgICogIEhhcmR3YXJlIGlucHV0IGZsb3cgY29udHJvbCBpcyBvbmx5IGVuYWJsZWQgZm9yIGZpcm13YXJlCiAgICAgICAgIGxldmVscyBhYm92ZSAyLjA2LiAgUmVhZCBzb3VyY2UgY29kZSBjb21tZW50cyBkZXNjcmliaW5nIEJlbGtpbgogICAgICAgICBmaXJtd2FyZSBlcnJhdGEuICBIYXJkd2FyZSBvdXRwdXQgZmxvdyBjb250cm9sIGlzIHdvcmtpbmcgZm9yIGFsbAogICAgICAgICBmaXJtd2FyZSB2ZXJzaW9ucy4KICAgICAgKiogUXVlcmllcyBvZiBpbnB1dHMgKENUUyxEU1IsQ0QsUkkpIHNob3cgdGhlIGxhc3QKICAgICAgICAgcmVwb3J0ZWQgc3RhdGUuICBRdWVyaWVzIG9mIG91dHB1dHMgKERUUixSVFMpIHNob3cgdGhlIGxhc3QKICAgICAgICAgcmVxdWVzdGVkIHN0YXRlIGFuZCBtYXkgbm90IHJlZmxlY3QgY3VycmVudCBzdGF0ZSBhcyBzZXQgYnkKICAgICAgICAgYXV0b21hdGljIGhhcmR3YXJlIGZsb3cgY29udHJvbC4KCiAgVE8gRE8gTGlzdDoKICAgIC0tIEFkZCB0cnVlIG1vZGVtIGNvbnRvbCBsaW5lIHF1ZXJ5IGNhcGFiaWxpdHkuICBDdXJyZW50bHkgdHJhY2tzIHRoZQogICAgICAgc3RhdGVzIHJlcG9ydGVkIGJ5IHRoZSBpbnRlcnJ1cHQgYW5kIHRoZSBzdGF0ZXMgcmVxdWVzdGVkLgogICAgLS0gQWRkIGVycm9yIHJlcG9ydGluZyBiYWNrIHRvIGFwcGxpY2F0aW9uIGZvciBVQVJUIGVycm9yIGNvbmRpdGlvbnMuCiAgICAtLSBBZGQgc3VwcG9ydCBmb3IgZmx1c2ggaW9jdGxzLgogICAgLS0gQWRkIGV2ZXJ5dGhpbmcgZWxzZSB0aGF0IGlzIG1pc3NpbmcgOikKCiAgRm9yIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMgd2l0aCB0aGlzIGRyaXZlciwgcGxlYXNlIGNvbnRhY3QgV2lsbGlhbQogIEdyZWF0aG91c2UgYXQgd2dyZWF0aG91c2VAc212YS5jb20KCgpFbXBlZyBlbXBlZy1jYXIgTWFyayBJL0lJIERyaXZlcgoKICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgdG8gcHJvdmlkZSBjb25uZWN0aXZpdHkgc3VwcG9ydCBmb3IgdGhlCiAgY2xpZW50IHN5bmNocm9uaXphdGlvbiB0b29scyBmb3IgYW4gRW1wZWcgZW1wZWctY2FyIG1wMyBwbGF5ZXIuCgogIFRpcHM6CiAgICAqIERvbid0IGZvcmdldCB0byBjcmVhdGUgdGhlIGRldmljZSBub2RlcyBmb3IgdHR5VVNCezAsMSwyLC4uLn0KICAgICogbW9kcHJvYmUgZW1wZWcgKG1vZHByb2JlIGlzIHlvdXIgZnJpZW5kKQogICAgKiBlbXB0b29sIC0tdXNiIC9kZXYvdHR5VVNCMCAob3Igd2hhdGV2ZXIgeW91IG5hbWVkIHlvdXIgZGV2aWNlIG5vZGUpCgogIEZvciBhbnkgcXVlc3Rpb25zIG9yIHByb2JsZW1zIHdpdGggdGhpcyBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEdhcnkKICBCcnViYWtlciBhdCB4YXZ5ZXJAaXgubmV0Y29tLmNvbQoKCk1DVCBVU0IgU2luZ2xlIFBvcnQgU2VyaWFsIEFkYXB0ZXIgVTIzMgoKICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIE1DVCBVU0ItUlMyMzIgQ29udmVydGVyICgyNSBwaW4sIE1vZGVsIE5vLgogIFUyMzItUDI1KSBmcm9tIE1hZ2ljIENvbnRyb2wgVGVjaG5vbG9neSBDb3JwLiAodGhlcmUgaXMgYWxzbyBhIDkgcGluCiAgTW9kZWwgTm8uIFUyMzItUDkpLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGV2aWNlIGNhbiBiZSBmb3VuZCBhdAogIHRoZSBtYW51ZmFjdHVyZSdzIHdlYi1zaXRlOiBodHRwOi8vd3d3Lm1jdC5jb20udHcuCgogIFRoZSBkcml2ZXIgaXMgZ2VuZXJhbGx5IHdvcmtpbmcsIHRob3VnaCBpdCBzdGlsbCBuZWVkcyBzb21lIG1vcmUgdGVzdGluZy4KICBJdCBpcyBkZXJpdmVkIGZyb20gdGhlIEJlbGtpbiBVU0IgU2VyaWFsIEFkYXB0ZXIgRjVVMTAzIGRyaXZlciBhbmQgaXRzCiAgVE9ETyBsaXN0IGlzIHZhbGlkIGZvciB0aGlzIGRyaXZlciBhcyB3ZWxsLgoKICBUaGlzIGRyaXZlciBoYXMgYWxzbyBiZWVuIGZvdW5kIHRvIHdvcmsgZm9yIG90aGVyIHByb2R1Y3RzLCB3aGljaCBoYXZlCiAgdGhlIHNhbWUgVmVuZG9yIElEIGJ1dCBkaWZmZXJlbnQgUHJvZHVjdCBJRHMuIFNpdGVjb20ncyBVMjMyLVAyNSBzZXJpYWwKICBjb252ZXJ0ZXIgdXNlcyBQcm9kdWN0IElEIDB4MjMwIGFuZCBWZW5kb3IgSUQgMHg3MTEgYW5kIHdvcmtzIHdpdGggdGhpcwogIGRyaXZlci4gQWxzbywgRC1MaW5rJ3MgRFUtSDNTUCBVU0IgQkFZIGFsc28gd29ya3Mgd2l0aCB0aGlzIGRyaXZlci4KCiAgRm9yIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMgd2l0aCB0aGlzIGRyaXZlciwgcGxlYXNlIGNvbnRhY3QgV29sZmdhbmcKICBHcmFuZGVnZ2VyIGF0IHdvbGZnYW5nQGNlcy5jaAoKCkluc2lkZSBPdXQgTmV0d29ya3MgRWRnZXBvcnQgRHJpdmVyCgogIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGFsbCBkZXZpY2VzIG1hZGUgYnkgSW5zaWRlIE91dCBOZXR3b3Jrcywgc3BlY2lmaWNhbGx5CiAgdGhlIGZvbGxvd2luZyBtb2RlbHM6CiAgICAgICBFZGdlcG9ydC80CiAgICAgICBSYXBpZHBvcnQvNAogICAgICAgRWRnZXBvcnQvNHQKICAgICAgIEVkZ2Vwb3J0LzIKICAgICAgIEVkZ2Vwb3J0LzRpCiAgICAgICBFZGdlcG9ydC8yaQogICAgICAgRWRnZXBvcnQvNDIxCiAgICAgICBFZGdlcG9ydC8yMQogICAgICAgRWRnZXBvcnQvOAogICAgICAgRWRnZXBvcnQvOCBEdWFsCiAgICAgICBFZGdlcG9ydC8yRDgKICAgICAgIEVkZ2Vwb3J0LzREOAogICAgICAgRWRnZXBvcnQvOGkKICAgICAgIEVkZ2Vwb3J0LzIgRElOCiAgICAgICBFZGdlcG9ydC80IERJTgogICAgICAgRWRnZXBvcnQvMTYgRHVhbAoKICBGb3IgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoaXMgZHJpdmVyLCBwbGVhc2UgY29udGFjdCBHcmVnCiAgS3JvYWgtSGFydG1hbiBhdCBncmVnQGtyb2FoLmNvbQoKClJFSU5FUiBTQ1QgY3liZXJKYWNrIHBpbnBhZC9lLWNvbSBVU0IgY2hpcGNhcmQgcmVhZGVyCiAgIAogIEludGVyZmFjZSB0byBJU08gNzgxNiBjb21wYXRpYmxlIGNvbnRhY3RiYXNlZCBjaGlwY2FyZHMsIGUuZy4gR1NNIFNJTXMuCiAgCiAgQ3VycmVudCBzdGF0dXM6CiAgICBUaGlzIGlzIHRoZSBrZXJuZWwgcGFydCBvZiB0aGUgZHJpdmVyIGZvciB0aGlzIFVTQiBjYXJkIHJlYWRlci4KICAgIFRoZXJlIGlzIGFsc28gYSB1c2VyIHBhcnQgZm9yIGEgQ1QtQVBJIGRyaXZlciBhdmFpbGFibGUuIEEgc2l0ZQogICAgZm9yIGRvd25sb2FkaW5nIGlzIFRCQS4gRm9yIG5vdywgeW91IGNhbiByZXF1ZXN0IGl0IGZyb20gdGhlCiAgICBtYWludGFpbmVyIChsaW51eC11c2JAc2lpLmxpKS4KCiAgRm9yIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMgd2l0aCB0aGlzIGRyaXZlciwgcGxlYXNlIGNvbnRhY3QKICBsaW51eC11c2JAc2lpLmxpCgoKUHJvbGlmaWMgUEwyMzAzIERyaXZlcgoKICBUaGlzIGRyaXZlciBzdXBwb3J0cyBhbnkgZGV2aWNlIHRoYXQgaGFzIHRoZSBQTDIzMDMgY2hpcCBmcm9tIFByb2xpZmljCiAgaW4gaXQuICBUaGlzIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHNpbmdsZSBwb3J0IFVTQiB0byBzZXJpYWwKICBjb252ZXJ0ZXJzIGFuZCBVU0IgR1BTIGRldmljZXMuICBEZXZpY2VzIGZyb20gQXRlbiAodGhlIFVDLTIzMikgYW5kCiAgSU8tRGF0YSB3b3JrIHdpdGggdGhpcyBkcml2ZXIsIGFzIGRvZXMgdGhlIERDVS0xMSBtb2JpbGUtcGhvbmUgY2FibGUuCgogIEZvciBhbnkgcXVlc3Rpb25zIG9yIHByb2JsZW1zIHdpdGggdGhpcyBkcml2ZXIsIHBsZWFzZSBjb250YWN0IEdyZWcKICBLcm9haC1IYXJ0bWFuIGF0IGdyZWdAa3JvYWguY29tCiAgCgpLTDVLVVNCMTA1IGNoaXBzZXQgLyBQYWxtQ29ubmVjdCBVU0Igc2luZ2xlLXBvcnQgYWRhcHRlcgogIApDdXJyZW50IHN0YXR1czoKICBUaGUgZHJpdmVyIHdhcyBwdXQgdG9nZXRoZXIgYnkgbG9va2luZyBhdCB0aGUgdXNiIGJ1cyB0cmFuc2FjdGlvbnMKICBkb25lIGJ5IFBhbG0ncyBkcml2ZXIgdW5kZXIgV2luZG93cywgc28gYSBsb3Qgb2YgZnVuY3Rpb25hbGl0eSBpcwogIHN0aWxsIG1pc3NpbmcuICBOb3RhYmx5LCBzZXJpYWwgaW9jdGxzIGFyZSBzb21ldGltZXMgZmFrZWQgb3Igbm90IHlldAogIGltcGxlbWVudGVkLiAgU3VwcG9ydCBmb3IgZmluZGluZyBvdXQgYWJvdXQgRFNSIGFuZCBDVFMgbGluZSBzdGF0dXMgaXMKICBob3dldmVyIGltcGxlbWVudGVkICh0aG91Z2ggbm90IG5pY2VseSksIHNvIHlvdXIgZmF2b3JpdGUgYXV0b3BpbG90KDEpCiAgYW5kIHBpbG90LW1hbmFnZXIgLWRhZW1vbiBjYWxscyB3aWxsIHdvcmsuICBCYXVkIHJhdGVzIHVwIHRvIDExNTIwMAogIGFyZSBzdXBwb3J0ZWQsIGJ1dCBoYW5kc2hha2luZyAoc29mdHdhcmUgb3IgaGFyZHdhcmUpIGlzIG5vdCwgd2hpY2ggaXMKICB3aHkgaXQgaXMgd2lzZSB0byBjdXQgZG93biBvbiB0aGUgcmF0ZSB1c2VkIGlzIHdpc2UgZm9yIGxhcmdlCiAgdHJhbnNmZXJzIHVudGlsIHRoaXMgaXMgc2V0dGxlZC4KICAKT3B0aW9ucyBzdXBwb3J0ZWQ6CiAgSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgYXMgYSBtb2R1bGUgeW91IGNhbiBwYXNzIHRoZSBmb2xsb3dpbmcKICBvcHRpb25zIHRvIGl0OgogIGRlYnVnCQkJLSBleHRyYSB2ZXJib3NlIGRlYnVnZ2luZyBpbmZvCiAgCQkJICAoZGVmYXVsdDogMDsgbm9uemVybyBlbmFibGVzKQogIHVzZV9sb3dsYXRlbmN5CS0gdXNlIGxvd19sYXRlbmN5IGZsYWcgdG8gc3BlZWQgdXAgdHR5IGxheWVyCgkJCSAgd2hlbiByZWFkaW5nIGZyb20gZnJvbSB0aGUgZGV2aWNlLgoJCQkgIChkZWZhdWx0OiAwOyBub256ZXJvIGVuYWJsZXMpCgogIFNlZSBodHRwOi8vd3d3LnV1aGF1cy5kZS9saW51eC9wYWxtY29ubmVjdC5odG1sIGZvciB1cC10by1kYXRlCiAgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIuCgoKR2VuZXJpYyBTZXJpYWwgZHJpdmVyCgogIElmIHlvdXIgZGV2aWNlIGlzIG5vdCBvbmUgb2YgdGhlIGFib3ZlIGxpc3RlZCBkZXZpY2VzLCBjb21wYXRpYmxlIHdpdGgKICB0aGUgYWJvdmUgbW9kZWxzLCB5b3UgY2FuIHRyeSBvdXQgdGhlICJnZW5lcmljIiBpbnRlcmZhY2UuIFRoaXMKICBpbnRlcmZhY2UgZG9lcyBub3QgcHJvdmlkZSBhbnkgdHlwZSBvZiBjb250cm9sIG1lc3NhZ2VzIHNlbnQgdG8gdGhlCiAgZGV2aWNlLCBhbmQgZG9lcyBub3Qgc3VwcG9ydCBhbnkga2luZCBvZiBkZXZpY2UgZmxvdyBjb250cm9sLiBBbGwgdGhhdAogIGlzIHJlcXVpcmVkIG9mIHlvdXIgZGV2aWNlIGlzIHRoYXQgaXQgaGFzIGF0IGxlYXN0IG9uZSBidWxrIGluIGVuZHBvaW50LAogIG9yIG9uZSBidWxrIG91dCBlbmRwb2ludC4gCiAgCiAgVG8gZW5hYmxlIHRoZSBnZW5lcmljIGRyaXZlciB0byByZWNvZ25pemUgeW91ciBkZXZpY2UsIGJ1aWxkIHRoZSBkcml2ZXIKICBhcyBhIG1vZHVsZSBhbmQgbG9hZCBpdCBieSB0aGUgZm9sbG93aW5nIGludm9jYXRpb246CglpbnNtb2QgdXNic2VyaWFsIHZlbmRvcj0weCMjIyMgcHJvZHVjdD0weCMjIyMKICB3aGVyZSB0aGUgIyMjIyBpcyByZXBsYWNlZCB3aXRoIHRoZSBoZXggcmVwcmVzZW50YXRpb24gb2YgeW91ciBkZXZpY2UncwogIHZlbmRvciBpZCBhbmQgcHJvZHVjdCBpZC4KCiAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHVzZWQgdG8gY29ubmVjdCB0byB0aGUgTmV0Q2hpcCBVU0IKICBkZXZlbG9wbWVudCBib2FyZCwgcHJvdmlkaW5nIGEgd2F5IHRvIGRldmVsb3AgVVNCIGZpcm13YXJlIHdpdGhvdXQKICBoYXZpbmcgdG8gd3JpdGUgYSBjdXN0b20gZHJpdmVyLgoKICBGb3IgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcyB3aXRoIHRoaXMgZHJpdmVyLCBwbGVhc2UgY29udGFjdCBHcmVnCiAgS3JvYWgtSGFydG1hbiBhdCBncmVnQGtyb2FoLmNvbQoKCkNPTlRBQ1Q6CgogIElmIGFueW9uZSBoYXMgYW55IHByb2JsZW1zIHVzaW5nIHRoZXNlIGRyaXZlcnMsIHdpdGggYW55IG9mIHRoZSBhYm92ZQogIHNwZWNpZmllZCBwcm9kdWN0cywgcGxlYXNlIGNvbnRhY3QgdGhlIHNwZWNpZmljIGRyaXZlcidzIGF1dGhvciBsaXN0ZWQKICBhYm92ZSwgb3Igam9pbiB0aGUgTGludXgtVVNCIG1haWxpbmcgbGlzdCAoaW5mb3JtYXRpb24gb24gam9pbmluZyB0aGUKICBtYWlsaW5nIGxpc3QsIGFzIHdlbGwgYXMgYSBsaW5rIHRvIGl0cyBzZWFyY2hhYmxlIGFyY2hpdmUgaXMgYXQKICBodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvICkKCgpHcmVnIEtyb2FoLUhhcnRtYW4KZ3JlZ0Brcm9haC5jb20K