Event Details

This is a KIND 5391 event created on 2024-03-24 16:18:35 (5 months, 3 weeks ago). Debug this event chain.

{
  "id": "350c0ef999e88b0463c4e39d52f0b496612088d8ec59835b1a5e906dbfbbcb84",
  "pubkey": "a029df4a2c4a042f4b23a0d6197fd9680805327e023eb1705c70d13db9821a3d",
  "created_at": 1711297115,
  "kind": "5391",
  "tags": [
    [
      "e",
      "97948bc0c73bb7173599cdd0364af026a8d01cdcd2cad13e0ec964c495a2e31e",
      "wss://dashglow-test.nostr1.com",
      "root"
    ],
    [
      "m",
      "text/html"
    ],
    [
      "alt",
      "This is a binary chunk of a web-based video game. Play the full game at https://crashglow.com/game/nevent1qqsf09ytcrrnhdchxkvum5pkftczd2xsrnwd9jk38c8vjexyjk3wx8spremhxue69uhkgctndpnkcmmh946x2um59ehx7um5wgcjucm0d5q3vamnwvaz7tmjv4kxz7fwwpexjmtpdshxuet5qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszymhwden5te0wfjkcctev93xcefwdaexwqg5waehxw309aex2mrp0yhxummnw3ezumt9qyxhwumn8ghj7mn0wvhxcmmvqyt8wumn8ghj7un9d3shjtnwdaehgu3wvfskueqzyzsznh62939qgt6tywsdvxtlm95qspfj0cpravtst3cdz0desgdr6qcyqqqqqqgvkufgw"
    ],
    [
      "index",
      "0"
    ],
    [
      "x",
      "a33194f438851920cc43d59c61a386b79adcc5a55b0b64667386cd8f43baaab0"
    ]
  ],
  "content": "PCFET0NUWVBFIEhUTUw+CjxodG1sPgoKPCEtLSBIRUFERVIgLS0+CjxoZWFkPgoKPG1ldGEgY2hhcnNldD0iVVRGLTgiPgoKPHRpdGxlPlRlc3Q8L3RpdGxlPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2JpdHN5R2FtZURhdGEiIGlkPSJleHBvcnRlZEdhbWVEYXRhIj4KVGVzdAoKIyBCSVRTWSBWRVJTSU9OIDguOQoKISBWRVJfTUFKIDgKISBWRVJfTUlOIDkKISBST09NX0ZPUk1BVCAxCiEgRExHX0NPTVBBVCAwCiEgVFhUX01PREUgMAoKUEFMIDAKMCw4MiwyMDQKMTI4LDE1OSwyNTUKMjU1LDI1NSwyNTUKTkFNRSBibHVlcHJpbnQKClJPT00gMAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCjAsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLDAKMCxhLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLGEsMAowLGEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsYSwwCjAsYSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCxhLDAKMCxhLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLGEsMAowLGEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsYSwwCjAsYSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCxhLDAKMCxhLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLGEsMAowLGEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsYSwwCjAsYSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCxhLDAKMCxhLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLGEsMAowLGEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsYSwwCjAsYSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCxhLDAKMCxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsMAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCk5BTUUgZXhhbXBsZSByb29tClBBTCAwClRVTkUgMgoKVElMIGEKMTExMTExMTEKMTAwMDAwMDEKMTAwMDAwMDEKMTAwMTEwMDEKMTAwMTEwMDEKMTAwMDAwMDEKMTAwMDAwMDEKMTExMTExMTEKTkFNRSBibG9jawoKU1BSIEEKMDAwMTEwMDAKMDAwMTEwMDAKMDAwMTEwMDAKMDAxMTExMDAKMDExMTExMTAKMTAxMTExMDEKMDAxMDAxMDAKMDAxMDAxMDAKUE9TIDAgNCw0CgpTUFIgYQowMDAwMDAwMAowMDAwMDAwMAowMTAxMDAwMQowMTExMDAwMQowMTExMDAxMAowMTExMTEwMAowMDExMTEwMAowMDEwMDEwMApOQU1FIGNhdApETEcgMApQT1MgMCA4LDEyCkJMSVAgMQoKSVRNIDAKMDAwMDAwMDAKMDAwMDAwMDAKMDAwMDAwMDAKMDAxMTExMDAKMDExMDAxMDAKMDAxMDAxMDAKMDAwMTEwMDAKMDAwMDAwMDAKTkFNRSB0ZWEKRExHIDEKCklUTSAxCjAwMDAwMDAwCjAwMTExMTAwCjAwMTAwMTAwCjAwMTExMTAwCjAwMDEwMDAwCjAwMDExMDAwCjAwMDEwMDAwCjAwMDExMDAwCk5BTUUga2V5CkRMRyAyCkJMSVAgMgoKRExHIDAKSSdtIGEgY2F0Ck5BTUUgY2F0IGRpYWxvZwoKRExHIDEKWW91IGZvdW5kIGEgbmljZSB3YXJtIGN1cCBvZiB0ZWEKTkFNRSB0ZWEgZGlhbG9nCgpETEcgMgpBIGtleSEge3d2eX1XaGF0IGRvZXMgaXQgb3Blbj97d3Z5fQpOQU1FIGtleSBkaWFsb2cKClZBUiBhCjQyCgpUVU5FIDEKM2QsMCwwLDAsM2Q1LDAsMCwwLDNsLDAsMCwwLDNzLDAsMCwwCjE2ZDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKPgo0bCwwLDAsMCxzLDAsM2wsMCwwLDAsMnMsMCwybSwwLDJyLDAKMTZtMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAo+CjNkLDAsMCwwLDNkNSwwLDAsMCwzbCwwLDAsMCwzcywwLDAsMAoxNmwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCj4KM2wsMCwwLDAscywwLDRtLDAsMCwwLDRyLDAsMCwwLDAsMAoxNnMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwCk5BTUUgZmluYWxlIGZhbmZhcmUKS0VZIEMsRCxFLEYsRyxBLEIgZCxyLG0scyxsClRNUCBYRlNUClNRUiBQMiBQOApBUlAgSU5UOAoKVFVORSAyCjAsMCwyRywwLEEsMCxCLDAsMkM1LDAsQixBLEcsMCwyRywwCkczLDAsRCwwLEczLDAsRCwwLDJBMywwLEUsMCxDLDAsRSwwCj4KMkYjLDAsRywwLEEsMCxGIywwLDJFLDAsRiMsRSw0RCwwLDAsMAoyRCwwLEUsMCxGIywwLEQsMCwyQywwLDJHMywwLDJGIzMsMCxEMiwwCj4KMCwwLDJHLDAsQSwwLEIsMCwyQzUsMCxCLEEsRywwLEcsMAoyRzIsMCxELEQ1LEczLEcsRCwwLDJDMiwwLEUsRTUsQzMsQyxFNSwwCj4KMkQsMCxDNSxCLEEsMCxBLDAsNEEsMCwwLDAsRiMsMCwwLDAKQTIsMCxFMywwLEMzLDAsRTMsMCxEMywwLEEzLDAsRCwwLDAsMAo+CjJFNSwwLDJHLDAsMkc1LDAsMkcsMCwyRiM1LDAsMkU1LDAsMkQ1LDAsMkM1LDAKMkMzLDAsMkUsMCwyRTUsMCwyQywwLDJBMywwLDJDLDAsMkYjLDAsMkUsMAo+CjNCLDAsMCwwLDJFNSwwLEQ1LDAsNEEsMCwwLDAsRywwLDAsMAoyRzMsMCxCMywwLDJELDAsRDMsMCwyQzMsMCxHMywwLEQjLDAsMCwwCj4KMCwwLDJHLDAsQSwwLDJCLDAsQzUsMCxCLEM1LEEsMCxHLDAKQTIsMCxBMywwLEMsMCwyRCwwLEQjLDAsRCxFLEMsMCxDMywwCj4KOEIsMCwwLDAsMCwwLDAsMCxBLDAsMkYjLDAsRSwwLEQsMApEMywwLEEzLDAsRiMsMCxELDAsQywwLDJEMywwLEMzLDAsRiMzLDAKTkFNRSB0dW5lZnVsIHRvd24KVE1QIEZTVApTUVIgUDQgUDIKClRVTkUgMwozRjUsMCwwLEEjLDAsMkMjNSwwLEEjLDNGNSwwLDAsRiM1LDAsMCwyRjUsMApBIzMsQyMsRiwwLDAsRixDIyxGLEEjMyxDIyxGLEEjLDAsQSMsQyMsRgo+CjNGNSwwLDAsQSwwLDJDIzUsMCxBLDNGNSwwLDAsMkEjNSwwLEEjLEQjNSwwCkEzLEMjLEYsQTMsMCxGLEMjLEYsQSxDIyxGLDAsRCMsMCxDIzUsMAo+CjRGNSwwLDAsMCxHIywyQyM1LDAsRyMsM0Y1LDAsMCxEIzUsMCxGNSwyQyM1LDAKRyMzLEMjLEYsM0YjLDAsMCwyRiwwLEcjMyxDIyxGLEYjLEIsQSxGLEQjCj4KNEQjNSwwLDAsMCwwLDAsMkEjLDAsNEEjLDAsMCwwLDAsMCxBIyxDNQpHMyxEIyxGLEcsMCxEIyxGLEcsRzMsRCMsRyxGLDAsRixEIyxDIzMKPgo0QyM1LDAsMCwwLDAsMCwyQyM1LDAsM0MjNSwwLDAsRCM1LDAsMCwyQyM1LDAKRiMyLEMjLEYjMyxBIzMsMCxGIzMsQyMzLEYjMyxGIzIsQSxGIzMsQyMsMCxGIzMsQTMsRiMzCj4KM0MjNSwwLDAsRiwzQzUsMCwwLEMsM0M1LDAsMCxEIywzQSMsMCwwLDAKRjIsRCMzLEEzLDAsMCxGMyxDIywwLEYjMixBIzMsRCMzLDAsMCxGIzMsQyMsQwo+CjNBIywwLDAsMCxDNSwwLEMjNSwwLEEjLDAsQyMsRCMsRyMsRyMzLDAsQyMzCkMzLEEjMyxDLEUsQSwwLEEjLDAsMCxCMixCMywwLDJGLDAsMCwwCj4KQSMsMCxBIzMsMCxDIywwLEYsMCxBIywwLDAsMCwwLDAsMCwwCkEjMiwwLEMjMywwLEYzLDAsQSMzLDAsRCwwLDAsMCwwLEYjMywwLEYzCk5BTUUgcmh5dGhtaWMgcnVpbnMKVE1QIE1FRApTUVIgUDQgUDQKCkJMSVAgMQpFNSxCNSxCNQpOQU1FIG1lb3cKRU5WIDQwIDk5IDQgMTg1IDEzOApCRUFUIDYxIDExNQpTUVIgUDIKCkJMSVAgMgpENSxFNSxENQpOQU1FIHBpY2sgdXAga2V5CkVOViA5OSA2NSA2IDk2IDE1MgpCRUFUIDk1IDAKU1FSIFA0CgoKPC9zY3JpcHQ+Cgo8c3R5bGU+Cmh0bWwgewoJbWFyZ2luOjBweDsKCXBhZGRpbmc6MHB4Owp9Cgpib2R5IHsKCW1hcmdpbjowcHg7CglwYWRkaW5nOjBweDsKCW92ZXJmbG93OmhpZGRlbjsKCWJhY2tncm91bmQ6I2ZmZmZmZjsKfQoKI2dhbWUgewoJYmFja2dyb3VuZDpibGFjazsKCXdpZHRoOjEwMHZ3OwoJbWF4LXdpZHRoOjEwMHZoOwoJbWFyZ2luOmF1dG87CglkaXNwbGF5OmJsb2NrOwp9Cjwvc3R5bGU+Cgo8IS0tIFNDUklQVFMgLS0+CjxzY3JpcHQ+CmZ1bmN0aW9uIHN0YXJ0RXhwb3J0ZWRHYW1lKCkgewoJdmFyIGdhbWVDYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpOwoJdmFyIGdhbWVEYXRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImV4cG9ydGVkR2FtZURhdGEiKS50ZXh0LnNsaWNlKDEpOwoJdmFyIGRlZmF1bHRGb250RGF0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlZmF1bHRGb250TmFtZSkudGV4dC5zbGljZSgxKTsKCWxvYWRHYW1lKGdhbWVDYW52YXMsIGdhbWVEYXRhLCBkZWZhdWx0Rm9udERhdGEpOwoJaW5pdFN5c3RlbSgpOwp9Cjwvc2NyaXB0PgoKPCEtLSBzeXN0ZW0gLS0+CjxzY3JpcHQ+CmZ1bmN0aW9uIElucHV0U3lzdGVtKCkgewoJdmFyIHNlbGYgPSB0aGlzOwoKCXRoaXMuS2V5ID0gewoJCUxFRlQ6IDM3LAoJCVJJR0hUOiAzOSwKCQlVUDogMzgsCgkJRE9XTjogNDAsCgkJU1BBQ0U6IDMyLAoJCUVOVEVSOiAxMywKCQlXOiA4NywKCQlBOiA2NSwKCQlTOiA4MywKCQlEOiA2OCwKCQlSOiA4MiwKCQlTSElGVDogMTYsCgkJQ1RSTDogMTcsCgkJQUxUOiAxOCwKCQlDTUQ6IDIyNAoJfTsKCgl2YXIgcHJlc3NlZDsKCXZhciBpZ25vcmVkOwoJdmFyIHRvdWNoU3RhdGU7CgoJdmFyIGlzUmVzdGFydENvbWJvUHJlc3NlZCA9IGZhbHNlOwoKCXZhciBTd2lwZURpciA9IHsKCQlOb25lIDogLTEsCgkJVXAgOiAwLAoJCURvd24gOiAxLAoJCUxlZnQgOiAyLAoJCVJpZ2h0IDogMywKCX07CgoJZnVuY3Rpb24gcmVzZXRBbGwoKSB7CgkJaXNSZXN0YXJ0Q29tYm9QcmVzc2VkID0gZmFsc2U7CgoJCXByZXNzZWQgPSB7fTsKCQlpZ25vcmVkID0ge307CgoJCXRvdWNoU3RhdGUgPSB7CgkJCWlzRG93biA6IGZhbHNlLAoJCQlzdGFydFggOiAwLAoJCQlzdGFydFkgOiAwLAoJCQljdXJYIDogMCwKCQkJY3VyWSA6IDAsCgkJCXN3aXBlRGlzdGFuY2UgOiAzMCwKCQkJc3dpcGVEaXJlY3Rpb24gOiBTd2lwZURpci5Ob25lLAoJCQl0YXBSZWxlYXNlZCA6IGZhbHNlCgkJfTsKCX0KCglyZXNldEFsbCgpOwoKCWZ1bmN0aW9uIHN0b3BXaW5kb3dTY3JvbGxpbmcoZSkgewoJCWlmIChlLmtleUNvZGUgPT0gc2VsZi5LZXkuTEVGVCB8fCBlLmtleUNvZGUgPT0gc2VsZi5LZXkuUklHSFQgfHwgZS5rZXlDb2RlID09IHNlbGYuS2V5LlVQIHx8IGUua2V5Q29kZSA9PSBzZWxmLktleS5ET1dOIHx8ICFpc1BsYXllckVtYmVkZGVkSW5FZGl0b3IpIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCX0KCglmdW5jdGlvbiBpc1Jlc3RhcnRDb21ibyhlKSB7CgkJcmV0dXJuIChlLmtleUNvZGUgPT09IHNlbGYuS2V5LlIgJiYgKGUuZ2V0TW9kaWZpZXJTdGF0ZSgiQ29udHJvbCIpfHwgZS5nZXRNb2RpZmllclN0YXRlKCJNZXRhIikpKTsKCX0KCglmdW5jdGlvbiBldmVudElzTW9kaWZpZXIoZXZlbnQpIHsKCQlyZXR1cm4gKGV2ZW50LmtleUNvZGUgPT0gc2VsZi5LZXkuU0hJRlQgfHwgZXZlbnQua2V5Q29kZSA9PSBzZWxmLktleS5DVFJMIHx8IGV2ZW50LmtleUNvZGUgPT0gc2VsZi5LZXkuQUxUIHx8IGV2ZW50LmtleUNvZGUgPT0gc2VsZi5LZXkuQ01EKTsKCX0KCglmdW5jdGlvbiBpc01vZGlmaWVyS2V5RG93bigpIHsKCQlyZXR1cm4gKHNlbGYuaXNLZXlEb3duKHNlbGYuS2V5LlNISUZUKSB8fCBzZWxmLmlzS2V5RG93bihzZWxmLktleS5DVFJMKSB8fCBzZWxmLmlzS2V5RG93bihzZWxmLktleS5BTFQpIHx8IHNlbGYuaXNLZXlEb3duKHNlbGYuS2V5LkNNRCkpOwoJfQoKCXRoaXMuaWdub3JlSGVsZEtleXMgPSBmdW5jdGlvbigpIHsKCQlmb3IgKHZhciBrZXkgaW4gcHJlc3NlZCkgewoJCQlpZiAocHJlc3NlZFtrZXldKSB7IC8vIG9ubHkgaWdub3JlIGtleXMgdGhhdCBhcmUgYWN0dWFsbHkgaGVsZAoJCQkJaWdub3JlZFtrZXldID0gdHJ1ZTsKCQkJCS8vIGJpdHN5TG9nKCJJR05PUkUgLS0gIiArIGtleSwgInN5c3RlbSIpOwoJCQl9CgkJfQoJfQoKCXRoaXMub25rZXlkb3duID0gZnVuY3Rpb24oZXZlbnQpIHsKCQllbmFibGVHbG9iYWxBdWRpb0NvbnRleHQoKTsKCQkvLyBiaXRzeUxvZygiS0VZRE9XTiAtLSAiICsgZXZlbnQua2V5Q29kZSwgInN5c3RlbSIpOwoKCQlzdG9wV2luZG93U2Nyb2xsaW5nKGV2ZW50KTsKCgkJaXNSZXN0YXJ0Q29tYm9QcmVzc2VkID0gaXNSZXN0YXJ0Q29tYm8oZXZlbnQpOwoKCQkvLyBTcGVjaWFsIGtleXMgYmVpbmcgaGVsZCBkb3duIGNhbiBpbnRlcmZlcmUgd2l0aCBrZXl1cCBldmVudHMgYW5kIGxvY2sgbW92ZW1lbnQKCQkvLyBzbyBqdXN0IGRvbid0IGNvbGxlY3QgaW5wdXQgd2hlbiB0aGV5J3JlIGhlbGQKCQl7CgkJCWlmIChpc01vZGlmaWVyS2V5RG93bigpKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmIChldmVudElzTW9kaWZpZXIoZXZlbnQpKSB7CgkJCQlyZXNldEFsbCgpOwoJCQl9CgkJfQoKCQlpZiAoaWdub3JlZFtldmVudC5rZXlDb2RlXSkgewoJCQlyZXR1cm47CgkJfQoKCQlwcmVzc2VkW2V2ZW50LmtleUNvZGVdID0gdHJ1ZTsKCQlpZ25vcmVkW2V2ZW50LmtleUNvZGVdID0gZmFsc2U7Cgl9CgoJdGhpcy5vbmtleXVwID0gZnVuY3Rpb24oZXZlbnQpIHsKCQkvLyBiaXRzeUxvZygiS0VZVVAgLS0gIiArIGV2ZW50LmtleUNvZGUsICJzeXN0ZW0iKTsKCQlwcmVzc2VkW2V2ZW50LmtleUNvZGVdID0gZmFsc2U7CgkJaWdub3JlZFtldmVudC5rZXlDb2RlXSA9IGZhbHNlOwoJfQoKCXRoaXMub250b3VjaHN0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHsKCQllbmFibGVHbG9iYWxBdWRpb0NvbnRleHQoKTsKCgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCgkJaWYoIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA+IDAgKSB7CgkJCXRvdWNoU3RhdGUuaXNEb3duID0gdHJ1ZTsKCgkJCXRvdWNoU3RhdGUuc3RhcnRYID0gdG91Y2hTdGF0ZS5jdXJYID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDsKCQkJdG91Y2hTdGF0ZS5zdGFydFkgPSB0b3VjaFN0YXRlLmN1clkgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZOwoKCQkJdG91Y2hTdGF0ZS5zd2lwZURpcmVjdGlvbiA9IFN3aXBlRGlyLk5vbmU7CgkJfQoJfQoKCXRoaXMub250b3VjaG1vdmUgPSBmdW5jdGlvbihldmVudCkgewoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCWlmKCB0b3VjaFN0YXRlLmlzRG93biAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwICkgewoJCQl0b3VjaFN0YXRlLmN1clggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwoJCQl0b3VjaFN0YXRlLmN1clkgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZOwoKCQkJdmFyIHByZXZEaXJlY3Rpb24gPSB0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uOwoKCQkJaWYoIHRvdWNoU3RhdGUuY3VyWCAtIHRvdWNoU3RhdGUuc3RhcnRYIDw9IC10b3VjaFN0YXRlLnN3aXBlRGlzdGFuY2UgKSB7CgkJCQl0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uID0gU3dpcGVEaXIuTGVmdDsKCQkJfQoJCQllbHNlIGlmKCB0b3VjaFN0YXRlLmN1clggLSB0b3VjaFN0YXRlLnN0YXJ0WCA+PSB0b3VjaFN0YXRlLnN3aXBlRGlzdGFuY2UgKSB7CgkJCQl0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uID0gU3dpcGVEaXIuUmlnaHQ7CgkJCX0KCQkJZWxzZSBpZiggdG91Y2hTdGF0ZS5jdXJZIC0gdG91Y2hTdGF0ZS5zdGFydFkgPD0gLXRvdWNoU3RhdGUuc3dpcGVEaXN0YW5jZSApIHsKCQkJCXRvdWNoU3RhdGUuc3dpcGVEaXJlY3Rpb24gPSBTd2lwZURpci5VcDsKCQkJfQoJCQllbHNlIGlmKCB0b3VjaFN0YXRlLmN1clkgLSB0b3VjaFN0YXRlLnN0YXJ0WSA+PSB0b3VjaFN0YXRlLnN3aXBlRGlzdGFuY2UgKSB7CgkJCQl0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uID0gU3dpcGVEaXIuRG93bjsKCQkJfQoKCQkJaWYoIHRvdWNoU3RhdGUuc3dpcGVEaXJlY3Rpb24gIT0gcHJldkRpcmVjdGlvbiApIHsKCQkJCS8vIHJlc2V0IGNlbnRlciBzbyBjaGFuZ2luZyBkaXJlY3Rpb25zIGlzIGVhc2llcgoJCQkJdG91Y2hTdGF0ZS5zdGFydFggPSB0b3VjaFN0YXRlLmN1clg7CgkJCQl0b3VjaFN0YXRlLnN0YXJ0WSA9IHRvdWNoU3RhdGUuY3VyWTsKCQkJfQoJCX0KCX0KCgl0aGlzLm9udG91Y2hlbmQgPSBmdW5jdGlvbihldmVudCkgewoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCXRvdWNoU3RhdGUuaXNEb3duID0gZmFsc2U7CgoJCWlmKCB0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uID09IFN3aXBlRGlyLk5vbmUgKSB7CgkJCS8vIHRhcCEKCQkJdG91Y2hTdGF0ZS50YXBSZWxlYXNlZCA9IHRydWU7CgkJfQoKCQl0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uID0gU3dpcGVEaXIuTm9uZTsKCX0KCgl0aGlzLmlzS2V5RG93biA9IGZ1bmN0aW9uKGtleUNvZGUpIHsKCQlyZXR1cm4gcHJlc3NlZFtrZXlDb2RlXSAhPSBudWxsICYmIHByZXNzZWRba2V5Q29kZV0gPT0gdHJ1ZSAmJiAoaWdub3JlZFtrZXlDb2RlXSA9PSBudWxsIHx8IGlnbm9yZWRba2V5Q29kZV0gPT0gZmFsc2UpOwoJfQoKCXRoaXMuYW55S2V5RG93biA9IGZ1bmN0aW9uKCkgewoJCXZhciBhbnlLZXkgPSBmYWxzZTsKCgkJZm9yICh2YXIga2V5IGluIHByZXNzZWQpIHsKCQkJaWYgKHByZXNzZWRba2V5XSAmJiAoaWdub3JlZFtrZXldID09IG51bGwgfHwgaWdub3JlZFtrZXldID09IGZhbHNlKSAmJgoJCQkJIShrZXkgPT09IHNlbGYuS2V5LlVQIHx8IGtleSA9PT0gc2VsZi5LZXkuRE9XTiB8fCBrZXkgPT09IHNlbGYuS2V5LkxFRlQgfHwga2V5ID09PSBzZWxmLktleS5SSUdIVCkgJiYKCQkJCSEoa2V5ID09PSBzZWxmLktleS5XIHx8IGtleSA9PT0gc2VsZi5LZXkuUyB8fCBrZXkgPT09IHNlbGYuS2V5LkEgfHwga2V5ID09PSBzZWxmLktleS5EKSkgewoJCQkJLy8gZGV0ZWN0ZWQgdGhhdCBhIGtleSBvdGhlciB0aGFuIHRoZSBkLXBhZCBrZXlzIGFyZSBkb3duIQoJCQkJYW55S2V5ID0gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGFueUtleTsKCX0KCgl0aGlzLmlzUmVzdGFydENvbWJvUHJlc3NlZCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBpc1Jlc3RhcnRDb21ib1ByZXNzZWQ7Cgl9CgoJdGhpcy5zd2lwZUxlZnQgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdG91Y2hTdGF0ZS5zd2lwZURpcmVjdGlvbiA9PSBTd2lwZURpci5MZWZ0OwoJfQoKCXRoaXMuc3dpcGVSaWdodCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uID09IFN3aXBlRGlyLlJpZ2h0OwoJfQoKCXRoaXMuc3dpcGVVcCA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0b3VjaFN0YXRlLnN3aXBlRGlyZWN0aW9uID09IFN3aXBlRGlyLlVwOwoJfQoKCXRoaXMuc3dpcGVEb3duID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRvdWNoU3RhdGUuc3dpcGVEaXJlY3Rpb24gPT0gU3dpcGVEaXIuRG93bjsKCX0KCgl0aGlzLmlzVGFwUmVsZWFzZWQgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdG91Y2hTdGF0ZS50YXBSZWxlYXNlZDsKCX0KCgl0aGlzLnJlc2V0VGFwUmVsZWFzZWQgPSBmdW5jdGlvbigpIHsKCQl0b3VjaFN0YXRlLnRhcFJlbGVhc2VkID0gZmFsc2U7Cgl9CgoJdGhpcy5vbmJsdXIgPSBmdW5jdGlvbigpIHsKCQkvLyBiaXRzeUxvZygifn5+IEJMVVIgfn4iLCAic3lzdGVtIik7CgkJcmVzZXRBbGwoKTsKCX0KCgl0aGlzLnJlc2V0QWxsID0gcmVzZXRBbGw7CgoJdGhpcy5saXN0ZW4gPSBmdW5jdGlvbihjYW52YXMpIHsKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgc2VsZi5vbmtleWRvd24pOwoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgc2VsZi5vbmtleXVwKTsKCgkJaWYgKGlzUGxheWVyRW1iZWRkZWRJbkVkaXRvcikgewoJCQljYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNlbGYub250b3VjaHN0YXJ0LCB7cGFzc2l2ZTpmYWxzZX0pOwoJCQljYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgc2VsZi5vbnRvdWNobW92ZSwge3Bhc3NpdmU6ZmFsc2V9KTsKCQkJY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgc2VsZi5vbnRvdWNoZW5kLCB7cGFzc2l2ZTpmYWxzZX0pOwoJCX0KCQllbHNlIHsKCQkJLy8gY3JlYXRlcyBhICd0b3VjaFRyaWdnZXInIGVsZW1lbnQgdGhhdCBjb3ZlcnMgdGhlIGVudGlyZSBzY3JlZW4gYW5kIGNhbiB1bml2ZXJzYWxseSBoYXZlIHRvdWNoIGV2ZW50IGxpc3RlbmVycyBhZGRlZCB3L28gaXNzdWUuCgoJCQkvLyB3ZSdyZSBjaGVja2luZyBmb3IgZXhpc3RpbmcgdG91Y2hUcmlnZ2VycyBib3RoIGF0IGdhbWUgc3RhcnQgYW5kIGVuZCwgc28gaXQncyBzbGlnaHRseSByZWR1bmRhbnQuCgkJCXZhciBleGlzdGluZ1RvdWNoVHJpZ2dlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b3VjaFRyaWdnZXInKTsKCgkJCWlmIChleGlzdGluZ1RvdWNoVHJpZ2dlciA9PT0gbnVsbCkgewoJCQkJdmFyIHRvdWNoVHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQkJdG91Y2hUcmlnZ2VyLnNldEF0dHJpYnV0ZSgiaWQiLCJ0b3VjaFRyaWdnZXIiKTsKCgkJCQkvLyBhZmFpayBjc3MgaW4ganMgaXMgbmVjZXNzYXJ5IGhlcmUgdG8gZm9yY2UgYSBmdWxsc2NyZWVuIGVsZW1lbnQKCQkJCXRvdWNoVHJpZ2dlci5zZXRBdHRyaWJ1dGUoCgkJCQkJInN0eWxlIiwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHdpZHRoOiAxMDB2dzsgaGVpZ2h0OiAxMDB2aDsgb3ZlcmZsb3c6IGhpZGRlbjsiCgkJCQkpOwoKCQkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG91Y2hUcmlnZ2VyKTsKCgkJCQl0b3VjaFRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHNlbGYub250b3VjaHN0YXJ0KTsKCQkJCXRvdWNoVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzZWxmLm9udG91Y2htb3ZlKTsKCQkJCXRvdWNoVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHNlbGYub250b3VjaGVuZCk7CgkJCX0KCQl9CgoJCXdpbmRvdy5vbmJsdXIgPSBzZWxmLm9uYmx1cjsKCX0KCgl0aGlzLnVubGlzdGVuID0gZnVuY3Rpb24oY2FudmFzKSB7CgkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHNlbGYub25rZXlkb3duKTsKCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHNlbGYub25rZXl1cCk7CgoJCWlmIChpc1BsYXllckVtYmVkZGVkSW5FZGl0b3IpIHsKCQkJY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBzZWxmLm9udG91Y2hzdGFydCk7CgkJCWNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzZWxmLm9udG91Y2htb3ZlKTsKCQkJY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgc2VsZi5vbnRvdWNoZW5kKTsKCQl9CgkJZWxzZSB7CgkJCS8vY2hlY2sgZm9yIHRvdWNoVHJpZ2dlciBhbmQgcmVtb3ZlcyBpdAoKCQkJdmFyIGV4aXN0aW5nVG91Y2hUcmlnZ2VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvdWNoVHJpZ2dlcicpOwoKCQkJaWYgKGV4aXN0aW5nVG91Y2hUcmlnZ2VyICE9PSBudWxsKSB7CgkJCQlleGlzdGluZ1RvdWNoVHJpZ2dlci5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgc2VsZi5vbnRvdWNoc3RhcnQpOwoJCQkJZXhpc3RpbmdUb3VjaFRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgc2VsZi5vbnRvdWNobW92ZSk7CgkJCQlleGlzdGluZ1RvdWNoVHJpZ2dlci5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHNlbGYub250b3VjaGVuZCk7CgoJCQkJZXhpc3RpbmdUb3VjaFRyaWdnZXIucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChleGlzdGluZ1RvdWNoVHJpZ2dlcik7CgkJCX0KCQl9CgoJCXdpbmRvdy5vbmJsdXIgPSBudWxsOwoJfQp9Cjwvc2NyaXB0PgoKPHNjcmlwdD4KLy8gaW5pdCBnbG9iYWwgYXVkaW8gY29udGV4dAp2YXIgYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpOwoKZnVuY3Rpb24gZW5hYmxlR2xvYmFsQXVkaW9Db250ZXh0KCkgewoJYXVkaW9Db250ZXh0LnJlc3VtZSgpOwp9CgpmdW5jdGlvbiBTb3VuZFN5c3RlbSgpIHsKCXZhciBzZWxmID0gdGhpczsKCgkvLyB2b2x1bWUKCXZhciBtYXhHYWluID0gMC4xNTsKCgkvLyBjdXJ2ZXMgZm9yIGRpZmZlcmVudCBwdWxzZSB3YXZlIGR1dGllcyAocmF0aW9zIGJldHdlZW4gb24gYW5kIG9mZikKCXZhciBkdXR5Q3ljbGVfMV84ID0gbmV3IEZsb2F0MzJBcnJheSgyNTYpOwoJZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJCWR1dHlDeWNsZV8xXzhbaV0gPSAoKGkgLyAyNTYpICogMikgLSAxLjc1OwoJfQoKCXZhciBkdXR5Q3ljbGVfMV80ID0gbmV3IEZsb2F0MzJBcnJheSgyNTYpOwoJZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJCWR1dHlDeWNsZV8xXzRbaV0gPSAoKGkgLyAyNTYpICogMikgLSAxLjU7Cgl9CgoJdmFyIGR1dHlDeWNsZV8xXzIgPSBuZXcgRmxvYXQzMkFycmF5KDI1Nik7Cglmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CgkJZHV0eUN5Y2xlXzFfMltpXSA9ICgoaSAvIDI1NikgKiAyKSAtIDEuMDsKCX0KCgl2YXIgZHV0eUN5Y2xlcyA9IFsKCQlkdXR5Q3ljbGVfMV84LAoJCWR1dHlDeWNsZV8xXzQsCgkJZHV0eUN5Y2xlXzFfMiAvLyBzcXVhcmUgd2F2ZQoJXTsKCglmdW5jdGlvbiBjcmVhdGVQdWxzZVdpZHRoTW9kdWxhdG9yKCkgewoJCS8vIHRoZSBiYXNlIG9zY2lsbGF0b3I6IHN0YXJ0IHdpdGggYSBzYXd0b290aCB3YXZlIHRoYXQgd2UnbGwgc2hhcGUgaW50byBhIHB1bHNlIHdhdmUKCQl2YXIgb3NjaWxsYXRvciA9IGF1ZGlvQ29udGV4dC5jcmVhdGVPc2NpbGxhdG9yKCk7CgkJb3NjaWxsYXRvci50eXBlID0gInNhd3Rvb3RoIjsKCgkJLy8gY3JlYXRlIGEgZ2FpbiBub2RlIHRvIGNvbnRyb2wgdGhlIHZvbHVtZSBvZiB0aGUgc291bmQKCQl2YXIgdm9sdW1lQ29udHJvbCA9IGF1ZGlvQ29udGV4dC5jcmVhdGVHYWluKCk7CgkJdm9sdW1lQ29udHJvbC5nYWluLnZhbHVlID0gMDsKCgkJLy8gY3JlYXRlIGEgd2F2ZSBzaGFwZXIgdGhhdCB0dXJucyB0aGUgc2F3dG9vdGggd2F2ZSBpbnRvIGEgcHVsc2UKCQkvLyBieSBtYXBwaW5nIGFueSBuZWdhdGl2ZSB2YWx1ZSB0byAtMSBhbmQgYW55IHBvc2l0aXZlIHZhbHVlIHRvIDEKCQl2YXIgcHVsc2VDdXJ2ZSA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IDEyODsgaSsrKSB7CgkJCXB1bHNlQ3VydmVbaV0gPSAtMTsKCQl9CgkJZm9yICh2YXIgaSA9IDEyODsgaSA8IDI1NjsgaSsrKSB7CgkJCXB1bHNlQ3VydmVbaV0gPSAxOwoJCX0KCgkJdmFyIHB1bHNlU2hhcGVyID0gYXVkaW9Db250ZXh0LmNyZWF0ZVdhdmVTaGFwZXIoKTsKCQlwdWxzZVNoYXBlci5jdXJ2ZSA9IHB1bHNlQ3VydmU7CgoJCXZhciBkdXR5U2hhcGVyID0gYXVkaW9Db250ZXh0LmNyZWF0ZVdhdmVTaGFwZXIoKTsKCQlkdXR5U2hhcGVyLmN1cnZlID0gZHV0eUN5Y2xlXzFfMjsKCgkJb3NjaWxsYXRvci5jb25uZWN0KGR1dHlTaGFwZXIpOwoJCWR1dHlTaGFwZXIuY29ubmVjdChwdWxzZVNoYXBlcik7CgkJcHVsc2VTaGFwZXIuY29ubmVjdCh2b2x1bWVDb250cm9sKTsKCQl2b2x1bWVDb250cm9sLmNvbm5lY3QoYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uKTsKCQlvc2NpbGxhdG9yLnN0YXJ0KCk7CgoJCXJldHVybiB7CgkJCW9zY2lsbGF0b3I6IG9zY2lsbGF0b3IsCgkJCXZvbHVtZUNvbnRyb2w6IHZvbHVtZUNvbnRyb2wsCgkJCWR1dHlTaGFwZXI6IGR1dHlTaGFwZXIKCQl9OwoJfQoKCXZhciBwdWxzZUNoYW5uZWxzID0gW2NyZWF0ZVB1bHNlV2lkdGhNb2R1bGF0b3IoKSwgY3JlYXRlUHVsc2VXaWR0aE1vZHVsYXRvcigpXTsKCgl0aGlzLnNldFB1bHNlID0gZnVuY3Rpb24oY2hhbm5lbCwgcHVsc2UpIHsKCQl2YXIgcHVsc2VDaGFubmVsID0gcHVsc2VDaGFubmVsc1tjaGFubmVsXTsKCQlwdWxzZUNoYW5uZWwuZHV0eVNoYXBlci5jdXJ2ZSA9IGR1dHlDeWNsZXNbcHVsc2VdOwoJfQoKCXRoaXMuc2V0RnJlcXVlbmN5ID0gZnVuY3Rpb24oY2hhbm5lbCwgZnJlcXVlbmN5SHopIHsKCQl2YXIgcHVsc2VDaGFubmVsID0gcHVsc2VDaGFubmVsc1tjaGFubmVsXTsKCQkvLyBzZXQgZnJlcXVlbmN5IGluIGhlcnR6CgkJcHVsc2VDaGFubmVsLm9zY2lsbGF0b3IuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKGZyZXF1ZW5jeUh6LCBhdWRpb0NvbnRleHQuY3VycmVudFRpbWUpOwoJfQoKCXRoaXMuc2V0Vm9sdW1lID0gZnVuY3Rpb24oY2hhbm5lbCwgdm9sdW1lTm9ybSkgewoJCXZhciBwdWxzZUNoYW5uZWwgPSBwdWxzZUNoYW5uZWxzW2NoYW5uZWxdOwoJCXB1bHNlQ2hhbm5lbC52b2x1bWVDb250cm9sLmdhaW4udmFsdWUgPSB2b2x1bWVOb3JtICogbWF4R2FpbjsKCX0KCgl0aGlzLm11dGUgPSBmdW5jdGlvbigpIHsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHB1bHNlQ2hhbm5lbHMubGVuZ3RoOyBpKyspIHsKCQkJcHVsc2VDaGFubmVsc1tpXS52b2x1bWVDb250cm9sLmdhaW4udmFsdWUgPSAwOwoJCX0KCX0KfQoKdmFyIHNvdW5kID0gbmV3IFNvdW5kU3lzdGVtKCk7Cjwvc2NyaXB0PgoKPHNjcmlwdD4KZnVuY3Rpb24gR3JhcGhpY3NTeXN0ZW0oKSB7Cgl2YXIgc2VsZiA9IHRoaXM7CgoJdmFyIGNhbnZhczsKCXZhciBjdHg7CgoJdmFyIHNjYWxlOwoJdmFyIHRleHRTY2FsZTsKCXZhciBwYWxldHRlID0gW107Cgl2YXIgaW1hZ2VzID0gW107Cgl2YXIgaW1hZ2VGaWxsQ29sb3JzID0gW107CgoJZnVuY3Rpb24gbWFrZUZpbGxTdHlsZShjb2xvciwgaXNUcmFuc3BhcmVudCkgewoJCXZhciBpID0gY29sb3IgKiAzOwoJCWlmIChpc1RyYW5zcGFyZW50KSB7CgkJCXJldHVybiAicmdiYSgiICsgcGFsZXR0ZVtpICsgMF0gKyAiLCIgKyBwYWxldHRlW2kgKyAxXSArICIsIiArIHBhbGV0dGVbaSArIDJdICsgIiwgMCkiOwoJCX0KCQllbHNlIHsKCQkJcmV0dXJuICJyZ2IoIiArIHBhbGV0dGVbaSArIDBdICsgIiwiICsgcGFsZXR0ZVtpICsgMV0gKyAiLCIgKyBwYWxldHRlW2kgKyAyXSArICIpIjsKCQl9Cgl9CgoJdGhpcy5faW1hZ2VzID0gaW1hZ2VzOwoJdGhpcy5fZ2V0UGFsZXR0ZSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBwYWxldHRlOwoJfTsKCgkvLyB0b2RvIDogZG8gSSByZWFsbHkgbmVlZCB0byBwYXNzIGluIHNpemUgaGVyZT8KCXRoaXMuYXR0YWNoQ2FudmFzID0gZnVuY3Rpb24oYywgc2l6ZSkgewoJCWNhbnZhcyA9IGM7CgkJY2FudmFzLndpZHRoID0gc2l6ZSAqIHNjYWxlOwoJCWNhbnZhcy5oZWlnaHQgPSBzaXplICogc2NhbGU7CgkJY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7Cgl9OwoKCXRoaXMuZ2V0Q2FudmFzID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGNhbnZhczsKCX07CgoJdGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGN0eDsKCX07CgoJdGhpcy5zZXRTY2FsZSA9IGZ1bmN0aW9uKHMpIHsKCQlzY2FsZSA9IHM7Cgl9OwoKCXRoaXMuc2V0VGV4dFNjYWxlID0gZnVuY3Rpb24ocykgewoJCXRleHRTY2FsZSA9IHM7Cgl9OwoKCXRoaXMuZ2V0VGV4dFNjYWxlID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRleHRTY2FsZTsKCX07CgoJdGhpcy5zZXRQYWxldHRlID0gZnVuY3Rpb24ocCkgewoJCXBhbGV0dGUgPSBwOwoJfTsKCgkvLyB0b2RvIDogcmVuYW1lIHRoaXMgc2luY2UgaXQgZG9lc24ndCBhbHdheXMgY3JlYXRlIGEgdG90YWxseSBuZXcgY2FudmFzPwoJdGhpcy5jcmVhdGVJbWFnZSA9IGZ1bmN0aW9uKGlkLCB3aWR0aCwgaGVpZ2h0LCBwaXhlbHMsIHVzZVRleHRTY2FsZSkgewoJCXZhciBpbWFnZVNjYWxlID0gdXNlVGV4dFNjYWxlID09PSB0cnVlID8gdGV4dFNjYWxlIDogc2NhbGU7CgkJdmFyIHdpZHRoU2NhbGVkID0gd2lkdGggKiBpbWFnZVNjYWxlOwoJCXZhciBoZWlnaHRTY2FsZWQgPSBoZWlnaHQgKiBpbWFnZVNjYWxlOwoKCQkvLyB0cnkgdG8gdXNlIGFuIGV4aXN0aW5nIGltYWdlIGNhbnZhcyBpZiBpdCBpcyB0aGUgcmlnaHQgc2l6ZSwKCQkvLyBpbnN0ZWFkIG9mIGV4cGVuc2l2ZWx5IGNyZWF0aW5nIGEgbmV3IG9uZQoJCXZhciBpbWFnZUNhbnZhcyA9IGltYWdlc1tpZF07CgkJaWYgKGltYWdlQ2FudmFzID09PSB1bmRlZmluZWQgfHwgaW1hZ2VDYW52YXMud2lkdGggIT0gd2lkdGhTY2FsZWQgfHwgaW1hZ2VDYW52YXMuaGVpZ2h0ICE9IGhlaWdodFNjYWxlZCkgewoJCQlpbWFnZUNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwoJCQlpbWFnZUNhbnZhcy53aWR0aCA9IHdpZHRoU2NhbGVkOwoJCQlpbWFnZUNhbnZhcy5oZWlnaHQgPSBoZWlnaHRTY2FsZWQ7CgkJfQoKCQl2YXIgaW1hZ2VDdHggPSBpbWFnZUNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwoKCQkvLyBpZiB3ZSBrbm93IHRoZSBmaWxsIGNvbG9yIGZvciB0aGlzIGltYWdlLCB3ZSBjYW4gc3BlZWQgdGhpbmdzIHVwCgkJLy8gYnkgZmlsbGluZyB0aGUgd2hvbGUgaW1hZ2Ugd2l0aCB0aGF0IGNvbG9yCgkJdmFyIGZpbGxDb2xvcjsKCQlpZiAoaW1hZ2VGaWxsQ29sb3JzW2lkXSAhPSB1bmRlZmluZWQpIHsKCQkJZmlsbENvbG9yID0gaW1hZ2VGaWxsQ29sb3JzW2lkXTsKCQkJdmFyIGlzVHJhbnNwYXJlbnQgPSAoZmlsbENvbG9yID09PSAwKTsKCQkJaWYgKGlzVHJhbnNwYXJlbnQpIHsKCQkJCWltYWdlQ3R4LmNsZWFyUmVjdCgwLCAwLCBpbWFnZUNhbnZhcy53aWR0aCwgaW1hZ2VDYW52YXMuaGVpZ2h0KTsKCQkJfQoJCQllbHNlIHsKCQkJCWltYWdlQ3R4LmZpbGxTdHlsZSA9IG1ha2VGaWxsU3R5bGUoZmlsbENvbG9yLCBpc1RyYW5zcGFyZW50KTsKCQkJCWltYWdlQ3R4LmZpbGxSZWN0KDAsIDAsIGltYWdlQ2FudmFzLndpZHRoLCBpbWFnZUNhbnZhcy5oZWlnaHQpOwoJCQl9CgkJfQoKCQlmb3IgKHZhciBpID0gMDsgaSA8IHBpeGVscy5sZW5ndGg7IGkrKykgewoJCQl2YXIgeCA9IGkgJSB3aWR0aDsKCQkJdmFyIHkgPSBNYXRoLmZsb29yKGkgLyB3aWR0aCk7CgkJCXZhciBjb2xvciA9IHBpeGVsc1tpXTsKCQkJaWYgKGNvbG9yICE9IGZpbGxDb2xvcikgewoJCQkJdmFyIGlzVHJhbnNwYXJlbnQgPSAoY29sb3IgPT09IDApOwoJCQkJaW1hZ2VDdHguZmlsbFN0eWxlID0gbWFrZUZpbGxTdHlsZShjb2xvciwgaXNUcmFuc3BhcmVudCk7CgkJCQlpbWFnZUN0eC5maWxsUmVjdCh4ICogaW1hZ2VTY2FsZSwgeSAqIGltYWdlU2NhbGUsIGltYWdlU2NhbGUsIGltYWdlU2NhbGUpOwoJCQl9CgkJfQoKCQlpbWFnZXNbaWRdID0gaW1hZ2VDYW52YXM7Cgl9OwoKCXRoaXMuc2V0SW1hZ2VGaWxsID0gZnVuY3Rpb24oaWQsIGNvbG9yKSB7CgkJaW1hZ2VGaWxsQ29sb3JzW2lkXSA9IGNvbG9yOwoJfTsKCgl0aGlzLmRyYXdJbWFnZSA9IGZ1bmN0aW9uKGlkLCB4LCB5LCBkZXN0SWQpIHsKCQlpZiAoIWltYWdlc1tpZF0pIHsKCQkJYml0c3lMb2coImltYWdlIGRvZXNuJ3QgZXhpc3Q6ICIgKyBpZCwgImdyYXBoaWNzIik7CgkJCXJldHVybjsKCQl9CgoJCXZhciBkZXN0Q3R4ID0gY3R4OwoJCWlmIChkZXN0SWQgIT0gdW5kZWZpbmVkKSB7CgkJCS8vIGlmIHRoZXJlJ3MgYSBkZXN0aW5hdGlvbiBJRCwgdGhhdCBtZWFucyB3ZSdyZSBkcmF3aW5nIHRoaXMgaW1hZ2UgKm9udG8qIGFub3RoZXIgaW1hZ2UgY2FudmFzCgkJCXZhciBkZXN0Q2FudmFzID0gaW1hZ2VzW2Rlc3RJZF07CgkJCWRlc3RDdHggPSBkZXN0Q2FudmFzLmdldENvbnRleHQoIjJkIik7CgkJfQoKCQlkZXN0Q3R4LmRyYXdJbWFnZShpbWFnZXNbaWRdLCB4ICogc2NhbGUsIHkgKiBzY2FsZSwgaW1hZ2VzW2lkXS53aWR0aCwgaW1hZ2VzW2lkXS5oZWlnaHQpOwoJfTsKCgl0aGlzLmhhc0ltYWdlID0gZnVuY3Rpb24oaWQpIHsKCQlyZXR1cm4gaW1hZ2VzW2lkXSAhPSB1bmRlZmluZWQ7Cgl9OwoKCXRoaXMuZ2V0SW1hZ2UgPSBmdW5jdGlvbihpZCkgewoJCXJldHVybiBpbWFnZXNbaWRdOwoJfTsKCgl0aGlzLmRlbGV0ZUltYWdlID0gZnVuY3Rpb24oaWQpIHsKCQlkZWxldGUgaW1hZ2VzW2lkXTsKCQlkZWxldGUgaW1hZ2VGaWxsQ29sb3JzW2lkXTsKCX07CgoJdGhpcy5nZXRDYW52YXMgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gY2FudmFzOwoJfTsKCgl0aGlzLmNsZWFyQ2FudmFzID0gZnVuY3Rpb24oY29sb3IpIHsKCQliaXRzeUxvZygicGFsPyAiICsgcGFsZXR0ZS5sZW5ndGggKyAiIC8gIiArIGNvbG9yLCAiZ3JhcGhpY3MiKTsKCQljdHguZmlsbFN0eWxlID0gbWFrZUZpbGxTdHlsZShjb2xvcik7CgkJY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7Cgl9Owp9Cjwvc2NyaXB0PgoKPHNjcmlwdD4KLyogTE9HR0lORyAqLwp2YXIgRGVidWdMb2dDYXRlZ29yeSA9IHsKCS8vIHN5c3RlbQoJaW5wdXQ6IGZhbHNlLAoJc291bmQ6IGZhbHNlLAoJZ3JhcGhpY3M6IGZhbHNlLAoJc3lzdGVtOiBmYWxzZSwKCgkvLyBlbmdpbmUKCWJpdHN5OiBmYWxzZSwKCgkvLyBlZGl0b3IKCWVkaXRvcjogZmFsc2UsCgoJLy8gdG9vbHMKCXJvb206IGZhbHNlLAoJdHVuZTogZmFsc2UsCglibGlwOiBmYWxzZSwKfTsKCnZhciBpc0xvZ2dpbmdWZXJib3NlID0gZmFsc2U7CgpmdW5jdGlvbiBiaXRzeUxvZyhtZXNzYWdlLCBjYXRlZ29yeSkgewoJaWYgKCFjYXRlZ29yeSkgewoJCWNhdGVnb3J5ID0gImJpdHN5IjsKCX0KCgl2YXIgc3VtbWFyeSA9IGNhdGVnb3J5ICsgIjo6IiArIG1lc3NhZ2U7CgoJaWYgKERlYnVnTG9nQ2F0ZWdvcnlbY2F0ZWdvcnldID09PSB0cnVlKSB7CgkJaWYgKGlzTG9nZ2luZ1ZlcmJvc2UpIHsKCQkJY29uc29sZS5ncm91cChzdW1tYXJ5KTsKCgkJCWNvbnNvbGUuZGlyKG1lc3NhZ2UpOwoKCQkJY29uc29sZS5ncm91cCgic3RhY2siKQoJCQljb25zb2xlLnRyYWNlKCk7CgkJCWNvbnNvbGUuZ3JvdXBFbmQoKTsKCgkJCWNvbnNvbGUuZ3JvdXBFbmQoKTsKCQl9CgkJZWxzZSB7CgkJCWNvbnNvbGUubG9nKHN1bW1hcnkpOwoJCX0KCX0KfQoKLyogR0xPQkFMUyAqLwp2YXIgdGlsZXNpemUgPSA4Owp2YXIgbWFwc2l6ZSA9IDE2Owp2YXIgd2lkdGggPSBtYXBzaXplICogdGlsZXNpemU7CnZhciBoZWlnaHQgPSBtYXBzaXplICogdGlsZXNpemU7CnZhciBzY2FsZSA9IDQ7CnZhciB0ZXh0U2NhbGUgPSAyOwoKLyogU1lTVEVNICovCnZhciB1cGRhdGVJbnRlcnZhbCA9IG51bGw7CnZhciBwcmV2VGltZSA9IDA7CnZhciBkZWx0YVRpbWUgPSAwOwoKZnVuY3Rpb24gaW5pdFN5c3RlbSgpIHsKCXByZXZUaW1lID0gRGF0ZS5ub3coKTsKCXVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlU3lzdGVtLCAxNik7Cn0KCmZ1bmN0aW9uIHVwZGF0ZVN5c3RlbSgpIHsKCXZhciBjdXJUaW1lID0gRGF0ZS5ub3coKTsKCWRlbHRhVGltZSA9IGN1clRpbWUgLSBwcmV2VGltZTsKCgkvLyB1cGRhdGUgYWxsIGFjdGl2ZSBwcm9jZXNzZXMKCWZvciAodmFyIGkgPSAwOyBpIDwgcHJvY2Vzc2VzLmxlbmd0aDsgaSsrKSB7CgkJYml0c3kgPSBwcm9jZXNzZXNbaV0uc3lzdGVtOwoJCWlmIChiaXRzeS5fYWN0aXZlKSB7CgkJCWJpdHN5TG9nKGJpdHN5Ll9uYW1lICsgIiBpbWcgY291bnQ6ICIgKyBiaXRzeS5fZ3JhcGhpY3MuX2ltYWdlcy5sZW5ndGgsICJzeXN0ZW0iKTsKCQkJdmFyIHNob3VsZENvbnRpbnVlID0gYml0c3kuX3VwZGF0ZShkZWx0YVRpbWUpOwoJCQlpZiAoIXNob3VsZENvbnRpbnVlKSB7CgkJCQkvLyB0b2RvIDogZG8gSSByZWFsbHkgY2FyZSBhYm91dCB0aGlzIF9leGl0IHRoaW5nPwoJCQkJaWYgKGJpdHN5Ll9uYW1lICE9ICJiaXRzeSIpIHsKCQkJCQliaXRzeS5fZXhpdCgpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWJpdHN5ID0gbWFpblByb2Nlc3Muc3lzdGVtOwoJcHJldlRpbWUgPSBjdXJUaW1lOwp9CgpmdW5jdGlvbiBsb2FkR2FtZShjYW52YXMsIGdhbWVEYXRhLCBkZWZhdWx0Rm9udERhdGEpIHsKCWJpdHN5TG9nKCJsb2FkISIsICJzeXN0ZW0iKTsKCS8vIGluaXRpYWxpemUgYml0c3kgc3lzdGVtCgliaXRzeS5fYXR0YWNoQ2FudmFzKGNhbnZhcyk7CgliaXRzeS5fd3JpdGUoYml0c3kuX2dhbWVEYXRhQmxvY2ssIGdhbWVEYXRhKTsKCWJpdHN5Ll93cml0ZShiaXRzeS5fZm9udERhdGFCbG9jaywgZGVmYXVsdEZvbnREYXRhKTsKCWJpdHN5Ll9zdGFydCgpOwp9CgpmdW5jdGlvbiBxdWl0R2FtZSgpIHsKCS8vIGhhY2sgdG8gcHJlc3MgdGhlIG1lbnUgYnV0dG9uIHRvIGZvcmNlIGdhbWUgb3ZlciBzdGF0ZQoJYml0c3kuX2luamVjdFByZUxvb3AgPSBmdW5jdGlvbigpIHsgYml0c3kuX3Bva2UoYml0c3kuX2J1dHRvbkJsb2NrLCBiaXRzeS5CVE5fTUVOVSwgMSk7IH07CgoJLy8gb25lIGxhc3QgdXBkYXRlIHRvIGNsZWFuIHVwIChhIGxpdHRsZSBoYWNreSB0byBkbyB0aGlzIGhlcmU/KQoJYml0c3kuX3VwZGF0ZSgwKTsKCWJpdHN5Ll9leGl0KCk7CgoJLy8gY2xlYW4gdXAgdGhpcyBncm9zcyBoYWNrCgliaXRzeS5faW5qZWN0UHJlTG9vcCA9IG51bGw7Cn0KCi8qIEdSQVBISUNTICovCnZhciBjYW52YXM7IC8vIGNhbiBJIGdldCByaWQgb2YgdGhlc2U/CnZhciBjdHg7CgpmdW5jdGlvbiBhdHRhY2hDYW52YXMoYykgewoJLy8gaGFjayA6IHRlcyB0bmV3IHN5c3RlbQoJYml0c3kuX2F0dGFjaENhbnZhcyhjKTsKCS8vIGV4dHJhIGhhY2t5CgljYW52YXMgPSBiaXRzeS5fZ2V0Q2FudmFzKCk7CgljdHggPSBiaXRzeS5fZ2V0Q29udGV4dCgpOwp9CgovKiBQUk9DRVNTRVMgKi8KdmFyIHByb2Nlc3NlcyA9IFtdOwoKZnVuY3Rpb24gYWRkUHJvY2VzcyhuYW1lKSB7Cgl2YXIgcHJvYyA9IHt9OwoJcHJvYy5zeXN0ZW0gPSBuZXcgQml0c3lTeXN0ZW0obmFtZSk7CgoJcHJvY2Vzc2VzLnB1c2gocHJvYyk7CgoJcmV0dXJuIHByb2M7Cn0KCi8qID09IFNZU1RFTSB2MC4yID09PSAqLwpmdW5jdGlvbiBCaXRzeVN5c3RlbShuYW1lKSB7Cgl2YXIgc2VsZiA9IHRoaXM7CgoJaWYgKCFuYW1lKSB7CgkJbmFtZSA9ICJiaXRzeSI7Cgl9CgoJLy8gbWVtb3J5Cgl2YXIgbWVtb3J5ID0gewoJCWJsb2NrczogW10sCgkJY2hhbmdlZDogW10KCX07CgoJLy8gaW5wdXQKCXZhciBpbnB1dCA9IG5ldyBJbnB1dFN5c3RlbSgpOwoKCS8vIHNvdW5kCgl2YXIgc291bmQgPSBuZXcgU291bmRTeXN0ZW0oKTsKCXZhciBzb3VuZER1cmF0aW9uSW5kZXggPSAwOwoJdmFyIHNvdW5kRnJlcXVlbmN5SW5kZXggPSAxOwoJdmFyIHNvdW5kVm9sdW1lSW5kZXggPSAyOwoJdmFyIHNvdW5kUHVsc2VJbmRleCA9IDM7Cgl2YXIgbWF4Vm9sdW1lID0gMTU7CgoJLy8gZ3JhcGhpY3MKCXZhciBncmFwaGljcyA9IG5ldyBHcmFwaGljc1N5c3RlbSgpOwoJZ3JhcGhpY3Muc2V0U2NhbGUoc2NhbGUpOwoJZ3JhcGhpY3Muc2V0VGV4dFNjYWxlKHRleHRTY2FsZSk7Cgl2YXIgaW5pdGlhbFBhbGV0dGVTaXplID0gNjQ7Cgl2YXIgdGlsZVBvb2xTdGFydCA9IG51bGw7Cgl2YXIgdGlsZVBvb2xTaXplID0gNTEyOwoJLy8gaGFjayEhISAoYWNjZXNzIGZvciBkZWJ1Z2dpbmcpCgl0aGlzLl9ncmFwaGljcyA9IGdyYXBoaWNzOwoKCWZ1bmN0aW9uIHVwZGF0ZVRleHRTY2FsZSgpIHsKCQkvLyBtYWtlIHN1cmUgdGhlIHRleHQgc2NhbGUgbWF0Y2hlcyB0aGUgdGV4dCBtb2RlCgkJdmFyIHRleHRNb2RlID0gc2VsZi5fcGVlayhtb2RlQmxvY2ssIDEpOwoJCXZhciB0ZXh0TW9kZVNjYWxlID0gKHRleHRNb2RlID09PSBzZWxmLlRYVF9MT1JFWikgPyBzY2FsZSA6IHRleHRTY2FsZTsKCQlpZiAoZ3JhcGhpY3MuZ2V0VGV4dFNjYWxlKCkgIT0gdGV4dE1vZGVTY2FsZSkgewoJCQlncmFwaGljcy5zZXRUZXh0U2NhbGUodGV4dE1vZGVTY2FsZSk7CgkJCW1lbW9yeS5jaGFuZ2VkW3NlbGYuVEVYVEJPWF0gPSB0cnVlOwoJCX0KCX0KCglmdW5jdGlvbiB1cGRhdGVJbnB1dCgpIHsKCQkvLyB1cGRhdGUgaW5wdXQgZmxhZ3MKCQlzZWxmLl9wb2tlKHNlbGYuX2J1dHRvbkJsb2NrLCBzZWxmLkJUTl9VUCwKCQkJKGlucHV0LmlzS2V5RG93bihpbnB1dC5LZXkuVVApIHx8IGlucHV0LmlzS2V5RG93bihpbnB1dC5LZXkuVykgfHwgaW5wdXQuc3dpcGVVcCgpKSA/IDEgOiAwKTsKCgkJc2VsZi5fcG9rZShzZWxmLl9idXR0b25CbG9jaywgc2VsZi5CVE5fRE9XTiwKCQkJKGlucHV0LmlzS2V5RG93bihpbnB1dC5LZXkuRE9XTikgfHwgaW5wdXQuaXNLZXlEb3duKGlucHV0LktleS5TKSB8fCBpbnB1dC5zd2lwZURvd24oKSkgPyAxIDogMCk7CgoJCXNlbGYuX3Bva2Uoc2VsZi5fYnV0dG9uQmxvY2ssIHNlbGYuQlROX0xFRlQsCgkJCShpbnB1dC5pc0tleURvd24oaW5wdXQuS2V5LkxFRlQpIHx8IGlucHV0LmlzS2V5RG93bihpbnB1dC5LZXkuQSkgfHwgaW5wdXQuc3dpcGVMZWZ0KCkpID8gMSA6IDApOwoKCQlzZWxmLl9wb2tlKHNlbGYuX2J1dHRvbkJsb2NrLCBzZWxmLkJUTl9SSUdIVCwKCQkJKGlucHV0LmlzS2V5RG93bihpbnB1dC5LZXkuUklHSFQpIHx8IGlucHV0LmlzS2V5RG93bihpbnB1dC5LZXkuRCkgfHwgaW5wdXQuc3dpcGVSaWdodCgpKSA/IDEgOiAwKTsKCgkJc2VsZi5fcG9rZShzZWxmLl9idXR0b25CbG9jaywgc2VsZi5CVE5fT0ssCgkJCShpbnB1dC5hbnlLZXlEb3duKCkgfHwgaW5wdXQuaXNUYXBSZWxlYXNlZCgpKSA/IDEgOiAwKTsKCgkJc2VsZi5fcG9rZShzZWxmLl9idXR0b25CbG9jaywgc2VsZi5CVE5fTUVOVSwKCQkJKGlucHV0LmlzUmVzdGFydENvbWJvUHJlc3NlZCgpKSA/IDEgOiAwKTsKCgkJaW5wdXQucmVzZXRUYXBSZWxlYXNlZCgpOwoJfQoKCWZ1bmN0aW9uIHVwZGF0ZVNvdW5kKGR0KSB7CgkJdmFyIGNoYW5nZWQwID0gbWVtb3J5LmNoYW5nZWRbc2VsZi5TT1VORDFdOwoJCXZhciBjaGFuZ2VkMSA9IG1lbW9yeS5jaGFuZ2VkW3NlbGYuU09VTkQyXTsKCgkJLy8gdXBkYXRlIHNvdW5kIGNoYW5uZWwgdGltZXJzCgkJdmFyIHRpbWVyMCA9IHNlbGYuX3BlZWsoc2VsZi5TT1VORDEsIHNvdW5kRHVyYXRpb25JbmRleCk7CgkJdGltZXIwIC09IGR0OwoJCWlmICh0aW1lcjAgPD0gMCkgewoJCQl0aW1lcjAgPSAwOwoJCQlpZiAoc2VsZi5fcGVlayhzZWxmLlNPVU5EMSwgc291bmRWb2x1bWVJbmRleCkgPiAwKSB7CgkJCQlzZWxmLl9wb2tlKHNlbGYuU09VTkQxLCBzb3VuZFZvbHVtZUluZGV4LCAwKTsKCQkJCWNoYW5nZWQwID0gdHJ1ZTsKCQkJfQoJCX0KCQlzZWxmLl9wb2tlKHNlbGYuU09VTkQxLCBzb3VuZER1cmF0aW9uSW5kZXgsIHRpbWVyMCk7CgoJCXZhciB0aW1lcjEgPSBzZWxmLl9wZWVrKHNlbGYuU09VTkQyLCBzb3VuZER1cmF0aW9uSW5kZXgpOwoJCXRpbWVyMSAtPSBkdDsKCQlpZiAodGltZXIxIDw9IDApIHsKCQkJdGltZXIxID0gMDsKCQkJaWYgKHNlbGYuX3BlZWsoc2VsZi5TT1VORDIsIHNvdW5kVm9sdW1lSW5kZXgpID4gMCkgewoJCQkJc2VsZi5fcG9rZShzZWxmLlNPVU5EMiwgc291bmRWb2x1bWVJbmRleCwgMCk7CgkJCQljaGFuZ2VkMSA9IHRydWU7CgkJCX0KCQl9CgkJc2VsZi5fcG9rZShzZWxmLlNPVU5EMiwgc291bmREdXJhdGlvbkluZGV4LCB0aW1lcjEpOwoKCQkvLyBzZW5kIHVwZGF0ZWQgY2hhbm5lbCBhdHRyaWJ1dGVzIHRvIHRoZSBzb3VuZCBzeXN0ZW0KCQlpZiAoY2hhbmdlZDApIHsKCQkJc291bmQuc2V0UHVsc2UoMCwgc2VsZi5fcGVlayhzZWxmLlNPVU5EMSwgc291bmRQdWxzZUluZGV4KSk7CgoJCQl2YXIgZnJlcSA9IHNlbGYuX3BlZWsoc2VsZi5TT1VORDEsIHNvdW5kRnJlcXVlbmN5SW5kZXgpOwoJCQl2YXIgZnJlcUh6ID0gZnJlcSAvIDEwMDsKCQkJc291bmQuc2V0RnJlcXVlbmN5KDAsIGZyZXFIeik7CgoJCQl2YXIgdm9sdW1lID0gc2VsZi5fcGVlayhzZWxmLlNPVU5EMSwgc291bmRWb2x1bWVJbmRleCk7CgkJCXZvbHVtZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHZvbHVtZSwgbWF4Vm9sdW1lKSk7CgkJCXZvbHVtZU5vcm0gPSAodm9sdW1lIC8gbWF4Vm9sdW1lKTsKCQkJc291bmQuc2V0Vm9sdW1lKDAsIHZvbHVtZU5vcm0pOwoJCX0KCgkJaWYgKGNoYW5nZWQxKSB7CgkJCXNvdW5kLnNldFB1bHNlKDEsIHNlbGYuX3BlZWsoc2VsZi5TT1VORDIsIHNvdW5kUHVsc2VJbmRleCkpOwoKCQkJdmFyIGZyZXEgPSBzZWxmLl9wZWVrKHNlbGYuU09VTkQyLCBzb3VuZEZyZXF1ZW5jeUluZGV4KTsKCQkJdmFyIGZyZXFIeiA9IGZyZXEgLyAxMDA7CgkJCXNvdW5kLnNldEZyZXF1ZW5jeSgxLCBmcmVxSHopOwoKCQkJdmFyIHZvbHVtZSA9IHNlbGYuX3BlZWsoc2VsZi5TT1VORDIsIHNvdW5kVm9sdW1lSW5kZXgpOwoJCQl2b2x1bWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih2b2x1bWUsIG1heFZvbHVtZSkpOwoJCQl2b2x1bWVOb3JtID0gKHZvbHVtZSAvIG1heFZvbHVtZSk7CgkJCXNvdW5kLnNldFZvbHVtZSgxLCB2b2x1bWVOb3JtKTsKCQl9Cgl9CgoJZnVuY3Rpb24gdXBkYXRlR3JhcGhpY3MoKSB7CgkJaWYgKHNlbGYuX2VuYWJsZUdyYXBoaWNzID09PSBmYWxzZSkgewoJCQlyZXR1cm47CgkJfQoKCQliaXRzeUxvZygidXBkYXRlIGdyYXBoaWNzIiwgInN5c3RlbSIpOwoKCQlpZiAobWVtb3J5LmNoYW5nZWRbcGFsZXR0ZUJsb2NrXSkgewoJCQlncmFwaGljcy5zZXRQYWxldHRlKHNlbGYuX2R1bXAoKVtwYWxldHRlQmxvY2tdKTsKCQl9CgoJCWlmICh0aWxlUG9vbFN0YXJ0ICE9IG51bGwpIHsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aWxlUG9vbFNpemU7IGkrKykgewoJCQkJdmFyIHRpbGUgPSB0aWxlUG9vbFN0YXJ0ICsgaTsKCQkJCWlmIChtZW1vcnkuYmxvY2tzW3RpbGVdICE9IHVuZGVmaW5lZCAmJiBtZW1vcnkuY2hhbmdlZFt0aWxlXSkgewoJCQkJCWJpdHN5TG9nKCJ0aWxlIGNoYW5nZWQ/ICIgKyB0aWxlLCAic3lzdGVtIik7CgkJCQkJLy8gdXBkYXRlIHRpbGUgaW1hZ2UKCQkJCQlncmFwaGljcy5jcmVhdGVJbWFnZSh0aWxlLCBzZWxmLlRJTEVfU0laRSwgc2VsZi5USUxFX1NJWkUsIHNlbGYuX2R1bXAoKVt0aWxlXSk7CgkJCQl9CgkJCX0KCQl9CgoJCXZhciB0ZXh0Ym94Q2hhbmdlZCA9IG1lbW9yeS5jaGFuZ2VkW3NlbGYuVEVYVEJPWF0gfHwgbWVtb3J5LmNoYW5nZWRbdGV4dGJveEF0dHJpYnV0ZUJsb2NrXTsKCQlpZiAodGV4dGJveENoYW5nZWQpIHsKCQkJLy8gdG9kbyA6IHNob3VsZCB0aGlzIGJlIG9wdGltaXplZCBpbiBzb21lIHdheT8KCQkJLy8gdXBkYXRlIHRleHRib3ggaW1hZ2UKCQkJdmFyIHcgPSBzZWxmLl9wZWVrKHRleHRib3hBdHRyaWJ1dGVCbG9jaywgMyk7IC8vIHRvZG8gOiBuZWVkIGEgdmFyaWFibGUgdG8gc3RvcmUgdGhpcyBpbmRleD8KCQkJdmFyIGggPSBzZWxmLl9wZWVrKHRleHRib3hBdHRyaWJ1dGVCbG9jaywgNCk7CgkJCWlmICh3ID4gMCAmJiBoID4gMCkgewoJCQkJYml0c3lMb2coInRleHRib3ggY2hhbmdlZCEgIiArIG1lbW9yeS5jaGFuZ2VkW3NlbGYuVEVYVEJPWF0gKyAiICIgKyBtZW1vcnkuY2hhbmdlZFt0ZXh0Ym94QXR0cmlidXRlQmxvY2tdICsgIiAiICsgdyArICIgIiArIGgsICJzeXN0ZW0iKTsKCQkJCXZhciB1c2VUZXh0Qm94U2NhbGUgPSB0cnVlOyAvLyB0b2RvIDogY2hlY2sgbW9kZSBoZXJlPwoJCQkJZ3JhcGhpY3MuY3JlYXRlSW1hZ2Uoc2VsZi5URVhUQk9YLCB3LCBoLCBzZWxmLl9kdW1wKClbc2VsZi5URVhUQk9YXSwgdXNlVGV4dEJveFNjYWxlKTsKCQkJfQoJCX0KCgkJdmFyIG1vZGUgPSBzZWxmLl9wZWVrKG1vZGVCbG9jaywgMCk7CgkJaWYgKG1vZGUgPT09IHNlbGYuR0ZYX1ZJREVPKSB7CgkJCWlmIChtZW1vcnkuY2hhbmdlZFtzZWxmLlZJREVPXSkgewoJCQkJZ3JhcGhpY3MuY2xlYXJDYW52YXMoMCk7CgkJCQkvLyB1cGRhdGUgc2NyZWVuIGltYWdlCgkJCQlncmFwaGljcy5jcmVhdGVJbWFnZShzZWxmLlZJREVPLCBzZWxmLlZJREVPX1NJWkUsIHNlbGYuVklERU9fU0laRSwgc2VsZi5fZHVtcCgpW3NlbGYuVklERU9dKTsKCQkJCS8vIHJlbmRlciBzY3JlZW4gb250byBjYW52YXMKCQkJCWdyYXBoaWNzLmRyYXdJbWFnZShzZWxmLlZJREVPLCAwLCAwKTsKCQkJfQoJCX0KCQllbHNlIGlmIChtb2RlID09PSBzZWxmLkdGWF9NQVApIHsKCQkJLy8gcmVkcmF3IGFueSBjaGFuZ2VkIGxheWVycwoJCQl2YXIgbGF5ZXJzID0gc2VsZi5fZ2V0VGlsZU1hcExheWVycygpOwoJCQl2YXIgYW55TWFwTGF5ZXJDaGFuZ2VkID0gZmFsc2U7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgbGF5ZXJJZCA9IGxheWVyc1tpXTsKCQkJCWlmIChtZW1vcnkuY2hhbmdlZFtsYXllcklkXSkgewoJCQkJCS8vIG5lZWQgdG8gcmVkcmF3IHRoaXMgbWFwIGxheWVyCgkJCQkJYW55TWFwTGF5ZXJDaGFuZ2VkID0gdHJ1ZTsKCQkJCQkvLyBjbGVhciBsYXllciBjYW52YXMKCQkJCQlncmFwaGljcy5zZXRJbWFnZUZpbGwobGF5ZXJJZCwgMCk7IC8vIGZpbGwgdHJhbnNwYXJlbnQKCQkJCQlncmFwaGljcy5jcmVhdGVJbWFnZShsYXllcklkLCBzZWxmLlZJREVPX1NJWkUsIHNlbGYuVklERU9fU0laRSwgW10pOwoJCQkJCS8vIHJlbmRlciB0aWxlcyBvbnRvIGxheWVyIGNhbnZhcwoJCQkJCXZhciBsYXllckRhdGEgPSBzZWxmLl9kdW1wKClbbGF5ZXJJZF07CgkJCQkJZm9yICh2YXIgdHkgPSAwOyB0eSA8IHNlbGYuTUFQX1NJWkU7IHR5KyspIHsKCQkJCQkJZm9yICh2YXIgdHggPSAwOyB0eCA8IHNlbGYuTUFQX1NJWkU7IHR4KyspIHsKCQkJCQkJCXZhciB0aWxlSW5kZXggPSAodHkgKiBzZWxmLk1BUF9TSVpFKSArIHR4OwoJCQkJCQkJdmFyIHRpbGUgPSBsYXllckRhdGFbdGlsZUluZGV4XTsKCQkJCQkJCWlmICh0aWxlID4gMCkgewoJCQkJCQkJCWdyYXBoaWNzLmRyYXdJbWFnZSh0aWxlLCB0eCAqIHNlbGYuVElMRV9TSVpFLCB0eSAqIHNlbGYuVElMRV9TSVpFLCBsYXllcklkKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gcmVkcmF3IHRoZSBtYWluIGNhbnZhcwoJCQlpZiAodGV4dGJveENoYW5nZWQgfHwgYW55TWFwTGF5ZXJDaGFuZ2VkKSB7CgkJCQliaXRzeUxvZygibWFwIGNoYW5nZWQ/ICIgKyBtZW1vcnkuY2hhbmdlZFtzZWxmLk1BUDFdICsgIiAiICsgbWVtb3J5LmNoYW5nZWRbc2VsZi5NQVAyXSwgInN5c3RlbSIpOwoJCQkJZ3JhcGhpY3MuY2xlYXJDYW52YXMoMCk7CgoJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHsKCQkJCQl2YXIgbGF5ZXJJZCA9IGxheWVyc1tpXTsKCQkJCQkvLyBkcmF3IHRoZSBsYXllcidzIGltYWdlIGNhbnZhcyBvbnRvIHRoZSBtYWluIGNhbnZhcwoJCQkJCWdyYXBoaWNzLmRyYXdJbWFnZShsYXllcklkLCAwLCAwKTsKCQkJCX0KCgkJCQkvLyBkcmF3IHRleHRib3ggb250byBjYW52YXMKCQkJCXZhciB2aXNpYmxlID0gc2VsZi5fcGVlayh0ZXh0Ym94QXR0cmlidXRlQmxvY2ssIDApCgkJCQl2YXIgeCA9IHNlbGYuX3BlZWsodGV4dGJveEF0dHJpYnV0ZUJsb2NrLCAxKTsKCQkJCXZhciB5ID0gc2VsZi5fcGVlayh0ZXh0Ym94QXR0cmlidXRlQmxvY2ssIDIpOwoJCQkJdmFyIHcgPSBzZWxmLl9wZWVrKHRleHRib3hBdHRyaWJ1dGVCbG9jaywgMyk7CgkJCQl2YXIgaCA9IHNlbGYuX3BlZWsodGV4dGJveEF0dHJpYnV0ZUJsb2NrLCA0KTsKCQkJCWlmICh2aXNpYmxlID4gMCAmJiB3ID4gMCAmJiBoID4gMCkgewoJCQkJCWdyYXBoaWNzLmRyYXdJbWFnZShzZWxmLlRFWFRCT1gsIHgsIHkpOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8qID09IFBSSVZBVEUgLyBERUJVRyA9PSAqLwoJdGhpcy5fbmFtZSA9IG5hbWU7CgoJdGhpcy5fYWN0aXZlID0gZmFsc2U7CgoJdGhpcy5fYXR0YWNoQ2FudmFzID0gZnVuY3Rpb24oYykgewoJCWdyYXBoaWNzLmF0dGFjaENhbnZhcyhjLCBzZWxmLlZJREVPX1NJWkUpOwoJfTsKCgl0aGlzLl9nZXRDYW52YXMgPSBncmFwaGljcy5nZXRDYW52YXM7Cgl0aGlzLl9nZXRDb250ZXh0ID0gZ3JhcGhpY3MuZ2V0Q29udGV4dDsKCgl0aGlzLl9zdGFydCA9IGZ1bmN0aW9uKCkgewoJCWlucHV0Lmxpc3RlbihncmFwaGljcy5nZXRDYW52YXMoKSk7CgkJdXBkYXRlVGV4dFNjYWxlKCk7CgkJc2VsZi5fYWN0aXZlID0gdHJ1ZTsKCX07CgoJLy8gaGFja3kuLi4KCXRoaXMuX3N0YXJ0Tm9JbnB1dCA9IGZ1bmN0aW9uKCkgewoJCXVwZGF0ZVRleHRTY2FsZSgpOwoJCXNlbGYuX2FjdGl2ZSA9IHRydWU7Cgl9OwoKCXRoaXMuX2V4aXQgPSBmdW5jdGlvbigpIHsKCQlpbnB1dC51bmxpc3RlbihncmFwaGljcy5nZXRDYW52YXMoKSk7CgkJc291bmQubXV0ZSgpOwoJCXNlbGYuX2FjdGl2ZSA9IGZhbHNlOwoJfTsKCgkvLyBoYWNreS4uLi4KCXRoaXMuX2luamVjdFByZUxvb3AgPSBudWxsOwoJdGhpcy5faW5qZWN0UG9zdERyYXcgPSBudWxsOwoKCXRoaXMuX3VwZGF0ZSA9IGZ1bmN0aW9uKGR0KSB7CgkJdmFyIHNob3VsZENvbnRpbnVlID0gZmFsc2U7CgoJCXVwZGF0ZUlucHV0KCk7CgoJCS8vIHRvbyBoYWNreT8/PwoJCWlmIChzZWxmLl9pbmplY3RQcmVMb29wKSB7CgkJCXNlbGYuX2luamVjdFByZUxvb3AoKTsKCQl9CgoJCS8vIHJ1biBtYWluIGxvb3AKCQlpZiAob25Mb29wRnVuY3Rpb24pIHsKCQkJc2hvdWxkQ29udGludWUgPSBvbkxvb3BGdW5jdGlvbihkdCk7CgkJfQoKCQlpZiAobWVtb3J5LmNoYW5nZWRbbW9kZUJsb2NrXSkgewoJCQl1cGRhdGVUZXh0U2NhbGUoKTsKCQl9CgoJCS8vIHVwZGF0ZSBvdXRwdXQgc3lzdGVtcwoJCXVwZGF0ZVNvdW5kKGR0KTsKCQl1cGRhdGVHcmFwaGljcygpOwoKCQlpZiAoc2VsZi5faW5qZWN0UG9zdERyYXcpIHsKCQkJc2VsZi5faW5qZWN0UG9zdERyYXcoKTsKCQl9CgoJCS8vIHJlc2V0IG1lbW9yeSBibG9jayBjaGFuZ2VkIGZsYWdzCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBtZW1vcnkuY2hhbmdlZC5sZW5ndGg7IGkrKykgewoJCQltZW1vcnkuY2hhbmdlZFtpXSA9IGZhbHNlOwoJCX0KCgkJLy8gdG9kbyA6IHNob3VsZCB0aGUgX2V4aXQoKSBjYWxsIGdvIGluIGhlcmU/CgoJCXJldHVybiBzaG91bGRDb250aW51ZTsKCX07CgoJdGhpcy5fdXBkYXRlR3JhcGhpY3MgPSB1cGRhdGVHcmFwaGljczsKCgl0aGlzLl9hbGxvY2F0ZSA9IGZ1bmN0aW9uKGFyZ3MpIHsKCQkvLyBmaW5kIG5leHQgYXZhaWxhYmxlIGJsb2NrIGluIHJhbmdlCgkJdmFyIG5leHQgPSAoYXJncyAmJiBhcmdzLnN0YXJ0KSA/IGFyZ3Muc3RhcnQgOiAwOwoJCXZhciBjb3VudCA9IChhcmdzICYmIGFyZ3MubWF4KSA/IGFyZ3MubWF4IDogLTE7CgkJd2hpbGUgKG1lbW9yeS5ibG9ja3NbbmV4dF0gIT0gdW5kZWZpbmVkICYmIGNvdW50ICE9IDApIHsKCQkJbmV4dCsrOwoJCQljb3VudC0tOwoJCX0KCgkJaWYgKGNvdW50ID09IDApIHsKCQkJLy8gY291bGRuJ3QgZmluZCBhbnkgYXZhaWxhYmxlIGJsb2NrCgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKGFyZ3MgJiYgYXJncy5zdHIpIHsKCQkJbWVtb3J5LmJsb2Nrc1tuZXh0XSA9IGFyZ3Muc3RyOwoJCX0KCQllbHNlIHsKCQkJdmFyIHNpemUgPSBhcmdzICYmIGFyZ3Muc2l6ZSA/IGFyZ3Muc2l6ZSA6IDA7CgkJCW1lbW9yeS5ibG9ja3NbbmV4dF0gPSBbXTsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCW1lbW9yeS5ibG9ja3NbbmV4dF0ucHVzaCgwKTsKCQkJfQoJCX0KCgkJbWVtb3J5LmNoYW5nZWRbbmV4dF0gPSBmYWxzZTsKCgkJcmV0dXJuIG5leHQ7Cgl9OwoKCXRoaXMuX2ZyZWUgPSBmdW5jdGlvbihibG9jaykgewoJCWRlbGV0ZSBtZW1vcnkuYmxvY2tzW2Jsb2NrXTsKCQlkZWxldGUgbWVtb3J5LmNoYW5nZWRbYmxvY2tdOwoJfTsKCgl0aGlzLl9wZWVrID0gZnVuY3Rpb24oYmxvY2ssIGluZGV4KSB7CgkJdmFyIG1lbW9yeUJsb2NrID0gbWVtb3J5LmJsb2Nrc1tibG9ja107CgkJaWYgKHR5cGVvZihtZW1vcnlCbG9jaykgPT09ICJzdHJpbmciKSB7CgkJCXJldHVybiBtZW1vcnlCbG9jay5jaGFyQ29kZUF0KGluZGV4KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBtZW1vcnlCbG9ja1tpbmRleF07CgkJfQoJfTsKCgl0aGlzLl9wb2tlID0gZnVuY3Rpb24oYmxvY2ssIGluZGV4LCB2YWx1ZSkgewoJCXZhciBtZW1vcnlCbG9jayA9IG1lbW9yeS5ibG9ja3NbYmxvY2tdOwoJCWlmICh0eXBlb2YobWVtb3J5QmxvY2spID09PSAic3RyaW5nIikgewoJCQltZW1vcnkuYmxvY2tzW2Jsb2NrXSA9IG1lbW9yeUJsb2NrLnN1YnN0cmluZygwLCBpbmRleCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlKSArIG1lbW9yeUJsb2NrLnN1YnN0cmluZyhpbmRleCArIDEpOwoJCX0KCQllbHNlIHsKCQkJdmFyIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpOwoJCQlpZiAoIWlzTmFOKHZhbHVlKSkgewoJCQkJbWVtb3J5QmxvY2tbaW5kZXhdID0gdmFsdWU7CgkJCX0KCQl9CgkJbWVtb3J5LmNoYW5nZWRbYmxvY2tdID0gdHJ1ZTsKCX07CgoJdGhpcy5fcmVhZCA9IGZ1bmN0aW9uKGJsb2NrKSB7CgkJdmFyIG1lbW9yeUJsb2NrID0gbWVtb3J5LmJsb2Nrc1tibG9ja107CgkJaWYgKHR5cGVvZihtZW1vcnlCbG9jaykgPT09ICJzdHJpbmciKSB7CgkJCXJldHVybiBtZW1vcnlCbG9jazsKCQl9CgkJZWxzZSB7CgkJCXZhciBzdHIgPSAiIjsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBtZW1vcnlCbG9jay5sZW5ndGg7IGkrKykgewoJCQkJc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobWVtb3J5QmxvY2tbaV0pOwoJCQl9CgkJCXJldHVybiBzdHI7CgkJfQoJfTsKCgl0aGlzLl93cml0ZSA9IGZ1bmN0aW9uKGJsb2NrLCBzdHIpIHsKCQl2YXIgbWVtb3J5QmxvY2sgPSBtZW1vcnkuYmxvY2tzW2Jsb2NrXTsKCQlpZiAodHlwZW9mKG1lbW9yeUJsb2NrKSA9PT0gInN0cmluZyIpIHsKCQkJbWVtb3J5LmJsb2Nrc1tibG9ja10gPSBzdHI7CgkJfQoJCWVsc2UgewoJCQltZW1vcnkuYmxvY2tzW2Jsb2NrXSA9IFtdOwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewoJCQkJbWVtb3J5LmJsb2Nrc1tibG9ja11baV0gPSBzdHIuY2hhckNvZGVBdChpKTsKCQkJfQoJCX0KCQltZW1vcnkuY2hhbmdlZFtibG9ja10gPSB0cnVlOwoJfTsKCgl0aGlzLl9kdW1wID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIG1lbW9yeS5ibG9ja3M7Cgl9OwoKCS8vIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGhhY2tpbmcgYXJvdW5kIHdpdGggbWFwIGxheWVycwoJdmFyIHRpbGVNYXBMYXllcnMgPSBbXTsKCXRoaXMuX2dldFRpbGVNYXBMYXllcnMgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGlsZU1hcExheWVyczsKCX07Cgl0aGlzLl9hZGRUaWxlTWFwTGF5ZXIgPSBmdW5jdGlvbigpIHsKCQl2YXIgbGF5ZXIgPSBzZWxmLl9hbGxvY2F0ZSh7CgkJCXN0YXJ0OiAodGlsZVBvb2xTdGFydCArIHRpbGVQb29sU2l6ZSksCgkJCXNpemU6IChzZWxmLk1BUF9TSVpFICogc2VsZi5NQVBfU0laRSkKCQl9KTsKCgkJdGlsZU1hcExheWVycy5wdXNoKGxheWVyKTsKCgkJcmV0dXJuIGxheWVyOwoJfTsKCgkvKiA9PSBDT05TVEFOVFMgPT0gKi8KCS8vIG1lbW9yeSBibG9ja3MgKHRoZXNlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYmVsb3cpCgl0aGlzLlZJREVPOwoJdGhpcy5URVhUQk9YOwoJdGhpcy5NQVAxOwoJdGhpcy5NQVAyOwoJdGhpcy5TT1VORDE7Cgl0aGlzLlNPVU5EMjsKCgkvLyBncmFwaGljcyBtb2RlcwoJdGhpcy5HRlhfVklERU8gPSAwOwoJdGhpcy5HRlhfTUFQID0gMTsKCgkvLyB0ZXh0IG1vZGVzCgl0aGlzLlRYVF9ISVJFWiA9IDA7IC8vIDJ4IHJlc29sdXRpb24KCXRoaXMuVFhUX0xPUkVaID0gMTsgLy8gMXggcmVzb2x1dGlvbgoKCS8vIHNpemUKCXRoaXMuVElMRV9TSVpFID0gdGlsZXNpemU7Cgl0aGlzLk1BUF9TSVpFID0gbWFwc2l6ZTsKCXRoaXMuVklERU9fU0laRSA9IHdpZHRoOwoJLy8gdG9kbyA6IHNob3VsZCB0ZXh0IHNjYWxlIGhhdmUgYSBjb25zdGFudD8KCgkvLyBidXR0b24gY29kZXMKCXRoaXMuQlROX1VQID0gMDsKCXRoaXMuQlROX0RPV04gPSAxOwoJdGhpcy5CVE5fTEVGVCA9IDI7Cgl0aGlzLkJUTl9SSUdIVCA9IDM7Cgl0aGlzLkJUTl9PSyA9IDQ7Cgl0aGlzLkJUTl9NRU5VID0gNTsKCgkvLyBwdWxzZSB3YXZlcwoJdGhpcy5QVUxTRV8xXzggPSAwOwoJdGhpcy5QVUxTRV8xXzQgPSAxOwoJdGhpcy5QVUxTRV8xXzIgPSAyOwoKCS8qID09IElPID09ICovCgl0aGlzLmxvZyA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKCQliaXRzeUxvZyhtZXNzYWdlLCBuYW1lKTsKCX07CgoJdGhpcy5idXR0b24gPSBmdW5jdGlvbihjb2RlKSB7CgkJcmV0dXJuIHNlbGYuX3BlZWsoYnV0dG9uQmxvY2ssIGNvZGUpID4gMDsKCX07CgoJdGhpcy5nZXRHYW1lRGF0YSA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzZWxmLl9yZWFkKGdhbWVEYXRhQmxvY2spOwoJfTsKCgl0aGlzLmdldEZvbnREYXRhID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHNlbGYuX3JlYWQoZm9udERhdGFCbG9jayk7Cgl9OwoKCS8qID09IEdSQVBISUNTID09ICovCgl0aGlzLmdyYXBoaWNzTW9kZSA9IGZ1bmN0aW9uKG1vZGUpIHsKCQkvLyB0b2RvIDogc3RvcmUgdGhlIG1vZGUgZmxhZyBpbmRpY2VzIHNvbWV3aGVyZT8KCQlpZiAobW9kZSAhPSB1bmRlZmluZWQpIHsKCQkJc2VsZi5fcG9rZShtb2RlQmxvY2ssIDAsIG1vZGUpOwoJCX0KCgkJcmV0dXJuIHNlbGYuX3BlZWsobW9kZUJsb2NrLCAwKTsKCX07CgoJdGhpcy50ZXh0TW9kZSA9IGZ1bmN0aW9uKG1vZGUpIHsKCQkvLyB0b2RvIDogdGVzdCB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgbW9kZSBpcyBzdXBwb3J0ZWQhCgkJaWYgKG1vZGUgIT0gdW5kZWZpbmVkKSB7CgkJCXNlbGYuX3Bva2UobW9kZUJsb2NrLCAxLCBtb2RlKTsKCQl9CgoJCXJldHVybiBzZWxmLl9wZWVrKG1vZGVCbG9jaywgMSk7Cgl9OwoKCXRoaXMuY29sb3IgPSBmdW5jdGlvbihjb2xvciwgciwgZywgYikgewoJCXNlbGYuX3Bva2UocGFsZXR0ZUJsb2NrLCAoY29sb3IgKiAzKSArIDAsIHIpOwoJCXNlbGYuX3Bva2UocGFsZXR0ZUJsb2NrLCAoY29sb3IgKiAzKSArIDEsIGcpOwoJCXNlbGYuX3Bva2UocGFsZXR0ZUJsb2NrLCAoY29sb3IgKiAzKSArIDIsIGIpOwoKCQkvLyBtYXJrIGFsbCBncmFwaGljcyBhcyBjaGFuZ2VkCgkJbWVtb3J5LmNoYW5nZWRbc2VsZi5WSURFT10gPSB0cnVlOwoJCW1lbW9yeS5jaGFuZ2VkW3NlbGYuVEVYVEJPWF0gPSB0cnVlOwoJCW1lbW9yeS5jaGFuZ2VkW3NlbGYuTUFQMV0gPSB0cnVlOwoJCW1lbW9yeS5jaGFuZ2VkW3NlbGYuTUFQMl0gPSB0cnVlOwoKCQlpZiAodGlsZVBvb2xTdGFydCAhPSBudWxsKSB7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGlsZVBvb2xTaXplOyBpKyspIHsKCQkJCWlmIChtZW1vcnkuYmxvY2tzW3RpbGVQb29sU3RhcnQgKyBpXSAhPSB1bmRlZmluZWQpIHsKCQkJCQltZW1vcnkuY2hhbmdlZFt0aWxlUG9vbFN0YXJ0ICsgaV0gPSB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJfTsKCgl0aGlzLnRpbGUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2VsZi5fYWxsb2NhdGUoewoJCQlzdGFydDogdGlsZVBvb2xTdGFydCwKCQkJbWF4OiB0aWxlUG9vbFNpemUsCgkJCXNpemU6IChzZWxmLlRJTEVfU0laRSAqIHNlbGYuVElMRV9TSVpFKQoJCX0pOwoJfTsKCgl0aGlzLmRlbGV0ZSA9IGZ1bmN0aW9uKHRpbGUpIHsKCQlpZiAoZ3JhcGhpY3MuaGFzSW1hZ2UodGlsZSkpIHsKCQkJZ3JhcGhpY3MuZGVsZXRlSW1hZ2UodGlsZSk7CgkJfQoKCQlzZWxmLl9mcmVlKHRpbGUpOwoJfTsKCgl0aGlzLmRlbGV0ZUFsbFRpbGVzID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRpbGVQb29sU3RhcnQgIT0gbnVsbCkgewoJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRpbGVQb29sU2l6ZTsgaSsrKSB7CgkJCQl2YXIgdGlsZSA9IHRpbGVQb29sU3RhcnQgKyBpOwoJCQkJdGhpcy5kZWxldGUodGlsZSk7CgkJCX0KCQl9Cgl9OwoKCXRoaXMuZmlsbCA9IGZ1bmN0aW9uKGJsb2NrLCB2YWx1ZSkgewoJCXZhciBsZW4gPSBtZW1vcnkuYmxvY2tzW2Jsb2NrXS5sZW5ndGg7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewoJCQlzZWxmLl9wb2tlKGJsb2NrLCBpLCB2YWx1ZSk7CgkJfQoKCQl2YXIgaXNJbWFnZSA9IChibG9jayA9PT0gc2VsZi5WSURFTykgfHwKCQkJKGJsb2NrID09PSBzZWxmLlRFWFRCT1gpIHx8CgkJCShibG9jayA+PSB0aWxlUG9vbFN0YXJ0ICYmIGJsb2NrIDwgKHRpbGVQb29sU3RhcnQgKyB0aWxlUG9vbFNpemUpKTsKCgkJLy8gb3B0aW1pemUgcmVuZGVyaW5nIGJ5IG5vdGlmeWluZyB0aGUgZ3JhcGhpY3Mgc3lzdGVtIHdoYXQgdGhlIGZpbGwgY29sb3IgaXMgZm9yIHRoaXMgaW1hZ2UKCQlpZiAoaXNJbWFnZSkgewoJCQlncmFwaGljcy5zZXRJbWFnZUZpbGwoYmxvY2ssIHZhbHVlKTsKCQl9Cgl9OwoKCXRoaXMuc2V0ID0gZnVuY3Rpb24oYmxvY2ssIGluZGV4LCB2YWx1ZSkgewoJCXNlbGYuX3Bva2UoYmxvY2ssIGluZGV4LCB2YWx1ZSk7Cgl9OwoKCXRoaXMudGV4dGJveCA9IGZ1bmN0aW9uKHZpc2libGUsIHgsIHksIHcsIGgpIHsKCQlpZiAodmlzaWJsZSAhPSB1bmRlZmluZWQpIHsKCQkJc2VsZi5fcG9rZSh0ZXh0Ym94QXR0cmlidXRlQmxvY2ssIDAsICh2aXNpYmxlID09PSB0cnVlKSA/IDEgOiAwKTsKCQl9CgkJCgkJaWYgKHggIT0gdW5kZWZpbmVkKSB7CgkJCXNlbGYuX3Bva2UodGV4dGJveEF0dHJpYnV0ZUJsb2NrLCAxLCB4KTsKCQl9CgkJCgkJaWYgKHkgIT0gdW5kZWZpbmVkKSB7CgkJCXNlbGYuX3Bva2UodGV4dGJveEF0dHJpYnV0ZUJsb2NrLCAyLCB5KTsKCQl9CgoJCXZhciBwcmV2V2lkdGggPSBzZWxmLl9wZWVrKHRleHRib3hBdHRyaWJ1dGVCbG9jaywgMyk7CgkJdmFyIHByZXZIZWlnaHQgPSBzZWxmLl9wZWVrKHRleHRib3hBdHRyaWJ1dGVCbG9jaywgNCk7CgoJCWlmICh3ICE9IHVuZGVmaW5lZCkgewoJCQlzZWxmLl9wb2tlKHRleHRib3hBdHRyaWJ1dGVCbG9jaywgMywgdyk7CgkJfQoJCQoJCWlmIChoICE9IHVuZGVmaW5lZCkgewoJCQlzZWxmLl9wb2tlKHRleHRib3hBdHRyaWJ1dGVCbG9jaywgNCwgaCk7CgkJfQoKCQlpZiAodyAhPSB1bmRlZmluZWQgJiYgaCAhPSB1bmRlZmluZWQgJiYgKHByZXZXaWR0aCAhPSB3IHx8IHByZXZIZWlnaHQgIT0gaCkpIHsKCQkJLy8gcmUtYWxsb2NhdGUgdGhlIHRleHRib3ggYmxvY2sgKHNob3VsZCBJIGhhdmUgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoaXM/KQoJCQltZW1vcnkuYmxvY2tzW3NlbGYuVEVYVEJPWF0gPSBbXTsKCQkJZm9yICh2YXIgaSA9IDA7IGkgPCAodyAqIGgpOyBpKyspIHsKCQkJCW1lbW9yeS5ibG9ja3Nbc2VsZi5URVhUQk9YXS5wdXNoKDApOwoJCQl9CgkJCW1lbW9yeS5jaGFuZ2VkW3NlbGYuVEVYVEJPWF0gPSB0cnVlOwoJCX0KCX07CgoJLyogPT0gU09VTkQgPT0gKi8KCS8vIGR1cmF0aW9uIGlzIGluIG1pbGxpc2Vjb25kcyAobXMpCgl0aGlzLnNvdW5kID0gZnVuY3Rpb24oY2hhbm5lbCwgZHVyYXRpb24sIGZyZXF1ZW5jeSwgdm9sdW1lLCBwdWxzZSkgewoJCXNlbGYuX3Bva2UoY2hhbm5lbCwgc291bmREdXJhdGlvbkluZGV4LCBkdXJhdGlvbik7CgkJc2VsZi5fcG9rZShjaGFubmVsLCBzb3VuZEZyZXF1ZW5jeUluZGV4LCBmcmVxdWVuY3kpOwoJCXNlbGYuX3Bva2UoY2hhbm5lbCwgc291bmRWb2x1bWVJbmRleCwgdm9sdW1lKTsKCQlzZWxmLl9wb2tlKGNoYW5uZWwsIHNvdW5kUHVsc2VJbmRleCwgcHVsc2UpOwoJfTsKCgkvLyBmcmVxdWVuY3kgaXMgaW4gZGVjaWhlcnR6IChkSHopCgl0aGlzLmZyZXF1ZW5jeSA9IGZ1bmN0aW9uKGNoYW5uZWwsIGZyZXF1ZW5jeSkgewoJCXNlbGYuX3Bva2UoY2hhbm5lbCwgc291bmRGcmVxdWVuY3lJbmRleCwgZnJlcXVlbmN5KTsKCX07CgoJLy8gdm9sdW1lOiBtaW4gPSAwLCBtYXggPSAxNQoJdGhpcy52b2x1bWUgPSBmdW5jdGlvbihjaGFubmVsLCB2b2x1bWUpIHsKCQlzZWxmLl9wb2tlKGNoYW5uZWwsIHNvdW5kVm9sdW1lSW5kZXgsIHZvbHVtZSk7Cgl9OwoKCS8qID09IEVWRU5UUyA9PSAqLwoJdGhpcy5sb29wID0gZnVuY3Rpb24oZm4pIHsKCQlvbkxvb3BGdW5jdGlvbiA9IGZuOwoJfTsKCgkvKiA9PSBJTlRFUk5BTCA9PSAqLwoJLy8gaW5pdGlhbGl6ZSBtZW1vcnkgYmxvY2tzCgl2YXIgZ2FtZURhdGFCbG9jayA9IHRoaXMuX2FsbG9jYXRlKHsgc3RyOiAiIiB9KTsKCXZhciBmb250RGF0YUJsb2NrID0gdGhpcy5fYWxsb2NhdGUoeyBzdHI6ICIiIH0pOwoJdGhpcy5WSURFTyA9IHRoaXMuX2FsbG9jYXRlKHsgc2l6ZTogc2VsZi5WSURFT19TSVpFICogc2VsZi5WSURFT19TSVpFIH0pOwoJdGhpcy5URVhUQk9YID0gdGhpcy5fYWxsb2NhdGUoKTsKCXRoaXMuTUFQMSA9IHRoaXMuX2FsbG9jYXRlKHsgc2l6ZTogc2VsZi5NQVBfU0laRSAqIHNlbGYuTUFQX1NJWkUgfSk7Cgl0aWxlTWFwTGF5ZXJzLnB1c2godGhpcy5NQVAxKTsKCXRoaXMuTUFQMiA9IHRoaXMuX2FsbG9jYXRlKHsgc2l6ZTogc2VsZi5NQVBfU0laRSAqIHNlbGYuTUFQX1NJWkUgfSk7Cgl0aWxlTWFwTGF5ZXJzLnB1c2godGhpcy5NQVAyKTsKCXZhciBwYWxldHRlQmxvY2sgPSB0aGlzLl9hbGxvY2F0ZSh7IHNpemU6IGluaXRpYWxQYWxldHRlU2l6ZSAqIDMgfSk7Cgl2YXIgYnV0dG9uQmxvY2sgPSB0aGlzLl9hbGxvY2F0ZSh7IHNpemU6IDggfSk7Cgl0aGlzLlNPVU5EMSA9IHRoaXMuX2FsbG9jYXRlKHsgc2l6ZTogNCB9KTsKCXRoaXMuU09VTkQyID0gdGhpcy5fYWxsb2NhdGUoeyBzaXplOiA0IH0pOwoJdmFyIG1vZGVCbG9jayA9IHRoaXMuX2FsbG9jYXRlKHsgc2l6ZTogOCB9KTsKCXZhciB0ZXh0Ym94QXR0cmlidXRlQmxvY2sgPSB0aGlzLl9hbGxvY2F0ZSh7IHNpemU6IDggfSk7CgoJdGlsZVBvb2xTdGFydCA9ICh0ZXh0Ym94QXR0cmlidXRlQmxvY2sgKyAxKTsKCgkvLyBhY2Nlc3MgZm9yIGRlYnVnZ2luZwoJdGhpcy5fZ2FtZURhdGFCbG9jayA9IGdhbWVEYXRhQmxvY2s7Cgl0aGlzLl9mb250RGF0YUJsb2NrID0gZm9udERhdGFCbG9jazsKCXRoaXMuX2J1dHRvbkJsb2NrID0gYnV0dG9uQmxvY2s7CgoJLy8gZXZlbnRzCgl2YXIgb25Mb29wRnVuY3Rpb24gPSBudWxsOwp9Cgp2YXIgbWFpblByb2Nlc3MgPSBhZGRQcm9jZXNzKCk7CnZhciBiaXRzeSA9IG1haW5Qcm9jZXNzLnN5c3RlbTsKPC9zY3JpcHQ+Cgo8IS0tIGVuZ2luZSAtLT4KPHNjcmlwdD4KLyogQklUU1kgVkVSU0lPTiAqLwovLyBpcyB0aGlzIHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyB0byBsaXZlPwp2YXIgdmVyc2lvbiA9IHsKCW1ham9yOiA4LCAvLyBtYWpvciBjaGFuZ2VzCgltaW5vcjogOSwgLy8gc21hbGxlciBjaGFuZ2VzCglkZXZCdWlsZFBoYXNlOiAiUkVMRUFTRSIsCn07CmZ1bmN0aW9uIGdldEVuZ2luZVZlcnNpb24oKSB7CglyZXR1cm4gdmVyc2lvbi5tYWpvciArICIuIiArIHZlcnNpb24ubWlub3I7Cn0KCi8qIFRFWFQgQ09OU1RBTlRTICovCnZhciB0aXRsZURpYWxvZ0lkID0gInRpdGxlIjsKCi8vIHRvZG8gOiB3aGVyZSBzaG91bGQgdGhpcyBiZSBzdG9yZWQ/CnZhciB0aWxlQ29sb3JTdGFydEluZGV4ID0gMTY7Cgp2YXIgVGV4dERpcmVjdGlvbiA9IHsKCUxlZnRUb1JpZ2h0IDogIkxUUiIsCglSaWdodFRvTGVmdCA6ICJSVEwiCn07Cgp2YXIgZGVmYXVsdEZvbnROYW1lID0gImFzY2lpX3NtYWxsIjsKCi8qIFRVTkUgQ09OU1RBTlRTICovCnZhciBiYXJMZW5ndGggPSAxNjsgLy8gc2l4dGVlbnRoIG5vdGVzCnZhciBtaW5UdW5lTGVuZ3RoID0gMTsKdmFyIG1heFR1bmVMZW5ndGggPSAxNjsKCi8vIGNocm9tYXRpYyBub3Rlcwp2YXIgTm90ZSA9IHsKCU5PTkUgCQk6IC0xLAoJQyAJCQk6IDAsCS8vIEMKCUNfU0hBUlAgCTogMSwJLy8gQyBzaGFycCAvIEQgZmxhdAoJRCAJCQk6IDIsCS8vIEQKCURfU0hBUlAgCTogMywJLy8gRCBzaGFycCAvIEUgZmxhdAoJRSAJCQk6IDQsCS8vIEUKCUYgCQkJOiA1LAkvLyBGCglGX1NIQVJQIAk6IDYsCS8vIEYgc2hhcnAgLyBHIGZsYXQKCUcgCQkJOiA3LAkvLyBHCglHX1NIQVJQIAk6IDgsCS8vIEcgc2hhcnAgLyBBIGZsYXQKCUEgCQkJOiA5LAkvLyBBCglBX1NIQVJQIAk6IDEwLAkvLyBBIHNoYXJwIC8gQiBmbGF0CglCIAkJCTogMTEsCS8vIEIKCUNPVU5UIAkJOiAxMgp9OwoKLy8gc29sZmEgbm90ZXMKdmFyIFNvbGZhID0gewoJTk9ORSAJOiAtMSwKCUQgCQk6IDAsCS8vIERvCglSIAkJOiAxLAkvLyBSZQoJTSAJCTogMiwJLy8gTWkKCUYgCQk6IDMsCS8vIEZhCglTIAkJOiA0LAkvLyBTb2wKCUwgCQk6IDUsCS8vIExhCglUIAkJOiA2LAkvLyBUaQoJQ09VTlQgCTogNwp9OwoKdmFyIE9jdGF2ZSA9IHsKCU5PTkU6IC0xLAoJMjogMCwKCTM6IDEsCgk0OiAyLCAvLyBvY3RhdmUgNDogbWlkZGxlIEMgb2N0YXZlCgk1OiAzLAoJQ09VTlQ6IDQKfTsKCnZhciBUZW1wbyA9IHsKCVNMVzogMCwgLy8gc2xvdwoJTUVEOiAxLCAvLyBtZWRpdW0KCUZTVDogMiwgLy8gZmFzdAoJWEZTVDogMyAvLyBleHRyYSBmYXN0IChha2EgdHVyYm8pCn07Cgp2YXIgU3F1YXJlV2F2ZSA9IHsKCVA4OiAwLCAvLyBwdWxzZSAxIC8gOAoJUDQ6IDEsIC8vIHB1bHNlIDEgLyA0CglQMjogMiwgLy8gcHVsc2UgMSAvIDIKCUNPVU5UOiAzCn07Cgp2YXIgQXJwZWdnaW9QYXR0ZXJuID0gewoJT0ZGOiAwLAoJVVA6IDEsIC8vIGFzY2VuZGluZyB0cmlhZCBjaG9yZAoJRFdOOiAyLCAvLyBkZXNjZW5kaW5nIHRyaWFkIGNob3JkCglJTlQ1OiAzLCAvLyA1IHN0ZXAgaW50ZXJ2YWwKCUlOVDg6IDQgLy8gOCBzZXRwIGludGVydmFsCn07CgpmdW5jdGlvbiBjcmVhdGVXb3JsZERhdGEoKSB7CglyZXR1cm4gewoJCXJvb20gOiB7fSwKCQl0aWxlIDoge30sCgkJc3ByaXRlIDoge30sCgkJaXRlbSA6IHt9LAoJCWRpYWxvZyA6IHt9LAoJCWVuZCA6IHt9LCAvLyBwcmUtNy4wIGVuZGluZyBkYXRhIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoJCXBhbGV0dGUgOiB7IC8vIHN0YXJ0IG9mZiB3aXRoIGEgZGVmYXVsdCBwYWxldHRlCgkJCSJkZWZhdWx0IiA6IHsKCQkJCW5hbWUgOiAiZGVmYXVsdCIsCgkJCQljb2xvcnMgOiBbWzAsMCwwXSxbMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NV1dCgkJCX0KCQl9LAoJCXZhcmlhYmxlIDoge30sCgkJdHVuZSA6IHt9LAoJCWJsaXAgOiB7fSwKCQl2ZXJzaW9uTnVtYmVyRnJvbUNvbW1lbnQgOiAtMSwgLy8gLTEgaW5kaWNhdGVzIG5vIHZlcnNpb24gaW5mb3JtYXRpb24gZm91bmQKCQlmb250TmFtZSA6IGRlZmF1bHRGb250TmFtZSwKCQl0ZXh0RGlyZWN0aW9uIDogVGV4dERpcmVjdGlvbi5MZWZ0VG9SaWdodCwKCQlmbGFncyA6IGNyZWF0ZURlZmF1bHRGbGFncygpLAoJCW5hbWVzIDoge30sCgkJLy8gc291cmNlIGRhdGEgZm9yIGFsbCBkcmF3aW5ncyAodG9kbzogYmV0dGVyIG5hbWU/KQoJCWRyYXdpbmdzIDoge30sCgl9Owp9CgovLyBjcmVhdGVzIGEgZHJhd2luZyBkYXRhIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzIGZvciB0aGUgdHlwZQpmdW5jdGlvbiBjcmVhdGVEcmF3aW5nRGF0YSh0eXBlLCBpZCkgewoJLy8gdGhlIGF2YXRhcidzIGRyYXdpbmcgaWQgc3RpbGwgdXNlcyB0aGUgc3ByaXRlIHByZWZpeCAoZm9yIGJhY2sgY29tcGF0KQoJdmFyIGRyd0lkID0gKHR5cGUgPT09ICJBVkEiID8gIlNQUiIgOiB0eXBlKSArICJfIiArIGlkOwoKCXZhciBkcmF3aW5nRGF0YSA9IHsKCQl0eXBlIDogdHlwZSwKCQlpZCA6IGlkLAoJCW5hbWUgOiBudWxsLAoJCWRydyA6IGRyd0lkLAoJCWNvbCA6ICh0eXBlID09PSAiVElMIikgPyAxIDogMiwgLy8gZm9yZWdyb3VuZCBjb2xvcgoJCWJnYyA6IDAsIC8vIGJhY2tncm91bmQgY29sb3IKCQlhbmltYXRpb24gOiB7CgkJCWlzQW5pbWF0ZWQgOiBmYWxzZSwKCQkJZnJhbWVJbmRleCA6IDAsCgkJCWZyYW1lQ291bnQgOiAxLAoJCX0sCgl9OwoKCS8vIGFkZCB0eXBlIHNwZWNpZmljIHByb3BlcnRpZXMKCWlmICh0eXBlID09PSAiVElMIikgewoJCS8vIGRlZmF1bHQgbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgaXQgY2FuIHZhcnkgZnJvbSByb29tIHRvIHJvb20gKG9yaWdpbmFsIHZlcnNpb24pCgkJZHJhd2luZ0RhdGEuaXNXYWxsID0gbnVsbDsKCX0KCglpZiAodHlwZSA9PT0gIkFWQSIgfHwgdHlwZSA9PT0gIlNQUiIpIHsKCQkvLyBkZWZhdWx0IHNwcml0ZSBsb2NhdGlvbiBpcyAib2Zmc3RhZ2UiCgkJZHJhd2luZ0RhdGEucm9vbSA9IG51bGw7CgkJZHJhd2luZ0RhdGEueCA9IC0xOwoJCWRyYXdpbmdEYXRhLnkgPSAtMTsKCQlkcmF3aW5nRGF0YS5pbnZlbnRvcnkgPSB7fTsKCX0KCglpZiAodHlwZSA9PT0gIkFWQSIgfHwgdHlwZSA9PT0gIlNQUiIgfHwgdHlwZSA9PT0gIklUTSIpIHsKCQlkcmF3aW5nRGF0YS5kbGcgPSBudWxsOwoJCWRyYXdpbmdEYXRhLmJsaXAgPSBudWxsOwoJfQoKCXJldHVybiBkcmF3aW5nRGF0YTsKfQoKZnVuY3Rpb24gY3JlYXRlVHVuZURhdGEoaWQpIHsKCXZhciB0dW5lRGF0YSA9IHsKCQlpZCA6IGlkLAoJCW5hbWUgOiBudWxsLAoJCW1lbG9keSA6IFtdLAoJCWhhcm1vbnkgOiBbXSwKCQlrZXk6IG51bGwsIC8vIGEgbnVsbCBrZXkgaW5kaWNhdGVzIGEgY2hyb21hdGljIHNjYWxlIChhbGwgbm90ZXMgZW5hYmxlZCkKCQl0ZW1wbzogVGVtcG8uTUVELAoJCWluc3RydW1lbnRBIDogU3F1YXJlV2F2ZS5QMiwKCQlpbnN0cnVtZW50QiA6IFNxdWFyZVdhdmUuUDIsCgkJYXJwZWdnaW9QYXR0ZXJuIDogQXJwZWdnaW9QYXR0ZXJuLk9GRiwKCX07CglyZXR1cm4gdHVuZURhdGE7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVR1bmVCYXJEYXRhKCkgewoJdmFyIGJhciA9IFtdOwoJZm9yICh2YXIgaSA9IDA7IGkgPCBiYXJMZW5ndGg7IGkrKykgewoJCWJhci5wdXNoKHsgYmVhdHM6IDAsIG5vdGU6IE5vdGUuQywgb2N0YXZlOiBPY3RhdmVbNF0gfSk7Cgl9CglyZXR1cm4gYmFyOwp9CgpmdW5jdGlvbiBjcmVhdGVUdW5lS2V5RGF0YSgpIHsKCXZhciBrZXkgPSB7CgkJbm90ZXM6IFtdLCAvLyBtYXBwaW5nIG9mIHRoZSBzb2xmYSBzY2FsZSBkZWdyZWVzIHRvIGNocm9tYXRpYyBub3RlcwoJCXNjYWxlOiBbXSAgLy8gbGlzdCBvZiBzb2xmYSBub3RlcyB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGlzIGtleQoJfTsKCgkvLyBpbml0aWFsaXplIG5vdGVzCglmb3IgKHZhciBpID0gMDsgaSA8IFNvbGZhLkNPVU5UOyBpKyspIHsKCQlrZXkubm90ZXMucHVzaChOb3RlLk5PTkUpOwoJfQoKCXJldHVybiBrZXk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUJsaXBEYXRhKGlkKSB7Cgl2YXIgYmxpcERhdGEgPSB7CgkJaWQ6IGlkLAoJCW5hbWU6IG51bGwsCgkJcGl0Y2hBOiB7IGJlYXRzOiAwLCBub3RlOiBOb3RlLkMsIG9jdGF2ZTogT2N0YXZlWzRdIH0sCgkJcGl0Y2hCOiB7IGJlYXRzOiAwLCBub3RlOiBOb3RlLkMsIG9jdGF2ZTogT2N0YXZlWzRdIH0sCgkJcGl0Y2hDOiB7IGJlYXRzOiAwLCBub3RlOiBOb3RlLkMsIG9jdGF2ZTogT2N0YXZlWzRdIH0sCgkJZW52ZWxvcGU6IHsKCQkJYXR0YWNrOiAwLCAvLyBhdHRhY2sgdGltZSBpbiBtcwoJCQlkZWNheTogMCwgLy8gZGVjYXkgdGltZSBpbiBtcwoJCQlzdXN0YWluOiAwLCAvLyBzdXN0YWluIHZvbHVtZQoJCQlsZW5ndGg6IDAsIC8vIHN1c3RhaW4gdGltZSBpbiBtcwoJCQlyZWxlYXNlOiAwIC8vIHJlbGVhc2UgdGltZSBpbiBtcwoJCX0sCgkJYmVhdCA6IHsKCQkJdGltZTogMCwgLy8gdGltZSBpbiBtcyBiZXR3ZWVuIHBpdGNoIGNoYW5nZXMKCQkJZGVsYXk6IDAgLy8gdGltZSBpbiBtcyAqYmVmb3JlKiBmaXJzdCBwaXRjaCBjaGFuZ2UKCQl9LAoJCWluc3RydW1lbnQ6IFNxdWFyZVdhdmUuUDIsCgkJZG9SZXBlYXQ6IGZhbHNlCgkJLy8gVE9ETyA6IGNvbnNpZGVyIGZvciBmdXR1cmUgdXBkYXRlCgkJLy8gZG9TbGlkZTogZmFsc2UsCgl9OwoKCXJldHVybiBibGlwRGF0YTsKfQoKZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEZsYWdzKCkgewoJcmV0dXJuIHsKCQkvLyB2ZXJzaW9uCgkJVkVSX01BSjogLTEsIC8vIG1ham9yIHZlcnNpb24gbnVtYmVyICgtMSA9IG5vIHZlcnNpb24gaW5mb3JtYXRpb24gZm91bmQpCgkJVkVSX01JTjogLTEsIC8vIG1pbm9yIHZlcnNpb24gbnVtYmVyICgtMSA9IG5vIHZlcnNpb24gaW5mb3JtYXRpb24gZm91bmQpCgkJLy8gY29tcGF0aWJpbGl0eQoJCVJPT01fRk9STUFUOiAwLCAvLyAwID0gbm9uLWNvbW1hIHNlcGFyYXRlZCAob3JpZ2luYWwpLCAxID0gY29tbWEgc2VwYXJhdGVkIChkZWZhdWx0KQoJCURMR19DT01QQVQ6IDAsIC8vIDAgPSBkZWZhdWx0IGRpYWxvZyBiZWhhdmlvciwgMSA9IHByZS03LjAgZGlhbG9nIGJlaGF2aW9yCgkJLy8gY29uZmlnCgkJVFhUX01PREU6IDAgLy8gMCA9IEhJUkVaICgyeCAtIGRlZmF1bHQpLCAxID0gTE9SRVogKDF4KQoJfTsKfQoKZnVuY3Rpb24gY3JlYXRlRGlhbG9nRGF0YShpZCkgewoJcmV0dXJuIHsKCQlzcmMgOiAiIiwKCQluYW1lIDogbnVsbCwKCQlpZCA6IGlkLAoJfTsKfQoKZnVuY3Rpb24gcGFyc2VXb3JsZChmaWxlKSB7CgliaXRzeS5sb2coImNyZWF0ZSB3b3JsZCBkYXRhIik7CgoJdmFyIHdvcmxkID0gY3JlYXRlV29ybGREYXRhKCk7CgoJYml0c3kubG9nKCJpbml0IHBhcnNlIHN0YXRlIik7CgoJdmFyIHBhcnNlU3RhdGUgPSB7CgkJbGluZXMgOiBmaWxlLnNwbGl0KCJcbiIpLAoJCWluZGV4IDogMCwKCQlzcHJpdGVTdGFydExvY2F0aW9ucyA6IHt9Cgl9OwoKCWJpdHN5LmxvZygic3RhcnQgcmVhZGluZyBsaW5lcyIpOwoKCXdoaWxlIChwYXJzZVN0YXRlLmluZGV4IDwgcGFyc2VTdGF0ZS5saW5lcy5sZW5ndGgpIHsKCQl2YXIgaSA9IHBhcnNlU3RhdGUuaW5kZXg7CgkJdmFyIGxpbmVzID0gcGFyc2VTdGF0ZS5saW5lczsKCQl2YXIgY3VyTGluZSA9IGxpbmVzW2ldOwoKCQkvLyBiaXRzeS5sb2coIkxOICIgKyBpICsgIiB4eCAiICsgY3VyTGluZSk7CgoJCWlmIChpID09IDApIHsKCQkJaSA9IHBhcnNlVGl0bGUocGFyc2VTdGF0ZSwgd29ybGQpOwoJCX0KCQllbHNlIGlmIChjdXJMaW5lLmxlbmd0aCA8PSAwIHx8IGN1ckxpbmUuY2hhckF0KDApID09PSAiIyIpIHsKCQkJLy8gY29sbGVjdCB2ZXJzaW9uIG51bWJlciBmcm9tIGEgY29tbWVudCAoaGFja3kgYnV0IHJlcXVpcmVkIGZvciBwcmUtOC4wIGNvbXBhdGliaWxpdHkpCgkJCWlmIChjdXJMaW5lLmluZGV4T2YoIiMgQklUU1kgVkVSU0lPTiAiKSAhPSAtMSkgewoJCQkJd29ybGQudmVyc2lvbk51bWJlckZyb21Db21tZW50ID0gcGFyc2VGbG9hdChjdXJMaW5lLnJlcGxhY2UoIiMgQklUU1kgVkVSU0lPTiAiLCAiIikpOwoJCQl9CgoJCQkvL3NraXAgYmxhbmsgbGluZXMgJiBjb21tZW50cwoJCQlpKys7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUoY3VyTGluZSkgPT09ICJQQUwiKSB7CgkJCWkgPSBwYXJzZVBhbGV0dGUocGFyc2VTdGF0ZSwgd29ybGQpOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGN1ckxpbmUpID09PSAiUk9PTSIgfHwgZ2V0VHlwZShjdXJMaW5lKSA9PT0gIlNFVCIpIHsgLy8gU0VUIGZvciBiYWNrIGNvbXBhdAoJCQlpID0gcGFyc2VSb29tKHBhcnNlU3RhdGUsIHdvcmxkKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShjdXJMaW5lKSA9PT0gIlRJTCIpIHsKCQkJaSA9IHBhcnNlVGlsZShwYXJzZVN0YXRlLCB3b3JsZCk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUoY3VyTGluZSkgPT09ICJTUFIiKSB7CgkJCWkgPSBwYXJzZVNwcml0ZShwYXJzZVN0YXRlLCB3b3JsZCk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUoY3VyTGluZSkgPT09ICJJVE0iKSB7CgkJCWkgPSBwYXJzZUl0ZW0ocGFyc2VTdGF0ZSwgd29ybGQpOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGN1ckxpbmUpID09PSAiRExHIikgewoJCQlpID0gcGFyc2VEaWFsb2cocGFyc2VTdGF0ZSwgd29ybGQpOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGN1ckxpbmUpID09PSAiRU5EIikgewoJCQkvLyBwYXJzZSBlbmRpbmdzIGZvciBiYWNrIGNvbXBhdAoJCQlpID0gcGFyc2VFbmRpbmcocGFyc2VTdGF0ZSwgd29ybGQpOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGN1ckxpbmUpID09PSAiVkFSIikgewoJCQlpID0gcGFyc2VWYXJpYWJsZShwYXJzZVN0YXRlLCB3b3JsZCk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUoY3VyTGluZSkgPT09ICJERUZBVUxUX0ZPTlQiKSB7CgkJCWkgPSBwYXJzZUZvbnROYW1lKHBhcnNlU3RhdGUsIHdvcmxkKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShjdXJMaW5lKSA9PT0gIlRFWFRfRElSRUNUSU9OIikgewoJCQlpID0gcGFyc2VUZXh0RGlyZWN0aW9uKHBhcnNlU3RhdGUsIHdvcmxkKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShjdXJMaW5lKSA9PT0gIkZPTlQiKSB7CgkJCWkgPSBwYXJzZUZvbnREYXRhKHBhcnNlU3RhdGUsIHdvcmxkKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShjdXJMaW5lKSA9PT0gIlRVTkUiKSB7CgkJCWkgPSBwYXJzZVR1bmUocGFyc2VTdGF0ZSwgd29ybGQpOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGN1ckxpbmUpID09PSAiQkxJUCIpIHsKCQkJaSA9IHBhcnNlQmxpcChwYXJzZVN0YXRlLCB3b3JsZCk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUoY3VyTGluZSkgPT09ICIhIikgewoJCQlpID0gcGFyc2VGbGFnKHBhcnNlU3RhdGUsIHdvcmxkKTsKCQl9CgkJZWxzZSB7CgkJCWkrKzsKCQl9CgoJCXBhcnNlU3RhdGUuaW5kZXggPSBpOwoJfQoKCXdvcmxkLm5hbWVzID0gY3JlYXRlTmFtZU1hcHNGb3JXb3JsZCh3b3JsZCk7CgoJcGxhY2VTcHJpdGVzKHBhcnNlU3RhdGUsIHdvcmxkKTsKCglpZiAoKHdvcmxkLmZsYWdzLlZFUl9NQUogPD0gLTEgfHwgd29ybGQuZmxhZ3MuVkVSX01JTiA8PSAtMSkgJiYgd29ybGQudmVyc2lvbk51bWJlckZyb21Db21tZW50ID4gLTEpIHsKCQl2YXIgdmVyc2lvbk51bWJlclN0ciA9ICIiICsgd29ybGQudmVyc2lvbk51bWJlckZyb21Db21tZW50OwoJCXZlcnNpb25OdW1iZXJTdHIgPSB2ZXJzaW9uTnVtYmVyU3RyLnNwbGl0KCIuIik7CgkJd29ybGQuZmxhZ3MuVkVSX01BSiA9IHBhcnNlRmxvYXQodmVyc2lvbk51bWJlclN0clswXSk7CgkJd29ybGQuZmxhZ3MuVkVSX01JTiA9IHBhcnNlRmxvYXQodmVyc2lvbk51bWJlclN0clsxXSk7Cgl9CgoJLy8gc3RhcnRpbmcgaW4gdmVyc2lvbiB2Ny4wLCB0aGVyZSB3ZXJlIHR3byBtYWpvciBjaGFuZ2VzIHRvIGRpYWxvZyBiZWhhdmlvcjoKCS8vIDEpIHNwcml0ZSBkaWFsb2cgd2FzIG5vIGxvbmdlciBpbXBsaWNpdGx5IGxpbmtlZCBieSB0aGUgc3ByaXRlIGFuZCBkaWFsb2cgSURzIG1hdGNoaW5nCgkvLyAgICAoc2VlIHRoaXMgY29tbWl0OiA1ZTFhZGIyOWZhYWQ0ZTUwNjAzYzY4OWQyZGFjMTQzMDc0MTE3YjRlKQoJLy8gMikgZW5kaW5nIGRpYWxvZ3Mgbm8gbG9uZ2VyIGhhZCB0aGVpciBvd24gd29ybGQgZGF0YSB0eXBlICgiRU5EIikKCS8vIGZvciB0aGUgdjcueCB2ZXJzaW9ucyBJIHRyaWVkIHRvIGF1dG9tYXRpY2FsbHkgY29udmVydCBvbGQgZGlhbG9nIHRvIHRoZSBuZXcgZm9ybWF0LAoJLy8gaG93ZXZlciwgdGhhdCBwcm9jZXNzIGNhbiBiZSB1bnJlbGlhYmxlIGFuZCBsZWFkIHRvIHdlaXJkIGJ1Z3MuCgkvLyB3aXRoIHY4LjAgYW5kIGFib3ZlIEkgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byBjb252ZXJ0IG9sZCBmaWxlcywgYW5kIGluc3RlYWQgd2lsbCB1c2UKCS8vIGEgZmxhZyB0byBpbmRpY2F0ZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIHRoZSBiYWNrd2FyZHMgY29tcGF0aWJsZSBiZWhhdmlvciAtCgkvLyB0aGlzIGlzIG1vcmUgcmVsaWFibGUgJiBjb25maWd1cmFibGUgKGF0IHRoZSBjb3N0IG9mIG1ha2luZyBwcmUtNy4wIGdhbWVzIGEgYml0IGhhcmRlciB0byBlZGl0KQoJaWYgKHdvcmxkLmZsYWdzLlZFUl9NQUogPCA3KSB7CgkJd29ybGQuZmxhZ3MuRExHX0NPTVBBVCA9IDE7Cgl9CgoJcmV0dXJuIHdvcmxkOwp9CgpmdW5jdGlvbiBwYXJzZVRpdGxlKHBhcnNlU3RhdGUsIHdvcmxkKSB7Cgl2YXIgaSA9IHBhcnNlU3RhdGUuaW5kZXg7Cgl2YXIgbGluZXMgPSBwYXJzZVN0YXRlLmxpbmVzOwoKCXZhciByZXN1bHRzOwoJaWYgKHNjcmlwdFV0aWxzKSB7CgkJcmVzdWx0cyA9IHNjcmlwdFV0aWxzLlJlYWREaWFsb2dTY3JpcHQobGluZXMsaSk7Cgl9CgllbHNlIHsKCQlyZXN1bHRzID0geyBzY3JpcHQ6IGxpbmVzW2ldLCBpbmRleDogKGkgKyAxKSB9OwoJfQoKCXdvcmxkLmRpYWxvZ1t0aXRsZURpYWxvZ0lkXSA9IGNyZWF0ZURpYWxvZ0RhdGEodGl0bGVEaWFsb2dJZCk7Cgl3b3JsZC5kaWFsb2dbdGl0bGVEaWFsb2dJZF0uc3JjID0gcmVzdWx0cy5zY3JpcHQ7CgoJaSA9IHJlc3VsdHMuaW5kZXg7CglpKys7CgoJcmV0dXJuIGk7Cn0KCmZ1bmN0aW9uIHBhcnNlUGFsZXR0ZShwYXJzZVN0YXRlLCB3b3JsZCkgewoJdmFyIGkgPSBwYXJzZVN0YXRlLmluZGV4OwoJdmFyIGxpbmVzID0gcGFyc2VTdGF0ZS5saW5lczsKCgl2YXIgaWQgPSBnZXRJZChsaW5lc1tpXSk7CglpKys7Cgl2YXIgY29sb3JzID0gW107Cgl2YXIgbmFtZSA9IG51bGw7Cgl3aGlsZSAoaSA8IGxpbmVzLmxlbmd0aCAmJiBsaW5lc1tpXS5sZW5ndGggPiAwKSB7IC8vbG9vayBmb3IgZW1wdHkgbGluZQoJCXZhciBhcmdzID0gbGluZXNbaV0uc3BsaXQoIiAiKTsKCQlpZiAoYXJnc1swXSA9PT0gIk5BTUUiKSB7CgkJCW5hbWUgPSBsaW5lc1tpXS5zcGxpdCgvXHMoLispLylbMV07CgkJfQoJCWVsc2UgewoJCQl2YXIgY29sID0gW107CgkJCWxpbmVzW2ldLnNwbGl0KCIsIikuZm9yRWFjaChmdW5jdGlvbihpKSB7CgkJCQljb2wucHVzaChwYXJzZUludChpKSk7CgkJCX0pOwoJCQljb2xvcnMucHVzaChjb2wpOwoJCX0KCQlpKys7Cgl9Cgl3b3JsZC5wYWxldHRlW2lkXSA9IHsKCQlpZCA6IGlkLAoJCW5hbWUgOiBuYW1lLAoJCWNvbG9ycyA6IGNvbG9ycwoJfTsKCXJldHVybiBpOwp9CgpmdW5jdGlvbiBjcmVhdGVSb29tRGF0YShpZCkgewoJcmV0dXJuIHsKCQlpZDogaWQsCgkJbmFtZTogbnVsbCwKCQl0aWxlbWFwOiBbXSwKCQl3YWxsczogW10sCgkJZXhpdHM6IFtdLAoJCWVuZGluZ3M6IFtdLAoJCWl0ZW1zOiBbXSwKCQlwYWw6IG51bGwsCgkJYXZhOiBudWxsLAoJCXR1bmU6ICIwIgoJfTsKfQoKZnVuY3Rpb24gY3JlYXRlRXhpdERhdGEoeCwgeSwgZGVzdFJvb20sIGRlc3RYLCBkZXN0WSwgdHJhbnNpdGlvbiwgZGxnKSB7CglyZXR1cm4gewoJCXg6IHgsCgkJeTogeSwKCQlkZXN0OiB7CgkJCXJvb206IGRlc3RSb29tLAoJCQl4OiBkZXN0WCwKCQkJeTogZGVzdFkKCQl9LAoJCXRyYW5zaXRpb25fZWZmZWN0OiB0cmFuc2l0aW9uLAoJCWRsZzogZGxnLAoJfTsKfQoKZnVuY3Rpb24gY3JlYXRlRW5kaW5nRGF0YShpZCwgeCwgeSkgewoJcmV0dXJuIHsKCQlpZDogaWQsCgkJeDogeCwKCQl5OiB5Cgl9Owp9CgpmdW5jdGlvbiBwYXJzZVJvb20ocGFyc2VTdGF0ZSwgd29ybGQpIHsKCXZhciBpID0gcGFyc2VTdGF0ZS5pbmRleDsKCXZhciBsaW5lcyA9IHBhcnNlU3RhdGUubGluZXM7Cgl2YXIgaWQgPSBnZXRJZChsaW5lc1tpXSk7CgoJdmFyIHJvb21EYXRhID0gY3JlYXRlUm9vbURhdGEoaWQpOwoKCWkrKzsKCgkvLyBjcmVhdGUgdGlsZSBtYXAKCWlmICh3b3JsZC5mbGFncy5ST09NX0ZPUk1BVCA9PT0gMCkgewoJCS8vIG9sZCB3YXk6IG5vIGNvbW1hcywgc2luZ2xlIGNoYXIgdGlsZSBpZHMKCQl2YXIgZW5kID0gaSArIGJpdHN5Lk1BUF9TSVpFOwoJCXZhciB5ID0gMDsKCQlmb3IgKDsgaSA8IGVuZDsgaSsrKSB7CgkJCXJvb21EYXRhLnRpbGVtYXAucHVzaChbXSk7CgkJCWZvciAoeCA9IDA7IHggPCBiaXRzeS5NQVBfU0laRTsgeCsrKSB7CgkJCQlyb29tRGF0YS50aWxlbWFwW3ldLnB1c2gobGluZXNbaV0uY2hhckF0KHgpKTsKCQkJfQoJCQl5Kys7CgkJfQoJfQoJZWxzZSBpZiAod29ybGQuZmxhZ3MuUk9PTV9GT1JNQVQgPT09IDEpIHsKCQkvLyBuZXcgd2F5OiBjb21tYSBzZXBhcmF0ZWQsIG11bHRpcGxlIGNoYXIgdGlsZSBpZHMKCQl2YXIgZW5kID0gaSArIGJpdHN5Lk1BUF9TSVpFOwoJCXZhciB5ID0gMDsKCQlmb3IgKDsgaSA8IGVuZDsgaSsrKSB7CgkJCXJvb21EYXRhLnRpbGVtYXAucHVzaChbXSk7CgkJCXZhciBsaW5lU2VwID0gbGluZXNbaV0uc3BsaXQoIiwiKTsKCQkJZm9yICh4ID0gMDsgeCA8IGJpdHN5Lk1BUF9TSVpFOyB4KyspIHsKCQkJCXJvb21EYXRhLnRpbGVtYXBbeV0ucHVzaChsaW5lU2VwW3hdKTsKCQkJfQoJCQl5Kys7CgkJfQoJfQoKCXdoaWxlIChpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldLmxlbmd0aCA+IDApIHsgLy9sb29rIGZvciBlbXB0eSBsaW5lCgkJLy8gYml0c3kubG9nKGdldFR5cGUobGluZXNbaV0pKTsKCQlpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJTUFIiKSB7CgkJCS8qIE5PVEUgU1BSSVRFIFNUQVJUIExPQ0FUSU9OUyAqLwoJCQl2YXIgc3BySWQgPSBnZXRJZChsaW5lc1tpXSk7CgkJCWlmIChzcHJJZC5pbmRleE9mKCIsIikgPT0gLTEgJiYgbGluZXNbaV0uc3BsaXQoIiAiKS5sZW5ndGggPj0gMykgeyAvL3NlY29uZCBjb25kaXRpb25hbCBjaGVja3MgZm9yIGNvb3JkcwoJCQkJLyogUExBQ0UgQSBTSU5HTEUgU1BSSVRFICovCgkJCQl2YXIgc3ByQ29vcmQgPSBsaW5lc1tpXS5zcGxpdCgiICIpWzJdLnNwbGl0KCIsIik7CgkJCQlwYXJzZVN0YXRlLnNwcml0ZVN0YXJ0TG9jYXRpb25zW3NwcklkXSA9IHsKCQkJCQlyb29tIDogaWQsCgkJCQkJeCA6IHBhcnNlSW50KHNwckNvb3JkWzBdKSwKCQkJCQl5IDogcGFyc2VJbnQoc3ByQ29vcmRbMV0pCgkJCQl9OwoJCQl9CgkJCWVsc2UgaWYgKCB3b3JsZC5mbGFncy5ST09NX0ZPUk1BVCA9PSAwICkgeyAvLyBUT0RPOiByaWdodCBub3cgdGhpcyBzaG9ydGN1dCBvbmx5IHdvcmtzIHcvIHRoZSBvbGQgY29tbWEgc2VwYXJhdGUgZm9ybWF0CgkJCQkvKiBQTEFDRSBNVUxUSVBMRSBTUFJJVEVTKi8gCgkJCQkvL0RvZXMgZmluZCBhbmQgcmVwbGFjZSBpbiB0aGUgdGlsZW1hcCAobWF5IGJlIGhhY2t5LCBidXQgaXRzIGNvbnZlbmllbnQpCgkJCQl2YXIgc3ByTGlzdCA9IHNwcklkLnNwbGl0KCIsIik7CgkJCQlmb3IgKHJvdyBpbiByb29tRGF0YS50aWxlbWFwKSB7CgkJCQkJZm9yIChzIGluIHNwckxpc3QpIHsKCQkJCQkJdmFyIGNvbCA9IHJvb21EYXRhLnRpbGVtYXBbcm93XS5pbmRleE9mKCBzcHJMaXN0W3NdICk7CgkJCQkJCS8vaWYgdGhlIHNwcml0ZSBpcyBpbiB0aGlzIHJvdywgcmVwbGFjZSBpdCB3aXRoIHRoZSAibnVsbCB0aWxlIiBhbmQgc2V0IGl0cyBzdGFydGluZyBwb3NpdGlvbgoJCQkJCQlpZiAoY29sICE9IC0xKSB7CgkJCQkJCQlyb29tRGF0YS50aWxlbWFwW3Jvd11bY29sXSA9ICIwIjsKCQkJCQkJCXBhcnNlU3RhdGUuc3ByaXRlU3RhcnRMb2NhdGlvbnNbIHNwckxpc3Rbc10gXSA9IHsKCQkJCQkJCQlyb29tIDogaWQsCgkJCQkJCQkJeCA6IHBhcnNlSW50KGNvbCksCgkJCQkJCQkJeSA6IHBhcnNlSW50KHJvdykKCQkJCQkJCX07CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJJVE0iKSB7CgkJCXZhciBpdG1JZCA9IGdldElkKGxpbmVzW2ldKTsKCQkJdmFyIGl0bUNvb3JkID0gbGluZXNbaV0uc3BsaXQoIiAiKVsyXS5zcGxpdCgiLCIpOwoJCQl2YXIgaXRtID0gewoJCQkJaWQ6IGl0bUlkLAoJCQkJeCA6IHBhcnNlSW50KGl0bUNvb3JkWzBdKSwKCQkJCXkgOiBwYXJzZUludChpdG1Db29yZFsxXSkKCQkJfTsKCQkJcm9vbURhdGEuaXRlbXMucHVzaCggaXRtICk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiV0FMIikgewoJCQkvKiBERUZJTkUgQ09MTElTSU9OUyAoV0FMTFMpICovCgkJCXJvb21EYXRhLndhbGxzID0gZ2V0SWQobGluZXNbaV0pLnNwbGl0KCIsIik7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiRVhUIikgewoJCQkvKiBBREQgRVhJVCAqLwoJCQl2YXIgZXhpdEFyZ3MgPSBsaW5lc1tpXS5zcGxpdCgiICIpOwoJCQkvL2FyZyBmb3JtYXQ6IEVYVCAxMCw1IE0gMywyIFtBVkE6NyBMQ0s6YSw5XSBbQVZBIDcgTENLIGEgOV0KCQkJdmFyIGV4aXRDb29yZHMgPSBleGl0QXJnc1sxXS5zcGxpdCgiLCIpOwoJCQl2YXIgZGVzdE5hbWUgPSBleGl0QXJnc1syXTsKCQkJdmFyIGRlc3RDb29yZHMgPSBleGl0QXJnc1szXS5zcGxpdCgiLCIpOwoJCQl2YXIgZXh0ID0gY3JlYXRlRXhpdERhdGEoCgkJCQkvKiB4IAkJCSovIHBhcnNlSW50KGV4aXRDb29yZHNbMF0pLAoJCQkJLyogeSAJCQkqLyBwYXJzZUludChleGl0Q29vcmRzWzFdKSwKCQkJCS8qIGRlc3RSb29tIAkqLyBkZXN0TmFtZSwKCQkJCS8qIGRlc3RYIAkJKi8gcGFyc2VJbnQoZGVzdENvb3Jkc1swXSksCgkJCQkvKiBkZXN0WSAJCSovIHBhcnNlSW50KGRlc3RDb29yZHNbMV0pLAoJCQkJLyogdHJhbnNpdGlvbiAJKi8gbnVsbCwKCQkJCS8qIGRsZyAJCQkqLyBudWxsKTsKCgkJCS8vIG9wdGlvbmFsIGFyZ3VtZW50cwoJCQl2YXIgZXhpdEFyZ0luZGV4ID0gNDsKCQkJd2hpbGUgKGV4aXRBcmdJbmRleCA8IGV4aXRBcmdzLmxlbmd0aCkgewoJCQkJaWYgKGV4aXRBcmdzW2V4aXRBcmdJbmRleF0gPT0gIkZYIikgewoJCQkJCWV4dC50cmFuc2l0aW9uX2VmZmVjdCA9IGV4aXRBcmdzW2V4aXRBcmdJbmRleCsxXTsKCQkJCQlleGl0QXJnSW5kZXggKz0gMjsKCQkJCX0KCQkJCWVsc2UgaWYgKGV4aXRBcmdzW2V4aXRBcmdJbmRleF0gPT0gIkRMRyIpIHsKCQkJCQlleHQuZGxnID0gZXhpdEFyZ3NbZXhpdEFyZ0luZGV4KzFdOwoJCQkJCWV4aXRBcmdJbmRleCArPSAyOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJZXhpdEFyZ0luZGV4ICs9IDE7CgkJCQl9CgkJCX0KCgkJCXJvb21EYXRhLmV4aXRzLnB1c2goZXh0KTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJFTkQiKSB7CgkJCS8qIEFERCBFTkRJTkcgKi8KCQkJdmFyIGVuZElkID0gZ2V0SWQobGluZXNbaV0pOwoKCQkJdmFyIGVuZENvb3JkcyA9IGdldENvb3JkKGxpbmVzW2ldLCAyKTsKCQkJdmFyIGVuZCA9IGNyZWF0ZUVuZGluZ0RhdGEoCgkJCQkvKiBpZCAqLyBlbmRJZCwKCQkJCS8qIHggKi8gcGFyc2VJbnQoZW5kQ29vcmRzWzBdKSwKCQkJCS8qIHkgKi8gcGFyc2VJbnQoZW5kQ29vcmRzWzFdKSk7CgoJCQlyb29tRGF0YS5lbmRpbmdzLnB1c2goZW5kKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJQQUwiKSB7CgkJCS8qIENIT09TRSBQQUxFVFRFICh0aGF0J3Mgbm90IGRlZmF1bHQpICovCgkJCXJvb21EYXRhLnBhbCA9IGdldElkKGxpbmVzW2ldKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJBVkEiKSB7CgkJCS8vIGNoYW5nZSBhdmF0YXIgYXBwZWFyYW5jZSBwZXIgcm9vbQoJCQlyb29tRGF0YS5hdmEgPSBnZXRJZChsaW5lc1tpXSk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiVFVORSIpIHsKCQkJcm9vbURhdGEudHVuZSA9IGdldElkKGxpbmVzW2ldKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJOQU1FIikgewoJCQlyb29tRGF0YS5uYW1lID0gZ2V0TmFtZUFyZyhsaW5lc1tpXSk7CgkJfQoKCQlpKys7Cgl9CgoJd29ybGQucm9vbVtpZF0gPSByb29tRGF0YTsKCglyZXR1cm4gaTsKfQoKZnVuY3Rpb24gcGFyc2VUaWxlKHBhcnNlU3RhdGUsIHdvcmxkKSB7Cgl2YXIgaSA9IHBhcnNlU3RhdGUuaW5kZXg7Cgl2YXIgbGluZXMgPSBwYXJzZVN0YXRlLmxpbmVzOwoKCXZhciBpZCA9IGdldElkKGxpbmVzW2ldKTsKCXZhciB0aWxlRGF0YSA9IGNyZWF0ZURyYXdpbmdEYXRhKCJUSUwiLCBpZCk7CgoJaSsrOwoKCS8vIHJlYWQgJiBzdG9yZSB0aWxlIGltYWdlIHNvdXJjZQoJaSA9IHBhcnNlRHJhd2luZ0NvcmUobGluZXMsIGksIHRpbGVEYXRhLmRydywgd29ybGQpOwoKCS8vIHVwZGF0ZSBhbmltYXRpb24gaW5mbwoJdGlsZURhdGEuYW5pbWF0aW9uLmZyYW1lQ291bnQgPSBnZXREcmF3aW5nRnJhbWVDb3VudCh3b3JsZCwgdGlsZURhdGEuZHJ3KTsKCXRpbGVEYXRhLmFuaW1hdGlvbi5pc0FuaW1hdGVkID0gdGlsZURhdGEuYW5pbWF0aW9uLmZyYW1lQ291bnQgPiAxOwoKCS8vIHJlYWQgb3RoZXIgcHJvcGVydGllcwoJd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaV0ubGVuZ3RoID4gMCkgeyAvLyBsb29rIGZvciBlbXB0eSBsaW5lCgkJaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiQ09MIikgewoJCQl0aWxlRGF0YS5jb2wgPSBwYXJzZUludChnZXRJZChsaW5lc1tpXSkpOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIkJHQyIpIHsKCQkJdmFyIGJnY0lkID0gZ2V0SWQobGluZXNbaV0pOwoJCQlpZiAoYmdjSWQgPT09ICIqIikgewoJCQkJLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZAoJCQkJdGlsZURhdGEuYmdjID0gKC0xICogdGlsZUNvbG9yU3RhcnRJbmRleCk7CgkJCX0KCQkJZWxzZSB7CgkJCQl0aWxlRGF0YS5iZ2MgPSBwYXJzZUludChiZ2NJZCk7CgkJCX0KCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJOQU1FIikgewoJCQkvKiBOQU1FICovCgkJCXRpbGVEYXRhLm5hbWUgPSBnZXROYW1lQXJnKGxpbmVzW2ldKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJXQUwiKSB7CgkJCXZhciB3YWxsQXJnID0gZ2V0QXJnKGxpbmVzW2ldLCAxKTsKCQkJaWYgKHdhbGxBcmcgPT09ICJ0cnVlIikgewoJCQkJdGlsZURhdGEuaXNXYWxsID0gdHJ1ZTsKCQkJfQoJCQllbHNlIGlmICh3YWxsQXJnID09PSAiZmFsc2UiKSB7CgkJCQl0aWxlRGF0YS5pc1dhbGwgPSBmYWxzZTsKCQkJfQoJCX0KCgkJaSsrOwoJfQoKCS8vIHN0b3JlIHRpbGUgZGF0YQoJd29ybGQudGlsZVtpZF0gPSB0aWxlRGF0YTsKCglyZXR1cm4gaTsKfQoKZnVuY3Rpb24gcGFyc2VTcHJpdGUocGFyc2VTdGF0ZSwgd29ybGQpIHsKCXZhciBpID0gcGFyc2VTdGF0ZS5pbmRleDsKCXZhciBsaW5lcyA9IHBhcnNlU3RhdGUubGluZXM7CgoJdmFyIGlkID0gZ2V0SWQobGluZXNbaV0pOwoJdmFyIHR5cGUgPSAoaWQgPT09ICJBIikgPyAiQVZBIiA6ICJTUFIiOwoJdmFyIHNwcml0ZURhdGEgPSBjcmVhdGVEcmF3aW5nRGF0YSh0eXBlLCBpZCk7CgoJLy8gYml0c3kubG9nKHNwcml0ZURhdGEpOwoKCWkrKzsKCgkvLyByZWFkICYgc3RvcmUgc3ByaXRlIGltYWdlIHNvdXJjZQoJaSA9IHBhcnNlRHJhd2luZ0NvcmUobGluZXMsIGksIHNwcml0ZURhdGEuZHJ3LCB3b3JsZCk7CgoJLy8gdXBkYXRlIGFuaW1hdGlvbiBpbmZvCglzcHJpdGVEYXRhLmFuaW1hdGlvbi5mcmFtZUNvdW50ID0gZ2V0RHJhd2luZ0ZyYW1lQ291bnQod29ybGQsIHNwcml0ZURhdGEuZHJ3KTsKCXNwcml0ZURhdGEuYW5pbWF0aW9uLmlzQW5pbWF0ZWQgPSBzcHJpdGVEYXRhLmFuaW1hdGlvbi5mcmFtZUNvdW50ID4gMTsKCgkvLyByZWFkIG90aGVyIHByb3BlcnRpZXMKCXdoaWxlIChpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldLmxlbmd0aCA+IDApIHsgLy8gbG9vayBmb3IgZW1wdHkgbGluZQoJCWlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIkNPTCIpIHsKCQkJLyogQ09MT1IgT0ZGU0VUIElOREVYICovCgkJCXNwcml0ZURhdGEuY29sID0gcGFyc2VJbnQoZ2V0SWQobGluZXNbaV0pKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJCR0MiKSB7CgkJCS8qIEJBQ0tHUk9VTkQgQ09MT1IgKi8KCQkJdmFyIGJnY0lkID0gZ2V0SWQobGluZXNbaV0pOwoJCQlpZiAoYmdjSWQgPT09ICIqIikgewoJCQkJLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZAoJCQkJc3ByaXRlRGF0YS5iZ2MgPSAoLTEgKiB0aWxlQ29sb3JTdGFydEluZGV4KTsKCQkJfQoJCQllbHNlIHsKCQkJCXNwcml0ZURhdGEuYmdjID0gcGFyc2VJbnQoYmdjSWQpOwoJCQl9CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiUE9TIikgewoJCQkvKiBTVEFSVElORyBQT1NJVElPTiAqLwoJCQl2YXIgcG9zQXJncyA9IGxpbmVzW2ldLnNwbGl0KCIgIik7CgkJCXZhciByb29tSWQgPSBwb3NBcmdzWzFdOwoJCQl2YXIgY29vcmRBcmdzID0gcG9zQXJnc1syXS5zcGxpdCgiLCIpOwoJCQlwYXJzZVN0YXRlLnNwcml0ZVN0YXJ0TG9jYXRpb25zW2lkXSA9IHsKCQkJCXJvb20gOiByb29tSWQsCgkJCQl4IDogcGFyc2VJbnQoY29vcmRBcmdzWzBdKSwKCQkJCXkgOiBwYXJzZUludChjb29yZEFyZ3NbMV0pCgkJCX07CgkJfQoJCWVsc2UgaWYoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJETEciKSB7CgkJCXNwcml0ZURhdGEuZGxnID0gZ2V0SWQobGluZXNbaV0pOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIk5BTUUiKSB7CgkJCS8qIE5BTUUgKi8KCQkJc3ByaXRlRGF0YS5uYW1lID0gZ2V0TmFtZUFyZyhsaW5lc1tpXSk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiSVRNIikgewoJCQkvKiBJVEVNIFNUQVJUSU5HIElOVkVOVE9SWSAqLwoJCQl2YXIgaXRlbUlkID0gZ2V0SWQobGluZXNbaV0pOwoJCQl2YXIgaXRlbUNvdW50ID0gcGFyc2VGbG9hdChnZXRBcmcobGluZXNbaV0sIDIpKTsKCQkJc3ByaXRlRGF0YS5pbnZlbnRvcnlbaXRlbUlkXSA9IGl0ZW1Db3VudDsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT0gIkJMSVAiKSB7CgkJCXZhciBibGlwSWQgPSBnZXRJZChsaW5lc1tpXSk7CgkJCXNwcml0ZURhdGEuYmxpcCA9IGJsaXBJZDsKCQl9CgoJCWkrKzsKCX0KCgkvLyBzdG9yZSBzcHJpdGUgZGF0YQoJd29ybGQuc3ByaXRlW2lkXSA9IHNwcml0ZURhdGE7CgoJcmV0dXJuIGk7Cn0KCmZ1bmN0aW9uIHBhcnNlSXRlbShwYXJzZVN0YXRlLCB3b3JsZCkgewoJdmFyIGkgPSBwYXJzZVN0YXRlLmluZGV4OwoJdmFyIGxpbmVzID0gcGFyc2VTdGF0ZS5saW5lczsKCgl2YXIgaWQgPSBnZXRJZChsaW5lc1tpXSk7Cgl2YXIgaXRlbURhdGEgPSBjcmVhdGVEcmF3aW5nRGF0YSgiSVRNIiwgaWQpOwoKCWkrKzsKCgkvLyByZWFkICYgc3RvcmUgaXRlbSBpbWFnZSBzb3VyY2UKCWkgPSBwYXJzZURyYXdpbmdDb3JlKGxpbmVzLCBpLCBpdGVtRGF0YS5kcncsIHdvcmxkKTsKCgkvLyB1cGRhdGUgYW5pbWF0aW9uIGluZm8KCWl0ZW1EYXRhLmFuaW1hdGlvbi5mcmFtZUNvdW50ID0gZ2V0RHJhd2luZ0ZyYW1lQ291bnQod29ybGQsIGl0ZW1EYXRhLmRydyk7CglpdGVtRGF0YS5hbmltYXRpb24uaXNBbmltYXRlZCA9IGl0ZW1EYXRhLmFuaW1hdGlvbi5mcmFtZUNvdW50ID4gMTsKCgkvLyByZWFkIG90aGVyIHByb3BlcnRpZXMKCXdoaWxlIChpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldLmxlbmd0aCA+IDApIHsgLy8gbG9vayBmb3IgZW1wdHkgbGluZQoJCWlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIkNPTCIpIHsKCQkJLyogQ09MT1IgT0ZGU0VUIElOREVYICovCgkJCWl0ZW1EYXRhLmNvbCA9IHBhcnNlSW50KGdldEFyZyhsaW5lc1tpXSwgMSkpOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIkJHQyIpIHsKCQkJLyogQkFDS0dST1VORCBDT0xPUiAqLwoJCQl2YXIgYmdjSWQgPSBnZXRJZChsaW5lc1tpXSk7CgkJCWlmIChiZ2NJZCA9PT0gIioiKSB7CgkJCQkvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCgkJCQlpdGVtRGF0YS5iZ2MgPSAoLTEgKiB0aWxlQ29sb3JTdGFydEluZGV4KTsKCQkJfQoJCQllbHNlIHsKCQkJCWl0ZW1EYXRhLmJnYyA9IHBhcnNlSW50KGJnY0lkKTsKCQkJfQoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIkRMRyIpIHsKCQkJaXRlbURhdGEuZGxnID0gZ2V0SWQobGluZXNbaV0pOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIk5BTUUiKSB7CgkJCS8qIE5BTUUgKi8KCQkJaXRlbURhdGEubmFtZSA9IGdldE5hbWVBcmcobGluZXNbaV0pOwoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PSAiQkxJUCIpIHsKCQkJdmFyIGJsaXBJZCA9IGdldElkKGxpbmVzW2ldKTsKCQkJaXRlbURhdGEuYmxpcCA9IGJsaXBJZDsKCQl9CgoJCWkrKzsKCX0KCgkvLyBzdG9yZSBpdGVtIGRhdGEKCXdvcmxkLml0ZW1baWRdID0gaXRlbURhdGE7CgoJcmV0dXJuIGk7Cn0KCmZ1bmN0aW9uIHBhcnNlRHJhd2luZ0NvcmUobGluZXMsIGksIGRyd0lkLCB3b3JsZCkgewoJdmFyIGZyYW1lTGlzdCA9IFtdOyAvL2luaXQgbGlzdCBvZiBmcmFtZXMKCWZyYW1lTGlzdC5wdXNoKCBbXSApOyAvL2luaXQgZmlyc3QgZnJhbWUKCXZhciBmcmFtZUluZGV4ID0gMDsKCXZhciB5ID0gMDsKCXdoaWxlICh5IDwgYml0c3kuVElMRV9TSVpFKSB7CgkJdmFyIGxpbmUgPSBsaW5lc1tpICsgeV07CgkJdmFyIHJvdyA9IFtdOwoKCQlmb3IgKHggPSAwOyB4IDwgYml0c3kuVElMRV9TSVpFOyB4KyspIHsKCQkJcm93LnB1c2gocGFyc2VJbnQobGluZS5jaGFyQXQoeCkpKTsKCQl9CgoJCWZyYW1lTGlzdFtmcmFtZUluZGV4XS5wdXNoKHJvdyk7CgkJeSsrOwoKCQlpZiAoeSA9PT0gYml0c3kuVElMRV9TSVpFKSB7CgkJCWkgPSBpICsgeTsKCQkJaWYgKGxpbmVzW2ldICE9IHVuZGVmaW5lZCAmJiBsaW5lc1tpXS5jaGFyQXQoMCkgPT09ICI+IikgewoJCQkJLy8gc3RhcnQgbmV4dCBmcmFtZSEKCQkJCWZyYW1lTGlzdC5wdXNoKFtdKTsKCQkJCWZyYW1lSW5kZXgrKzsKCgkJCQkvL3N0YXJ0IHRoZSBjb3VudCBvdmVyIGFnYWluIGZvciB0aGUgbmV4dCBmcmFtZQoJCQkJaSsrOwoJCQkJeSA9IDA7CgkJCX0KCQl9Cgl9CgoJc3RvcmVEcmF3aW5nRGF0YSh3b3JsZCwgZHJ3SWQsIGZyYW1lTGlzdCk7CgoJcmV0dXJuIGk7Cn0KCmZ1bmN0aW9uIHBhcnNlRGlhbG9nKHBhcnNlU3RhdGUsIHdvcmxkKSB7Cgl2YXIgaSA9IHBhcnNlU3RhdGUuaW5kZXg7Cgl2YXIgbGluZXMgPSBwYXJzZVN0YXRlLmxpbmVzOwoKCS8vIGhhY2t5IGJ1dCBJIG5lZWQgdG8gc3RvcmUgdGhpcyBzbyBJIGNhbiBzZXQgdGhlIG5hbWUgYmVsb3cKCXZhciBpZCA9IGdldElkKGxpbmVzW2ldKTsKCglpID0gcGFyc2VTY3JpcHQobGluZXMsIGksIHdvcmxkLmRpYWxvZyk7CgoJaWYgKGkgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaV0ubGVuZ3RoID4gMCAmJiBnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIk5BTUUiKSB7CgkJd29ybGQuZGlhbG9nW2lkXS5uYW1lID0gZ2V0TmFtZUFyZyhsaW5lc1tpXSk7CgkJaSsrOwoJfQoKCXJldHVybiBpOwp9CgovLyBrZWVwaW5nIHRoaXMgYXJvdW5kIHRvIHBhcnNlIG9sZCBmaWxlcyB3aGVyZSBlbmRpbmdzIHdlcmUgc2VwYXJhdGUgZnJvbSBkaWFsb2dzCmZ1bmN0aW9uIHBhcnNlRW5kaW5nKHBhcnNlU3RhdGUsIHdvcmxkKSB7Cgl2YXIgaSA9IHBhcnNlU3RhdGUuaW5kZXg7Cgl2YXIgbGluZXMgPSBwYXJzZVN0YXRlLmxpbmVzOwoKCXJldHVybiBwYXJzZVNjcmlwdChsaW5lcywgaSwgd29ybGQuZW5kKTsKfQoKZnVuY3Rpb24gcGFyc2VTY3JpcHQobGluZXMsIGksIGRhdGEpIHsKCXZhciBpZCA9IGdldElkKGxpbmVzW2ldKTsKCWkrKzsKCgl2YXIgcmVzdWx0czsKCWlmIChzY3JpcHRVdGlscykgewoJCXJlc3VsdHMgPSBzY3JpcHRVdGlscy5SZWFkRGlhbG9nU2NyaXB0KGxpbmVzLGkpOwoJfQoJZWxzZSB7CgkJcmVzdWx0cyA9IHsgc2NyaXB0OiBsaW5lc1tpXSwgaW5kZXg6IChpICsgMSl9OwoJfQoKCWRhdGFbaWRdID0gY3JlYXRlRGlhbG9nRGF0YShpZCk7CglkYXRhW2lkXS5zcmMgPSByZXN1bHRzLnNjcmlwdDsKCglpID0gcmVzdWx0cy5pbmRleDsKCglyZXR1cm4gaTsKfQoKZnVuY3Rpb24gcGFyc2VWYXJpYWJsZShwYXJzZVN0YXRlLCB3b3JsZCkgewoJdmFyIGkgPSBwYXJzZVN0YXRlLmluZGV4OwoJdmFyIGxpbmVzID0gcGFyc2VTdGF0ZS5saW5lczsKCXZhciBpZCA9IGdldElkKGxpbmVzW2ldKTsKCWkrKzsKCXZhciB2YWx1ZSA9IGxpbmVzW2ldOwoJaSsrOwoJd29ybGQudmFyaWFibGVbaWRdID0gdmFsdWU7CglyZXR1cm4gaTsKfQoKZnVuY3Rpb24gcGFyc2VGb250TmFtZShwYXJzZVN0YXRlLCB3b3JsZCkgewoJdmFyIGkgPSBwYXJzZVN0YXRlLmluZGV4OwoJdmFyIGxpbmVzID0gcGFyc2VTdGF0ZS5saW5lczsKCXdvcmxkLmZvbnROYW1lID0gZ2V0QXJnKGxpbmVzW2ldLCAxKTsKCWkrKzsKCXJldHVybiBpOwp9CgpmdW5jdGlvbiBwYXJzZVRleHREaXJlY3Rpb24ocGFyc2VTdGF0ZSwgd29ybGQpIHsKCXZhciBpID0gcGFyc2VTdGF0ZS5pbmRleDsKCXZhciBsaW5lcyA9IHBhcnNlU3RhdGUubGluZXM7Cgl3b3JsZC50ZXh0RGlyZWN0aW9uID0gZ2V0QXJnKGxpbmVzW2ldLCAxKTsKCWkrKzsKCXJldHVybiBpOwp9CgpmdW5jdGlvbiBwYXJzZUZvbnREYXRhKHBhcnNlU3RhdGUsIHdvcmxkKSB7Cgl2YXIgaSA9IHBhcnNlU3RhdGUuaW5kZXg7Cgl2YXIgbGluZXMgPSBwYXJzZVN0YXRlLmxpbmVzOwoKCS8vIE5PVEUgOiB3ZSdyZSBub3QgZG9pbmcgdGhlIGFjdHVhbCBwYXJzaW5nIGhlcmUgLS0KCS8vIGp1c3QgZ3JhYmJpbmcgdGhlIGJsb2NrIG9mIHRleHQgdGhhdCByZXByZXNlbnRzIHRoZSBmb250CgkvLyBhbmQgZ2l2aW5nIGl0IHRvIHRoZSBmb250IG1hbmFnZXIgdG8gdXNlIGxhdGVyCgoJdmFyIGxvY2FsRm9udE5hbWUgPSBnZXRJZChsaW5lc1tpXSk7Cgl2YXIgbG9jYWxGb250RGF0YSA9IGxpbmVzW2ldOwoJaSsrOwoKCXdoaWxlIChpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldICE9ICIiKSB7CgkJbG9jYWxGb250RGF0YSArPSAiXG4iICsgbGluZXNbaV07CgkJaSsrOwoJfQoKCXZhciBsb2NhbEZvbnRGaWxlbmFtZSA9IGxvY2FsRm9udE5hbWUgKyBmb250TWFuYWdlci5HZXRFeHRlbnNpb24oKTsKCWZvbnRNYW5hZ2VyLkFkZFJlc291cmNlKCBsb2NhbEZvbnRGaWxlbmFtZSwgbG9jYWxGb250RGF0YSApOwoKCXJldHVybiBpOwp9CgpmdW5jdGlvbiBwYXJzZVR1bmUocGFyc2VTdGF0ZSwgd29ybGQpIHsKCXZhciBpID0gcGFyc2VTdGF0ZS5pbmRleDsKCXZhciBsaW5lcyA9IHBhcnNlU3RhdGUubGluZXM7CgoJdmFyIGlkID0gZ2V0SWQobGluZXNbaV0pOwoJaSsrOwoKCXZhciB0dW5lRGF0YSA9IGNyZWF0ZVR1bmVEYXRhKGlkKTsKCgl2YXIgYmFySW5kZXggPSAwOwoJd2hpbGUgKGJhckluZGV4IDwgbWF4VHVuZUxlbmd0aCkgewoJCS8vIE1FTE9EWQoJCXZhciBtZWxvZHlCYXIgPSBjcmVhdGVUdW5lQmFyRGF0YSgpOwoJCXZhciBtZWxvZHlOb3RlcyA9IGxpbmVzW2ldLnNwbGl0KCIsIik7CgkJZm9yICh2YXIgaiA9IDA7IGogPCBiYXJMZW5ndGg7IGorKykgewoJCQkvLyBkZWZhdWx0IHRvIGEgcmVzdAoJCQl2YXIgcGl0Y2ggPSB7IGJlYXRzOiAwLCBub3RlOiBOb3RlLkMsIG9jdGF2ZTogT2N0YXZlWzRdLCB9OwoKCQkJaWYgKGogPCBtZWxvZHlOb3Rlcy5sZW5ndGgpIHsKCQkJCXZhciBwaXRjaFNwbGl0ID0gbWVsb2R5Tm90ZXNbal0uc3BsaXQoIn4iKTsKCQkJCXZhciBwaXRjaFN0ciA9IHBpdGNoU3BsaXRbMF07CgkJCQlwaXRjaCA9IHBhcnNlUGl0Y2gobWVsb2R5Tm90ZXNbal0pOwoKCQkJCS8vIGxvb2sgZm9yIGVmZmVjdCBhZGRlZCB0byB0aGUgbm90ZQoJCQkJaWYgKHBpdGNoU3BsaXQubGVuZ3RoID4gMSkgewoJCQkJCXZhciBibGlwSWQgPSBwaXRjaFNwbGl0WzFdOwoJCQkJCXBpdGNoLmJsaXAgPSBibGlwSWQ7CgkJCQl9CgkJCX0KCgkJCW1lbG9keUJhcltqXSA9IHBpdGNoOwoJCX0KCQl0dW5lRGF0YS5tZWxvZHkucHVzaChtZWxvZHlCYXIpOwoJCWkrKzsKCgkJLy8gSEFSTU9OWQoJCXZhciBoYXJtb255QmFyID0gY3JlYXRlVHVuZUJhckRhdGEoKTsKCQl2YXIgaGFybW9ueU5vdGVzID0gbGluZXNbaV0uc3BsaXQoIiwiKTsKCQlmb3IgKHZhciBqID0gMDsgaiA8IGJhckxlbmd0aDsgaisrKSB7CgkJCS8vIGRlZmF1bHQgdG8gYSByZXN0CgkJCXZhciBwaXRjaCA9IHsgYmVhdHM6IDAsIG5vdGU6IE5vdGUuQywgb2N0YXZlOiBPY3RhdmVbNF0sIH07CgoJCQlpZiAoaiA8IGhhcm1vbnlOb3Rlcy5sZW5ndGgpIHsKCQkJCXZhciBwaXRjaFNwbGl0ID0gaGFybW9ueU5vdGVzW2pdLnNwbGl0KCJ+Iik7CgkJCQl2YXIgcGl0Y2hTdHIgPSBwaXRjaFNwbGl0WzBdOwoJCQkJcGl0Y2ggPSBwYXJzZVBpdGNoKGhhcm1vbnlOb3Rlc1tqXSk7CgoJCQkJLy8gbG9vayBmb3IgZWZmZWN0IGFkZGVkIHRvIHRoZSBub3RlCgkJCQlpZiAocGl0Y2hTcGxpdC5sZW5ndGggPiAxKSB7CgkJCQkJdmFyIGJsaXBJZCA9IHBpdGNoU3BsaXRbMV07CgkJCQkJcGl0Y2guYmxpcCA9IGJsaXBJZDsKCQkJCX0KCQkJfQoKCQkJaGFybW9ueUJhcltqXSA9IHBpdGNoOwoJCX0KCQl0dW5lRGF0YS5oYXJtb255LnB1c2goaGFybW9ueUJhcik7CgkJaSsrOwoKCQkvLyBjaGVjayBpZiB0aGVyZSdzIGFub3RoZXIgYmFyIGFmdGVyIHRoaXMgb25lCgkJaWYgKGxpbmVzW2ldID09PSAiPiIpIHsKCQkJLy8gdGhlcmUgaXMhIGluY3JlbWVudCB0aGUgaW5kZXgKCQkJYmFySW5kZXgrKzsKCQkJaSsrOwoJCX0KCQllbHNlIHsKCQkJLy8gd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0dW5lIQoJCQliYXJJbmRleCA9IG1heFR1bmVMZW5ndGg7CgkJfQoJfQoKCS8vIHBhcnNlIG90aGVyIHR1bmUgcHJvcGVydGllcwoJd2hpbGUgKGkgPCBsaW5lcy5sZW5ndGggJiYgbGluZXNbaV0ubGVuZ3RoID4gMCkgeyAvLyBsb29rIGZvciBlbXB0eSBsaW5lCgkJaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiS0VZIikgewoJCQl0dW5lRGF0YS5rZXkgPSBjcmVhdGVUdW5lS2V5RGF0YSgpOwoKCQkJdmFyIGtleU5vdGVzID0gZ2V0QXJnKGxpbmVzW2ldLCAxKTsKCQkJaWYgKGtleU5vdGVzKSB7CgkJCQlrZXlOb3RlcyA9IGtleU5vdGVzLnNwbGl0KCIsIik7CgkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGtleU5vdGVzLmxlbmd0aCAmJiBqIDwgdHVuZURhdGEua2V5Lm5vdGVzLmxlbmd0aDsgaisrKSB7CgkJCQkJdmFyIHBpdGNoID0gcGFyc2VQaXRjaChrZXlOb3Rlc1tqXSk7CgkJCQkJdHVuZURhdGEua2V5Lm5vdGVzW2pdID0gcGl0Y2gubm90ZTsKCQkJCX0KCQkJfQoKCQkJdmFyIGtleVNjYWxlID0gZ2V0QXJnKGxpbmVzW2ldLCAyKTsKCQkJaWYgKGtleVNjYWxlKSB7CgkJCQlrZXlTY2FsZSA9IGtleVNjYWxlLnNwbGl0KCIsIik7CgkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGtleVNjYWxlLmxlbmd0aDsgaisrKSB7CgkJCQkJdmFyIHBpdGNoID0gcGFyc2VQaXRjaChrZXlTY2FsZVtqXSk7CgkJCQkJaWYgKHBpdGNoLm5vdGUgPiBTb2xmYS5OT05FICYmIHBpdGNoLm5vdGUgPCBTb2xmYS5DT1VOVCkgewoJCQkJCQl0dW5lRGF0YS5rZXkuc2NhbGUucHVzaChwaXRjaC5ub3RlKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJUTVAiKSB7CgkJCXZhciB0ZW1wb0lkID0gZ2V0SWQobGluZXNbaV0pOwoJCQlpZiAoVGVtcG9bdGVtcG9JZF0gIT0gdW5kZWZpbmVkKSB7CgkJCQl0dW5lRGF0YS50ZW1wbyA9IFRlbXBvW3RlbXBvSWRdOwoJCQl9CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiU1FSIikgewoJCQkvLyBzcXVhcmUgd2F2ZSBpbnN0cnVtZW50IHNldHRpbmdzCgkJCXZhciBzcXVhcmVXYXZlSWRBID0gZ2V0QXJnKGxpbmVzW2ldLCAxKTsKCQkJaWYgKFNxdWFyZVdhdmVbc3F1YXJlV2F2ZUlkQV0gIT0gdW5kZWZpbmVkKSB7CgkJCQl0dW5lRGF0YS5pbnN0cnVtZW50QSA9IFNxdWFyZVdhdmVbc3F1YXJlV2F2ZUlkQV07CgkJCX0KCgkJCXZhciBzcXVhcmVXYXZlSWRCID0gZ2V0QXJnKGxpbmVzW2ldLCAyKTsKCQkJaWYgKFNxdWFyZVdhdmVbc3F1YXJlV2F2ZUlkQl0gIT0gdW5kZWZpbmVkKSB7CgkJCQl0dW5lRGF0YS5pbnN0cnVtZW50QiA9IFNxdWFyZVdhdmVbc3F1YXJlV2F2ZUlkQl07CgkJCX0KCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJBUlAiKSB7CgkJCXZhciBhcnAgPSBnZXRJZChsaW5lc1tpXSk7CgkJCWlmIChBcnBlZ2dpb1BhdHRlcm5bYXJwXSAhPSB1bmRlZmluZWQpIHsKCQkJCXR1bmVEYXRhLmFycGVnZ2lvUGF0dGVybiA9IEFycGVnZ2lvUGF0dGVyblthcnBdOwoJCQl9CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiTkFNRSIpIHsKCQkJdmFyIG5hbWUgPSBsaW5lc1tpXS5zcGxpdCgvXHMoLispLylbMV07CgkJCXR1bmVEYXRhLm5hbWUgPSBuYW1lOwoJCQkvLyB0b2RvIDogYWRkIHRvIG1hcD8KCQl9CgoJCWkrKzsKCX0KCgl3b3JsZC50dW5lW2lkXSA9IHR1bmVEYXRhOwoKCXJldHVybiBpOwp9CgpmdW5jdGlvbiBwYXJzZUJsaXAocGFyc2VTdGF0ZSwgd29ybGQpIHsKCXZhciBpID0gcGFyc2VTdGF0ZS5pbmRleDsKCXZhciBsaW5lcyA9IHBhcnNlU3RhdGUubGluZXM7CgoJdmFyIGlkID0gZ2V0SWQobGluZXNbaV0pOwoJaSsrOwoKCXZhciBibGlwRGF0YSA9IGNyZWF0ZUJsaXBEYXRhKGlkKTsKCgkvLyBibGlwIHBpdGNoZXMKCXZhciBub3RlcyA9IGxpbmVzW2ldLnNwbGl0KCIsIik7CglpZiAobm90ZXMubGVuZ3RoID49IDEpIHsKCQlibGlwRGF0YS5waXRjaEEgPSBwYXJzZVBpdGNoKG5vdGVzWzBdKTsKCX0KCWlmIChub3Rlcy5sZW5ndGggPj0gMikgewoJCWJsaXBEYXRhLnBpdGNoQiA9IHBhcnNlUGl0Y2gobm90ZXNbMV0pOwoJfQoJaWYgKG5vdGVzLmxlbmd0aCA+PSAzKSB7CgkJYmxpcERhdGEucGl0Y2hDID0gcGFyc2VQaXRjaChub3Rlc1syXSk7Cgl9CglpKys7CgoJLy8gYmxpcCBwYXJhbWV0ZXJzCgl3aGlsZSAoaSA8IGxpbmVzLmxlbmd0aCAmJiBsaW5lc1tpXS5sZW5ndGggPiAwKSB7IC8vIGxvb2sgZm9yIGVtcHR5IGxpbmUKCQlpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJFTlYiKSB7CgkJCS8vIGVudmVsb3BlCgkJCWJsaXBEYXRhLmVudmVsb3BlLmF0dGFjayA9IHBhcnNlSW50KGdldEFyZyhsaW5lc1tpXSwgMSkpOwoJCQlibGlwRGF0YS5lbnZlbG9wZS5kZWNheSA9IHBhcnNlSW50KGdldEFyZyhsaW5lc1tpXSwgMikpOwoJCQlibGlwRGF0YS5lbnZlbG9wZS5zdXN0YWluID0gcGFyc2VJbnQoZ2V0QXJnKGxpbmVzW2ldLCAzKSk7CgkJCWJsaXBEYXRhLmVudmVsb3BlLmxlbmd0aCA9IHBhcnNlSW50KGdldEFyZyhsaW5lc1tpXSwgNCkpOwoJCQlibGlwRGF0YS5lbnZlbG9wZS5yZWxlYXNlID0gcGFyc2VJbnQoZ2V0QXJnKGxpbmVzW2ldLCA1KSk7CgkJfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiQkVBVCIpIHsKCQkJLy8gcGl0Y2ggYmVhdCBsZW5ndGgKCQkJYmxpcERhdGEuYmVhdC50aW1lID0gcGFyc2VJbnQoZ2V0QXJnKGxpbmVzW2ldLCAxKSk7CgkJCWJsaXBEYXRhLmJlYXQuZGVsYXkgPSBwYXJzZUludChnZXRBcmcobGluZXNbaV0sIDIpKTsKCQl9CgkJZWxzZSBpZiAoZ2V0VHlwZShsaW5lc1tpXSkgPT09ICJTUVIiKSB7CgkJCS8vIHNxdWFyZSB3YXZlCgkJCXZhciBzcXVhcmVXYXZlSWQgPSBnZXRBcmcobGluZXNbaV0sIDEpOwoJCQlpZiAoU3F1YXJlV2F2ZVtzcXVhcmVXYXZlSWRdICE9IHVuZGVmaW5lZCkgewoJCQkJYmxpcERhdGEuaW5zdHJ1bWVudCA9IFNxdWFyZVdhdmVbc3F1YXJlV2F2ZUlkXTsKCQkJfQoJCX0KCQkvLyBUT0RPIDogY29uc2lkZXIgZm9yIGZ1dHVyZSB1cGRhdGUKCQkvLyBlbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIlNMRCIpIHsKCQkvLyAJLy8gc2xpZGUgbW9kZQoJCS8vIAlpZiAocGFyc2VJbnQoZ2V0QXJnKGxpbmVzW2ldLCAxKSkgPT09IDEpIHsKCQkvLyAJCWJsaXBEYXRhLmRvU2xpZGUgPSB0cnVlOwoJCS8vIAl9CgkJLy8gfQoJCWVsc2UgaWYgKGdldFR5cGUobGluZXNbaV0pID09PSAiUlBUIikgewoJCQkvLyByZXBlYXQgbW9kZQoJCQlpZiAocGFyc2VJbnQoZ2V0QXJnKGxpbmVzW2ldLCAxKSkgPT09IDEpIHsKCQkJCWJsaXBEYXRhLmRvUmVwZWF0ID0gdHJ1ZTsKCQkJfQoJCX0KCQllbHNlIGlmIChnZXRUeXBlKGxpbmVzW2ldKSA9PT0gIk5BTUUiKSB7CgkJCXZhciBuYW1lID0gbGluZXNbaV0uc3BsaXQoL1xzKC4rKS8pWzFdOwoJCQlibGlwRGF0YS5uYW1lID0gbmFtZTsKCQl9CgoJCWkrKzsKCX0KCgl3b3JsZC5ibGlwW2lkXSA9IGJsaXBEYXRhOwoKCXJldHVybiBpOwp9CgpmdW5jdGlvbiBwYXJzZVBpdGNoKHBpdGNoU3RyKSB7Cgl2YXIgcGl0Y2ggPSB7IGJlYXRzOiAxLCBub3RlOiBOb3RlLkMsIG9jdGF2ZTogT2N0YXZlWzRdLCB9OwoJdmFyIGk7CgoJLy8gYmVhdHMKCXZhciBiZWF0c1Rva2VuID0gIiI7Cglmb3IgKGkgPSAwOyBpIDwgcGl0Y2hTdHIubGVuZ3RoICYmICgiMDEyMzQ1Njc4OSIuaW5kZXhPZihwaXRjaFN0cltpXSkgIT0gLTEpOyBpKyspIHsKCQliZWF0c1Rva2VuICs9IHBpdGNoU3RyW2ldOwoJfQoJaWYgKGJlYXRzVG9rZW4ubGVuZ3RoID4gMCkgewoJCXBpdGNoLmJlYXRzID0gcGFyc2VJbnQoYmVhdHNUb2tlbik7Cgl9CgoJLy8gbm90ZQoJdmFyIG5vdGVUeXBlOwoJdmFyIG5vdGVOYW1lID0gIiI7CglpZiAoaSA8IHBpdGNoU3RyLmxlbmd0aCkgewoJCWlmIChwaXRjaFN0cltpXSA9PT0gcGl0Y2hTdHJbaV0udG9VcHBlckNhc2UoKSkgewoJCQkvLyB1cHBlcmNhc2UgbGV0dGVycyByZXByZXNlbnQgY2hyb21hdGljIG5vdGVzCgkJCW5vdGVUeXBlID0gTm90ZTsKCQkJbm90ZU5hbWUgKz0gcGl0Y2hTdHJbaV07CgkJCWkrKzsKCgkJCS8vIGNoZWNrIGZvciBzaGFycAoJCQlpZiAoaSA8IHBpdGNoU3RyLmxlbmd0aCAmJiBwaXRjaFN0cltpXSA9PT0gIiMiKSB7CgkJCQlub3RlTmFtZSArPSAiX1NIQVJQIjsKCQkJCWkrKzsKCQkJfQoJCX0KCQllbHNlIHsKCQkJLy8gbG93ZXJjYXNlIGxldHRlcnMgcmVwcmVzZW50IHNvbGZhIG5vdGVzCgkJCW5vdGVUeXBlID0gU29sZmE7CgkJCW5vdGVOYW1lICs9IHBpdGNoU3RyW2ldLnRvVXBwZXJDYXNlKCk7CgkJCWkrKzsKCQl9Cgl9CgoJaWYgKG5vdGVUeXBlICE9IHVuZGVmaW5lZCAmJiBub3RlVHlwZVtub3RlTmFtZV0gIT0gdW5kZWZpbmVkKSB7CgkJcGl0Y2gubm90ZSA9IG5vdGVUeXBlW25vdGVOYW1lXTsKCX0KCgkvLyBvY3RhdmUKCXZhciBvY3RhdmVUb2tlbiA9ICIiOwoJaWYgKGkgPCBwaXRjaFN0ci5sZW5ndGgpIHsKCQlvY3RhdmVUb2tlbiArPSBwaXRjaFN0cltpXTsKCX0KCglpZiAoT2N0YXZlW29jdGF2ZVRva2VuXSAhPSB1bmRlZmluZWQpIHsKCQlwaXRjaC5vY3RhdmUgPSBPY3RhdmVbb2N0YXZlVG9rZW5dOwoJfQoKCXJldHVybiBwaXRjaDsKfQoKZnVuY3Rpb24gcGFyc2VGbGFnKHBhcnNlU3RhdGUsIHdvcmxkKSB7Cgl2YXIgaSA9IHBhcnNlU3RhdGUuaW5kZXg7Cgl2YXIgbGluZXMgPSBwYXJzZVN0YXRlLmxpbmVzOwoJdmFyIGlkID0gZ2V0SWQobGluZXNbaV0pOwoJdmFyIHZhbFN0ciA9IGxpbmVzW2ldLnNwbGl0KCIgIilbMl07Cgl3b3JsZC5mbGFnc1tpZF0gPSBwYXJzZUludCggdmFsU3RyICk7CglpKys7CglyZXR1cm4gaTsKfQoKZnVuY3Rpb24gZ2V0RHJhd2luZ0ZyYW1lQ291bnQod29ybGQsIGRyd0lkKSB7CglyZXR1cm4gd29ybGQuZHJhd2luZ3NbZHJ3SWRdLmxlbmd0aDsKfQoKZnVuY3Rpb24gc3RvcmVEcmF3aW5nRGF0YSh3b3JsZCwgZHJ3SWQsIGRyYXdpbmdEYXRhKSB7Cgl3b3JsZC5kcmF3aW5nc1tkcndJZF0gPSBkcmF3aW5nRGF0YTsKfQoKZnVuY3Rpb24gcGxhY2VTcHJpdGVzKHBhcnNlU3RhdGUsIHdvcmxkKSB7Cglmb3IgKGlkIGluIHBhcnNlU3RhdGUuc3ByaXRlU3RhcnRMb2NhdGlvbnMpIHsKCQl3b3JsZC5zcHJpdGVbaWRdLnJvb20gPSBwYXJzZVN0YXRlLnNwcml0ZVN0YXJ0TG9jYXRpb25zW2lkXS5yb29tOwoJCXdvcmxkLnNwcml0ZVtpZF0ueCA9IHBhcnNlU3RhdGUuc3ByaXRlU3RhcnRMb2NhdGlvbnNbaWRdLng7CgkJd29ybGQuc3ByaXRlW2lkXS55ID0gcGFyc2VTdGF0ZS5zcHJpdGVTdGFydExvY2F0aW9uc1tpZF0ueTsKCX0KfQoKZnVuY3Rpb24gY3JlYXRlTmFtZU1hcHNGb3JXb3JsZCh3b3JsZCkgewoJdmFyIG5hbWVNYXBzID0ge307CgoJZnVuY3Rpb24gY3JlYXRlTmFtZU1hcChvYmplY3RTdG9yZSkgewoJCXZhciBtYXAgPSB7fTsKCgkJZm9yIChpZCBpbiBvYmplY3RTdG9yZSkgewoJCQlpZiAob2JqZWN0U3RvcmVbaWRdLm5hbWUgIT0gdW5kZWZpbmVkICYmIG9iamVjdFN0b3JlW2lkXS5uYW1lICE9IG51bGwpIHsKCQkJCW1hcFtvYmplY3RTdG9yZVtpZF0ubmFtZV0gPSBpZDsKCQkJfQoJCX0KCgkJcmV0dXJuIG1hcDsKCX0KCgluYW1lTWFwcy5yb29tID0gY3JlYXRlTmFtZU1hcCh3b3JsZC5yb29tKTsKCW5hbWVNYXBzLnRpbGUgPSBjcmVhdGVOYW1lTWFwKHdvcmxkLnRpbGUpOwoJbmFtZU1hcHMuc3ByaXRlID0gY3JlYXRlTmFtZU1hcCh3b3JsZC5zcHJpdGUpOwoJbmFtZU1hcHMuaXRlbSA9IGNyZWF0ZU5hbWVNYXAod29ybGQuaXRlbSk7CgluYW1lTWFwcy5kaWFsb2cgPSBjcmVhdGVOYW1lTWFwKHdvcmxkLmRpYWxvZyk7CgluYW1lTWFwcy5wYWxldHRlID0gY3JlYXRlTmFtZU1hcCh3b3JsZC5wYWxldHRlKTsKCW5hbWVNYXBzLnR1bmUgPSBjcmVhdGVOYW1lTWFwKHdvcmxkLnR1bmUpOwoJbmFtZU1hcHMuYmxpcCA9IGNyZWF0ZU5hbWVNYXAod29ybGQuYmxpcCk7CgoJcmV0dXJuIG5hbWVNYXBzOwp9CgpmdW5jdGlvbiBnZXRUeXBlKGxpbmUpIHsKCXJldHVybiBnZXRBcmcobGluZSwwKTsKfQoKZnVuY3Rpb24gZ2V0SWQobGluZSkgewoJcmV0dXJuIGdldEFyZyhsaW5lLDEpOwp9CgpmdW5jdGlvbiBnZXRDb29yZChsaW5lLGFyZykgewoJcmV0dXJuIGdldEFyZyhsaW5lLGFyZykuc3BsaXQoIiwiKTsKfQoKZnVuY3Rpb24gZ2V0QXJnKGxpbmUsYXJnKSB7CglyZXR1cm4gbGluZS5zcGxpdCgiICIpW2FyZ107Cn0KCmZ1bmN0aW9uIGdldE5hbWVBcmcobGluZSkgewoJdmFyIG5hbWUgPSBsaW5lLnNwbGl0KC9ccyguKykvKVsxXTsKCXJldHVybiBuYW1lOwp9Cjwvc2NyaXB0PgoKPHNjcmlwdD4KLyogUElUQ0ggSEVMUEVSIEZVTkNUSU9OUyAqLwpmdW5jdGlvbiBwaXRjaFRvU3RlcHMocGl0Y2gpIHsKCXJldHVybiAocGl0Y2gub2N0YXZlICogTm90ZS5DT1VOVCkgKyBwaXRjaC5ub3RlOwp9CgpmdW5jdGlvbiBzdGVwc1RvUGl0Y2goc3RlcHMpIHsKCXZhciBwaXRjaCA9IHsgYmVhdHM6IDEsIG5vdGU6IE5vdGUuQywgb2N0YXZlOiBPY3RhdmVbMl0sIH07CgoJd2hpbGUgKHN0ZXBzID49IE5vdGUuQ09VTlQpIHsKCQlwaXRjaC5vY3RhdmUgPSAocGl0Y2gub2N0YXZlICsgMSkgJSBPY3RhdmUuQ09VTlQ7CgkJc3RlcHMgLT0gTm90ZS5DT1VOVDsKCX0KCglwaXRjaC5ub3RlICs9IHN0ZXBzOwoKCS8vIG1ha2Ugc3VyZSBwaXRjaCBpc24ndCBvdXRzaWRlIGEgdmFsaWQgcmFuZ2UKCWlmIChwaXRjaC5ub3RlIDw9IE5vdGUuTk9ORSkgewoJCXBpdGNoLm5vdGUgPSBOb3RlLkM7Cgl9CgllbHNlIGlmIChwaXRjaC5ub3RlID49IE5vdGUuQ09VTlQpIHsKCQlwaXRjaC5ub3RlID0gTm90ZS5COwoJfQoKCWlmIChwaXRjaC5vY3RhdmUgPD0gT2N0YXZlLk5PTkUpIHsKCQlwaXRjaC5vY3RhdmUgPSBPY3RhdmVbMl07Cgl9CgllbHNlIGlmIChwaXRjaC5vY3RhdmUgPj0gT2N0YXZlLkNPVU5UKSB7CgkJcGl0Y2gub2N0YXZlID0gT2N0YXZlWzVdOwoJfQoKCXJldHVybiBwaXRjaDsKfQoKZnVuY3Rpb24gYWRqdXN0UGl0Y2gocGl0Y2gsIHN0ZXBEZWx0YSkgewoJcmV0dXJuIHN0ZXBzVG9QaXRjaChwaXRjaFRvU3RlcHMocGl0Y2gpICsgc3RlcERlbHRhKTsKfQoKZnVuY3Rpb24gcGl0Y2hEaXN0YW5jZShwaXRjaEEsIHBpdGNoQikgewoJcmV0dXJuIHBpdGNoVG9TdGVwcyhwaXRjaEIpIC0gcGl0Y2hUb1N0ZXBzKHBpdGNoQSk7Cn0KCmZ1bmN0aW9uIGlzTWluUGl0Y2gocGl0Y2gpIHsKCXJldHVybiBwaXRjaFRvU3RlcHMocGl0Y2gpIDw9IHBpdGNoVG9TdGVwcyh7IG5vdGU6IE5vdGUuQywgb2N0YXZlOiBPY3RhdmVbMl0gfSk7Cn0KCmZ1bmN0aW9uIGlzTWF4UGl0Y2gocGl0Y2gpIHsKCXJldHVybiBwaXRjaFRvU3RlcHMocGl0Y2gpID49IHBpdGNoVG9TdGVwcyh7IG5vdGU6IE5vdGUuQiwgb2N0YXZlOiBPY3RhdmVbNV0gfSk7Cn0KCmZ1bmN0aW9uIFNvdW5kUGxheWVyKCkgewoJLy8gZnJlcXVlbmNpZXMgKGluIGhlcnR6KSBmb3Igb2N0YXZlIDAgKG9yIGlzIGl0IG9jdGF2ZSA0PykKCXZhciBmcmVxdWVuY2llcyA9IFsKCQkyNjEuNywgLy8gbWlkZGxlIEMKCQkyNzcuMiwKCQkyOTMuNywKCQkzMTEuMiwKCQkzMjkuNywKCQkzNDkuMywKCQkzNzAuMCwKCQkzOTIuMCwKCQk0MTUuMywKCQk0NDAuMCwKCQk0NjYuMiwKCQk0OTMuOSwKCV07CgoJLy8gdGVtcG9zIGFyZSBjYWxjdWxhdGVkIGFzIHRoZSBkdXJhdGlvbiBvZiBhIDE2dGggbm90ZSwgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBtaWxsaXNlY29uZAoJdmFyIHRlbXBvcyA9IHt9OwoJdGVtcG9zW1RlbXBvLlNMV10gPSAyNTA7IC8vIDYwYnBtIChhZGFnaW8pCgl0ZW1wb3NbVGVtcG8uTUVEXSA9IDE4ODsgLy8gfjgwYnBtIChhbmRhbnRlKSBbZXhhY3Qgd291bGQgYmUgMTg3LjUgbXNdCgl0ZW1wb3NbVGVtcG8uRlNUXSA9IDEyNTsgLy8gMTIwYnBtIChtb2RlcmF0bykKCXRlbXBvc1tUZW1wby5YRlNUXSA9IDk0OyAvLyB+MTYwYnBtIChhbGxlZ3JvKSBbZXhhY3Qgd291bGQgYmUgOTMuNzUgbXNdCgoJLy8gYXJwZWdnaW8gcGF0dGVybnMgZXhwcmVzc2VkIGluIHNjYWxlIGRlZ3JlZXMKCXZhciBhcnBlZ2dpb1BhdHRlcm4gPSB7fTsKCWFycGVnZ2lvUGF0dGVybltBcnBlZ2dpb1BhdHRlcm4uVVBdID0gWzAsIDIsIDQsIDddOwoJYXJwZWdnaW9QYXR0ZXJuW0FycGVnZ2lvUGF0dGVybi5EV05dID0gWzcsIDQsIDIsIDBdOwoJYXJwZWdnaW9QYXR0ZXJuW0FycGVnZ2lvUGF0dGVybi5JTlQ1XSA9IFswLCA0XTsKCWFycGVnZ2lvUGF0dGVybltBcnBlZ2dpb1BhdHRlcm4uSU5UOF0gPSBbMCwgN107CgoJdGhpcy5nZXRBcnBlZ2dpb1N0ZXBzID0gZnVuY3Rpb24odHVuZSkgeyByZXR1cm4gYXJwZWdnaW9QYXR0ZXJuW3R1bmUuYXJwZWdnaW9QYXR0ZXJuXTsgfTsKCglmdW5jdGlvbiBpc1BpdGNoUGxheWFibGUocGl0Y2gsIGtleSkgewoJCWlmIChwaXRjaC5iZWF0cyA8PSAwKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyB0ZXN0IGlmIG5vdGUgaXMgaW4gdGhlIHNjYWxlCgkJcmV0dXJuIChrZXkuc2NhbGUuaW5kZXhPZihwaXRjaC5ub3RlKSA+IC0xKQoJCQkmJiAoa2V5Lm5vdGVzW3BpdGNoLm5vdGVdID4gTm90ZS5OT05FKQoJCQkmJiAoa2V5Lm5vdGVzW3BpdGNoLm5vdGVdIDwgTm90ZS5DT1VOVCk7Cgl9CgoJZnVuY3Rpb24gcGl0Y2hUb0Nocm9tYXRpYyhwaXRjaCwga2V5KSB7CgkJaWYgKHBpdGNoID09PSB1bmRlZmluZWQgfHwgcGl0Y2ggPT09IG51bGwpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQlpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7CgkJCXJldHVybiBwaXRjaDsKCQl9CgoJCS8vIGNvbnZlcnQgZnJvbSBzb2xmYQoJCXZhciBvY3RhdmVPZmZzZXQgPSAocGl0Y2gubm90ZSA+PSBTb2xmYS5DT1VOVCkgPyAxIDogMDsKCgkJcmV0dXJuIHsKCQkJYmVhdHM6IHBpdGNoLmJlYXRzLAoJCQlvY3RhdmU6IHBpdGNoLm9jdGF2ZSArIG9jdGF2ZU9mZnNldCwKCQkJLy8gdG9kbyA6IHdoYXQgYWJvdXQgdGhlIHNjYWxlIGxpbWl0cz8KCQkJbm90ZToga2V5Lm5vdGVzWyhwaXRjaC5ub3RlICUgU29sZmEuQ09VTlQpXSwKCQkJYmxpcDogcGl0Y2guYmxpcAoJCX07Cgl9CgoJZnVuY3Rpb24gbWFrZVBpdGNoRnJlcXVlbmN5KHBpdGNoKSB7CgkJLy8gdG9kbyA6IHRoaXMgY2xhbXAgc2hvdWxkbid0IGJlIHJlcXVpcmVkLi4gdGhlcmUncyBhIGJ1ZyBpbiB0aGUgcGl0Y2ggc2hpZnRpbmcgc29tZXdoZXJlCgkJdmFyIG5vdGUgPSBNYXRoLm1heCgwLCBwaXRjaC5ub3RlKTsKCQl2YXIgb2N0YXZlID0gKHBpdGNoLm9jdGF2ZSAhPSB1bmRlZmluZWQgPyBwaXRjaC5vY3RhdmUgOiBPY3RhdmVbNF0pOwoKCQl2YXIgb2N0YXZlTWluID0gT2N0YXZlWzJdOwoJCXZhciBvY3RhdmVNYXggPSBPY3RhdmVbNV07CgoJCS8vIG1ha2Ugc3VyZSBvY3RhdmUgaXMgaW4gdmFsaWQgcmFuZ2UKCQlvY3RhdmUgPSBNYXRoLm1heChvY3RhdmVNaW4sIE1hdGgubWluKG9jdGF2ZSwgb2N0YXZlTWF4KSk7CgkJdmFyIGRpc3RGcm9tTWlkZGxlQyA9IG9jdGF2ZSAtIDI7CgoJCXZhciBmcmVxID0gZnJlcXVlbmNpZXNbbm90ZV0gKiBNYXRoLnBvdygyLCBkaXN0RnJvbU1pZGRsZUMpOwoKCQlpZiAoaXNOYU4oZnJlcSkpIHsKCQkJYml0c3kubG9nKCJpbnZhbGlkIGZyZXF1ZW5jeSAiICsgcGl0Y2gsICJzb3VuZCIpOwoJCX0KCgkJcmV0dXJuIGZyZXE7Cgl9CgoJdmFyIG1heFZvbHVtZSA9IDE1OyAvLyB0b2RvIDogc2hvdWxkIHRoaXMgYmUgYSBzeXN0ZW0gY29uc3RhbnQ/Cgl2YXIgbm90ZVZvbHVtZSA9IDU7CgoJdmFyIGN1clR1bmUgPSBudWxsOwoJdmFyIGlzVHVuZVBhdXNlZCA9IGZhbHNlOwoJdmFyIGJhckluZGV4ID0gLTE7Cgl2YXIgY3VyQXJwZWdnaW8gPSBbXTsKCgl2YXIgYmVhdDE2ID0gMDsKCXZhciBiZWF0MTZUaW1lciA9IDA7Cgl2YXIgYmVhdDE2SW5kZXggPSAwOwoKCS8vIHNwZWNpYWwgc2V0dGluZ3MKCXZhciBpc0xvb3BpbmcgPSBmYWxzZTsKCXZhciBpc01lbG9keU11dGVkID0gZmFsc2U7Cgl2YXIgbWF4QmVhdENvdW50ID0gbnVsbDsKCXZhciBtdXRlVGltZXIgPSAwOyAvLyBhbGxvdyB0ZW1wb3JhcnkgbXV0aW5nIG9mIGFsbCBub3RlcwoKCWZ1bmN0aW9uIGFycGVnZ2lhdGVCYXIoYmFyLCBrZXksIHBhdHRlcm4pIHsKCQl2YXIgYXJwZWdnaW8gPSBbXTsKCgkJaWYgKGtleSAhPSB1bmRlZmluZWQgJiYga2V5ICE9IG51bGwgJiYgaXNQaXRjaFBsYXlhYmxlKGJhclswXSwga2V5KSkgewoJCQlmb3IgKHZhciBpID0gMDsgaSA8IGFycGVnZ2lvUGF0dGVybltwYXR0ZXJuXS5sZW5ndGg7IGkrKykgewoJCQkJdmFyIHBpdGNoID0geyBiZWF0czogMSwgbm90ZTogYmFyWzBdLm5vdGUgKyBhcnBlZ2dpb1BhdHRlcm5bcGF0dGVybl1baV0sIG9jdGF2ZTogYmFyWzBdLm9jdGF2ZSB9OwoJCQkJYXJwZWdnaW8ucHVzaChwaXRjaFRvQ2hyb21hdGljKHBpdGNoLCBrZXkpKTsKCQkJfQoJCX0KCgkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcnBlZ2dpby5sZW5ndGg7IGkrKykgewoJCQliaXRzeS5sb2coaSArICI6ICIgKyBzZXJpYWxpemVOb3RlKGFycGVnZ2lvW2ldLm5vdGUpKTsKCQl9CgoJCXJldHVybiBhcnBlZ2dpbzsKCX07CgoJZnVuY3Rpb24gcGxheU5vdGUocGl0Y2gsIGluc3RydW1lbnQsIG9wdGlvbnMpIHsKCQlpZiAocGl0Y2guYmVhdHMgPD0gMCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgY2hhbm5lbCA9IGJpdHN5LlNPVU5EMTsKCQlpZiAob3B0aW9ucyAhPSB1bmRlZmluZWQgJiYgb3B0aW9ucy5jaGFubmVsICE9IHVuZGVmaW5lZCkgewoJCQljaGFubmVsID0gb3B0aW9ucy5jaGFubmVsOwoJCX0KCgkJdmFyIGtleSA9IG51bGw7CgkJaWYgKG9wdGlvbnMgIT0gdW5kZWZpbmVkICYmIG9wdGlvbnMua2V5ICE9IHVuZGVmaW5lZCkgewoJCQlrZXkgPSBvcHRpb25zLmtleTsKCQl9CgoJCXZhciBiZWF0TGVuID0gYmVhdDE2OwoJCWlmIChvcHRpb25zICE9IHVuZGVmaW5lZCAmJiBvcHRpb25zLmJlYXRMZW4gIT0gdW5kZWZpbmVkKSB7CgkJCWJlYXRMZW4gPSBvcHRpb25zLmJlYXRMZW47CgkJfQoKCQlpZiAoaXNQaXRjaFBsYXlhYmxlKHBpdGNoLCBrZXkpKSB7CgkJCXZhciBmcmVxID0gbWFrZVBpdGNoRnJlcXVlbmN5KHBpdGNoVG9DaHJvbWF0aWMocGl0Y2gsIGtleSkpOwoJCQliaXRzeS5zb3VuZChjaGFubmVsLCAocGl0Y2guYmVhdHMgKiBiZWF0TGVuKSwgZnJlcSAqIDEwMCwgbm90ZVZvbHVtZSwgaW5zdHJ1bWVudCk7CgkJfQoJfQoKCWZ1bmN0aW9uIHNmeEZyZXF1ZW5jeUF0VGltZShzZngsIHRpbWUpIHsKCQl2YXIgYmVhdERlbGF5ID0gc2Z4LmJsaXAuYmVhdC5kZWxheTsKCQl2YXIgYmVhdFRpbWUgPSBzZnguYmxpcC5iZWF0LnRpbWU7CgkJdmFyIGRlbHRhID0gTWF0aC5tYXgoMCwgdGltZSAtIGJlYXREZWxheSkgLyBiZWF0VGltZTsKCgkJdmFyIHBpdGNoRGVsdGEgPSBzZnguYmxpcC5kb1JlcGVhdAoJCQk/IChkZWx0YSAlIHNmeC5mcmVxdWVuY2llcy5sZW5ndGgpCgkJCTogTWF0aC5taW4oZGVsdGEsIHNmeC5mcmVxdWVuY2llcy5sZW5ndGggLSAxKTsKCgkJc2Z4LnBpdGNoSW5kZXggPSBNYXRoLmZsb29yKHBpdGNoRGVsdGEpOwoJCXZhciBjdXJGcmVxID0gc2Z4LmZyZXF1ZW5jaWVzW3NmeC5waXRjaEluZGV4XTsKCgkJLy8gVE9ETyA6IGNvbnNpZGVyIGZvciBmdXR1cmUgdXBkYXRlCgkJLy8gaWYgKHNmeC5ibGlwLmRvU2xpZGUpIHsKCQkvLyAJdmFyIG5leHRQaXRjaEluZGV4ID0gKHNmeC5waXRjaEluZGV4ICsgMSkgJSBzZnguZnJlcXVlbmNpZXMubGVuZ3RoOwoJCS8vIAl2YXIgbmV4dEZyZXEgPSBzZnguZnJlcXVlbmNpZXNbbmV4dFBpdGNoSW5kZXhdOwoJCS8vIAl2YXIgZCA9IHBpdGNoRGVsdGEgLSBzZngucGl0Y2hJbmRleDsKCQkvLyAJY3VyRnJlcSA9IGN1ckZyZXEgKyAoKG5leHRGcmVxIC0gY3VyRnJlcSkgKiBkKTsKCQkvLyB9CgoJCXJldHVybiBjdXJGcmVxOwoJfQoKCWZ1bmN0aW9uIHNmeFZvbHVtZUF0VGltZShzZngsIHRpbWUpIHsKCQl2YXIgdm9sdW1lID0gMDsKCgkJLy8gdXNlIGVudmVsb3BlIHNldHRpbmdzIHRvIGNhbGN1bGF0ZSB2b2x1bWUKCQl2YXIgYXR0YWNrID0gc2Z4LmJsaXAuZW52ZWxvcGUuYXR0YWNrOwoJCXZhciBkZWNheSA9IHNmeC5ibGlwLmVudmVsb3BlLmRlY2F5OwoJCXZhciBsZW5ndGggPSBzZnguYmxpcC5lbnZlbG9wZS5sZW5ndGg7CgkJdmFyIHJlbGVhc2UgPSBzZnguYmxpcC5lbnZlbG9wZS5yZWxlYXNlOwoJCWlmICh0aW1lIDwgYXR0YWNrKSB7CgkJCS8vIGF0dGFjawoJCQl2YXIgdCA9IHRpbWUgLyBhdHRhY2s7CgkJCXZvbHVtZSA9IE1hdGguZmxvb3Ioc2Z4UGVha1ZvbHVtZSAqIHQpOwoJCX0KCQllbHNlIGlmICh0aW1lIDwgYXR0YWNrICsgZGVjYXkpIHsKCQkJLy8gZGVjYXkKCQkJdmFyIHQgPSAodGltZSAtIGF0dGFjaykgLyBkZWNheTsKCQkJdmFyIGQgPSBzZnguYmxpcC5lbnZlbG9wZS5zdXN0YWluIC0gc2Z4UGVha1ZvbHVtZTsKCQkJdm9sdW1lID0gTWF0aC5mbG9vcihzZnhQZWFrVm9sdW1lICsgKGQgKiB0KSk7CgkJfQoJCWVsc2UgaWYgKHRpbWUgPCBhdHRhY2sgKyBkZWNheSArIGxlbmd0aCkgewoJCQkvLyBzdXN0YWluCgkJCXZvbHVtZSA9IHNmeC5ibGlwLmVudmVsb3BlLnN1c3RhaW47CgkJfQoJCWVsc2UgaWYgKHRpbWUgPCBhdHRhY2sgKyBkZWNheSArIGxlbmd0aCArIHJlbGVhc2UpIHsKCQkJLy8gcmVsZWFzZQoJCQl2YXIgdCA9ICh0aW1lIC0gKGF0dGFjayArIGRlY2F5ICsgbGVuZ3RoKSkgLyByZWxlYXNlOwoJCQl2b2x1bWUgPSBNYXRoLmZsb29yKHNmeC5ibGlwLmVudmVsb3BlLnN1c3RhaW4gKiAoMSAtIHQpKTsKCQl9CgkJZWxzZSB7CgkJCXZvbHVtZSA9IDA7CgkJfQoKCQlyZXR1cm4gdm9sdW1lOwoJfQoKCWZ1bmN0aW9uIHVwZGF0ZVNmeChkdCkgewoJCS8vIHRyeSBsaW1pdGluZyB0aGUgbWF4IGNoYW5nZSBwZXIgZnJhbWUKCQlkdCA9IE1hdGgubWluKGR0LCAzMik7CgkJdmFyIGlzQW55QmxpcFBsYXlpbmcgPSBmYWxzZTsKCgkJaWYgKGFjdGl2ZVNmeCAhPSBudWxsKSB7CgkJCWlzQW55QmxpcFBsYXlpbmcgPSB0cnVlOwoJCQl2YXIgc2Z4ID0gYWN0aXZlU2Z4OwoKCQkJc2Z4LnRpbWVyICs9IGR0OwoJCQlpZiAoc2Z4LnRpbWVyID49IHNmeC5kdXJhdGlvbikgewoJCQkJc2Z4LnRpbWVyID0gc2Z4LmR1cmF0aW9uOwoJCQl9CgoJCQlpZiAoc2Z4LmZyZXF1ZW5jaWVzLmxlbmd0aCA+IDApIHsKCQkJCS8vIHVwZGF0ZSBwaXRjaAoJCQkJdmFyIHByZXZQaXRjaEluZGV4ID0gc2Z4LnBpdGNoSW5kZXg7CgkJCQl2YXIgZnJlcSA9IHNmeEZyZXF1ZW5jeUF0VGltZShzZngsIHNmeC50aW1lcik7CgkJCQlpZiAocHJldlBpdGNoSW5kZXggIT0gc2Z4LnBpdGNoSW5kZXgpIHsKCQkJCQkvLyBwaXRjaCBjaGFuZ2VkIQoJCQkJCWJpdHN5LmZyZXF1ZW5jeShiaXRzeS5TT1VORDEsIGZyZXEgKiAxMDApOwoJCQkJfQoKCQkJCS8vIHVwZGF0ZSB2b2x1bWUgZW52ZWxvcGUKCQkJCWJpdHN5LnZvbHVtZShiaXRzeS5TT1VORDEsIHNmeFZvbHVtZUF0VGltZShzZngsIHNmeC50aW1lcikpOwoJCQl9CgoJCQlpZiAoc2Z4LnRpbWVyID49IHNmeC5kdXJhdGlvbikgewoJCQkJLy8gdHVybiBvZmYgc291bmQKCQkJCWJpdHN5LnZvbHVtZShiaXRzeS5TT1VORDEsIDApOwoJCQkJYWN0aXZlU2Z4ID0gbnVsbDsKCQkJfQoJCX0KCgkJaWYgKGlzTXVzaWNQYXVzZWRGb3JCbGlwICYmICFpc0FueUJsaXBQbGF5aW5nKSB7CgkJCWlzTXVzaWNQYXVzZWRGb3JCbGlwID0gZmFsc2U7CgkJfQoJfQoKCWZ1bmN0aW9uIHVwZGF0ZVR1bmUoZHQpIHsKCQlpZiAoY3VyVHVuZSA9PT0gdW5kZWZpbmVkIHx8IGN1clR1bmUgPT09IG51bGwpIHsKCQkJcmV0dXJuOwoJCX0KCgkJYmVhdDE2VGltZXIgKz0gZHQ7CgoJCWlmIChtdXRlVGltZXIgPiAwKSB7CgkJCW11dGVUaW1lciAtPSBkdDsKCQl9CgoJCWlmIChiZWF0MTZUaW1lciA+PSBiZWF0MTYpIHsKCQkJYmVhdDE2VGltZXIgPSAwOwoJCQliZWF0MTZJbmRleCsrOwoKCQkJaWYgKGJlYXQxNkluZGV4ID49IDE2KSB7CgkJCQliZWF0MTZJbmRleCA9IDA7CgoJCQkJaWYgKCFpc0xvb3BpbmcpIHsKCQkJCQliYXJJbmRleCA9IChiYXJJbmRleCArIDEpICUgY3VyVHVuZS5tZWxvZHkubGVuZ3RoOwoKCQkJCQlpZiAoY3VyVHVuZS5hcnBlZ2dpb1BhdHRlcm4gIT0gQXJwZWdnaW9QYXR0ZXJuLk9GRiAmJiBjdXJUdW5lLmtleSAhPSBudWxsKSB7CgkJCQkJCWN1ckFycGVnZ2lvID0gYXJwZWdnaWF0ZUJhcihjdXJUdW5lLmhhcm1vbnlbYmFySW5kZXhdLCBjdXJUdW5lLmtleSwgY3VyVHVuZS5hcnBlZ2dpb1BhdHRlcm4pOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKG11dGVUaW1lciA8PSAwKSB7CgkJCQlpZiAoIWlzTWVsb2R5TXV0ZWQpIHsKCQkJCQkvLyBtZWxvZHkgbm90ZQoJCQkJCXZhciBwaXRjaEEgPSBjdXJUdW5lLm1lbG9keVtiYXJJbmRleF1bYmVhdDE2SW5kZXhdOwoJCQkJCWlmIChwaXRjaEEuYmVhdHMgPiAwKSB7CgkJCQkJCS8vIHNpbmNlIHRoZXkncmUgcGxheWVkIG9uIHRoZSBzYW1lIGNoYW5uZWwsIGFueSBtZWxvZHkgbm90ZSB3aWxsIGNhbmNlbCBhIGJsaXAKCQkJCQkJYWN0aXZlU2Z4ID0gbnVsbDsKCQkJCQl9CgoJCQkJCWlmIChwaXRjaEEuYmxpcCAhPSB1bmRlZmluZWQgJiYgcGl0Y2hBLmJlYXRzID4gMCkgewoJCQkJCQlwbGF5QmxpcChibGlwW3BpdGNoQS5ibGlwXSwgeyBpbnRlcnJ1cHRNdXNpYzogZmFsc2UsIHBpdGNoOiBwaXRjaEEsIGtleTogY3VyVHVuZS5rZXkgfSk7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlwbGF5Tm90ZShwaXRjaEEsIGN1clR1bmUuaW5zdHJ1bWVudEEsIHsgY2hhbm5lbDogYml0c3kuU09VTkQxLCBrZXk6IGN1clR1bmUua2V5IH0pOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoY3VyVHVuZS5hcnBlZ2dpb1BhdHRlcm4gPT09IEFycGVnZ2lvUGF0dGVybi5PRkYpIHsKCQkJCQkvLyBoYXJtb255IG5vdGUKCQkJCQl2YXIgcGl0Y2hCID0gY3VyVHVuZS5oYXJtb255W2JhckluZGV4XVtiZWF0MTZJbmRleF07CgkJCQkJaWYgKHBpdGNoQi5ibGlwICE9IHVuZGVmaW5lZCAmJiBwaXRjaEIuYmVhdHMgPiAwKSB7CgkJCQkJCXBsYXlCbGlwKGJsaXBbcGl0Y2hCLmJsaXBdLCB7IGludGVycnVwdE11c2ljOiBmYWxzZSwgcGl0Y2g6IHBpdGNoQiwga2V5OiBjdXJUdW5lLmtleSB9KTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCXBsYXlOb3RlKHBpdGNoQiwgY3VyVHVuZS5pbnN0cnVtZW50QiwgeyBjaGFubmVsOiBiaXRzeS5TT1VORDIsIGtleTogY3VyVHVuZS5rZXkgfSk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJdmFyIGFycFBpdGNoID0gY3VyQXJwZWdnaW9bYmVhdDE2SW5kZXggJSBjdXJBcnBlZ2dpby5sZW5ndGhdOwoJCQkJCWlmIChhcnBQaXRjaCAhPSB1bmRlZmluZWQgJiYgYXJwUGl0Y2guYmVhdHMgPiAwKSB7CgkJCQkJCXBsYXlOb3RlKGFycFBpdGNoLCBjdXJUdW5lLmluc3RydW1lbnRCLCB7IGNoYW5uZWw6IGJpdHN5LlNPVU5EMiwgYmVhdExlbjogYmVhdDE2IH0pOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKG1heEJlYXRDb3VudCAhPSBudWxsICYmIGJlYXQxNkluZGV4ID49IChtYXhCZWF0Q291bnQgLSAxKSkgewoJCQkJLy8gc3RvcCBwbGF5YmFjayBlYXJseQoJCQkJY3VyVHVuZSA9IG51bGw7CgkJCX0KCQl9Cgl9CgoJdGhpcy51cGRhdGUgPSBmdW5jdGlvbihkdCkgewoJCXVwZGF0ZVNmeChkdCk7CgkJaWYgKCFpc1R1bmVQYXVzZWQgJiYgIWlzTXVzaWNQYXVzZWRGb3JCbGlwKSB7CgkJCXVwZGF0ZVR1bmUoZHQpOwoJCX0KCX07CgoJdGhpcy5wbGF5VHVuZSA9IGZ1bmN0aW9uKHR1bmUsIG9wdGlvbnMpIHsKCQljdXJUdW5lID0gdHVuZTsKCQliZWF0MTZUaW1lciA9IDA7CgkJYmVhdDE2SW5kZXggPSAtMTsKCQliYXJJbmRleCA9IDA7CgoJCWlzTG9vcGluZyA9IGZhbHNlOwoJCWlzTWVsb2R5TXV0ZWQgPSBmYWxzZTsKCQltYXhCZWF0Q291bnQgPSBudWxsOwoKCQkvLyBzcGVjaWFsIG9wdGlvbnMgZm9yIHRoZSBlZGl0b3IKCQlpZiAob3B0aW9ucyAhPSB1bmRlZmluZWQpIHsKCQkJaWYgKG9wdGlvbnMuYmFySW5kZXggIT0gdW5kZWZpbmVkKSB7CgkJCQliYXJJbmRleCA9IG9wdGlvbnMuYmFySW5kZXg7CgkJCX0KCgkJCWlmIChvcHRpb25zLmxvb3AgIT0gdW5kZWZpbmVkKSB7CgkJCQlpc0xvb3BpbmcgPSBvcHRpb25zLmxvb3A7CgkJCX0KCgkJCWlmIChvcHRpb25zLm1lbG9keSAhPSB1bmRlZmluZWQpIHsKCQkJCWlzTWVsb2R5TXV0ZWQgPSAhb3B0aW9ucy5tZWxvZHk7CgkJCX0KCgkJCWlmIChvcHRpb25zLmJlYXRDb3VudCAhPSB1bmRlZmluZWQpIHsKCQkJCW1heEJlYXRDb3VudCA9IG9wdGlvbnMuYmVhdENvdW50OwoJCQl9CgkJfQoKCQkvLyB1cGRhdGUgdGVtcG8KCQliZWF0MTYgPSB0ZW1wb3NbY3VyVHVuZS50ZW1wb107CgoJCWlmIChjdXJUdW5lLmFycGVnZ2lvUGF0dGVybiAhPSBBcnBlZ2dpb1BhdHRlcm4uT0ZGICYmIGN1clR1bmUua2V5ICE9IG51bGwpIHsKCQkJY3VyQXJwZWdnaW8gPSBhcnBlZ2dpYXRlQmFyKGN1clR1bmUuaGFybW9ueVtiYXJJbmRleF0sIGN1clR1bmUua2V5LCBjdXJUdW5lLmFycGVnZ2lvUGF0dGVybik7CgkJfQoJfTsKCgl0aGlzLmlzVHVuZVBsYXlpbmcgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gY3VyVHVuZSAhPSBudWxsOwoJfTsKCgl0aGlzLmdldEN1clR1bmVJZCA9IGZ1bmN0aW9uKCkgewoJCWlmIChjdXJUdW5lKSB7CgkJCXJldHVybiBjdXJUdW5lLmlkOwoJCX0KCgkJcmV0dXJuIG51bGw7Cgl9OwoKCXRoaXMuc3RvcFR1bmUgPSBmdW5jdGlvbigpIHsKCQljdXJUdW5lID0gbnVsbDsKCX07CgoJdGhpcy5wYXVzZVR1bmUgPSBmdW5jdGlvbigpIHsKCQlpc1R1bmVQYXVzZWQgPSB0cnVlOwoJfTsKCgl0aGlzLnJlc3VtZVR1bmUgPSBmdW5jdGlvbigpIHsKCQlpc1R1bmVQYXVzZWQgPSBmYWxzZTsKCX07CgoJdGhpcy5nZXRCZWF0ID0gZnVuY3Rpb24oKSB7CgkJaWYgKGN1clR1bmUgPT0g",
  "sig": "edbb94133df091c498f920938b46fe47d649e20bd55de2ee00d4d1823911241744702f2ecb2fa2d7482f3954548b6f371e729278e494cab34e6e5b7286f1f6fa"
}

Note: Under active development, if you find a bug, please report it here GitHub & Reach out.