LyoKCkNvcHlyaWdodCAoYykgMjAxMywgTWljaGFlbCBCb3N0b2NrCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKKiBUaGUgbmFtZSBNaWNoYWVsIEJvc3RvY2sgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwogIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCkFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIE1JQ0hBRUwgQk9TVE9DSyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCklORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLApCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLApEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCk9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCk5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCiovCgooZnVuY3Rpb24oKXtpZiAoIURhdGUubm93KSBEYXRlLm5vdyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiArbmV3IERhdGU7Cn07CnRyeSB7CiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLCAwLCAiIik7Cn0gY2F0Y2ggKGVycm9yKSB7CiAgdmFyIGQzX3N0eWxlX3Byb3RvdHlwZSA9IENTU1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLAogICAgICBkM19zdHlsZV9zZXRQcm9wZXJ0eSA9IGQzX3N0eWxlX3Byb3RvdHlwZS5zZXRQcm9wZXJ0eTsKICBkM19zdHlsZV9wcm90b3R5cGUuc2V0UHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIGQzX3N0eWxlX3NldFByb3BlcnR5LmNhbGwodGhpcywgbmFtZSwgdmFsdWUgKyAiIiwgcHJpb3JpdHkpOwogIH07Cn0KZDMgPSB7dmVyc2lvbjogIjIuOC4xIn07IC8vIHNlbXZlcgpmdW5jdGlvbiBkM19jbGFzcyhjdG9yLCBwcm9wZXJ0aWVzKSB7CiAgdHJ5IHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwga2V5LCB7CiAgICAgICAgdmFsdWU6IHByb3BlcnRpZXNba2V5XSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZQogICAgICB9KTsKICAgIH0KICB9IGNhdGNoIChlKSB7CiAgICBjdG9yLnByb3RvdHlwZSA9IHByb3BlcnRpZXM7CiAgfQp9CnZhciBkM19hcnJheSA9IGQzX2FycmF5U2xpY2U7IC8vIGNvbnZlcnNpb24gZm9yIE5vZGVMaXN0cwoKZnVuY3Rpb24gZDNfYXJyYXlDb3B5KHBzZXVkb2FycmF5KSB7CiAgdmFyIGkgPSAtMSwgbiA9IHBzZXVkb2FycmF5Lmxlbmd0aCwgYXJyYXkgPSBbXTsKICB3aGlsZSAoKytpIDwgbikgYXJyYXkucHVzaChwc2V1ZG9hcnJheVtpXSk7CiAgcmV0dXJuIGFycmF5Owp9CgpmdW5jdGlvbiBkM19hcnJheVNsaWNlKHBzZXVkb2FycmF5KSB7CiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHBzZXVkb2FycmF5KTsKfQoKdHJ5IHsKICBkM19hcnJheShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcylbMF0ubm9kZVR5cGU7Cn0gY2F0Y2goZSkgewogIGQzX2FycmF5ID0gZDNfYXJyYXlDb3B5Owp9Cgp2YXIgZDNfYXJyYXlTdWJjbGFzcyA9IFtdLl9fcHJvdG9fXz8KCi8vIFVudGlsIEVDTUFTY3JpcHQgc3VwcG9ydHMgYXJyYXkgc3ViY2xhc3NpbmcsIHByb3RvdHlwZSBpbmplY3Rpb24gd29ya3Mgd2VsbC4KZnVuY3Rpb24oYXJyYXksIHByb3RvdHlwZSkgewogIGFycmF5Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTsKfToKCi8vIEFuZCBpZiB5b3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IF9fcHJvdG9fXywgd2UnbGwgdXNlIGRpcmVjdCBleHRlbnNpb24uCmZ1bmN0aW9uKGFycmF5LCBwcm90b3R5cGUpIHsKICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm90b3R5cGUpIGFycmF5W3Byb3BlcnR5XSA9IHByb3RvdHlwZVtwcm9wZXJ0eV07Cn07CmQzLm1hcCA9IGZ1bmN0aW9uKG9iamVjdCkgewogIHZhciBtYXAgPSBuZXcgZDNfTWFwOwogIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7CiAgcmV0dXJuIG1hcDsKfTsKCmZ1bmN0aW9uIGQzX01hcCgpIHt9CgpkM19jbGFzcyhkM19NYXAsIHsKICBoYXM6IGZ1bmN0aW9uKGtleSkgewogICAgcmV0dXJuIGQzX21hcF9wcmVmaXggKyBrZXkgaW4gdGhpczsKICB9LAogIGdldDogZnVuY3Rpb24oa2V5KSB7CiAgICByZXR1cm4gdGhpc1tkM19tYXBfcHJlZml4ICsga2V5XTsKICB9LAogIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgcmV0dXJuIHRoaXNbZDNfbWFwX3ByZWZpeCArIGtleV0gPSB2YWx1ZTsKICB9LAogIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7CiAgICBrZXkgPSBkM19tYXBfcHJlZml4ICsga2V5OwogICAgcmV0dXJuIGtleSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW2tleV07CiAgfSwKICBrZXlzOiBmdW5jdGlvbigpIHsKICAgIHZhciBrZXlzID0gW107CiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7IGtleXMucHVzaChrZXkpOyB9KTsKICAgIHJldHVybiBrZXlzOwogIH0sCiAgdmFsdWVzOiBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7IHZhbHVlcy5wdXNoKHZhbHVlKTsgfSk7CiAgICByZXR1cm4gdmFsdWVzOwogIH0sCiAgZW50cmllczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZW50cmllcyA9IFtdOwogICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsgZW50cmllcy5wdXNoKHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlfSk7IH0pOwogICAgcmV0dXJuIGVudHJpZXM7CiAgfSwKICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgewogICAgICBpZiAoa2V5LmNoYXJDb2RlQXQoMCkgPT09IGQzX21hcF9wcmVmaXhDb2RlKSB7CiAgICAgICAgZi5jYWxsKHRoaXMsIGtleS5zdWJzdHJpbmcoMSksIHRoaXNba2V5XSk7CiAgICAgIH0KICAgIH0KICB9Cn0pOwoKdmFyIGQzX21hcF9wcmVmaXggPSAiXDAiLCAvLyBwcmV2ZW50IGNvbGxpc2lvbiB3aXRoIGJ1aWx0LWlucwogICAgZDNfbWFwX3ByZWZpeENvZGUgPSBkM19tYXBfcHJlZml4LmNoYXJDb2RlQXQoMCk7CmZ1bmN0aW9uIGQzX3RoaXMoKSB7CiAgcmV0dXJuIHRoaXM7Cn0KZDMuZnVuY3RvciA9IGZ1bmN0aW9uKHYpIHsKICByZXR1cm4gdHlwZW9mIHYgPT09ICJmdW5jdGlvbiIgPyB2IDogZnVuY3Rpb24oKSB7IHJldHVybiB2OyB9Owp9OwovLyBDb3BpZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgbWV0aG9kcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuCmQzLnJlYmluZCA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgdmFyIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgbWV0aG9kOwogIHdoaWxlICgrK2kgPCBuKSB0YXJnZXRbbWV0aG9kID0gYXJndW1lbnRzW2ldXSA9IGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgc291cmNlW21ldGhvZF0pOwogIHJldHVybiB0YXJnZXQ7Cn07CgovLyBNZXRob2QgaXMgYXNzdW1lZCB0byBiZSBhIHN0YW5kYXJkIEQzIGdldHRlci1zZXR0ZXI6Ci8vIElmIHBhc3NlZCB3aXRoIG5vIGFyZ3VtZW50cywgZ2V0cyB0aGUgdmFsdWUuCi8vIElmIHBhc3NlZCB3aXRoIGFyZ3VtZW50cywgc2V0cyB0aGUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHRhcmdldC4KZnVuY3Rpb24gZDNfcmViaW5kKHRhcmdldCwgc291cmNlLCBtZXRob2QpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdmFsdWUgPSBtZXRob2QuYXBwbHkoc291cmNlLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0YXJnZXQgOiB2YWx1ZTsKICB9Owp9CmQzLmFzY2VuZGluZyA9IGZ1bmN0aW9uKGEsIGIpIHsKICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47Cn07CmQzLmRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOOwp9OwpkMy5tZWFuID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICB2YXIgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgYSwKICAgICAgbSA9IDAsCiAgICAgIGkgPSAtMSwKICAgICAgaiA9IDA7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtYmVyKGEgPSBhcnJheVtpXSkpIG0gKz0gKGEgLSBtKSAvICsrajsKICB9IGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1iZXIoYSA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkgbSArPSAoYSAtIG0pIC8gKytqOwogIH0KICByZXR1cm4gaiA/IG0gOiB1bmRlZmluZWQ7Cn07CmQzLm1lZGlhbiA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSBhcnJheSA9IGFycmF5Lm1hcChmKTsKICBhcnJheSA9IGFycmF5LmZpbHRlcihkM19udW1iZXIpOwogIHJldHVybiBhcnJheS5sZW5ndGggPyBkMy5xdWFudGlsZShhcnJheS5zb3J0KGQzLmFzY2VuZGluZyksIC41KSA6IHVuZGVmaW5lZDsKfTsKZDMubWluID0gZnVuY3Rpb24oYXJyYXksIGYpIHsKICB2YXIgaSA9IC0xLAogICAgICBuID0gYXJyYXkubGVuZ3RoLAogICAgICBhLAogICAgICBiOwogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBhcnJheVtpXSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOwogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjsKICB9IGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpID09IG51bGwgfHwgYSAhPSBhKSkgYSA9IHVuZGVmaW5lZDsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7CiAgfQogIHJldHVybiBhOwp9OwpkMy5tYXggPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciBpID0gLTEsCiAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgIGEsCiAgICAgIGI7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGFycmF5W2ldKSA9PSBudWxsIHx8IGEgIT0gYSkpIGEgPSB1bmRlZmluZWQ7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiOwogIH0gZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbiAmJiAoKGEgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOwogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjsKICB9CiAgcmV0dXJuIGE7Cn07CmQzLmV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgYSwKICAgICAgYiwKICAgICAgYzsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgd2hpbGUgKCsraSA8IG4gJiYgKChhID0gYyA9IGFycmF5W2ldKSA9PSBudWxsIHx8IGEgIT0gYSkpIGEgPSBjID0gdW5kZWZpbmVkOwogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsKSB7CiAgICAgIGlmIChhID4gYikgYSA9IGI7CiAgICAgIGlmIChjIDwgYikgYyA9IGI7CiAgICB9CiAgfSBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuICYmICgoYSA9IGMgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgPT0gbnVsbCB8fCBhICE9IGEpKSBhID0gdW5kZWZpbmVkOwogICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsKSB7CiAgICAgIGlmIChhID4gYikgYSA9IGI7CiAgICAgIGlmIChjIDwgYikgYyA9IGI7CiAgICB9CiAgfQogIHJldHVybiBbYSwgY107Cn07CmQzLnJhbmRvbSA9IHsKICBub3JtYWw6IGZ1bmN0aW9uKG1lYW4sIGRldmlhdGlvbikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBkZXZpYXRpb24gPSAxOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSBtZWFuID0gMDsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHgsIHksIHI7CiAgICAgIGRvIHsKICAgICAgICB4ID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxOwogICAgICAgIHkgPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7CiAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7CiAgICAgIH0gd2hpbGUgKCFyIHx8IHIgPiAxKTsKICAgICAgcmV0dXJuIG1lYW4gKyBkZXZpYXRpb24gKiB4ICogTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocikgLyByKTsKICAgIH07CiAgfQp9OwpmdW5jdGlvbiBkM19udW1iZXIoeCkgewogIHJldHVybiB4ICE9IG51bGwgJiYgIWlzTmFOKHgpOwp9CmQzLnN1bSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIHMgPSAwLAogICAgICBuID0gYXJyYXkubGVuZ3RoLAogICAgICBhLAogICAgICBpID0gLTE7CgogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gK2FycmF5W2ldKSkgcyArPSBhOwogIH0gZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpc05hTihhID0gK2YuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkgcyArPSBhOwogIH0KCiAgcmV0dXJuIHM7Cn07Ci8vIFItNyBwZXIgPGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUXVhbnRpbGU+CmQzLnF1YW50aWxlID0gZnVuY3Rpb24odmFsdWVzLCBwKSB7CiAgdmFyIEggPSAodmFsdWVzLmxlbmd0aCAtIDEpICogcCArIDEsCiAgICAgIGggPSBNYXRoLmZsb29yKEgpLAogICAgICB2ID0gdmFsdWVzW2ggLSAxXSwKICAgICAgZSA9IEggLSBoOwogIHJldHVybiBlID8gdiArIGUgKiAodmFsdWVzW2hdIC0gdikgOiB2Owp9OwpkMy50cmFuc3Bvc2UgPSBmdW5jdGlvbihtYXRyaXgpIHsKICByZXR1cm4gZDMuemlwLmFwcGx5KGQzLCBtYXRyaXgpOwp9OwpkMy56aXAgPSBmdW5jdGlvbigpIHsKICBpZiAoIShuID0gYXJndW1lbnRzLmxlbmd0aCkpIHJldHVybiBbXTsKICBmb3IgKHZhciBpID0gLTEsIG0gPSBkMy5taW4oYXJndW1lbnRzLCBkM196aXBMZW5ndGgpLCB6aXBzID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgewogICAgZm9yICh2YXIgaiA9IC0xLCBuLCB6aXAgPSB6aXBzW2ldID0gbmV3IEFycmF5KG4pOyArK2ogPCBuOykgewogICAgICB6aXBbal0gPSBhcmd1bWVudHNbal1baV07CiAgICB9CiAgfQogIHJldHVybiB6aXBzOwp9OwoKZnVuY3Rpb24gZDNfemlwTGVuZ3RoKGQpIHsKICByZXR1cm4gZC5sZW5ndGg7Cn0KZDMuYmlzZWN0b3IgPSBmdW5jdGlvbihmKSB7CiAgcmV0dXJuIHsKICAgIGxlZnQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+IDE7CiAgICAgICAgaWYgKGYuY2FsbChhLCBhW21pZF0sIG1pZCkgPCB4KSBsbyA9IG1pZCArIDE7CiAgICAgICAgZWxzZSBoaSA9IG1pZDsKICAgICAgfQogICAgICByZXR1cm4gbG87CiAgICB9LAogICAgcmlnaHQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+IDE7CiAgICAgICAgaWYgKHggPCBmLmNhbGwoYSwgYVttaWRdLCBtaWQpKSBoaSA9IG1pZDsKICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgfQogICAgICByZXR1cm4gbG87CiAgICB9CiAgfTsKfTsKCnZhciBkM19iaXNlY3RvciA9IGQzLmJpc2VjdG9yKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ7IH0pOwpkMy5iaXNlY3RMZWZ0ID0gZDNfYmlzZWN0b3IubGVmdDsKZDMuYmlzZWN0ID0gZDMuYmlzZWN0UmlnaHQgPSBkM19iaXNlY3Rvci5yaWdodDsKZDMuZmlyc3QgPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciBpID0gMCwKICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgYSA9IGFycmF5WzBdLAogICAgICBiOwogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBmID0gZDMuYXNjZW5kaW5nOwogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBpZiAoZi5jYWxsKGFycmF5LCBhLCBiID0gYXJyYXlbaV0pID4gMCkgewogICAgICBhID0gYjsKICAgIH0KICB9CiAgcmV0dXJuIGE7Cn07CmQzLmxhc3QgPSBmdW5jdGlvbihhcnJheSwgZikgewogIHZhciBpID0gMCwKICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgYSA9IGFycmF5WzBdLAogICAgICBiOwogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBmID0gZDMuYXNjZW5kaW5nOwogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBpZiAoZi5jYWxsKGFycmF5LCBhLCBiID0gYXJyYXlbaV0pIDw9IDApIHsKICAgICAgYSA9IGI7CiAgICB9CiAgfQogIHJldHVybiBhOwp9OwpkMy5uZXN0ID0gZnVuY3Rpb24oKSB7CiAgdmFyIG5lc3QgPSB7fSwKICAgICAga2V5cyA9IFtdLAogICAgICBzb3J0S2V5cyA9IFtdLAogICAgICBzb3J0VmFsdWVzLAogICAgICByb2xsdXA7CgogIGZ1bmN0aW9uIG1hcChhcnJheSwgZGVwdGgpIHsKICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHJvbGx1cAogICAgICAgID8gcm9sbHVwLmNhbGwobmVzdCwgYXJyYXkpIDogKHNvcnRWYWx1ZXMKICAgICAgICA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykKICAgICAgICA6IGFycmF5KTsKCiAgICB2YXIgaSA9IC0xLAogICAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwKICAgICAgICBrZXlWYWx1ZSwKICAgICAgICBvYmplY3QsCiAgICAgICAgdmFsdWVzQnlLZXkgPSBuZXcgZDNfTWFwLAogICAgICAgIHZhbHVlcywKICAgICAgICBvID0ge307CgogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaWYgKHZhbHVlcyA9IHZhbHVlc0J5S2V5LmdldChrZXlWYWx1ZSA9IGtleShvYmplY3QgPSBhcnJheVtpXSkpKSB7CiAgICAgICAgdmFsdWVzLnB1c2gob2JqZWN0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZXNCeUtleS5zZXQoa2V5VmFsdWUsIFtvYmplY3RdKTsKICAgICAgfQogICAgfQoKICAgIHZhbHVlc0J5S2V5LmZvckVhY2goZnVuY3Rpb24oa2V5VmFsdWUpIHsKICAgICAgb1trZXlWYWx1ZV0gPSBtYXAodmFsdWVzQnlLZXkuZ2V0KGtleVZhbHVlKSwgZGVwdGgpOwogICAgfSk7CgogICAgcmV0dXJuIG87CiAgfQoKICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHsKICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIG1hcDsKCiAgICB2YXIgYSA9IFtdLAogICAgICAgIHNvcnRLZXkgPSBzb3J0S2V5c1tkZXB0aCsrXSwKICAgICAgICBrZXk7CgogICAgZm9yIChrZXkgaW4gbWFwKSB7CiAgICAgIGEucHVzaCh7a2V5OiBrZXksIHZhbHVlczogZW50cmllcyhtYXBba2V5XSwgZGVwdGgpfSk7CiAgICB9CgogICAgaWYgKHNvcnRLZXkpIGEuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgIHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7CiAgICB9KTsKCiAgICByZXR1cm4gYTsKICB9CgogIG5lc3QubWFwID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgIHJldHVybiBtYXAoYXJyYXksIDApOwogIH07CgogIG5lc3QuZW50cmllcyA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICByZXR1cm4gZW50cmllcyhtYXAoYXJyYXksIDApLCAwKTsKICB9OwoKICBuZXN0LmtleSA9IGZ1bmN0aW9uKGQpIHsKICAgIGtleXMucHVzaChkKTsKICAgIHJldHVybiBuZXN0OwogIH07CgogIC8vIFNwZWNpZmllcyB0aGUgb3JkZXIgZm9yIHRoZSBtb3N0LXJlY2VudGx5IHNwZWNpZmllZCBrZXkuCiAgLy8gTm90ZTogb25seSBhcHBsaWVzIHRvIGVudHJpZXMuIE1hcCBrZXlzIGFyZSB1bm9yZGVyZWQhCiAgbmVzdC5zb3J0S2V5cyA9IGZ1bmN0aW9uKG9yZGVyKSB7CiAgICBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7CiAgICByZXR1cm4gbmVzdDsKICB9OwoKICAvLyBTcGVjaWZpZXMgdGhlIG9yZGVyIGZvciBsZWFmIHZhbHVlcy4KICAvLyBBcHBsaWVzIHRvIGJvdGggbWFwcyBhbmQgZW50cmllcyBhcnJheS4KICBuZXN0LnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihvcmRlcikgewogICAgc29ydFZhbHVlcyA9IG9yZGVyOwogICAgcmV0dXJuIG5lc3Q7CiAgfTsKCiAgbmVzdC5yb2xsdXAgPSBmdW5jdGlvbihmKSB7CiAgICByb2xsdXAgPSBmOwogICAgcmV0dXJuIG5lc3Q7CiAgfTsKCiAgcmV0dXJuIG5lc3Q7Cn07CmQzLmtleXMgPSBmdW5jdGlvbihtYXApIHsKICB2YXIga2V5cyA9IFtdOwogIGZvciAodmFyIGtleSBpbiBtYXApIGtleXMucHVzaChrZXkpOwogIHJldHVybiBrZXlzOwp9OwpkMy52YWx1ZXMgPSBmdW5jdGlvbihtYXApIHsKICB2YXIgdmFsdWVzID0gW107CiAgZm9yICh2YXIga2V5IGluIG1hcCkgdmFsdWVzLnB1c2gobWFwW2tleV0pOwogIHJldHVybiB2YWx1ZXM7Cn07CmQzLmVudHJpZXMgPSBmdW5jdGlvbihtYXApIHsKICB2YXIgZW50cmllcyA9IFtdOwogIGZvciAodmFyIGtleSBpbiBtYXApIGVudHJpZXMucHVzaCh7a2V5OiBrZXksIHZhbHVlOiBtYXBba2V5XX0pOwogIHJldHVybiBlbnRyaWVzOwp9OwpkMy5wZXJtdXRlID0gZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHsKICB2YXIgcGVybXV0ZXMgPSBbXSwKICAgICAgaSA9IC0xLAogICAgICBuID0gaW5kZXhlcy5sZW5ndGg7CiAgd2hpbGUgKCsraSA8IG4pIHBlcm11dGVzW2ldID0gYXJyYXlbaW5kZXhlc1tpXV07CiAgcmV0dXJuIHBlcm11dGVzOwp9OwpkMy5tZXJnZSA9IGZ1bmN0aW9uKGFycmF5cykgewogIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnJheXMpOwp9OwpkMy5zcGxpdCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7CiAgdmFyIGFycmF5cyA9IFtdLAogICAgICB2YWx1ZXMgPSBbXSwKICAgICAgdmFsdWUsCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IGFycmF5Lmxlbmd0aDsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGYgPSBkM19zcGxpdHRlcjsKICB3aGlsZSAoKytpIDwgbikgewogICAgaWYgKGYuY2FsbCh2YWx1ZXMsIHZhbHVlID0gYXJyYXlbaV0sIGkpKSB7CiAgICAgIHZhbHVlcyA9IFtdOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSBhcnJheXMucHVzaCh2YWx1ZXMpOwogICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICB9CiAgfQogIHJldHVybiBhcnJheXM7Cn07CgpmdW5jdGlvbiBkM19zcGxpdHRlcihkKSB7CiAgcmV0dXJuIGQgPT0gbnVsbDsKfQpmdW5jdGlvbiBkM19jb2xsYXBzZShzKSB7CiAgcmV0dXJuIHMucmVwbGFjZSgvKF5ccyspfChccyskKS9nLCAiIikucmVwbGFjZSgvXHMrL2csICIgIik7Cn0KZDMucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgewogICAgc3RlcCA9IDE7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgc3RvcCA9IHN0YXJ0OwogICAgICBzdGFydCA9IDA7CiAgICB9CiAgfQogIGlmICgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXAgPT09IEluZmluaXR5KSB0aHJvdyBuZXcgRXJyb3IoImluZmluaXRlIHJhbmdlIik7CiAgdmFyIHJhbmdlID0gW10sCiAgICAgICBrID0gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKE1hdGguYWJzKHN0ZXApKSwKICAgICAgIGkgPSAtMSwKICAgICAgIGo7CiAgc3RhcnQgKj0gaywgc3RvcCAqPSBrLCBzdGVwICo9IGs7CiAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKGogPSBzdGFydCArIHN0ZXAgKiArK2kpID4gc3RvcCkgcmFuZ2UucHVzaChqIC8gayk7CiAgZWxzZSB3aGlsZSAoKGogPSBzdGFydCArIHN0ZXAgKiArK2kpIDwgc3RvcCkgcmFuZ2UucHVzaChqIC8gayk7CiAgcmV0dXJuIHJhbmdlOwp9OwoKZnVuY3Rpb24gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKHgpIHsKICB2YXIgayA9IDE7CiAgd2hpbGUgKHggKiBrICUgMSkgayAqPSAxMDsKICByZXR1cm4gazsKfQpkMy5yZXF1b3RlID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzLnJlcGxhY2UoZDNfcmVxdW90ZV9yZSwgIlxcJCYiKTsKfTsKCnZhciBkM19yZXF1b3RlX3JlID0gL1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nOwpkMy5yb3VuZCA9IGZ1bmN0aW9uKHgsIG4pIHsKICByZXR1cm4gbgogICAgICA/IE1hdGgucm91bmQoeCAqIChuID0gTWF0aC5wb3coMTAsIG4pKSkgLyBuCiAgICAgIDogTWF0aC5yb3VuZCh4KTsKfTsKZDMueGhyID0gZnVuY3Rpb24odXJsLCBtaW1lLCBjYWxsYmFjaykgewogIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBjYWxsYmFjayA9IG1pbWUsIG1pbWUgPSBudWxsOwogIGVsc2UgaWYgKG1pbWUgJiYgcmVxLm92ZXJyaWRlTWltZVR5cGUpIHJlcS5vdmVycmlkZU1pbWVUeXBlKG1pbWUpOwogIHJlcS5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOwogIGlmIChtaW1lKSByZXEuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IiwgbWltZSk7CiAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0KSBjYWxsYmFjayhyZXEuc3RhdHVzIDwgMzAwID8gcmVxIDogbnVsbCk7CiAgfTsKICByZXEuc2VuZChudWxsKTsKfTsKZDMudGV4dCA9IGZ1bmN0aW9uKHVybCwgbWltZSwgY2FsbGJhY2spIHsKICBmdW5jdGlvbiByZWFkeShyZXEpIHsKICAgIGNhbGxiYWNrKHJlcSAmJiByZXEucmVzcG9uc2VUZXh0KTsKICB9CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICBjYWxsYmFjayA9IG1pbWU7CiAgICBtaW1lID0gbnVsbDsKICB9CiAgZDMueGhyKHVybCwgbWltZSwgcmVhZHkpOwp9OwpkMy5qc29uID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykgewogIGQzLnRleHQodXJsLCAiYXBwbGljYXRpb24vanNvbiIsIGZ1bmN0aW9uKHRleHQpIHsKICAgIGNhbGxiYWNrKHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDogbnVsbCk7CiAgfSk7Cn07CmQzLmh0bWwgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgZDMudGV4dCh1cmwsICJ0ZXh0L2h0bWwiLCBmdW5jdGlvbih0ZXh0KSB7CiAgICBpZiAodGV4dCAhPSBudWxsKSB7IC8vIFRyZWF0IGVtcHR5IHN0cmluZyBhcyB2YWxpZCBIVE1MLgogICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICByYW5nZS5zZWxlY3ROb2RlKGRvY3VtZW50LmJvZHkpOwogICAgICB0ZXh0ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRleHQpOwogICAgfQogICAgY2FsbGJhY2sodGV4dCk7CiAgfSk7Cn07CmQzLnhtbCA9IGZ1bmN0aW9uKHVybCwgbWltZSwgY2FsbGJhY2spIHsKICBmdW5jdGlvbiByZWFkeShyZXEpIHsKICAgIGNhbGxiYWNrKHJlcSAmJiByZXEucmVzcG9uc2VYTUwpOwogIH0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsKICAgIGNhbGxiYWNrID0gbWltZTsKICAgIG1pbWUgPSBudWxsOwogIH0KICBkMy54aHIodXJsLCBtaW1lLCByZWFkeSk7Cn07CnZhciBkM19uc1ByZWZpeCA9IHsKICBzdmc6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgeGh0bWw6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwKICB4bGluazogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLAogIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKfTsKCmQzLm5zID0gewogIHByZWZpeDogZDNfbnNQcmVmaXgsCiAgcXVhbGlmeTogZnVuY3Rpb24obmFtZSkgewogICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoIjoiKSwKICAgICAgICBwcmVmaXggPSBuYW1lOwogICAgaWYgKGkgPj0gMCkgewogICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpKTsKICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGkgKyAxKTsKICAgIH0KICAgIHJldHVybiBkM19uc1ByZWZpeC5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpCiAgICAgICAgPyB7c3BhY2U6IGQzX25zUHJlZml4W3ByZWZpeF0sIGxvY2FsOiBuYW1lfQogICAgICAgIDogbmFtZTsKICB9Cn07CmQzLmRpc3BhdGNoID0gZnVuY3Rpb24oKSB7CiAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoLAogICAgICBpID0gLTEsCiAgICAgIG4gPSBhcmd1bWVudHMubGVuZ3RoOwogIHdoaWxlICgrK2kgPCBuKSBkaXNwYXRjaFthcmd1bWVudHNbaV1dID0gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpOwogIHJldHVybiBkaXNwYXRjaDsKfTsKCmZ1bmN0aW9uIGQzX2Rpc3BhdGNoKCkge30KCmQzX2Rpc3BhdGNoLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7CiAgdmFyIGkgPSB0eXBlLmluZGV4T2YoIi4iKSwKICAgICAgbmFtZSA9ICIiOwoKICAvLyBFeHRyYWN0IG9wdGlvbmFsIG5hbWVzcGFjZSwgZS5nLiwgImNsaWNrLmZvbyIKICBpZiAoaSA+IDApIHsKICAgIG5hbWUgPSB0eXBlLnN1YnN0cmluZyhpICsgMSk7CiAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgaSk7CiAgfQoKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIKICAgICAgPyB0aGlzW3R5cGVdLm9uKG5hbWUpCiAgICAgIDogdGhpc1t0eXBlXS5vbihuYW1lLCBsaXN0ZW5lcik7Cn07CgpmdW5jdGlvbiBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCkgewogIHZhciBsaXN0ZW5lcnMgPSBbXSwKICAgICAgbGlzdGVuZXJCeU5hbWUgPSBuZXcgZDNfTWFwOwoKICBmdW5jdGlvbiBldmVudCgpIHsKICAgIHZhciB6ID0gbGlzdGVuZXJzLCAvLyBkZWZlbnNpdmUgcmVmZXJlbmNlCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSB6Lmxlbmd0aCwKICAgICAgICBsOwogICAgd2hpbGUgKCsraSA8IG4pIGlmIChsID0geltpXS5vbikgbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGRpc3BhdGNoOwogIH0KCiAgZXZlbnQub24gPSBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikgewogICAgdmFyIGwgPSBsaXN0ZW5lckJ5TmFtZS5nZXQobmFtZSksCiAgICAgICAgaTsKCiAgICAvLyByZXR1cm4gdGhlIGN1cnJlbnQgbGlzdGVuZXIsIGlmIGFueQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gbCAmJiBsLm9uOwoKICAgIC8vIHJlbW92ZSB0aGUgb2xkIGxpc3RlbmVyLCBpZiBhbnkgKHdpdGggY29weS1vbi13cml0ZSkKICAgIGlmIChsKSB7CiAgICAgIGwub24gPSBudWxsOwogICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCwgaSA9IGxpc3RlbmVycy5pbmRleE9mKGwpKS5jb25jYXQobGlzdGVuZXJzLnNsaWNlKGkgKyAxKSk7CiAgICAgIGxpc3RlbmVyQnlOYW1lLnJlbW92ZShuYW1lKTsKICAgIH0KCiAgICAvLyBhZGQgdGhlIG5ldyBsaXN0ZW5lciwgaWYgYW55CiAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyQnlOYW1lLnNldChuYW1lLCB7b246IGxpc3RlbmVyfSkpOwoKICAgIHJldHVybiBkaXNwYXRjaDsKICB9OwoKICByZXR1cm4gZXZlbnQ7Cn0KLy8gVE9ETyBhbGlnbgpkMy5mb3JtYXQgPSBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICB2YXIgbWF0Y2ggPSBkM19mb3JtYXRfcmUuZXhlYyhzcGVjaWZpZXIpLAogICAgICBmaWxsID0gbWF0Y2hbMV0gfHwgIiAiLAogICAgICBzaWduID0gbWF0Y2hbM10gfHwgIiIsCiAgICAgIHpmaWxsID0gbWF0Y2hbNV0sCiAgICAgIHdpZHRoID0gK21hdGNoWzZdLAogICAgICBjb21tYSA9IG1hdGNoWzddLAogICAgICBwcmVjaXNpb24gPSBtYXRjaFs4XSwKICAgICAgdHlwZSA9IG1hdGNoWzldLAogICAgICBzY2FsZSA9IDEsCiAgICAgIHN1ZmZpeCA9ICIiLAogICAgICBpbnRlZ2VyID0gZmFsc2U7CgogIGlmIChwcmVjaXNpb24pIHByZWNpc2lvbiA9ICtwcmVjaXNpb24uc3Vic3RyaW5nKDEpOwoKICBpZiAoemZpbGwpIHsKICAgIGZpbGwgPSAiMCI7IC8vIFRPRE8gYWxpZ24gPSAiPSI7CiAgICBpZiAoY29tbWEpIHdpZHRoIC09IE1hdGguZmxvb3IoKHdpZHRoIC0gMSkgLyA0KTsKICB9CgogIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSAibiI6IGNvbW1hID0gdHJ1ZTsgdHlwZSA9ICJnIjsgYnJlYWs7CiAgICBjYXNlICIlIjogc2NhbGUgPSAxMDA7IHN1ZmZpeCA9ICIlIjsgdHlwZSA9ICJmIjsgYnJlYWs7CiAgICBjYXNlICJwIjogc2NhbGUgPSAxMDA7IHN1ZmZpeCA9ICIlIjsgdHlwZSA9ICJyIjsgYnJlYWs7CiAgICBjYXNlICJkIjogaW50ZWdlciA9IHRydWU7IHByZWNpc2lvbiA9IDA7IGJyZWFrOwogICAgY2FzZSAicyI6IHNjYWxlID0gLTE7IHR5cGUgPSAiciI7IGJyZWFrOwogIH0KCiAgLy8gSWYgbm8gcHJlY2lzaW9uIGlzIHNwZWNpZmllZCBmb3IgciwgZmFsbGJhY2sgdG8gZ2VuZXJhbCBub3RhdGlvbi4KICBpZiAodHlwZSA9PSAiciIgJiYgIXByZWNpc2lvbikgdHlwZSA9ICJnIjsKCiAgdHlwZSA9IGQzX2Zvcm1hdF90eXBlcy5nZXQodHlwZSkgfHwgZDNfZm9ybWF0X3R5cGVEZWZhdWx0OwoKICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKCiAgICAvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBmb3IgZmxvYXRzIGZvcm1hdHRlZCBhcyBpbnRzLgogICAgaWYgKGludGVnZXIgJiYgKHZhbHVlICUgMSkpIHJldHVybiAiIjsKCiAgICAvLyBDb252ZXJ0IG5lZ2F0aXZlIHRvIHBvc2l0aXZlLCBhbmQgcmVjb3JkIHRoZSBzaWduIHByZWZpeC4KICAgIHZhciBuZWdhdGl2ZSA9ICh2YWx1ZSA8IDApICYmICh2YWx1ZSA9IC12YWx1ZSkgPyAiXHUyMjEyIiA6IHNpZ247CgogICAgLy8gQXBwbHkgdGhlIHNjYWxlLCBjb21wdXRpbmcgaXQgZnJvbSB0aGUgdmFsdWUncyBleHBvbmVudCBmb3Igc2kgZm9ybWF0LgogICAgaWYgKHNjYWxlIDwgMCkgewogICAgICB2YXIgcHJlZml4ID0gZDMuZm9ybWF0UHJlZml4KHZhbHVlLCBwcmVjaXNpb24pOwogICAgICB2YWx1ZSAqPSBwcmVmaXguc2NhbGU7CiAgICAgIHN1ZmZpeCA9IHByZWZpeC5zeW1ib2w7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSAqPSBzY2FsZTsKICAgIH0KCiAgICAvLyBDb252ZXJ0IHRvIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KICAgIHZhbHVlID0gdHlwZSh2YWx1ZSwgcHJlY2lzaW9uKTsKCiAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgMCwgdGhlIHNpZ24gYW5kIGdyb3VwIGlzIGFwcGxpZWQgYWZ0ZXIgdGhlIGZpbGwuCiAgICBpZiAoemZpbGwpIHsKICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCArIG5lZ2F0aXZlLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aCA8IHdpZHRoKSB2YWx1ZSA9IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyB2YWx1ZTsKICAgICAgaWYgKGNvbW1hKSB2YWx1ZSA9IGQzX2Zvcm1hdF9ncm91cCh2YWx1ZSk7CiAgICAgIHZhbHVlID0gbmVnYXRpdmUgKyB2YWx1ZTsKICAgIH0KCiAgICAvLyBPdGhlcndpc2UgKGUuZy4sIHNwYWNlLWZpbGxpbmcpLCB0aGUgc2lnbiBhbmQgZ3JvdXAgaXMgYXBwbGllZCBiZWZvcmUuCiAgICBlbHNlIHsKICAgICAgaWYgKGNvbW1hKSB2YWx1ZSA9IGQzX2Zvcm1hdF9ncm91cCh2YWx1ZSk7CiAgICAgIHZhbHVlID0gbmVnYXRpdmUgKyB2YWx1ZTsKICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aCA8IHdpZHRoKSB2YWx1ZSA9IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyB2YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gdmFsdWUgKyBzdWZmaXg7CiAgfTsKfTsKCi8vIFtbZmlsbF1hbGlnbl1bc2lnbl1bI11bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdCnZhciBkM19mb3JtYXRfcmUgPSAvKD86KFtee10pPyhbPD49Xl0pKT8oWytcLSBdKT8oIyk/KDApPyhbMC05XSspPygsKT8oXC5bMC05XSspPyhbYS16QS1aJV0pPy87Cgp2YXIgZDNfZm9ybWF0X3R5cGVzID0gZDMubWFwKHsKICBnOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvUHJlY2lzaW9uKHApOyB9LAogIGU6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTsgfSwKICBmOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRml4ZWQocCk7IH0sCiAgcjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gZDMucm91bmQoeCwgcCA9IGQzX2Zvcm1hdF9wcmVjaXNpb24oeCwgcCkpLnRvRml4ZWQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHApKSk7IH0KfSk7CgpmdW5jdGlvbiBkM19mb3JtYXRfcHJlY2lzaW9uKHgsIHApIHsKICByZXR1cm4gcCAtICh4ID8gMSArIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIE1hdGgucG93KDEwLCAxICsgTWF0aC5mbG9vcihNYXRoLmxvZyh4KSAvIE1hdGguTE4xMCkgLSBwKSkgLyBNYXRoLkxOMTApIDogMSk7Cn0KCmZ1bmN0aW9uIGQzX2Zvcm1hdF90eXBlRGVmYXVsdCh4KSB7CiAgcmV0dXJuIHggKyAiIjsKfQoKLy8gQXBwbHkgY29tbWEgZ3JvdXBpbmcgZm9yIHRob3VzYW5kcy4KZnVuY3Rpb24gZDNfZm9ybWF0X2dyb3VwKHZhbHVlKSB7CiAgdmFyIGkgPSB2YWx1ZS5sYXN0SW5kZXhPZigiLiIpLAogICAgICBmID0gaSA+PSAwID8gdmFsdWUuc3Vic3RyaW5nKGkpIDogKGkgPSB2YWx1ZS5sZW5ndGgsICIiKSwKICAgICAgdCA9IFtdOwogIHdoaWxlIChpID4gMCkgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IDMsIGkgKyAzKSk7CiAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4oIiwiKSArIGY7Cn0KdmFyIGQzX2Zvcm1hdFByZWZpeGVzID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLOvCIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLm1hcChkM19mb3JtYXRQcmVmaXgpOwoKZDMuZm9ybWF0UHJlZml4ID0gZnVuY3Rpb24odmFsdWUsIHByZWNpc2lvbikgewogIHZhciBpID0gMDsKICBpZiAodmFsdWUpIHsKICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlICo9IC0xOwogICAgaWYgKHByZWNpc2lvbikgdmFsdWUgPSBkMy5yb3VuZCh2YWx1ZSwgZDNfZm9ybWF0X3ByZWNpc2lvbih2YWx1ZSwgcHJlY2lzaW9uKSk7CiAgICBpID0gMSArIE1hdGguZmxvb3IoMWUtMTIgKyBNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMTApOwogICAgaSA9IE1hdGgubWF4KC0yNCwgTWF0aC5taW4oMjQsIE1hdGguZmxvb3IoKGkgPD0gMCA/IGkgKyAxIDogaSAtIDEpIC8gMykgKiAzKSk7CiAgfQogIHJldHVybiBkM19mb3JtYXRQcmVmaXhlc1s4ICsgaSAvIDNdOwp9OwoKZnVuY3Rpb24gZDNfZm9ybWF0UHJlZml4KGQsIGkpIHsKICByZXR1cm4gewogICAgc2NhbGU6IE1hdGgucG93KDEwLCAoOCAtIGkpICogMyksCiAgICBzeW1ib2w6IGQKICB9Owp9CgovKgogKiBURVJNUyBPRiBVU0UgLSBFQVNJTkcgRVFVQVRJT05TCiAqCiAqIE9wZW4gc291cmNlIHVuZGVyIHRoZSBCU0QgTGljZW5zZS4KICoKICogQ29weXJpZ2h0IDIwMDEgUm9iZXJ0IFBlbm5lcgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KICogICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYwogKiAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCiAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCiAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCiAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCiAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCnZhciBkM19lYXNlX3F1YWQgPSBkM19lYXNlX3BvbHkoMiksCiAgICBkM19lYXNlX2N1YmljID0gZDNfZWFzZV9wb2x5KDMpLAogICAgZDNfZWFzZV9kZWZhdWx0ID0gZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2lkZW50aXR5OyB9OwoKdmFyIGQzX2Vhc2UgPSBkMy5tYXAoewogIGxpbmVhcjogZDNfZWFzZV9kZWZhdWx0LAogIHBvbHk6IGQzX2Vhc2VfcG9seSwKICBxdWFkOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfcXVhZDsgfSwKICBjdWJpYzogZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX2N1YmljOyB9LAogIHNpbjogZnVuY3Rpb24oKSB7IHJldHVybiBkM19lYXNlX3NpbjsgfSwKICBleHA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZDNfZWFzZV9leHA7IH0sCiAgY2lyY2xlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfY2lyY2xlOyB9LAogIGVsYXN0aWM6IGQzX2Vhc2VfZWxhc3RpYywKICBiYWNrOiBkM19lYXNlX2JhY2ssCiAgYm91bmNlOiBmdW5jdGlvbigpIHsgcmV0dXJuIGQzX2Vhc2VfYm91bmNlOyB9Cn0pOwoKdmFyIGQzX2Vhc2VfbW9kZSA9IGQzLm1hcCh7CiAgImluIjogZDNfZWFzZV9pZGVudGl0eSwKICAib3V0IjogZDNfZWFzZV9yZXZlcnNlLAogICJpbi1vdXQiOiBkM19lYXNlX3JlZmxlY3QsCiAgIm91dC1pbiI6IGZ1bmN0aW9uKGYpIHsgcmV0dXJuIGQzX2Vhc2VfcmVmbGVjdChkM19lYXNlX3JldmVyc2UoZikpOyB9Cn0pOwoKZDMuZWFzZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICB2YXIgaSA9IG5hbWUuaW5kZXhPZigiLSIpLAogICAgICB0ID0gaSA+PSAwID8gbmFtZS5zdWJzdHJpbmcoMCwgaSkgOiBuYW1lLAogICAgICBtID0gaSA+PSAwID8gbmFtZS5zdWJzdHJpbmcoaSArIDEpIDogImluIjsKICB0ID0gZDNfZWFzZS5nZXQodCkgfHwgZDNfZWFzZV9kZWZhdWx0OwogIG0gPSBkM19lYXNlX21vZGUuZ2V0KG0pIHx8IGQzX2Vhc2VfaWRlbnRpdHk7CiAgcmV0dXJuIGQzX2Vhc2VfY2xhbXAobSh0LmFwcGx5KG51bGwsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpKSk7Cn07CgpmdW5jdGlvbiBkM19lYXNlX2NsYW1wKGYpIHsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgcmV0dXJuIHQgPD0gMCA/IDAgOiB0ID49IDEgPyAxIDogZih0KTsKICB9Owp9CgpmdW5jdGlvbiBkM19lYXNlX3JldmVyc2UoZikgewogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gMSAtIGYoMSAtIHQpOwogIH07Cn0KCmZ1bmN0aW9uIGQzX2Vhc2VfcmVmbGVjdChmKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiAuNSAqICh0IDwgLjUgPyBmKDIgKiB0KSA6ICgyIC0gZigyIC0gMiAqIHQpKSk7CiAgfTsKfQoKZnVuY3Rpb24gZDNfZWFzZV9pZGVudGl0eSh0KSB7CiAgcmV0dXJuIHQ7Cn0KCmZ1bmN0aW9uIGQzX2Vhc2VfcG9seShlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiBNYXRoLnBvdyh0LCBlKTsKICB9Owp9CgpmdW5jdGlvbiBkM19lYXNlX3Npbih0KSB7CiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogTWF0aC5QSSAvIDIpOwp9CgpmdW5jdGlvbiBkM19lYXNlX2V4cCh0KSB7CiAgcmV0dXJuIE1hdGgucG93KDIsIDEwICogKHQgLSAxKSk7Cn0KCmZ1bmN0aW9uIGQzX2Vhc2VfY2lyY2xlKHQpIHsKICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpOwp9CgpmdW5jdGlvbiBkM19lYXNlX2VsYXN0aWMoYSwgcCkgewogIHZhciBzOwogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcCA9IDAuNDU7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7IGEgPSAxOyBzID0gcCAvIDQ7IH0KICBlbHNlIHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiAxICsgYSAqIE1hdGgucG93KDIsIDEwICogLXQpICogTWF0aC5zaW4oKHQgLSBzKSAqIDIgKiBNYXRoLlBJIC8gcCk7CiAgfTsKfQoKZnVuY3Rpb24gZDNfZWFzZV9iYWNrKHMpIHsKICBpZiAoIXMpIHMgPSAxLjcwMTU4OwogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsKICB9Owp9CgpmdW5jdGlvbiBkM19lYXNlX2JvdW5jZSh0KSB7CiAgcmV0dXJuIHQgPCAxIC8gMi43NSA/IDcuNTYyNSAqIHQgKiB0CiAgICAgIDogdCA8IDIgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMS41IC8gMi43NSkgKiB0ICsgLjc1CiAgICAgIDogdCA8IDIuNSAvIDIuNzUgPyA3LjU2MjUgKiAodCAtPSAyLjI1IC8gMi43NSkgKiB0ICsgLjkzNzUKICAgICAgOiA3LjU2MjUgKiAodCAtPSAyLjYyNSAvIDIuNzUpICogdCArIC45ODQzNzU7Cn0KZDMuZXZlbnQgPSBudWxsOwoKZnVuY3Rpb24gZDNfZXZlbnRDYW5jZWwoKSB7CiAgZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZDMuZXZlbnQucHJldmVudERlZmF1bHQoKTsKfQoKZnVuY3Rpb24gZDNfZXZlbnRTb3VyY2UoKSB7CiAgdmFyIGUgPSBkMy5ldmVudCwgczsKICB3aGlsZSAocyA9IGUuc291cmNlRXZlbnQpIGUgPSBzOwogIHJldHVybiBlOwp9CgovLyBMaWtlIGQzLmRpc3BhdGNoLCBidXQgZm9yIGN1c3RvbSBldmVudHMgYWJzdHJhY3RpbmcgbmF0aXZlIFVJIGV2ZW50cy4gVGhlc2UKLy8gZXZlbnRzIGhhdmUgYSB0YXJnZXQgY29tcG9uZW50IChzdWNoIGFzIGEgYnJ1c2gpLCBhIHRhcmdldCBlbGVtZW50IChzdWNoIGFzCi8vIHRoZSBzdmc6ZyBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGJydXNoKSBhbmQgdGhlIHN0YW5kYXJkIGFyZ3VtZW50cyBgZGAgKHRoZQovLyB0YXJnZXQgZWxlbWVudCdzIGRhdGEpIGFuZCBgaWAgKHRoZSBzZWxlY3Rpb24gaW5kZXggb2YgdGhlIHRhcmdldCBlbGVtZW50KS4KZnVuY3Rpb24gZDNfZXZlbnREaXNwYXRjaCh0YXJnZXQpIHsKICB2YXIgZGlzcGF0Y2ggPSBuZXcgZDNfZGlzcGF0Y2gsCiAgICAgIGkgPSAwLAogICAgICBuID0gYXJndW1lbnRzLmxlbmd0aDsKCiAgd2hpbGUgKCsraSA8IG4pIGRpc3BhdGNoW2FyZ3VtZW50c1tpXV0gPSBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCk7CgogIC8vIENyZWF0ZXMgYSBkaXNwYXRjaCBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIGB0aGl6YCAodHlwaWNhbGx5LCB0aGUgdGFyZ2V0CiAgLy8gRE9NIGVsZW1lbnQgdGhhdCByZWNlaXZlZCB0aGUgc291cmNlIGV2ZW50KSBhbmQgYGFyZ3VtZW50emAgKHR5cGljYWxseSwgdGhlCiAgLy8gZGF0YSBgZGAgYW5kIGluZGV4IGBpYCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQpLiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gY2FuIGJlCiAgLy8gdXNlZCB0byBkaXNwYXRjaCBhbiBldmVudCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnM7IHRoZSBmdW5jdGlvbiB0YWtlcyBhCiAgLy8gc2luZ2xlIGFyZ3VtZW50IGFzIGlucHV0LCBiZWluZyB0aGUgZXZlbnQgdG8gZGlzcGF0Y2guIFRoZSBldmVudCBtdXN0IGhhdmUKICAvLyBhICJ0eXBlIiBhdHRyaWJ1dGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gYSB0eXBlIHJlZ2lzdGVyZWQgaW4gdGhlCiAgLy8gY29uc3RydWN0b3IuIFRoaXMgY29udGV4dCB3aWxsIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGUgdGhlICJzb3VyY2VFdmVudCIgYW5kCiAgLy8gInRhcmdldCIgYXR0cmlidXRlcyBvZiB0aGUgZXZlbnQsIGFzIHdlbGwgYXMgc2V0dGluZyB0aGUgYGQzLmV2ZW50YCBnbG9iYWwKICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBub3RpZmljYXRpb24uCiAgZGlzcGF0Y2gub2YgPSBmdW5jdGlvbih0aGl6LCBhcmd1bWVudHopIHsKICAgIHJldHVybiBmdW5jdGlvbihlMSkgewogICAgICB0cnkgewogICAgICAgIHZhciBlMCA9CiAgICAgICAgZTEuc291cmNlRXZlbnQgPSBkMy5ldmVudDsKICAgICAgICBlMS50YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgZDMuZXZlbnQgPSBlMTsKICAgICAgICBkaXNwYXRjaFtlMS50eXBlXS5hcHBseSh0aGl6LCBhcmd1bWVudHopOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGQzLmV2ZW50ID0gZTA7CiAgICAgIH0KICAgIH07CiAgfTsKCiAgcmV0dXJuIGRpc3BhdGNoOwp9CmQzLmludGVycG9sYXRlID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBpID0gZDMuaW50ZXJwb2xhdG9ycy5sZW5ndGgsIGY7CiAgd2hpbGUgKC0taSA+PSAwICYmICEoZiA9IGQzLmludGVycG9sYXRvcnNbaV0oYSwgYikpKTsKICByZXR1cm4gZjsKfTsKCmQzLmludGVycG9sYXRlTnVtYmVyID0gZnVuY3Rpb24oYSwgYikgewogIGIgLT0gYTsKICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gYSArIGIgKiB0OyB9Owp9OwoKZDMuaW50ZXJwb2xhdGVSb3VuZCA9IGZ1bmN0aW9uKGEsIGIpIHsKICBiIC09IGE7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTsgfTsKfTsKCmQzLmludGVycG9sYXRlU3RyaW5nID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBtLCAvLyBjdXJyZW50IG1hdGNoCiAgICAgIGksIC8vIGN1cnJlbnQgaW5kZXgKICAgICAgaiwgLy8gY3VycmVudCBpbmRleCAoZm9yIGNvYWxsZXNjaW5nKQogICAgICBzMCA9IDAsIC8vIHN0YXJ0IGluZGV4IG9mIGN1cnJlbnQgc3RyaW5nIHByZWZpeAogICAgICBzMSA9IDAsIC8vIGVuZCBpbmRleCBvZiBjdXJyZW50IHN0cmluZyBwcmVmaXgKICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKICAgICAgcSA9IFtdLCAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycwogICAgICBuLCAvLyBxLmxlbmd0aAogICAgICBvOwoKICAvLyBSZXNldCBvdXIgcmVndWxhciBleHByZXNzaW9uIQogIGQzX2ludGVycG9sYXRlX251bWJlci5sYXN0SW5kZXggPSAwOwoKICAvLyBGaW5kIGFsbCBudW1iZXJzIGluIGIuCiAgZm9yIChpID0gMDsgbSA9IGQzX2ludGVycG9sYXRlX251bWJlci5leGVjKGIpOyArK2kpIHsKICAgIGlmIChtLmluZGV4KSBzLnB1c2goYi5zdWJzdHJpbmcoczAsIHMxID0gbS5pbmRleCkpOwogICAgcS5wdXNoKHtpOiBzLmxlbmd0aCwgeDogbVswXX0pOwogICAgcy5wdXNoKG51bGwpOwogICAgczAgPSBkM19pbnRlcnBvbGF0ZV9udW1iZXIubGFzdEluZGV4OwogIH0KICBpZiAoczAgPCBiLmxlbmd0aCkgcy5wdXNoKGIuc3Vic3RyaW5nKHMwKSk7CgogIC8vIEZpbmQgYWxsIG51bWJlcnMgaW4gYS4KICBmb3IgKGkgPSAwLCBuID0gcS5sZW5ndGg7IChtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyLmV4ZWMoYSkpICYmIGkgPCBuOyArK2kpIHsKICAgIG8gPSBxW2ldOwogICAgaWYgKG8ueCA9PSBtWzBdKSB7IC8vIFRoZSBudW1iZXJzIG1hdGNoLCBzbyBjb2FsbGVzY2UuCiAgICAgIGlmIChvLmkpIHsKICAgICAgICBpZiAoc1tvLmkgKyAxXSA9PSBudWxsKSB7IC8vIFRoaXMgbWF0Y2ggaXMgZm9sbG93ZWQgYnkgYW5vdGhlciBudW1iZXIuCiAgICAgICAgICBzW28uaSAtIDFdICs9IG8ueDsKICAgICAgICAgIHMuc3BsaWNlKG8uaSwgMSk7CiAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IG47ICsraikgcVtqXS5pLS07CiAgICAgICAgfSBlbHNlIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhIHN0cmluZywgc28gY29hbGxlc2NlIHR3aWNlLgogICAgICAgICAgc1tvLmkgLSAxXSArPSBvLnggKyBzW28uaSArIDFdOwogICAgICAgICAgcy5zcGxpY2Uoby5pLCAyKTsKICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgKytqKSBxW2pdLmkgLT0gMjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc1tvLmkgKyAxXSA9PSBudWxsKSB7IC8vIFRoaXMgbWF0Y2ggaXMgZm9sbG93ZWQgYnkgYW5vdGhlciBudW1iZXIuCiAgICAgICAgICBzW28uaV0gPSBvLng7CiAgICAgICAgfSBlbHNlIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhIHN0cmluZywgc28gY29hbGxlc2NlIHR3aWNlLgogICAgICAgICAgc1tvLmldID0gby54ICsgc1tvLmkgKyAxXTsKICAgICAgICAgIHMuc3BsaWNlKG8uaSArIDEsIDEpOwogICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuOyArK2opIHFbal0uaS0tOwogICAgICAgIH0KICAgICAgfQogICAgICBxLnNwbGljZShpLCAxKTsKICAgICAgbi0tOwogICAgICBpLS07CiAgICB9IGVsc2UgewogICAgICBvLnggPSBkMy5pbnRlcnBvbGF0ZU51bWJlcihwYXJzZUZsb2F0KG1bMF0pLCBwYXJzZUZsb2F0KG8ueCkpOwogICAgfQogIH0KCiAgLy8gUmVtb3ZlIGFueSBudW1iZXJzIGluIGIgbm90IGZvdW5kIGluIGEuCiAgd2hpbGUgKGkgPCBuKSB7CiAgICBvID0gcS5wb3AoKTsKICAgIGlmIChzW28uaSArIDFdID09IG51bGwpIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhbm90aGVyIG51bWJlci4KICAgICAgc1tvLmldID0gby54OwogICAgfSBlbHNlIHsgLy8gVGhpcyBtYXRjaCBpcyBmb2xsb3dlZCBieSBhIHN0cmluZywgc28gY29hbGxlc2NlIHR3aWNlLgogICAgICBzW28uaV0gPSBvLnggKyBzW28uaSArIDFdOwogICAgICBzLnNwbGljZShvLmkgKyAxLCAxKTsKICAgIH0KICAgIG4tLTsKICB9CgogIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLgogIGlmIChzLmxlbmd0aCA9PT0gMSkgewogICAgcmV0dXJuIHNbMF0gPT0gbnVsbCA/IHFbMF0ueCA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gYjsgfTsKICB9CgogIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgIHJldHVybiBzLmpvaW4oIiIpOwogIH07Cn07CgpkMy5pbnRlcnBvbGF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uKGEsIGIpIHsKICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKICAgICAgcSA9IFtdLCAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycwogICAgICBuLAogICAgICBBID0gZDMudHJhbnNmb3JtKGEpLAogICAgICBCID0gZDMudHJhbnNmb3JtKGIpLAogICAgICB0YSA9IEEudHJhbnNsYXRlLAogICAgICB0YiA9IEIudHJhbnNsYXRlLAogICAgICByYSA9IEEucm90YXRlLAogICAgICByYiA9IEIucm90YXRlLAogICAgICB3YSA9IEEuc2tldywKICAgICAgd2IgPSBCLnNrZXcsCiAgICAgIGthID0gQS5zY2FsZSwKICAgICAga2IgPSBCLnNjYWxlOwoKICBpZiAodGFbMF0gIT0gdGJbMF0gfHwgdGFbMV0gIT0gdGJbMV0pIHsKICAgIHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsICIsIiwgbnVsbCwgIikiKTsKICAgIHEucHVzaCh7aTogMSwgeDogZDMuaW50ZXJwb2xhdGVOdW1iZXIodGFbMF0sIHRiWzBdKX0sIHtpOiAzLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcih0YVsxXSwgdGJbMV0pfSk7CiAgfSBlbHNlIGlmICh0YlswXSB8fCB0YlsxXSkgewogICAgcy5wdXNoKCJ0cmFuc2xhdGUoIiArIHRiICsgIikiKTsKICB9IGVsc2UgewogICAgcy5wdXNoKCIiKTsKICB9CgogIGlmIChyYSAhPSByYikgewogICAgcS5wdXNoKHtpOiBzLnB1c2gocy5wb3AoKSArICJyb3RhdGUoIiwgbnVsbCwgIikiKSAtIDIsIHg6IGQzLmludGVycG9sYXRlTnVtYmVyKHJhLCByYil9KTsKICB9IGVsc2UgaWYgKHJiKSB7CiAgICBzLnB1c2gocy5wb3AoKSArICJyb3RhdGUoIiArIHJiICsgIikiKTsKICB9CgogIGlmICh3YSAhPSB3YikgewogICAgcS5wdXNoKHtpOiBzLnB1c2gocy5wb3AoKSArICJza2V3WCgiLCBudWxsLCAiKSIpIC0gMiwgeDogZDMuaW50ZXJwb2xhdGVOdW1iZXIod2EsIHdiKX0pOwogIH0gZWxzZSBpZiAod2IpIHsKICAgIHMucHVzaChzLnBvcCgpICsgInNrZXdYKCIgKyB3YiArICIpIik7CiAgfQoKICBpZiAoa2FbMF0gIT0ga2JbMF0gfHwga2FbMV0gIT0ga2JbMV0pIHsKICAgIG4gPSBzLnB1c2gocy5wb3AoKSArICJzY2FsZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICBxLnB1c2goe2k6IG4gLSA0LCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcihrYVswXSwga2JbMF0pfSwge2k6IG4gLSAyLCB4OiBkMy5pbnRlcnBvbGF0ZU51bWJlcihrYVsxXSwga2JbMV0pfSk7CiAgfSBlbHNlIGlmIChrYlswXSAhPSAxIHx8IGtiWzFdICE9IDEpIHsKICAgIHMucHVzaChzLnBvcCgpICsgInNjYWxlKCIgKyBrYiArICIpIik7CiAgfQoKICBuID0gcS5sZW5ndGg7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHZhciBpID0gLTEsIG87CiAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgcmV0dXJuIHMuam9pbigiIik7CiAgfTsKfTsKCmQzLmludGVycG9sYXRlUmdiID0gZnVuY3Rpb24oYSwgYikgewogIGEgPSBkMy5yZ2IoYSk7CiAgYiA9IGQzLnJnYihiKTsKICB2YXIgYXIgPSBhLnIsCiAgICAgIGFnID0gYS5nLAogICAgICBhYiA9IGEuYiwKICAgICAgYnIgPSBiLnIgLSBhciwKICAgICAgYmcgPSBiLmcgLSBhZywKICAgICAgYmIgPSBiLmIgLSBhYjsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgcmV0dXJuICIjIgogICAgICAgICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFyICsgYnIgKiB0KSkKICAgICAgICArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhZyArIGJnICogdCkpCiAgICAgICAgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYWIgKyBiYiAqIHQpKTsKICB9Owp9OwoKLy8gaW50ZXJwb2xhdGVzIEhTTCBzcGFjZSwgYnV0IG91dHB1dHMgUkdCIHN0cmluZyAoZm9yIGNvbXBhdGliaWxpdHkpCmQzLmludGVycG9sYXRlSHNsID0gZnVuY3Rpb24oYSwgYikgewogIGEgPSBkMy5oc2woYSk7CiAgYiA9IGQzLmhzbChiKTsKICB2YXIgaDAgPSBhLmgsCiAgICAgIHMwID0gYS5zLAogICAgICBsMCA9IGEubCwKICAgICAgaDEgPSBiLmggLSBoMCwKICAgICAgczEgPSBiLnMgLSBzMCwKICAgICAgbDEgPSBiLmwgLSBsMDsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgcmV0dXJuIGQzX2hzbF9yZ2IoaDAgKyBoMSAqIHQsIHMwICsgczEgKiB0LCBsMCArIGwxICogdCkudG9TdHJpbmcoKTsKICB9Owp9OwoKZDMuaW50ZXJwb2xhdGVBcnJheSA9IGZ1bmN0aW9uKGEsIGIpIHsKICB2YXIgeCA9IFtdLAogICAgICBjID0gW10sCiAgICAgIG5hID0gYS5sZW5ndGgsCiAgICAgIG5iID0gYi5sZW5ndGgsCiAgICAgIG4wID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKSwKICAgICAgaTsKICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgeC5wdXNoKGQzLmludGVycG9sYXRlKGFbaV0sIGJbaV0pKTsKICBmb3IgKDsgaSA8IG5hOyArK2kpIGNbaV0gPSBhW2ldOwogIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuMDsgKytpKSBjW2ldID0geFtpXSh0KTsKICAgIHJldHVybiBjOwogIH07Cn07CgpkMy5pbnRlcnBvbGF0ZU9iamVjdCA9IGZ1bmN0aW9uKGEsIGIpIHsKICB2YXIgaSA9IHt9LAogICAgICBjID0ge30sCiAgICAgIGs7CiAgZm9yIChrIGluIGEpIHsKICAgIGlmIChrIGluIGIpIHsKICAgICAgaVtrXSA9IGQzX2ludGVycG9sYXRlQnlOYW1lKGspKGFba10sIGJba10pOwogICAgfSBlbHNlIHsKICAgICAgY1trXSA9IGFba107CiAgICB9CiAgfQogIGZvciAoayBpbiBiKSB7CiAgICBpZiAoIShrIGluIGEpKSB7CiAgICAgIGNba10gPSBiW2tdOwogICAgfQogIH0KICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpOwogICAgcmV0dXJuIGM7CiAgfTsKfQoKdmFyIGQzX2ludGVycG9sYXRlX251bWJlciA9IC9bLStdPyg/OlxkKlwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nOwoKZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVCeU5hbWUobikgewogIHJldHVybiBuID09ICJ0cmFuc2Zvcm0iCiAgICAgID8gZDMuaW50ZXJwb2xhdGVUcmFuc2Zvcm0KICAgICAgOiBkMy5pbnRlcnBvbGF0ZTsKfQoKZDMuaW50ZXJwb2xhdG9ycyA9IFsKICBkMy5pbnRlcnBvbGF0ZU9iamVjdCwKICBmdW5jdGlvbihhLCBiKSB7IHJldHVybiAoYiBpbnN0YW5jZW9mIEFycmF5KSAmJiBkMy5pbnRlcnBvbGF0ZUFycmF5KGEsIGIpOyB9LAogIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICh0eXBlb2YgYSA9PT0gInN0cmluZyIgfHwgdHlwZW9mIGIgPT09ICJzdHJpbmciKSAmJiBkMy5pbnRlcnBvbGF0ZVN0cmluZyhhICsgIiIsIGIgKyAiIik7IH0sCiAgZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gKHR5cGVvZiBiID09PSAic3RyaW5nIiA/IGQzX3JnYl9uYW1lcy5oYXMoYikgfHwgL14oI3xyZ2JcKHxoc2xcKCkvLnRlc3QoYikgOiBiIGluc3RhbmNlb2YgZDNfUmdiIHx8IGIgaW5zdGFuY2VvZiBkM19Ic2wpICYmIGQzLmludGVycG9sYXRlUmdiKGEsIGIpOyB9LAogIGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuICFpc05hTihhID0gK2EpICYmICFpc05hTihiID0gK2IpICYmIGQzLmludGVycG9sYXRlTnVtYmVyKGEsIGIpOyB9Cl07CmZ1bmN0aW9uIGQzX3VuaW50ZXJwb2xhdGVOdW1iZXIoYSwgYikgewogIGIgPSBiIC0gKGEgPSArYSkgPyAxIC8gKGIgLSBhKSA6IDA7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgKiBiOyB9Owp9CgpmdW5jdGlvbiBkM191bmludGVycG9sYXRlQ2xhbXAoYSwgYikgewogIGIgPSBiIC0gKGEgPSArYSkgPyAxIC8gKGIgLSBhKSA6IDA7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsICh4IC0gYSkgKiBiKSk7IH07Cn0KZDMucmdiID0gZnVuY3Rpb24ociwgZywgYikgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxCiAgICAgID8gKHIgaW5zdGFuY2VvZiBkM19SZ2IgPyBkM19yZ2Ioci5yLCByLmcsIHIuYikKICAgICAgOiBkM19yZ2JfcGFyc2UoIiIgKyByLCBkM19yZ2IsIGQzX2hzbF9yZ2IpKQogICAgICA6IGQzX3JnYih+fnIsIH5+Zywgfn5iKTsKfTsKCmZ1bmN0aW9uIGQzX3JnYihyLCBnLCBiKSB7CiAgcmV0dXJuIG5ldyBkM19SZ2IociwgZywgYik7Cn0KCmZ1bmN0aW9uIGQzX1JnYihyLCBnLCBiKSB7CiAgdGhpcy5yID0gcjsKICB0aGlzLmcgPSBnOwogIHRoaXMuYiA9IGI7Cn0KCmQzX1JnYi5wcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7CiAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsKICB2YXIgciA9IHRoaXMuciwKICAgICAgZyA9IHRoaXMuZywKICAgICAgYiA9IHRoaXMuYiwKICAgICAgaSA9IDMwOwogIGlmICghciAmJiAhZyAmJiAhYikgcmV0dXJuIGQzX3JnYihpLCBpLCBpKTsKICBpZiAociAmJiByIDwgaSkgciA9IGk7CiAgaWYgKGcgJiYgZyA8IGkpIGcgPSBpOwogIGlmIChiICYmIGIgPCBpKSBiID0gaTsKICByZXR1cm4gZDNfcmdiKAogICAgICBNYXRoLm1pbigyNTUsIE1hdGguZmxvb3IociAvIGspKSwKICAgICAgTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgLyBrKSksCiAgICAgIE1hdGgubWluKDI1NSwgTWF0aC5mbG9vcihiIC8gaykpKTsKfTsKCmQzX1JnYi5wcm90b3R5cGUuZGFya2VyID0gZnVuY3Rpb24oaykgewogIGsgPSBNYXRoLnBvdygwLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7CiAgcmV0dXJuIGQzX3JnYigKICAgICAgTWF0aC5mbG9vcihrICogdGhpcy5yKSwKICAgICAgTWF0aC5mbG9vcihrICogdGhpcy5nKSwKICAgICAgTWF0aC5mbG9vcihrICogdGhpcy5iKSk7Cn07CgpkM19SZ2IucHJvdG90eXBlLmhzbCA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBkM19yZ2JfaHNsKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpOwp9OwoKZDNfUmdiLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAiIyIgKyBkM19yZ2JfaGV4KHRoaXMucikgKyBkM19yZ2JfaGV4KHRoaXMuZykgKyBkM19yZ2JfaGV4KHRoaXMuYik7Cn07CgpmdW5jdGlvbiBkM19yZ2JfaGV4KHYpIHsKICByZXR1cm4gdiA8IDB4MTAKICAgICAgPyAiMCIgKyBNYXRoLm1heCgwLCB2KS50b1N0cmluZygxNikKICAgICAgOiBNYXRoLm1pbigyNTUsIHYpLnRvU3RyaW5nKDE2KTsKfQoKZnVuY3Rpb24gZDNfcmdiX3BhcnNlKGZvcm1hdCwgcmdiLCBoc2wpIHsKICB2YXIgciA9IDAsIC8vIHJlZCBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0KICAgICAgZyA9IDAsIC8vIGdyZWVuIGNoYW5uZWw7IGludCBpbiBbMCwgMjU1XQogICAgICBiID0gMCwgLy8gYmx1ZSBjaGFubmVsOyBpbnQgaW4gWzAsIDI1NV0KICAgICAgbTEsIC8vIENTUyBjb2xvciBzcGVjaWZpY2F0aW9uIG1hdGNoCiAgICAgIG0yLCAvLyBDU1MgY29sb3Igc3BlY2lmaWNhdGlvbiB0eXBlIChlLmcuLCByZ2IpCiAgICAgIG5hbWU7CgogIC8qIEhhbmRsZSBoc2wsIHJnYi4gKi8KICBtMSA9IC8oW2Etel0rKVwoKC4qKVwpL2kuZXhlYyhmb3JtYXQpOwogIGlmIChtMSkgewogICAgbTIgPSBtMVsyXS5zcGxpdCgiLCIpOwogICAgc3dpdGNoIChtMVsxXSkgewogICAgICBjYXNlICJoc2wiOiB7CiAgICAgICAgcmV0dXJuIGhzbCgKICAgICAgICAgIHBhcnNlRmxvYXQobTJbMF0pLCAvLyBkZWdyZWVzCiAgICAgICAgICBwYXJzZUZsb2F0KG0yWzFdKSAvIDEwMCwgLy8gcGVyY2VudGFnZQogICAgICAgICAgcGFyc2VGbG9hdChtMlsyXSkgLyAxMDAgLy8gcGVyY2VudGFnZQogICAgICAgICk7CiAgICAgIH0KICAgICAgY2FzZSAicmdiIjogewogICAgICAgIHJldHVybiByZ2IoCiAgICAgICAgICBkM19yZ2JfcGFyc2VOdW1iZXIobTJbMF0pLAogICAgICAgICAgZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzFdKSwKICAgICAgICAgIGQzX3JnYl9wYXJzZU51bWJlcihtMlsyXSkKICAgICAgICApOwogICAgICB9CiAgICB9CiAgfQoKICAvKiBOYW1lZCBjb2xvcnMuICovCiAgaWYgKG5hbWUgPSBkM19yZ2JfbmFtZXMuZ2V0KGZvcm1hdCkpIHJldHVybiByZ2IobmFtZS5yLCBuYW1lLmcsIG5hbWUuYik7CgogIC8qIEhleGFkZWNpbWFsIGNvbG9yczogI3JnYiBhbmQgI3JyZ2diYi4gKi8KICBpZiAoZm9ybWF0ICE9IG51bGwgJiYgZm9ybWF0LmNoYXJBdCgwKSA9PT0gIiMiKSB7CiAgICBpZiAoZm9ybWF0Lmxlbmd0aCA9PT0gNCkgewogICAgICByID0gZm9ybWF0LmNoYXJBdCgxKTsgciArPSByOwogICAgICBnID0gZm9ybWF0LmNoYXJBdCgyKTsgZyArPSBnOwogICAgICBiID0gZm9ybWF0LmNoYXJBdCgzKTsgYiArPSBiOwogICAgfSBlbHNlIGlmIChmb3JtYXQubGVuZ3RoID09PSA3KSB7CiAgICAgIHIgPSBmb3JtYXQuc3Vic3RyaW5nKDEsIDMpOwogICAgICBnID0gZm9ybWF0LnN1YnN0cmluZygzLCA1KTsKICAgICAgYiA9IGZvcm1hdC5zdWJzdHJpbmcoNSwgNyk7CiAgICB9CiAgICByID0gcGFyc2VJbnQociwgMTYpOwogICAgZyA9IHBhcnNlSW50KGcsIDE2KTsKICAgIGIgPSBwYXJzZUludChiLCAxNik7CiAgfQoKICByZXR1cm4gcmdiKHIsIGcsIGIpOwp9CgpmdW5jdGlvbiBkM19yZ2JfaHNsKHIsIGcsIGIpIHsKICB2YXIgbWluID0gTWF0aC5taW4ociAvPSAyNTUsIGcgLz0gMjU1LCBiIC89IDI1NSksCiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLAogICAgICBkID0gbWF4IC0gbWluLAogICAgICBoLAogICAgICBzLAogICAgICBsID0gKG1heCArIG1pbikgLyAyOwogIGlmIChkKSB7CiAgICBzID0gbCA8IC41ID8gZCAvIChtYXggKyBtaW4pIDogZCAvICgyIC0gbWF4IC0gbWluKTsKICAgIGlmIChyID09IG1heCkgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOwogICAgZWxzZSBpZiAoZyA9PSBtYXgpIGggPSAoYiAtIHIpIC8gZCArIDI7CiAgICBlbHNlIGggPSAociAtIGcpIC8gZCArIDQ7CiAgICBoICo9IDYwOwogIH0gZWxzZSB7CiAgICBzID0gaCA9IDA7CiAgfQogIHJldHVybiBkM19oc2woaCwgcywgbCk7Cn0KCmZ1bmN0aW9uIGQzX3JnYl9wYXJzZU51bWJlcihjKSB7IC8vIGVpdGhlciBpbnRlZ2VyIG9yIHBlcmNlbnRhZ2UKICB2YXIgZiA9IHBhcnNlRmxvYXQoYyk7CiAgcmV0dXJuIGMuY2hhckF0KGMubGVuZ3RoIC0gMSkgPT09ICIlIiA/IE1hdGgucm91bmQoZiAqIDIuNTUpIDogZjsKfQoKdmFyIGQzX3JnYl9uYW1lcyA9IGQzLm1hcCh7CiAgYWxpY2VibHVlOiAiI2YwZjhmZiIsCiAgYW50aXF1ZXdoaXRlOiAiI2ZhZWJkNyIsCiAgYXF1YTogIiMwMGZmZmYiLAogIGFxdWFtYXJpbmU6ICIjN2ZmZmQ0IiwKICBhenVyZTogIiNmMGZmZmYiLAogIGJlaWdlOiAiI2Y1ZjVkYyIsCiAgYmlzcXVlOiAiI2ZmZTRjNCIsCiAgYmxhY2s6ICIjMDAwMDAwIiwKICBibGFuY2hlZGFsbW9uZDogIiNmZmViY2QiLAogIGJsdWU6ICIjMDAwMGZmIiwKICBibHVldmlvbGV0OiAiIzhhMmJlMiIsCiAgYnJvd246ICIjYTUyYTJhIiwKICBidXJseXdvb2Q6ICIjZGViODg3IiwKICBjYWRldGJsdWU6ICIjNWY5ZWEwIiwKICBjaGFydHJldXNlOiAiIzdmZmYwMCIsCiAgY2hvY29sYXRlOiAiI2QyNjkxZSIsCiAgY29yYWw6ICIjZmY3ZjUwIiwKICBjb3JuZmxvd2VyYmx1ZTogIiM2NDk1ZWQiLAogIGNvcm5zaWxrOiAiI2ZmZjhkYyIsCiAgY3JpbXNvbjogIiNkYzE0M2MiLAogIGN5YW46ICIjMDBmZmZmIiwKICBkYXJrYmx1ZTogIiMwMDAwOGIiLAogIGRhcmtjeWFuOiAiIzAwOGI4YiIsCiAgZGFya2dvbGRlbnJvZDogIiNiODg2MGIiLAogIGRhcmtncmF5OiAiI2E5YTlhOSIsCiAgZGFya2dyZWVuOiAiIzAwNjQwMCIsCiAgZGFya2dyZXk6ICIjYTlhOWE5IiwKICBkYXJra2hha2k6ICIjYmRiNzZiIiwKICBkYXJrbWFnZW50YTogIiM4YjAwOGIiLAogIGRhcmtvbGl2ZWdyZWVuOiAiIzU1NmIyZiIsCiAgZGFya29yYW5nZTogIiNmZjhjMDAiLAogIGRhcmtvcmNoaWQ6ICIjOTkzMmNjIiwKICBkYXJrcmVkOiAiIzhiMDAwMCIsCiAgZGFya3NhbG1vbjogIiNlOTk2N2EiLAogIGRhcmtzZWFncmVlbjogIiM4ZmJjOGYiLAogIGRhcmtzbGF0ZWJsdWU6ICIjNDgzZDhiIiwKICBkYXJrc2xhdGVncmF5OiAiIzJmNGY0ZiIsCiAgZGFya3NsYXRlZ3JleTogIiMyZjRmNGYiLAogIGRhcmt0dXJxdW9pc2U6ICIjMDBjZWQxIiwKICBkYXJrdmlvbGV0OiAiIzk0MDBkMyIsCiAgZGVlcHBpbms6ICIjZmYxNDkzIiwKICBkZWVwc2t5Ymx1ZTogIiMwMGJmZmYiLAogIGRpbWdyYXk6ICIjNjk2OTY5IiwKICBkaW1ncmV5OiAiIzY5Njk2OSIsCiAgZG9kZ2VyYmx1ZTogIiMxZTkwZmYiLAogIGZpcmVicmljazogIiNiMjIyMjIiLAogIGZsb3JhbHdoaXRlOiAiI2ZmZmFmMCIsCiAgZm9yZXN0Z3JlZW46ICIjMjI4YjIyIiwKICBmdWNoc2lhOiAiI2ZmMDBmZiIsCiAgZ2FpbnNib3JvOiAiI2RjZGNkYyIsCiAgZ2hvc3R3aGl0ZTogIiNmOGY4ZmYiLAogIGdvbGQ6ICIjZmZkNzAwIiwKICBnb2xkZW5yb2Q6ICIjZGFhNTIwIiwKICBncmF5OiAiIzgwODA4MCIsCiAgZ3JlZW46ICIjMDA4MDAwIiwKICBncmVlbnllbGxvdzogIiNhZGZmMmYiLAogIGdyZXk6ICIjODA4MDgwIiwKICBob25leWRldzogIiNmMGZmZjAiLAogIGhvdHBpbms6ICIjZmY2OWI0IiwKICBpbmRpYW5yZWQ6ICIjY2Q1YzVjIiwKICBpbmRpZ286ICIjNGIwMDgyIiwKICBpdm9yeTogIiNmZmZmZjAiLAogIGtoYWtpOiAiI2YwZTY4YyIsCiAgbGF2ZW5kZXI6ICIjZTZlNmZhIiwKICBsYXZlbmRlcmJsdXNoOiAiI2ZmZjBmNSIsCiAgbGF3bmdyZWVuOiAiIzdjZmMwMCIsCiAgbGVtb25jaGlmZm9uOiAiI2ZmZmFjZCIsCiAgbGlnaHRibHVlOiAiI2FkZDhlNiIsCiAgbGlnaHRjb3JhbDogIiNmMDgwODAiLAogIGxpZ2h0Y3lhbjogIiNlMGZmZmYiLAogIGxpZ2h0Z29sZGVucm9keWVsbG93OiAiI2ZhZmFkMiIsCiAgbGlnaHRncmF5OiAiI2QzZDNkMyIsCiAgbGlnaHRncmVlbjogIiM5MGVlOTAiLAogIGxpZ2h0Z3JleTogIiNkM2QzZDMiLAogIGxpZ2h0cGluazogIiNmZmI2YzEiLAogIGxpZ2h0c2FsbW9uOiAiI2ZmYTA3YSIsCiAgbGlnaHRzZWFncmVlbjogIiMyMGIyYWEiLAogIGxpZ2h0c2t5Ymx1ZTogIiM4N2NlZmEiLAogIGxpZ2h0c2xhdGVncmF5OiAiIzc3ODg5OSIsCiAgbGlnaHRzbGF0ZWdyZXk6ICIjNzc4ODk5IiwKICBsaWdodHN0ZWVsYmx1ZTogIiNiMGM0ZGUiLAogIGxpZ2h0eWVsbG93OiAiI2ZmZmZlMCIsCiAgbGltZTogIiMwMGZmMDAiLAogIGxpbWVncmVlbjogIiMzMmNkMzIiLAogIGxpbmVuOiAiI2ZhZjBlNiIsCiAgbWFnZW50YTogIiNmZjAwZmYiLAogIG1hcm9vbjogIiM4MDAwMDAiLAogIG1lZGl1bWFxdWFtYXJpbmU6ICIjNjZjZGFhIiwKICBtZWRpdW1ibHVlOiAiIzAwMDBjZCIsCiAgbWVkaXVtb3JjaGlkOiAiI2JhNTVkMyIsCiAgbWVkaXVtcHVycGxlOiAiIzkzNzBkYiIsCiAgbWVkaXVtc2VhZ3JlZW46ICIjM2NiMzcxIiwKICBtZWRpdW1zbGF0ZWJsdWU6ICIjN2I2OGVlIiwKICBtZWRpdW1zcHJpbmdncmVlbjogIiMwMGZhOWEiLAogIG1lZGl1bXR1cnF1b2lzZTogIiM0OGQxY2MiLAogIG1lZGl1bXZpb2xldHJlZDogIiNjNzE1ODUiLAogIG1pZG5pZ2h0Ymx1ZTogIiMxOTE5NzAiLAogIG1pbnRjcmVhbTogIiNmNWZmZmEiLAogIG1pc3R5cm9zZTogIiNmZmU0ZTEiLAogIG1vY2Nhc2luOiAiI2ZmZTRiNSIsCiAgbmF2YWpvd2hpdGU6ICIjZmZkZWFkIiwKICBuYXZ5OiAiIzAwMDA4MCIsCiAgb2xkbGFjZTogIiNmZGY1ZTYiLAogIG9saXZlOiAiIzgwODAwMCIsCiAgb2xpdmVkcmFiOiAiIzZiOGUyMyIsCiAgb3JhbmdlOiAiI2ZmYTUwMCIsCiAgb3JhbmdlcmVkOiAiI2ZmNDUwMCIsCiAgb3JjaGlkOiAiI2RhNzBkNiIsCiAgcGFsZWdvbGRlbnJvZDogIiNlZWU4YWEiLAogIHBhbGVncmVlbjogIiM5OGZiOTgiLAogIHBhbGV0dXJxdW9pc2U6ICIjYWZlZWVlIiwKICBwYWxldmlvbGV0cmVkOiAiI2RiNzA5MyIsCiAgcGFwYXlhd2hpcDogIiNmZmVmZDUiLAogIHBlYWNocHVmZjogIiNmZmRhYjkiLAogIHBlcnU6ICIjY2Q4NTNmIiwKICBwaW5rOiAiI2ZmYzBjYiIsCiAgcGx1bTogIiNkZGEwZGQiLAogIHBvd2RlcmJsdWU6ICIjYjBlMGU2IiwKICBwdXJwbGU6ICIjODAwMDgwIiwKICByZWQ6ICIjZmYwMDAwIiwKICByb3N5YnJvd246ICIjYmM4ZjhmIiwKICByb3lhbGJsdWU6ICIjNDE2OWUxIiwKICBzYWRkbGVicm93bjogIiM4YjQ1MTMiLAogIHNhbG1vbjogIiNmYTgwNzIiLAogIHNhbmR5YnJvd246ICIjZjRhNDYwIiwKICBzZWFncmVlbjogIiMyZThiNTciLAogIHNlYXNoZWxsOiAiI2ZmZjVlZSIsCiAgc2llbm5hOiAiI2EwNTIyZCIsCiAgc2lsdmVyOiAiI2MwYzBjMCIsCiAgc2t5Ymx1ZTogIiM4N2NlZWIiLAogIHNsYXRlYmx1ZTogIiM2YTVhY2QiLAogIHNsYXRlZ3JheTogIiM3MDgwOTAiLAogIHNsYXRlZ3JleTogIiM3MDgwOTAiLAogIHNub3c6ICIjZmZmYWZhIiwKICBzcHJpbmdncmVlbjogIiMwMGZmN2YiLAogIHN0ZWVsYmx1ZTogIiM0NjgyYjQiLAogIHRhbjogIiNkMmI0OGMiLAogIHRlYWw6ICIjMDA4MDgwIiwKICB0aGlzdGxlOiAiI2Q4YmZkOCIsCiAgdG9tYXRvOiAiI2ZmNjM0NyIsCiAgdHVycXVvaXNlOiAiIzQwZTBkMCIsCiAgdmlvbGV0OiAiI2VlODJlZSIsCiAgd2hlYXQ6ICIjZjVkZWIzIiwKICB3aGl0ZTogIiNmZmZmZmYiLAogIHdoaXRlc21va2U6ICIjZjVmNWY1IiwKICB5ZWxsb3c6ICIjZmZmZjAwIiwKICB5ZWxsb3dncmVlbjogIiM5YWNkMzIiCn0pOwoKZDNfcmdiX25hbWVzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogIGQzX3JnYl9uYW1lcy5zZXQoa2V5LCBkM19yZ2JfcGFyc2UodmFsdWUsIGQzX3JnYiwgZDNfaHNsX3JnYikpOwp9KTsKZDMuaHNsID0gZnVuY3Rpb24oaCwgcywgbCkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxCiAgICAgID8gKGggaW5zdGFuY2VvZiBkM19Ic2wgPyBkM19oc2woaC5oLCBoLnMsIGgubCkKICAgICAgOiBkM19yZ2JfcGFyc2UoIiIgKyBoLCBkM19yZ2JfaHNsLCBkM19oc2wpKQogICAgICA6IGQzX2hzbCgraCwgK3MsICtsKTsKfTsKCmZ1bmN0aW9uIGQzX2hzbChoLCBzLCBsKSB7CiAgcmV0dXJuIG5ldyBkM19Ic2woaCwgcywgbCk7Cn0KCmZ1bmN0aW9uIGQzX0hzbChoLCBzLCBsKSB7CiAgdGhpcy5oID0gaDsKICB0aGlzLnMgPSBzOwogIHRoaXMubCA9IGw7Cn0KCmQzX0hzbC5wcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7CiAgayA9IE1hdGgucG93KDAuNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTsKICByZXR1cm4gZDNfaHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgLyBrKTsKfTsKCmQzX0hzbC5wcm90b3R5cGUuZGFya2VyID0gZnVuY3Rpb24oaykgewogIGsgPSBNYXRoLnBvdygwLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7CiAgcmV0dXJuIGQzX2hzbCh0aGlzLmgsIHRoaXMucywgayAqIHRoaXMubCk7Cn07CgpkM19Ic2wucHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBkM19oc2xfcmdiKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwpOwp9OwoKZDNfSHNsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiB0aGlzLnJnYigpLnRvU3RyaW5nKCk7Cn07CgpmdW5jdGlvbiBkM19oc2xfcmdiKGgsIHMsIGwpIHsKICB2YXIgbTEsCiAgICAgIG0yOwoKICAvKiBTb21lIHNpbXBsZSBjb3JyZWN0aW9ucyBmb3IgaCwgcyBhbmQgbC4gKi8KICBoID0gaCAlIDM2MDsgaWYgKGggPCAwKSBoICs9IDM2MDsKICBzID0gcyA8IDAgPyAwIDogcyA+IDEgPyAxIDogczsKICBsID0gbCA8IDAgPyAwIDogbCA+IDEgPyAxIDogbDsKCiAgLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLwogIG0yID0gbCA8PSAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogczsKICBtMSA9IDIgKiBsIC0gbTI7CgogIGZ1bmN0aW9uIHYoaCkgewogICAgaWYgKGggPiAzNjApIGggLT0gMzYwOwogICAgZWxzZSBpZiAoaCA8IDApIGggKz0gMzYwOwogICAgaWYgKGggPCA2MCkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAvIDYwOwogICAgaWYgKGggPCAxODApIHJldHVybiBtMjsKICAgIGlmIChoIDwgMjQwKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MDsKICAgIHJldHVybiBtMTsKICB9CgogIGZ1bmN0aW9uIHZ2KGgpIHsKICAgIHJldHVybiBNYXRoLnJvdW5kKHYoaCkgKiAyNTUpOwogIH0KCiAgcmV0dXJuIGQzX3JnYih2dihoICsgMTIwKSwgdnYoaCksIHZ2KGggLSAxMjApKTsKfQpmdW5jdGlvbiBkM19zZWxlY3Rpb24oZ3JvdXBzKSB7CiAgZDNfYXJyYXlTdWJjbGFzcyhncm91cHMsIGQzX3NlbGVjdGlvblByb3RvdHlwZSk7CiAgcmV0dXJuIGdyb3VwczsKfQoKdmFyIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIG4ucXVlcnlTZWxlY3RvcihzKTsgfSwKICAgIGQzX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIG4ucXVlcnlTZWxlY3RvckFsbChzKTsgfSwKICAgIGQzX3NlbGVjdFJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCiAgICBkM19zZWxlY3RNYXRjaGVyID0gZDNfc2VsZWN0Um9vdC5tYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZDNfc2VsZWN0Um9vdC5tc01hdGNoZXNTZWxlY3RvciB8fCBkM19zZWxlY3RSb290Lm9NYXRjaGVzU2VsZWN0b3IsCiAgICBkM19zZWxlY3RNYXRjaGVzID0gZnVuY3Rpb24obiwgcykgeyByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlci5jYWxsKG4sIHMpOyB9OwoKLy8gUHJlZmVyIFNpenpsZSwgaWYgYXZhaWxhYmxlLgppZiAodHlwZW9mIFNpenpsZSA9PT0gImZ1bmN0aW9uIikgewogIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHsgcmV0dXJuIFNpenpsZShzLCBuKVswXTsgfTsKICBkM19zZWxlY3RBbGwgPSBmdW5jdGlvbihzLCBuKSB7IHJldHVybiBTaXp6bGUudW5pcXVlU29ydChTaXp6bGUocywgbikpOyB9OwogIGQzX3NlbGVjdE1hdGNoZXMgPSBTaXp6bGUubWF0Y2hlc1NlbGVjdG9yOwp9Cgp2YXIgZDNfc2VsZWN0aW9uUHJvdG90eXBlID0gW107CgpkMy5zZWxlY3Rpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDNfc2VsZWN0aW9uUm9vdDsKfTsKCmQzLnNlbGVjdGlvbi5wcm90b3R5cGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGU7CmQzX3NlbGVjdGlvblByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHZhciBzdWJncm91cHMgPSBbXSwKICAgICAgc3ViZ3JvdXAsCiAgICAgIHN1Ym5vZGUsCiAgICAgIGdyb3VwLAogICAgICBub2RlOwoKICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7CgogIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgewogICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CiAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTsKICAgIGZvciAodmFyIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjspIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpOwogICAgICAgIGlmIChzdWJub2RlICYmICJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpOwp9OwoKZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NlbGVjdChzZWxlY3RvciwgdGhpcyk7CiAgfTsKfQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICB2YXIgc3ViZ3JvdXBzID0gW10sCiAgICAgIHN1Ymdyb3VwLAogICAgICBub2RlOwoKICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7CgogIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgewogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7CiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IGQzX2FycmF5KHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpKTsKICAgICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gbm9kZTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpOwp9OwoKZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NlbGVjdEFsbChzZWxlY3RvciwgdGhpcyk7CiAgfTsKfQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7CgogIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7CiAgICByZXR1cm4gbmFtZS5sb2NhbAogICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKQogICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgfQoKICBmdW5jdGlvbiBhdHRyTnVsbCgpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogIH0KCiAgZnVuY3Rpb24gYXR0ck51bGxOUygpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCk7CiAgfQoKICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQoKSB7CiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgfQoKICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUygpIHsKICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgdmFsdWUpOwogIH0KCiAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKCkgewogICAgdmFyIHggPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHggPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHgpOwogIH0KCiAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoKSB7CiAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpOwogICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIHgpOwogIH0KCiAgcmV0dXJuIHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgID8gKG5hbWUubG9jYWwgPyBhdHRyTnVsbE5TIDogYXR0ck51bGwpIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IChuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pCiAgICAgIDogKG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKTsKfTsKZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNsYXNzZWQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIHZhciBuYW1lcyA9IG5hbWUuc3BsaXQoZDNfc2VsZWN0aW9uX2NsYXNzZWRXaGl0ZXNwYWNlKSwKICAgICAgbiA9IG5hbWVzLmxlbmd0aCwKICAgICAgaSA9IC0xOwogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgd2hpbGUgKCsraSA8IG4pIGQzX3NlbGVjdGlvbl9jbGFzc2VkLmNhbGwodGhpcywgbmFtZXNbaV0sIHZhbHVlKTsKICAgIHJldHVybiB0aGlzOwogIH0gZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFkM19zZWxlY3Rpb25fY2xhc3NlZC5jYWxsKHRoaXMsIG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQp9OwoKdmFyIGQzX3NlbGVjdGlvbl9jbGFzc2VkV2hpdGVzcGFjZSA9IC9ccysvZzsKCmZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7CiAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiKF58XFxzKykiICsgZDMucmVxdW90ZShuYW1lKSArICIoXFxzK3wkKSIsICJnIik7CgogIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7CiAgICBpZiAoYyA9IG5vZGUuY2xhc3NMaXN0KSByZXR1cm4gYy5jb250YWlucyhuYW1lKTsKICAgIHZhciBjID0gbm9kZS5jbGFzc05hbWU7CiAgICByZS5sYXN0SW5kZXggPSAwOwogICAgcmV0dXJuIHJlLnRlc3QoYy5iYXNlVmFsICE9IG51bGwgPyBjLmJhc2VWYWwgOiBjKTsKICB9CgogIGZ1bmN0aW9uIGNsYXNzZWRBZGQoKSB7CiAgICBpZiAoYyA9IHRoaXMuY2xhc3NMaXN0KSByZXR1cm4gYy5hZGQobmFtZSk7CiAgICB2YXIgYyA9IHRoaXMuY2xhc3NOYW1lLAogICAgICAgIGNiID0gYy5iYXNlVmFsICE9IG51bGwsCiAgICAgICAgY3YgPSBjYiA/IGMuYmFzZVZhbCA6IGM7CiAgICByZS5sYXN0SW5kZXggPSAwOwogICAgaWYgKCFyZS50ZXN0KGN2KSkgewogICAgICBjdiA9IGQzX2NvbGxhcHNlKGN2ICsgIiAiICsgbmFtZSk7CiAgICAgIGlmIChjYikgYy5iYXNlVmFsID0gY3Y7CiAgICAgIGVsc2UgdGhpcy5jbGFzc05hbWUgPSBjdjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUoKSB7CiAgICBpZiAoYyA9IHRoaXMuY2xhc3NMaXN0KSByZXR1cm4gYy5yZW1vdmUobmFtZSk7CiAgICB2YXIgYyA9IHRoaXMuY2xhc3NOYW1lLAogICAgICAgIGNiID0gYy5iYXNlVmFsICE9IG51bGwsCiAgICAgICAgY3YgPSBjYiA/IGMuYmFzZVZhbCA6IGM7CiAgICBjdiA9IGQzX2NvbGxhcHNlKGN2LnJlcGxhY2UocmUsICIgIikpOwogICAgaWYgKGNiKSBjLmJhc2VWYWwgPSBjdjsKICAgIGVsc2UgdGhpcy5jbGFzc05hbWUgPSBjdjsKICB9CgogIGZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbigpIHsKICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpCiAgICAgICAgPyBjbGFzc2VkQWRkCiAgICAgICAgOiBjbGFzc2VkUmVtb3ZlKS5jYWxsKHRoaXMpOwogIH0KCiAgcmV0dXJuIHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZQogICAgICA/IGNsYXNzZWRBZGQKICAgICAgOiBjbGFzc2VkUmVtb3ZlKTsKfQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHByaW9yaXR5ID0gIiI7CgogIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiB3aW5kb3cKICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy5ub2RlKCksIG51bGwpCiAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwoKICBmdW5jdGlvbiBzdHlsZU51bGwoKSB7CiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogIH0KCiAgZnVuY3Rpb24gc3R5bGVDb25zdGFudCgpIHsKICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTsKICB9CgogIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24oKSB7CiAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHgsIHByaW9yaXR5KTsKICB9CgogIHJldHVybiB0aGlzLmVhY2godmFsdWUgPT0gbnVsbAogICAgICA/IHN0eWxlTnVsbCA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgPyBzdHlsZUZ1bmN0aW9uIDogc3R5bGVDb25zdGFudCkpOwp9OwpkM19zZWxlY3Rpb25Qcm90b3R5cGUucHJvcGVydHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewoKICAvLyBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgZmlyc3QgdmFsdWUuCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcy5ub2RlKClbbmFtZV07CgogIGZ1bmN0aW9uIHByb3BlcnR5TnVsbCgpIHsKICAgIGRlbGV0ZSB0aGlzW25hbWVdOwogIH0KCiAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudCgpIHsKICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICB9CgogIGZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24oKSB7CiAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICBpZiAoeCA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsKICAgIGVsc2UgdGhpc1tuYW1lXSA9IHg7CiAgfQoKICByZXR1cm4gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgPyBwcm9wZXJ0eU51bGwgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgID8gcHJvcGVydHlGdW5jdGlvbiA6IHByb3BlcnR5Q29uc3RhbnQpKTsKfTsKZDNfc2VsZWN0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMQogICAgICA/IHRoaXMubm9kZSgpLnRleHRDb250ZW50IDogdGhpcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IGZ1bmN0aW9uKCkgeyB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyAiIiA6IHY7IH0gOiB2YWx1ZSA9PSBudWxsCiAgICAgID8gZnVuY3Rpb24oKSB7IHRoaXMudGV4dENvbnRlbnQgPSAiIjsgfQogICAgICA6IGZ1bmN0aW9uKCkgeyB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7IH0pOwp9OwpkM19zZWxlY3Rpb25Qcm90b3R5cGUuaHRtbCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAxCiAgICAgID8gdGhpcy5ub2RlKCkuaW5uZXJIVE1MIDogdGhpcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IGZ1bmN0aW9uKCkgeyB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gIiIgOiB2OyB9IDogdmFsdWUgPT0gbnVsbAogICAgICA/IGZ1bmN0aW9uKCkgeyB0aGlzLmlubmVySFRNTCA9ICIiOyB9CiAgICAgIDogZnVuY3Rpb24oKSB7IHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7IH0pOwp9OwovLyBUT0RPIGFwcGVuZChub2RlKT8KLy8gVE9ETyBhcHBlbmQoZnVuY3Rpb24pPwpkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSkgewogIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpOwoKICBmdW5jdGlvbiBhcHBlbmQoKSB7CiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksIG5hbWUpKTsKICB9CgogIGZ1bmN0aW9uIGFwcGVuZE5TKCkgewogICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpKTsKICB9CgogIHJldHVybiB0aGlzLnNlbGVjdChuYW1lLmxvY2FsID8gYXBwZW5kTlMgOiBhcHBlbmQpOwp9OwovLyBUT0RPIGluc2VydChub2RlLCBmdW5jdGlvbik/Ci8vIFRPRE8gaW5zZXJ0KGZ1bmN0aW9uLCBzdHJpbmcpPwovLyBUT0RPIGluc2VydChmdW5jdGlvbiwgZnVuY3Rpb24pPwpkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7CiAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7CgogIGZ1bmN0aW9uIGluc2VydCgpIHsKICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZSgKICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksIG5hbWUpLAogICAgICAgIGQzX3NlbGVjdChiZWZvcmUsIHRoaXMpKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydE5TKCkgewogICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKAogICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwKICAgICAgICBkM19zZWxlY3QoYmVmb3JlLCB0aGlzKSk7CiAgfQoKICByZXR1cm4gdGhpcy5zZWxlY3QobmFtZS5sb2NhbCA/IGluc2VydE5TIDogaW5zZXJ0KTsKfTsKLy8gVE9ETyByZW1vdmUoc2VsZWN0b3IpPwovLyBUT0RPIHJlbW92ZShub2RlKT8KLy8gVE9ETyByZW1vdmUoZnVuY3Rpb24pPwpkM19zZWxlY3Rpb25Qcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgfSk7Cn07CmQzX3NlbGVjdGlvblByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24odmFsdWUsIGtleSkgewogIHZhciBpID0gLTEsCiAgICAgIG4gPSB0aGlzLmxlbmd0aCwKICAgICAgZ3JvdXAsCiAgICAgIG5vZGU7CgogIC8vIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBmaXJzdCB2YWx1ZS4KICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgIHZhbHVlID0gbmV3IEFycmF5KG4gPSAoZ3JvdXAgPSB0aGlzWzBdKS5sZW5ndGgpOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIHZhbHVlW2ldID0gbm9kZS5fX2RhdGFfXzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gYmluZChncm91cCwgZ3JvdXBEYXRhKSB7CiAgICB2YXIgaSwKICAgICAgICBuID0gZ3JvdXAubGVuZ3RoLAogICAgICAgIG0gPSBncm91cERhdGEubGVuZ3RoLAogICAgICAgIG4wID0gTWF0aC5taW4obiwgbSksCiAgICAgICAgbjEgPSBNYXRoLm1heChuLCBtKSwKICAgICAgICB1cGRhdGVOb2RlcyA9IFtdLAogICAgICAgIGVudGVyTm9kZXMgPSBbXSwKICAgICAgICBleGl0Tm9kZXMgPSBbXSwKICAgICAgICBub2RlLAogICAgICAgIG5vZGVEYXRhOwoKICAgIGlmIChrZXkpIHsKICAgICAgdmFyIG5vZGVCeUtleVZhbHVlID0gbmV3IGQzX01hcCwKICAgICAgICAgIGtleVZhbHVlcyA9IFtdLAogICAgICAgICAga2V5VmFsdWUsCiAgICAgICAgICBqID0gZ3JvdXBEYXRhLmxlbmd0aDsKCiAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuOykgewogICAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSA9IGdyb3VwW2ldLCBub2RlLl9fZGF0YV9fLCBpKTsKICAgICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkgewogICAgICAgICAgZXhpdE5vZGVzW2orK10gPSBub2RlOyAvLyBkdXBsaWNhdGUga2V5CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7CiAgICAgICAgfQogICAgICAgIGtleVZhbHVlcy5wdXNoKGtleVZhbHVlKTsKICAgICAgfQoKICAgICAgZm9yIChpID0gLTE7ICsraSA8IG07KSB7CiAgICAgICAga2V5VmFsdWUgPSBrZXkuY2FsbChncm91cERhdGEsIG5vZGVEYXRhID0gZ3JvdXBEYXRhW2ldLCBpKQogICAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7CiAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpOwogICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhOwogICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUobm9kZURhdGEpOwogICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBleGl0Tm9kZXNbaV0gPSBudWxsOwogICAgICAgIH0KICAgICAgICBub2RlQnlLZXlWYWx1ZS5yZW1vdmUoa2V5VmFsdWUpOwogICAgICB9CgogICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbjspIHsKICAgICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlc1tpXSkpIHsKICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IGdyb3VwW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChpID0gLTE7ICsraSA8IG4wOykgewogICAgICAgIG5vZGUgPSBncm91cFtpXTsKICAgICAgICBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXTsKICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhOwogICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBub2RlOwogICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUobm9kZURhdGEpOwogICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBleGl0Tm9kZXNbaV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKDsgaSA8IG07ICsraSkgewogICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUoZ3JvdXBEYXRhW2ldKTsKICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IGV4aXROb2Rlc1tpXSA9IG51bGw7CiAgICAgIH0KICAgICAgZm9yICg7IGkgPCBuMTsgKytpKSB7CiAgICAgICAgZXhpdE5vZGVzW2ldID0gZ3JvdXBbaV07CiAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IHVwZGF0ZU5vZGVzW2ldID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGVudGVyTm9kZXMudXBkYXRlCiAgICAgICAgPSB1cGRhdGVOb2RlczsKCiAgICBlbnRlck5vZGVzLnBhcmVudE5vZGUKICAgICAgICA9IHVwZGF0ZU5vZGVzLnBhcmVudE5vZGUKICAgICAgICA9IGV4aXROb2Rlcy5wYXJlbnROb2RlCiAgICAgICAgPSBncm91cC5wYXJlbnROb2RlOwoKICAgIGVudGVyLnB1c2goZW50ZXJOb2Rlcyk7CiAgICB1cGRhdGUucHVzaCh1cGRhdGVOb2Rlcyk7CiAgICBleGl0LnB1c2goZXhpdE5vZGVzKTsKICB9CgogIHZhciBlbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcihbXSksCiAgICAgIHVwZGF0ZSA9IGQzX3NlbGVjdGlvbihbXSksCiAgICAgIGV4aXQgPSBkM19zZWxlY3Rpb24oW10pOwoKICBpZiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iKSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUuY2FsbChncm91cCwgZ3JvdXAucGFyZW50Tm9kZS5fX2RhdGFfXywgaSkpOwogICAgfQogIH0gZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUpOwogICAgfQogIH0KCiAgdXBkYXRlLmVudGVyID0gZnVuY3Rpb24oKSB7IHJldHVybiBlbnRlcjsgfTsKICB1cGRhdGUuZXhpdCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZXhpdDsgfTsKICByZXR1cm4gdXBkYXRlOwp9OwoKZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKGRhdGEpIHsKICByZXR1cm4ge19fZGF0YV9fOiBkYXRhfTsKfQpkM19zZWxlY3Rpb25Qcm90b3R5cGUuZGF0dW0gPQpkM19zZWxlY3Rpb25Qcm90b3R5cGUubWFwID0gZnVuY3Rpb24odmFsdWUpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDEKICAgICAgPyB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpCiAgICAgIDogdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLCB2YWx1ZSk7Cn07CmQzX3NlbGVjdGlvblByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbihmaWx0ZXIpIHsKICB2YXIgc3ViZ3JvdXBzID0gW10sCiAgICAgIHN1Ymdyb3VwLAogICAgICBncm91cCwKICAgICAgbm9kZTsKCiAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09ICJmdW5jdGlvbiIpIGZpbHRlciA9IGQzX3NlbGVjdGlvbl9maWx0ZXIoZmlsdGVyKTsKCiAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgewogICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CiAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBmaWx0ZXIuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKSkgewogICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTsKfTsKCmZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9maWx0ZXIoc2VsZWN0b3IpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlcyh0aGlzLCBzZWxlY3Rvcik7CiAgfTsKfQpkM19zZWxlY3Rpb25Qcm90b3R5cGUub3JkZXIgPSBmdW5jdGlvbigpIHsKICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7CiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSBub2RlLm5leHRTaWJsaW5nKSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwogICAgICAgIG5leHQgPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB0aGlzOwp9OwpkM19zZWxlY3Rpb25Qcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uKGNvbXBhcmF0b3IpIHsKICBjb21wYXJhdG9yID0gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB0aGlzW2pdLnNvcnQoY29tcGFyYXRvcik7CiAgcmV0dXJuIHRoaXMub3JkZXIoKTsKfTsKCmZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9zb3J0Q29tcGFyYXRvcihjb21wYXJhdG9yKSB7CiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSBjb21wYXJhdG9yID0gZDMuYXNjZW5kaW5nOwogIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICByZXR1cm4gY29tcGFyYXRvcihhICYmIGEuX19kYXRhX18sIGIgJiYgYi5fX2RhdGFfXyk7CiAgfTsKfQovLyB0eXBlIGNhbiBiZSBuYW1lc3BhY2VkLCBlLmcuLCAiY2xpY2suZm9vIgovLyBsaXN0ZW5lciBjYW4gYmUgbnVsbCBmb3IgcmVtb3ZhbApkM19zZWxlY3Rpb25Qcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lciwgY2FwdHVyZSkgewogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgY2FwdHVyZSA9IGZhbHNlOwoKICAvLyBwYXJzZSB0aGUgdHlwZSBzcGVjaWZpZXIKICB2YXIgbmFtZSA9ICJfX29uIiArIHR5cGUsIGkgPSB0eXBlLmluZGV4T2YoIi4iKTsKICBpZiAoaSA+IDApIHR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCBpKTsKCiAgLy8gaWYgY2FsbGVkIHdpdGggb25seSBvbmUgYXJndW1lbnQsIHJldHVybiB0aGUgY3VycmVudCBsaXN0ZW5lcgogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChpID0gdGhpcy5ub2RlKClbbmFtZV0pICYmIGkuXzsKCiAgLy8gcmVtb3ZlIHRoZSBvbGQgZXZlbnQgbGlzdGVuZXIsIGFuZCBhZGQgdGhlIG5ldyBldmVudCBsaXN0ZW5lcgogIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCwgaSkgewogICAgdmFyIG5vZGUgPSB0aGlzLAogICAgICAgIG8gPSBub2RlW25hbWVdOwoKICAgIC8vIHJlbW92ZSB0aGUgb2xkIGxpc3RlbmVyLCBpZiBhbnkgKHVzaW5nIHRoZSBwcmV2aW91c2x5LXNldCBjYXB0dXJlKQogICAgaWYgKG8pIHsKICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIG8sIG8uJCk7CiAgICAgIGRlbGV0ZSBub2RlW25hbWVdOwogICAgfQoKICAgIC8vIGFkZCB0aGUgbmV3IGxpc3RlbmVyLCBpZiBhbnkgKHJlbWVtYmVyaW5nIHRoZSBjYXB0dXJlIGZsYWcpCiAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIG5vZGVbbmFtZV0gPSBsLCBsLiQgPSBjYXB0dXJlKTsKICAgICAgbC5fID0gbGlzdGVuZXI7IC8vIHN0YXNoIHRoZSB1bndyYXBwZWQgbGlzdGVuZXIgZm9yIGdldAogICAgfQoKICAgIC8vIHdyYXBwZWQgZXZlbnQgbGlzdGVuZXIgdGhhdCBwcmVzZXJ2ZXMgaQogICAgZnVuY3Rpb24gbChlKSB7CiAgICAgIHZhciBvID0gZDMuZXZlbnQ7IC8vIEV2ZW50cyBjYW4gYmUgcmVlbnRyYW50IChlLmcuLCBmb2N1cykuCiAgICAgIGQzLmV2ZW50ID0gZTsKICAgICAgdHJ5IHsKICAgICAgICBsaXN0ZW5lci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGQzLmV2ZW50ID0gbzsKICAgICAgfQogICAgfQogIH0pOwp9OwpkM19zZWxlY3Rpb25Qcm90b3R5cGUuZWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07KSB7CiAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjspIHsKICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgaWYgKG5vZGUpIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7CiAgICB9CiAgfQogIHJldHVybiB0aGlzOwp9OwovLwovLyBOb3RlOiBhc3NpZ25pbmcgdG8gdGhlIGFyZ3VtZW50cyBhcnJheSBzaW11bHRhbmVvdXNseSBjaGFuZ2VzIHRoZSB2YWx1ZSBvZgovLyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudCEKLy8KLy8gVE9ETyBUaGUgYHRoaXNgIGFyZ3VtZW50IHByb2JhYmx5IHNob3VsZG4ndCBiZSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlCi8vIGNhbGxiYWNrLCBhbnl3YXksIHNpbmNlIGl0J3MgcmVkdW5kYW50LiBIb3dldmVyLCB0aGF0IHdpbGwgcmVxdWlyZSBhIG1ham9yCi8vIHZlcnNpb24gYnVtcCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHNvIEknbSBub3QgY2hhbmdpbmcgaXQgcmlnaHQKLy8gYXdheS4KLy8KZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbihjYWxsYmFjaykgewogIGNhbGxiYWNrLmFwcGx5KHRoaXMsIChhcmd1bWVudHNbMF0gPSB0aGlzLCBhcmd1bWVudHMpKTsKICByZXR1cm4gdGhpczsKfTsKZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuICF0aGlzLm5vZGUoKTsKfTsKZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbihjYWxsYmFjaykgewogIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHsKICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfTsKZDNfc2VsZWN0aW9uUHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsKICB2YXIgc3ViZ3JvdXBzID0gW10sCiAgICAgIHN1Ymdyb3VwLAogICAgICBub2RlOwoKICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7CiAgICAgIHN1Ymdyb3VwLnB1c2goKG5vZGUgPSBncm91cFtpXSkgPyB7bm9kZTogbm9kZSwgZGVsYXk6IGQzX3RyYW5zaXRpb25EZWxheSwgZHVyYXRpb246IGQzX3RyYW5zaXRpb25EdXJhdGlvbn0gOiBudWxsKTsKICAgIH0KICB9CgogIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgZDNfdHJhbnNpdGlvbklkIHx8ICsrZDNfdHJhbnNpdGlvbk5leHRJZCwgRGF0ZS5ub3coKSk7Cn07CnZhciBkM19zZWxlY3Rpb25Sb290ID0gZDNfc2VsZWN0aW9uKFtbZG9jdW1lbnRdXSk7CgpkM19zZWxlY3Rpb25Sb290WzBdLnBhcmVudE5vZGUgPSBkM19zZWxlY3RSb290OwoKLy8gVE9ETyBmYXN0IHNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiEKLy8gVE9ETyBzZWxlY3QoZnVuY3Rpb24pCmQzLnNlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBkM19zZWxlY3Rpb25Sb290LnNlbGVjdChzZWxlY3RvcikKICAgICAgOiBkM19zZWxlY3Rpb24oW1tzZWxlY3Rvcl1dKTsgLy8gYXNzdW1lIG5vZGUKfTsKCi8vIFRPRE8gc2VsZWN0QWxsKGZ1bmN0aW9uKQpkMy5zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciCiAgICAgID8gZDNfc2VsZWN0aW9uUm9vdC5zZWxlY3RBbGwoc2VsZWN0b3IpCiAgICAgIDogZDNfc2VsZWN0aW9uKFtkM19hcnJheShzZWxlY3RvcildKTsgLy8gYXNzdW1lIG5vZGVbXQp9OwpmdW5jdGlvbiBkM19zZWxlY3Rpb25fZW50ZXIoc2VsZWN0aW9uKSB7CiAgZDNfYXJyYXlTdWJjbGFzcyhzZWxlY3Rpb24sIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSk7CiAgcmV0dXJuIHNlbGVjdGlvbjsKfQoKdmFyIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSA9IFtdOwoKZDMuc2VsZWN0aW9uLmVudGVyID0gZDNfc2VsZWN0aW9uX2VudGVyOwpkMy5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlID0gZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlOwoKZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmFwcGVuZCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5hcHBlbmQ7CmQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5pbnNlcnQgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW5zZXJ0OwpkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuZW1wdHkgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZW1wdHk7CmQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5ub2RlID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGU7CmQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHZhciBzdWJncm91cHMgPSBbXSwKICAgICAgc3ViZ3JvdXAsCiAgICAgIHN1Ym5vZGUsCiAgICAgIHVwZ3JvdXAsCiAgICAgIGdyb3VwLAogICAgICBub2RlOwoKICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgIHVwZ3JvdXAgPSAoZ3JvdXAgPSB0aGlzW2pdKS51cGRhdGU7CiAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTsKICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSBncm91cC5wYXJlbnROb2RlOwogICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOykgewogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaCh1cGdyb3VwW2ldID0gc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwoZ3JvdXAucGFyZW50Tm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpOwogICAgICAgIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICB9IGVsc2UgewogICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTsKfTsKZnVuY3Rpb24gZDNfdHJhbnNpdGlvbihncm91cHMsIGlkLCB0aW1lKSB7CiAgZDNfYXJyYXlTdWJjbGFzcyhncm91cHMsIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUpOwoKICB2YXIgdHdlZW5zID0gbmV3IGQzX01hcCwKICAgICAgZXZlbnQgPSBkMy5kaXNwYXRjaCgic3RhcnQiLCAiZW5kIiksCiAgICAgIGVhc2UgPSBkM190cmFuc2l0aW9uRWFzZTsKCiAgZ3JvdXBzLmlkID0gaWQ7CgogIGdyb3Vwcy50aW1lID0gdGltZTsKCiAgZ3JvdXBzLnR3ZWVuID0gZnVuY3Rpb24obmFtZSwgdHdlZW4pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHR3ZWVucy5nZXQobmFtZSk7CiAgICBpZiAodHdlZW4gPT0gbnVsbCkgdHdlZW5zLnJlbW92ZShuYW1lKTsKICAgIGVsc2UgdHdlZW5zLnNldChuYW1lLCB0d2Vlbik7CiAgICByZXR1cm4gZ3JvdXBzOwogIH07CgogIGdyb3Vwcy5lYXNlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVhc2U7CiAgICBlYXNlID0gdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdmFsdWUgOiBkMy5lYXNlLmFwcGx5KGQzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGdyb3VwczsKICB9OwoKICBncm91cHMuZWFjaCA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBkM190cmFuc2l0aW9uX2VhY2guY2FsbChncm91cHMsIHR5cGUpOwogICAgZXZlbnQub24odHlwZSwgbGlzdGVuZXIpOwogICAgcmV0dXJuIGdyb3VwczsKICB9OwoKICBkMy50aW1lcihmdW5jdGlvbihlbGFwc2VkKSB7CiAgICBncm91cHMuZWFjaChmdW5jdGlvbihkLCBpLCBqKSB7CiAgICAgIHZhciB0d2VlbmVkID0gW10sCiAgICAgICAgICBub2RlID0gdGhpcywKICAgICAgICAgIGRlbGF5ID0gZ3JvdXBzW2pdW2ldLmRlbGF5LAogICAgICAgICAgZHVyYXRpb24gPSBncm91cHNbal1baV0uZHVyYXRpb24sCiAgICAgICAgICBsb2NrID0gbm9kZS5fX3RyYW5zaXRpb25fXyB8fCAobm9kZS5fX3RyYW5zaXRpb25fXyA9IHthY3RpdmU6IDAsIGNvdW50OiAwfSk7CgogICAgICArK2xvY2suY291bnQ7CgogICAgICBkZWxheSA8PSBlbGFwc2VkID8gc3RhcnQoZWxhcHNlZCkgOiBkMy50aW1lcihzdGFydCwgZGVsYXksIHRpbWUpOwoKICAgICAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkgewogICAgICAgIGlmIChsb2NrLmFjdGl2ZSA+IGlkKSByZXR1cm4gc3RvcCgpOwogICAgICAgIGxvY2suYWN0aXZlID0gaWQ7CgogICAgICAgIHR3ZWVucy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICAgIGlmICh0d2VlbiA9IHZhbHVlLmNhbGwobm9kZSwgZCwgaSkpIHsKICAgICAgICAgICAgdHdlZW5lZC5wdXNoKHR3ZWVuKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZXZlbnQuc3RhcnQuY2FsbChub2RlLCBkLCBpKTsKICAgICAgICBpZiAoIXRpY2soZWxhcHNlZCkpIGQzLnRpbWVyKHRpY2ssIDAsIHRpbWUpOwogICAgICAgIHJldHVybiAxOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsKICAgICAgICBpZiAobG9jay5hY3RpdmUgIT09IGlkKSByZXR1cm4gc3RvcCgpOwoKICAgICAgICB2YXIgdCA9IChlbGFwc2VkIC0gZGVsYXkpIC8gZHVyYXRpb24sCiAgICAgICAgICAgIGUgPSBlYXNlKHQpLAogICAgICAgICAgICBuID0gdHdlZW5lZC5sZW5ndGg7CgogICAgICAgIHdoaWxlIChuID4gMCkgewogICAgICAgICAgdHdlZW5lZFstLW5dLmNhbGwobm9kZSwgZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAodCA+PSAxKSB7CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgICBkM190cmFuc2l0aW9uSWQgPSBpZDsKICAgICAgICAgIGV2ZW50LmVuZC5jYWxsKG5vZGUsIGQsIGkpOwogICAgICAgICAgZDNfdHJhbnNpdGlvbklkID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICBpZiAoIS0tbG9jay5jb3VudCkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uX187CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIDE7CiAgfSwgMCwgdGltZSk7CgogIHJldHVybiBncm91cHM7Cn0KCnZhciBkM190cmFuc2l0aW9uUmVtb3ZlID0ge307CgpmdW5jdGlvbiBkM190cmFuc2l0aW9uTnVsbChkLCBpLCBhKSB7CiAgcmV0dXJuIGEgIT0gIiIgJiYgZDNfdHJhbnNpdGlvblJlbW92ZTsKfQoKZnVuY3Rpb24gZDNfdHJhbnNpdGlvblR3ZWVuKG5hbWUsIGIpIHsKICB2YXIgaW50ZXJwb2xhdGUgPSBkM19pbnRlcnBvbGF0ZUJ5TmFtZShuYW1lKTsKCiAgZnVuY3Rpb24gdHJhbnNpdGlvbkZ1bmN0aW9uKGQsIGksIGEpIHsKICAgIHZhciB2ID0gYi5jYWxsKHRoaXMsIGQsIGkpOwogICAgcmV0dXJuIHYgPT0gbnVsbAogICAgICAgID8gYSAhPSAiIiAmJiBkM190cmFuc2l0aW9uUmVtb3ZlCiAgICAgICAgOiBhICE9IHYgJiYgaW50ZXJwb2xhdGUoYSwgdik7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2l0aW9uU3RyaW5nKGQsIGksIGEpIHsKICAgIHJldHVybiBhICE9IGIgJiYgaW50ZXJwb2xhdGUoYSwgYik7CiAgfQoKICByZXR1cm4gdHlwZW9mIGIgPT09ICJmdW5jdGlvbiIgPyB0cmFuc2l0aW9uRnVuY3Rpb24KICAgICAgOiBiID09IG51bGwgPyBkM190cmFuc2l0aW9uTnVsbAogICAgICA6IChiICs9ICIiLCB0cmFuc2l0aW9uU3RyaW5nKTsKfQoKdmFyIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUgPSBbXSwKICAgIGQzX3RyYW5zaXRpb25OZXh0SWQgPSAwLAogICAgZDNfdHJhbnNpdGlvbklkID0gMCwKICAgIGQzX3RyYW5zaXRpb25EZWZhdWx0RGVsYXkgPSAwLAogICAgZDNfdHJhbnNpdGlvbkRlZmF1bHREdXJhdGlvbiA9IDI1MCwKICAgIGQzX3RyYW5zaXRpb25EZWZhdWx0RWFzZSA9IGQzLmVhc2UoImN1YmljLWluLW91dCIpLAogICAgZDNfdHJhbnNpdGlvbkRlbGF5ID0gZDNfdHJhbnNpdGlvbkRlZmF1bHREZWxheSwKICAgIGQzX3RyYW5zaXRpb25EdXJhdGlvbiA9IGQzX3RyYW5zaXRpb25EZWZhdWx0RHVyYXRpb24sCiAgICBkM190cmFuc2l0aW9uRWFzZSA9IGQzX3RyYW5zaXRpb25EZWZhdWx0RWFzZTsKCmQzX3RyYW5zaXRpb25Qcm90b3R5cGUuY2FsbCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsOwoKZDMudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKHNlbGVjdGlvbikgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gKGQzX3RyYW5zaXRpb25JZCA/IHNlbGVjdGlvbi50cmFuc2l0aW9uKCkgOiBzZWxlY3Rpb24pCiAgICAgIDogZDNfc2VsZWN0aW9uUm9vdC50cmFuc2l0aW9uKCk7Cn07CgpkMy50cmFuc2l0aW9uLnByb3RvdHlwZSA9IGQzX3RyYW5zaXRpb25Qcm90b3R5cGU7CmQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICB2YXIgc3ViZ3JvdXBzID0gW10sCiAgICAgIHN1Ymdyb3VwLAogICAgICBzdWJub2RlLAogICAgICBub2RlOwoKICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7CgogIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgewogICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7CiAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjspIHsKICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0b3IuY2FsbChub2RlLm5vZGUsIG5vZGUubm9kZS5fX2RhdGFfXywgaSkpKSB7CiAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZS5ub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5ub2RlLl9fZGF0YV9fOwogICAgICAgIHN1Ymdyb3VwLnB1c2goe25vZGU6IHN1Ym5vZGUsIGRlbGF5OiBub2RlLmRlbGF5LCBkdXJhdGlvbjogbm9kZS5kdXJhdGlvbn0pOwogICAgICB9IGVsc2UgewogICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5pZCwgdGhpcy50aW1lKS5lYXNlKHRoaXMuZWFzZSgpKTsKfTsKZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3RvcikgewogIHZhciBzdWJncm91cHMgPSBbXSwKICAgICAgc3ViZ3JvdXAsCiAgICAgIHN1Ym5vZGVzLAogICAgICBub2RlOwoKICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAiZnVuY3Rpb24iKSBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7CgogIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOykgewogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47KSB7CiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBzdWJub2RlcyA9IHNlbGVjdG9yLmNhbGwobm9kZS5ub2RlLCBub2RlLm5vZGUuX19kYXRhX18sIGkpOwogICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pOwogICAgICAgIGZvciAodmFyIGsgPSAtMSwgbyA9IHN1Ym5vZGVzLmxlbmd0aDsgKytrIDwgbzspIHsKICAgICAgICAgIHN1Ymdyb3VwLnB1c2goe25vZGU6IHN1Ym5vZGVzW2tdLCBkZWxheTogbm9kZS5kZWxheSwgZHVyYXRpb246IG5vZGUuZHVyYXRpb259KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5pZCwgdGhpcy50aW1lKS5lYXNlKHRoaXMuZWFzZSgpKTsKfTsKZDNfdHJhbnNpdGlvblByb3RvdHlwZS5hdHRyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgZDNfdHJhbnNpdGlvblR3ZWVuKG5hbWUsIHZhbHVlKSk7Cn07CgpkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWVOUywgdHdlZW4pIHsKICB2YXIgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZU5TKTsKCiAgZnVuY3Rpb24gYXR0clR3ZWVuKGQsIGkpIHsKICAgIHZhciBmID0gdHdlZW4uY2FsbCh0aGlzLCBkLCBpLCB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKSk7CiAgICByZXR1cm4gZiA9PT0gZDNfdHJhbnNpdGlvblJlbW92ZQogICAgICAgID8gKHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpLCBudWxsKQogICAgICAgIDogZiAmJiBmdW5jdGlvbih0KSB7IHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGYodCkpOyB9OwogIH0KCiAgZnVuY3Rpb24gYXR0clR3ZWVuTlMoZCwgaSkgewogICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIHRoaXMuZ2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCkpOwogICAgcmV0dXJuIGYgPT09IGQzX3RyYW5zaXRpb25SZW1vdmUKICAgICAgICA/ICh0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpLCBudWxsKQogICAgICAgIDogZiAmJiBmdW5jdGlvbih0KSB7IHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgZih0KSk7IH07CiAgfQoKICByZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iICsgbmFtZU5TLCBuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pOwp9OwpkM190cmFuc2l0aW9uUHJvdG90eXBlLnN0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBwcmlvcml0eSA9ICIiOwogIHJldHVybiB0aGlzLnN0eWxlVHdlZW4obmFtZSwgZDNfdHJhbnNpdGlvblR3ZWVuKG5hbWUsIHZhbHVlKSwgcHJpb3JpdHkpOwp9OwoKZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZVR3ZWVuID0gZnVuY3Rpb24obmFtZSwgdHdlZW4sIHByaW9yaXR5KSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBwcmlvcml0eSA9ICIiOwogIHJldHVybiB0aGlzLnR3ZWVuKCJzdHlsZS4iICsgbmFtZSwgZnVuY3Rpb24oZCwgaSkgewogICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSkpOwogICAgcmV0dXJuIGYgPT09IGQzX3RyYW5zaXRpb25SZW1vdmUKICAgICAgICA/ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBudWxsKQogICAgICAgIDogZiAmJiBmdW5jdGlvbih0KSB7IHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgZih0KSwgcHJpb3JpdHkpOyB9OwogIH0pOwp9OwpkM190cmFuc2l0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkgewogIHJldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwgZnVuY3Rpb24oZCwgaSkgewogICAgdGhpcy50ZXh0Q29udGVudCA9IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgID8gdmFsdWUuY2FsbCh0aGlzLCBkLCBpKQogICAgICAgIDogdmFsdWU7CiAgfSk7Cn07CmQzX3RyYW5zaXRpb25Qcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLCBmdW5jdGlvbigpIHsKICAgIHZhciBwOwogICAgaWYgKCF0aGlzLl9fdHJhbnNpdGlvbl9fICYmIChwID0gdGhpcy5wYXJlbnROb2RlKSkgcC5yZW1vdmVDaGlsZCh0aGlzKTsKICB9KTsKfTsKZDNfdHJhbnNpdGlvblByb3RvdHlwZS5kZWxheSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgdmFyIGdyb3VwcyA9IHRoaXM7CiAgcmV0dXJuIGdyb3Vwcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IGZ1bmN0aW9uKGQsIGksIGopIHsgZ3JvdXBzW2pdW2ldLmRlbGF5ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8IDA7IH0KICAgICAgOiAodmFsdWUgPSB2YWx1ZSB8IDAsIGZ1bmN0aW9uKGQsIGksIGopIHsgZ3JvdXBzW2pdW2ldLmRlbGF5ID0gdmFsdWU7IH0pKTsKfTsKZDNfdHJhbnNpdGlvblByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgdmFyIGdyb3VwcyA9IHRoaXM7CiAgcmV0dXJuIGdyb3Vwcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IGZ1bmN0aW9uKGQsIGksIGopIHsgZ3JvdXBzW2pdW2ldLmR1cmF0aW9uID0gTWF0aC5tYXgoMSwgdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8IDApOyB9CiAgICAgIDogKHZhbHVlID0gTWF0aC5tYXgoMSwgdmFsdWUgfCAwKSwgZnVuY3Rpb24oZCwgaSwgaikgeyBncm91cHNbal1baV0uZHVyYXRpb24gPSB2YWx1ZTsgfSkpOwp9OwpmdW5jdGlvbiBkM190cmFuc2l0aW9uX2VhY2goY2FsbGJhY2spIHsKICB2YXIgaWQgPSBkM190cmFuc2l0aW9uSWQsCiAgICAgIGVhc2UgPSBkM190cmFuc2l0aW9uRWFzZSwKICAgICAgZGVsYXkgPSBkM190cmFuc2l0aW9uRGVsYXksCiAgICAgIGR1cmF0aW9uID0gZDNfdHJhbnNpdGlvbkR1cmF0aW9uOwoKICBkM190cmFuc2l0aW9uSWQgPSB0aGlzLmlkOwogIGQzX3RyYW5zaXRpb25FYXNlID0gdGhpcy5lYXNlKCk7CiAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykgewogICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOwogICAgICBpZiAobm9kZSkgewogICAgICAgIGQzX3RyYW5zaXRpb25EZWxheSA9IHRoaXNbal1baV0uZGVsYXk7CiAgICAgICAgZDNfdHJhbnNpdGlvbkR1cmF0aW9uID0gdGhpc1tqXVtpXS5kdXJhdGlvbjsKICAgICAgICBjYWxsYmFjay5jYWxsKG5vZGUgPSBub2RlLm5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopOwogICAgICB9CiAgICB9CiAgfQoKICBkM190cmFuc2l0aW9uSWQgPSBpZDsKICBkM190cmFuc2l0aW9uRWFzZSA9IGVhc2U7CiAgZDNfdHJhbnNpdGlvbkRlbGF5ID0gZGVsYXk7CiAgZDNfdHJhbnNpdGlvbkR1cmF0aW9uID0gZHVyYXRpb247CiAgcmV0dXJuIHRoaXM7Cn0KZDNfdHJhbnNpdGlvblByb3RvdHlwZS50cmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuc2VsZWN0KGQzX3RoaXMpOwp9Owp2YXIgZDNfdGltZXJfcXVldWUgPSBudWxsLAogICAgZDNfdGltZXJfaW50ZXJ2YWwsIC8vIGlzIGFuIGludGVydmFsIChvciBmcmFtZSkgYWN0aXZlPwogICAgZDNfdGltZXJfdGltZW91dDsgLy8gaXMgYSB0aW1lb3V0IGFjdGl2ZT8KCi8vIFRoZSB0aW1lciB3aWxsIGNvbnRpbnVlIHRvIGZpcmUgdW50aWwgY2FsbGJhY2sgcmV0dXJucyB0cnVlLgpkMy50aW1lciA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGhlbikgewogIHZhciBmb3VuZCA9IGZhbHNlLAogICAgICB0MCwKICAgICAgdDEgPSBkM190aW1lcl9xdWV1ZTsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGRlbGF5ID0gMDsKICAgIGVsc2UgaWYgKCFpc0Zpbml0ZShkZWxheSkpIHJldHVybjsKICAgIHRoZW4gPSBEYXRlLm5vdygpOwogIH0KCiAgLy8gU2VlIGlmIHRoZSBjYWxsYmFjaydzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgogIHdoaWxlICh0MSkgewogICAgaWYgKHQxLmNhbGxiYWNrID09PSBjYWxsYmFjaykgewogICAgICB0MS50aGVuID0gdGhlbjsKICAgICAgdDEuZGVsYXkgPSBkZWxheTsKICAgICAgZm91bmQgPSB0cnVlOwogICAgICBicmVhazsKICAgIH0KICAgIHQwID0gdDE7CiAgICB0MSA9IHQxLm5leHQ7CiAgfQoKICAvLyBPdGhlcndpc2UsIGFkZCB0aGUgY2FsbGJhY2sgdG8gdGhlIHF1ZXVlLgogIGlmICghZm91bmQpIGQzX3RpbWVyX3F1ZXVlID0gewogICAgY2FsbGJhY2s6IGNhbGxiYWNrLAogICAgdGhlbjogdGhlbiwKICAgIGRlbGF5OiBkZWxheSwKICAgIG5leHQ6IGQzX3RpbWVyX3F1ZXVlCiAgfTsKCiAgLy8gU3RhcnQgYW5pbWF0aW4nIQogIGlmICghZDNfdGltZXJfaW50ZXJ2YWwpIHsKICAgIGQzX3RpbWVyX3RpbWVvdXQgPSBjbGVhclRpbWVvdXQoZDNfdGltZXJfdGltZW91dCk7CiAgICBkM190aW1lcl9pbnRlcnZhbCA9IDE7CiAgICBkM190aW1lcl9mcmFtZShkM190aW1lcl9zdGVwKTsKICB9Cn0KCmZ1bmN0aW9uIGQzX3RpbWVyX3N0ZXAoKSB7CiAgdmFyIGVsYXBzZWQsCiAgICAgIG5vdyA9IERhdGUubm93KCksCiAgICAgIHQxID0gZDNfdGltZXJfcXVldWU7CgogIHdoaWxlICh0MSkgewogICAgZWxhcHNlZCA9IG5vdyAtIHQxLnRoZW47CiAgICBpZiAoZWxhcHNlZCA+PSB0MS5kZWxheSkgdDEuZmx1c2ggPSB0MS5jYWxsYmFjayhlbGFwc2VkKTsKICAgIHQxID0gdDEubmV4dDsKICB9CgogIHZhciBkZWxheSA9IGQzX3RpbWVyX2ZsdXNoKCkgLSBub3c7CiAgaWYgKGRlbGF5ID4gMjQpIHsKICAgIGlmIChpc0Zpbml0ZShkZWxheSkpIHsKICAgICAgY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpOwogICAgICBkM190aW1lcl90aW1lb3V0ID0gc2V0VGltZW91dChkM190aW1lcl9zdGVwLCBkZWxheSk7CiAgICB9CiAgICBkM190aW1lcl9pbnRlcnZhbCA9IDA7CiAgfSBlbHNlIHsKICAgIGQzX3RpbWVyX2ludGVydmFsID0gMTsKICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApOwogIH0KfQoKZDMudGltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICB2YXIgZWxhcHNlZCwKICAgICAgbm93ID0gRGF0ZS5ub3coKSwKICAgICAgdDEgPSBkM190aW1lcl9xdWV1ZTsKCiAgd2hpbGUgKHQxKSB7CiAgICBlbGFwc2VkID0gbm93IC0gdDEudGhlbjsKICAgIGlmICghdDEuZGVsYXkpIHQxLmZsdXNoID0gdDEuY2FsbGJhY2soZWxhcHNlZCk7CiAgICB0MSA9IHQxLm5leHQ7CiAgfQoKICBkM190aW1lcl9mbHVzaCgpOwp9OwoKLy8gRmx1c2ggYWZ0ZXIgY2FsbGJhY2tzLCB0byBhdm9pZCBjb25jdXJyZW50IHF1ZXVlIG1vZGlmaWNhdGlvbi4KZnVuY3Rpb24gZDNfdGltZXJfZmx1c2goKSB7CiAgdmFyIHQwID0gbnVsbCwKICAgICAgdDEgPSBkM190aW1lcl9xdWV1ZSwKICAgICAgdGhlbiA9IEluZmluaXR5OwogIHdoaWxlICh0MSkgewogICAgaWYgKHQxLmZsdXNoKSB7CiAgICAgIHQxID0gdDAgPyB0MC5uZXh0ID0gdDEubmV4dCA6IGQzX3RpbWVyX3F1ZXVlID0gdDEubmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHRoZW4gPSBNYXRoLm1pbih0aGVuLCB0MS50aGVuICsgdDEuZGVsYXkpOwogICAgICB0MSA9ICh0MCA9IHQxKS5uZXh0OwogICAgfQogIH0KICByZXR1cm4gdGhlbjsKfQoKdmFyIGQzX3RpbWVyX2ZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZQogICAgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZQogICAgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZQogICAgfHwgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgIHx8IHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZQogICAgfHwgZnVuY3Rpb24oY2FsbGJhY2spIHsgc2V0VGltZW91dChjYWxsYmFjaywgMTcpOyB9OwpkMy50cmFuc2Zvcm0gPSBmdW5jdGlvbihzdHJpbmcpIHsKICB2YXIgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkMy5ucy5wcmVmaXguc3ZnLCAiZyIpLAogICAgICBpZGVudGl0eSA9IHthOiAxLCBiOiAwLCBjOiAwLCBkOiAxLCBlOiAwLCBmOiAwfTsKICByZXR1cm4gKGQzLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgZy5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHN0cmluZyk7CiAgICB2YXIgdCA9IGcudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKTsKICAgIHJldHVybiBuZXcgZDNfdHJhbnNmb3JtKHQgPyB0Lm1hdHJpeCA6IGlkZW50aXR5KTsKICB9KShzdHJpbmcpOwp9OwoKLy8gQ29tcHV0ZSB4LXNjYWxlIGFuZCBub3JtYWxpemUgdGhlIGZpcnN0IHJvdy4KLy8gQ29tcHV0ZSBzaGVhciBhbmQgbWFrZSBzZWNvbmQgcm93IG9ydGhvZ29uYWwgdG8gZmlyc3QuCi8vIENvbXB1dGUgeS1zY2FsZSBhbmQgbm9ybWFsaXplIHRoZSBzZWNvbmQgcm93LgovLyBGaW5hbGx5LCBjb21wdXRlIHRoZSByb3RhdGlvbi4KZnVuY3Rpb24gZDNfdHJhbnNmb3JtKG0pIHsKICB2YXIgcjAgPSBbbS5hLCBtLmJdLAogICAgICByMSA9IFttLmMsIG0uZF0sCiAgICAgIGt4ID0gZDNfdHJhbnNmb3JtTm9ybWFsaXplKHIwKSwKICAgICAga3ogPSBkM190cmFuc2Zvcm1Eb3QocjAsIHIxKSwKICAgICAga3kgPSBkM190cmFuc2Zvcm1Ob3JtYWxpemUoZDNfdHJhbnNmb3JtQ29tYmluZShyMSwgcjAsIC1reikpIHx8IDA7CiAgaWYgKHIwWzBdICogcjFbMV0gPCByMVswXSAqIHIwWzFdKSB7CiAgICByMFswXSAqPSAtMTsKICAgIHIwWzFdICo9IC0xOwogICAga3ggKj0gLTE7CiAgICBreiAqPSAtMTsKICB9CiAgdGhpcy5yb3RhdGUgPSAoa3ggPyBNYXRoLmF0YW4yKHIwWzFdLCByMFswXSkgOiBNYXRoLmF0YW4yKC1yMVswXSwgcjFbMV0pKSAqIGQzX3RyYW5zZm9ybURlZ3JlZXM7CiAgdGhpcy50cmFuc2xhdGUgPSBbbS5lLCBtLmZdOwogIHRoaXMuc2NhbGUgPSBba3gsIGt5XTsKICB0aGlzLnNrZXcgPSBreSA/IE1hdGguYXRhbjIoa3osIGt5KSAqIGQzX3RyYW5zZm9ybURlZ3JlZXMgOiAwOwp9OwoKZDNfdHJhbnNmb3JtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnRyYW5zbGF0ZQogICAgICArICIpcm90YXRlKCIgKyB0aGlzLnJvdGF0ZQogICAgICArICIpc2tld1goIiArIHRoaXMuc2tldwogICAgICArICIpc2NhbGUoIiArIHRoaXMuc2NhbGUKICAgICAgKyAiKSI7Cn07CgpmdW5jdGlvbiBkM190cmFuc2Zvcm1Eb3QoYSwgYikgewogIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdOwp9CgpmdW5jdGlvbiBkM190cmFuc2Zvcm1Ob3JtYWxpemUoYSkgewogIHZhciBrID0gTWF0aC5zcXJ0KGQzX3RyYW5zZm9ybURvdChhLCBhKSk7CiAgaWYgKGspIHsKICAgIGFbMF0gLz0gazsKICAgIGFbMV0gLz0gazsKICB9CiAgcmV0dXJuIGs7Cn0KCmZ1bmN0aW9uIGQzX3RyYW5zZm9ybUNvbWJpbmUoYSwgYiwgaykgewogIGFbMF0gKz0gayAqIGJbMF07CiAgYVsxXSArPSBrICogYlsxXTsKICByZXR1cm4gYTsKfQoKdmFyIGQzX3RyYW5zZm9ybURlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwpkMy5tb3VzZSA9IGZ1bmN0aW9uKGNvbnRhaW5lcikgewogIHJldHVybiBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgZDNfZXZlbnRTb3VyY2UoKSk7Cn07CgovLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQwODMKdmFyIGQzX21vdXNlX2J1ZzQ0MDgzID0gL1dlYktpdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IC0xIDogMDsKCmZ1bmN0aW9uIGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCBlKSB7CiAgdmFyIHN2ZyA9IGNvbnRhaW5lci5vd25lclNWR0VsZW1lbnQgfHwgY29udGFpbmVyOwogIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHsKICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOwogICAgaWYgKChkM19tb3VzZV9idWc0NDA4MyA8IDApICYmICh3aW5kb3cuc2Nyb2xsWCB8fCB3aW5kb3cuc2Nyb2xsWSkpIHsKICAgICAgc3ZnID0gZDMuc2VsZWN0KGRvY3VtZW50LmJvZHkpCiAgICAgICAgLmFwcGVuZCgic3ZnIikKICAgICAgICAgIC5zdHlsZSgicG9zaXRpb24iLCAiYWJzb2x1dGUiKQogICAgICAgICAgLnN0eWxlKCJ0b3AiLCAwKQogICAgICAgICAgLnN0eWxlKCJsZWZ0IiwgMCk7CiAgICAgIHZhciBjdG0gPSBzdmdbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7CiAgICAgIGQzX21vdXNlX2J1ZzQ0MDgzID0gIShjdG0uZiB8fCBjdG0uZSk7CiAgICAgIHN2Zy5yZW1vdmUoKTsKICAgIH0KICAgIGlmIChkM19tb3VzZV9idWc0NDA4MykgewogICAgICBwb2ludC54ID0gZS5wYWdlWDsKICAgICAgcG9pbnQueSA9IGUucGFnZVk7CiAgICB9IGVsc2UgewogICAgICBwb2ludC54ID0gZS5jbGllbnRYOwogICAgICBwb2ludC55ID0gZS5jbGllbnRZOwogICAgfQogICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0oY29udGFpbmVyLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7CiAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldOwogIH0KICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICByZXR1cm4gW2UuY2xpZW50WCAtIHJlY3QubGVmdCAtIGNvbnRhaW5lci5jbGllbnRMZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCAtIGNvbnRhaW5lci5jbGllbnRUb3BdOwp9OwpkMy50b3VjaGVzID0gZnVuY3Rpb24oY29udGFpbmVyLCB0b3VjaGVzKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB0b3VjaGVzID0gZDNfZXZlbnRTb3VyY2UoKS50b3VjaGVzOwogIHJldHVybiB0b3VjaGVzID8gZDNfYXJyYXkodG91Y2hlcykubWFwKGZ1bmN0aW9uKHRvdWNoKSB7CiAgICB2YXIgcG9pbnQgPSBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgdG91Y2gpOwogICAgcG9pbnQuaWRlbnRpZmllciA9IHRvdWNoLmlkZW50aWZpZXI7CiAgICByZXR1cm4gcG9pbnQ7CiAgfSkgOiBbXTsKfTsKZnVuY3Rpb24gZDNfbm9vcCgpIHt9CmQzLnNjYWxlID0ge307CgpmdW5jdGlvbiBkM19zY2FsZUV4dGVudChkb21haW4pIHsKICB2YXIgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdOwogIHJldHVybiBzdGFydCA8IHN0b3AgPyBbc3RhcnQsIHN0b3BdIDogW3N0b3AsIHN0YXJ0XTsKfQoKZnVuY3Rpb24gZDNfc2NhbGVSYW5nZShzY2FsZSkgewogIHJldHVybiBzY2FsZS5yYW5nZUV4dGVudCA/IHNjYWxlLnJhbmdlRXh0ZW50KCkgOiBkM19zY2FsZUV4dGVudChzY2FsZS5yYW5nZSgpKTsKfQpmdW5jdGlvbiBkM19zY2FsZV9uaWNlKGRvbWFpbiwgbmljZSkgewogIHZhciBpMCA9IDAsCiAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsCiAgICAgIHgwID0gZG9tYWluW2kwXSwKICAgICAgeDEgPSBkb21haW5baTFdLAogICAgICBkeDsKCiAgaWYgKHgxIDwgeDApIHsKICAgIGR4ID0gaTA7IGkwID0gaTE7IGkxID0gZHg7CiAgICBkeCA9IHgwOyB4MCA9IHgxOyB4MSA9IGR4OwogIH0KCiAgaWYgKGR4ID0geDEgLSB4MCkgewogICAgbmljZSA9IG5pY2UoZHgpOwogICAgZG9tYWluW2kwXSA9IG5pY2UuZmxvb3IoeDApOwogICAgZG9tYWluW2kxXSA9IG5pY2UuY2VpbCh4MSk7CiAgfQoKICByZXR1cm4gZG9tYWluOwp9CgpmdW5jdGlvbiBkM19zY2FsZV9uaWNlRGVmYXVsdCgpIHsKICByZXR1cm4gTWF0aDsKfQpkMy5zY2FsZS5saW5lYXIgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDNfc2NhbGVfbGluZWFyKFswLCAxXSwgWzAsIDFdLCBkMy5pbnRlcnBvbGF0ZSwgZmFsc2UpOwp9OwoKZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlLCBjbGFtcCkgewogIHZhciBvdXRwdXQsCiAgICAgIGlucHV0OwoKICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgdmFyIGxpbmVhciA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgPiAyID8gZDNfc2NhbGVfcG9seWxpbmVhciA6IGQzX3NjYWxlX2JpbGluZWFyLAogICAgICAgIHVuaW50ZXJwb2xhdGUgPSBjbGFtcCA/IGQzX3VuaW50ZXJwb2xhdGVDbGFtcCA6IGQzX3VuaW50ZXJwb2xhdGVOdW1iZXI7CiAgICBvdXRwdXQgPSBsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpOwogICAgaW5wdXQgPSBsaW5lYXIocmFuZ2UsIGRvbWFpbiwgdW5pbnRlcnBvbGF0ZSwgZDMuaW50ZXJwb2xhdGUpOwogICAgcmV0dXJuIHNjYWxlOwogIH0KCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIG91dHB1dCh4KTsKICB9CgogIC8vIE5vdGU6IHJlcXVpcmVzIHJhbmdlIGlzIGNvZXJjaWJsZSB0byBudW1iZXIhCiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgewogICAgcmV0dXJuIGlucHV0KHkpOwogIH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgIGRvbWFpbiA9IHgubWFwKE51bWJlcik7CiAgICByZXR1cm4gcmVzY2FsZSgpOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7CiAgICByYW5nZSA9IHg7CiAgICByZXR1cm4gcmVzY2FsZSgpOwogIH07CgogIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gc2NhbGUucmFuZ2UoeCkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVSb3VuZCk7CiAgfTsKCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGFtcDsKICAgIGNsYW1wID0geDsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZTsKICAgIGludGVycG9sYXRlID0geDsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihtKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTsKICB9OwoKICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSkgewogICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtKTsKICB9OwoKICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7CiAgICBkM19zY2FsZV9uaWNlKGRvbWFpbiwgZDNfc2NhbGVfbGluZWFyTmljZSk7CiAgICByZXR1cm4gcmVzY2FsZSgpOwogIH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9saW5lYXIoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUsIGNsYW1wKTsKICB9OwoKICByZXR1cm4gcmVzY2FsZSgpOwp9CgpmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJSZWJpbmQoc2NhbGUsIGxpbmVhcikgewogIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgInJhbmdlIiwgInJhbmdlUm91bmQiLCAiaW50ZXJwb2xhdGUiLCAiY2xhbXAiKTsKfQoKZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyTmljZShkeCkgewogIGR4ID0gTWF0aC5wb3coMTAsIE1hdGgucm91bmQoTWF0aC5sb2coZHgpIC8gTWF0aC5MTjEwKSAtIDEpOwogIHJldHVybiB7CiAgICBmbG9vcjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5mbG9vcih4IC8gZHgpICogZHg7IH0sCiAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmNlaWwoeCAvIGR4KSAqIGR4OyB9CiAgfTsKfQoKZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSkgewogIHZhciBleHRlbnQgPSBkM19zY2FsZUV4dGVudChkb21haW4pLAogICAgICBzcGFuID0gZXh0ZW50WzFdIC0gZXh0ZW50WzBdLAogICAgICBzdGVwID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3BhbiAvIG0pIC8gTWF0aC5MTjEwKSksCiAgICAgIGVyciA9IG0gLyBzcGFuICogc3RlcDsKCiAgLy8gRmlsdGVyIHRpY2tzIHRvIGdldCBjbG9zZXIgdG8gdGhlIGRlc2lyZWQgY291bnQuCiAgaWYgKGVyciA8PSAuMTUpIHN0ZXAgKj0gMTA7CiAgZWxzZSBpZiAoZXJyIDw9IC4zNSkgc3RlcCAqPSA1OwogIGVsc2UgaWYgKGVyciA8PSAuNzUpIHN0ZXAgKj0gMjsKCiAgLy8gUm91bmQgc3RhcnQgYW5kIHN0b3AgdmFsdWVzIHRvIHN0ZXAgaW50ZXJ2YWwuCiAgZXh0ZW50WzBdID0gTWF0aC5jZWlsKGV4dGVudFswXSAvIHN0ZXApICogc3RlcDsKICBleHRlbnRbMV0gPSBNYXRoLmZsb29yKGV4dGVudFsxXSAvIHN0ZXApICogc3RlcCArIHN0ZXAgKiAuNTsgLy8gaW5jbHVzaXZlCiAgZXh0ZW50WzJdID0gc3RlcDsKICByZXR1cm4gZXh0ZW50Owp9CgpmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pIHsKICByZXR1cm4gZDMucmFuZ2UuYXBwbHkoZDMsIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pKTsKfQoKZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0pIHsKICByZXR1cm4gZDMuZm9ybWF0KCIsLiIgKyBNYXRoLm1heCgwLCAtTWF0aC5mbG9vcihNYXRoLmxvZyhkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKVsyXSkgLyBNYXRoLkxOMTAgKyAuMDEpKSArICJmIik7Cn0KZnVuY3Rpb24gZDNfc2NhbGVfYmlsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpIHsKICB2YXIgdSA9IHVuaW50ZXJwb2xhdGUoZG9tYWluWzBdLCBkb21haW5bMV0pLAogICAgICBpID0gaW50ZXJwb2xhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTsKICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGkodSh4KSk7CiAgfTsKfQpmdW5jdGlvbiBkM19zY2FsZV9wb2x5bGluZWFyKGRvbWFpbiwgcmFuZ2UsIHVuaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKSB7CiAgdmFyIHUgPSBbXSwKICAgICAgaSA9IFtdLAogICAgICBqID0gMCwKICAgICAgayA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxOwoKICAvLyBIYW5kbGUgZGVzY2VuZGluZyBkb21haW5zLgogIGlmIChkb21haW5ba10gPCBkb21haW5bMF0pIHsKICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTsKICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7CiAgfQoKICB3aGlsZSAoKytqIDw9IGspIHsKICAgIHUucHVzaCh1bmludGVycG9sYXRlKGRvbWFpbltqIC0gMV0sIGRvbWFpbltqXSkpOwogICAgaS5wdXNoKGludGVycG9sYXRlKHJhbmdlW2ogLSAxXSwgcmFuZ2Vbal0pKTsKICB9CgogIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICB2YXIgaiA9IGQzLmJpc2VjdChkb21haW4sIHgsIDEsIGspIC0gMTsKICAgIHJldHVybiBpW2pdKHVbal0oeCkpOwogIH07Cn0KZDMuc2NhbGUubG9nID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGQzX3NjYWxlX2xvZyhkMy5zY2FsZS5saW5lYXIoKSwgZDNfc2NhbGVfbG9ncCk7Cn07CgpmdW5jdGlvbiBkM19zY2FsZV9sb2cobGluZWFyLCBsb2cpIHsKICB2YXIgcG93ID0gbG9nLnBvdzsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIGxpbmVhcihsb2coeCkpOwogIH0KCiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIHBvdyhsaW5lYXIuaW52ZXJ0KHgpKTsKICB9OwoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5lYXIuZG9tYWluKCkubWFwKHBvdyk7CiAgICBsb2cgPSB4WzBdIDwgMCA/IGQzX3NjYWxlX2xvZ24gOiBkM19zY2FsZV9sb2dwOwogICAgcG93ID0gbG9nLnBvdzsKICAgIGxpbmVhci5kb21haW4oeC5tYXAobG9nKSk7CiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgewogICAgbGluZWFyLmRvbWFpbihkM19zY2FsZV9uaWNlKGxpbmVhci5kb21haW4oKSwgZDNfc2NhbGVfbmljZURlZmF1bHQpKTsKICAgIHJldHVybiBzY2FsZTsKICB9OwoKICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGxpbmVhci5kb21haW4oKSksCiAgICAgICAgdGlja3MgPSBbXTsKICAgIGlmIChleHRlbnQuZXZlcnkoaXNGaW5pdGUpKSB7CiAgICAgIHZhciBpID0gTWF0aC5mbG9vcihleHRlbnRbMF0pLAogICAgICAgICAgaiA9IE1hdGguY2VpbChleHRlbnRbMV0pLAogICAgICAgICAgdSA9IHBvdyhleHRlbnRbMF0pLAogICAgICAgICAgdiA9IHBvdyhleHRlbnRbMV0pOwogICAgICBpZiAobG9nID09PSBkM19zY2FsZV9sb2duKSB7CiAgICAgICAgdGlja3MucHVzaChwb3coaSkpOwogICAgICAgIGZvciAoOyBpKysgPCBqOykgZm9yICh2YXIgayA9IDk7IGsgPiAwOyBrLS0pIHRpY2tzLnB1c2gocG93KGkpICogayk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICg7IGkgPCBqOyBpKyspIGZvciAodmFyIGsgPSAxOyBrIDwgMTA7IGsrKykgdGlja3MucHVzaChwb3coaSkgKiBrKTsKICAgICAgICB0aWNrcy5wdXNoKHBvdyhpKSk7CiAgICAgIH0KICAgICAgZm9yIChpID0gMDsgdGlja3NbaV0gPCB1OyBpKyspIHt9IC8vIHN0cmlwIHNtYWxsIHZhbHVlcwogICAgICBmb3IgKGogPSB0aWNrcy5sZW5ndGg7IHRpY2tzW2ogLSAxXSA+IHY7IGotLSkge30gLy8gc3RyaXAgYmlnIHZhbHVlcwogICAgICB0aWNrcyA9IHRpY2tzLnNsaWNlKGksIGopOwogICAgfQogICAgcmV0dXJuIHRpY2tzOwogIH07CgogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihuLCBmb3JtYXQpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgZm9ybWF0ID0gZDNfc2NhbGVfbG9nRm9ybWF0OwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gZm9ybWF0OwogICAgdmFyIGsgPSBuIC8gc2NhbGUudGlja3MoKS5sZW5ndGgsCiAgICAgICAgZiA9IGxvZyA9PT0gZDNfc2NhbGVfbG9nbiA/IChlID0gLTFlLTEyLCBNYXRoLmZsb29yKSA6IChlID0gMWUtMTIsIE1hdGguY2VpbCksCiAgICAgICAgZTsKICAgIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiBkIC8gcG93KGYobG9nKGQpICsgZSkpIDwgayA/IGZvcm1hdChkKSA6ICIiOwogICAgfTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfbG9nKGxpbmVhci5jb3B5KCksIGxvZyk7CiAgfTsKCiAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTsKfQoKdmFyIGQzX3NjYWxlX2xvZ0Zvcm1hdCA9IGQzLmZvcm1hdCgiLjBlIik7CgpmdW5jdGlvbiBkM19zY2FsZV9sb2dwKHgpIHsKICByZXR1cm4gTWF0aC5sb2coeCA8IDAgPyAwIDogeCkgLyBNYXRoLkxOMTA7Cn0KCmZ1bmN0aW9uIGQzX3NjYWxlX2xvZ24oeCkgewogIHJldHVybiAtTWF0aC5sb2coeCA+IDAgPyAwIDogLXgpIC8gTWF0aC5MTjEwOwp9CgpkM19zY2FsZV9sb2dwLnBvdyA9IGZ1bmN0aW9uKHgpIHsKICByZXR1cm4gTWF0aC5wb3coMTAsIHgpOwp9OwoKZDNfc2NhbGVfbG9nbi5wb3cgPSBmdW5jdGlvbih4KSB7CiAgcmV0dXJuIC1NYXRoLnBvdygxMCwgLXgpOwp9OwpkMy5zY2FsZS5wb3cgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDNfc2NhbGVfcG93KGQzLnNjYWxlLmxpbmVhcigpLCAxKTsKfTsKCmZ1bmN0aW9uIGQzX3NjYWxlX3BvdyhsaW5lYXIsIGV4cG9uZW50KSB7CiAgdmFyIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQpLAogICAgICBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIHJldHVybiBsaW5lYXIocG93cCh4KSk7CiAgfQoKICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gcG93YihsaW5lYXIuaW52ZXJ0KHgpKTsKICB9OwoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5lYXIuZG9tYWluKCkubWFwKHBvd2IpOwogICAgbGluZWFyLmRvbWFpbih4Lm1hcChwb3dwKSk7CiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihtKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3Moc2NhbGUuZG9tYWluKCksIG0pOwogIH07CgogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChzY2FsZS5kb21haW4oKSwgbSk7CiAgfTsKCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkM19zY2FsZV9uaWNlKHNjYWxlLmRvbWFpbigpLCBkM19zY2FsZV9saW5lYXJOaWNlKSk7CiAgfTsKCiAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBleHBvbmVudDsKICAgIHZhciBkb21haW4gPSBzY2FsZS5kb21haW4oKTsKICAgIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQgPSB4KTsKICAgIHBvd2IgPSBkM19zY2FsZV9wb3dQb3coMSAvIGV4cG9uZW50KTsKICAgIHJldHVybiBzY2FsZS5kb21haW4oZG9tYWluKTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfcG93KGxpbmVhci5jb3B5KCksIGV4cG9uZW50KTsKICB9OwoKICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpOwp9CgpmdW5jdGlvbiBkM19zY2FsZV9wb3dQb3coZSkgewogIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4geCA8IDAgPyAtTWF0aC5wb3coLXgsIGUpIDogTWF0aC5wb3coeCwgZSk7CiAgfTsKfQpkMy5zY2FsZS5zcXJ0ID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGQzLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KTsKfTsKZDMuc2NhbGUub3JkaW5hbCA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKFtdLCB7dDogInJhbmdlIiwgeDogW119KTsKfTsKCmZ1bmN0aW9uIGQzX3NjYWxlX29yZGluYWwoZG9tYWluLCByYW5nZXIpIHsKICB2YXIgaW5kZXgsCiAgICAgIHJhbmdlLAogICAgICByYW5nZUJhbmQ7CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIHJldHVybiByYW5nZVsoKGluZGV4LmdldCh4KSB8fCBpbmRleC5zZXQoeCwgZG9tYWluLnB1c2goeCkpKSAtIDEpICUgcmFuZ2UubGVuZ3RoXTsKICB9CgogIGZ1bmN0aW9uIHN0ZXBzKHN0YXJ0LCBzdGVwKSB7CiAgICByZXR1cm4gZDMucmFuZ2UoZG9tYWluLmxlbmd0aCkubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluOwogICAgZG9tYWluID0gW107CiAgICBpbmRleCA9IG5ldyBkM19NYXA7CiAgICB2YXIgaSA9IC0xLCBuID0geC5sZW5ndGgsIHhpOwogICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKHhpID0geFtpXSkpIGluZGV4LnNldCh4aSwgZG9tYWluLnB1c2goeGkpKTsKICAgIHJldHVybiBzY2FsZVtyYW5nZXIudF0ocmFuZ2VyLngsIHJhbmdlci5wKTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlOwogICAgcmFuZ2UgPSB4OwogICAgcmFuZ2VCYW5kID0gMDsKICAgIHJhbmdlciA9IHt0OiAicmFuZ2UiLCB4OiB4fTsKICAgIHJldHVybiBzY2FsZTsKICB9OwoKICBzY2FsZS5yYW5nZVBvaW50cyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7CiAgICB2YXIgc3RhcnQgPSB4WzBdLAogICAgICAgIHN0b3AgPSB4WzFdLAogICAgICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gMSArIHBhZGRpbmcpOwogICAgcmFuZ2UgPSBzdGVwcyhkb21haW4ubGVuZ3RoIDwgMiA/IChzdGFydCArIHN0b3ApIC8gMiA6IHN0YXJ0ICsgc3RlcCAqIHBhZGRpbmcgLyAyLCBzdGVwKTsKICAgIHJhbmdlQmFuZCA9IDA7CiAgICByYW5nZXIgPSB7dDogInJhbmdlUG9pbnRzIiwgeDogeCwgcDogcGFkZGluZ307CiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgc2NhbGUucmFuZ2VCYW5kcyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7CiAgICB2YXIgcmV2ZXJzZSA9IHhbMV0gPCB4WzBdLAogICAgICAgIHN0YXJ0ID0geFtyZXZlcnNlIC0gMF0sCiAgICAgICAgc3RvcCA9IHhbMSAtIHJldmVyc2VdLAogICAgICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoICsgcGFkZGluZyk7CiAgICByYW5nZSA9IHN0ZXBzKHN0YXJ0ICsgc3RlcCAqIHBhZGRpbmcsIHN0ZXApOwogICAgaWYgKHJldmVyc2UpIHJhbmdlLnJldmVyc2UoKTsKICAgIHJhbmdlQmFuZCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmcpOwogICAgcmFuZ2VyID0ge3Q6ICJyYW5nZUJhbmRzIiwgeDogeCwgcDogcGFkZGluZ307CiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgc2NhbGUucmFuZ2VSb3VuZEJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwYWRkaW5nID0gMDsKICAgIHZhciByZXZlcnNlID0geFsxXSA8IHhbMF0sCiAgICAgICAgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwKICAgICAgICBzdG9wID0geFsxIC0gcmV2ZXJzZV0sCiAgICAgICAgc3RlcCA9IE1hdGguZmxvb3IoKHN0b3AgLSBzdGFydCkgLyAoZG9tYWluLmxlbmd0aCArIHBhZGRpbmcpKSwKICAgICAgICBlcnJvciA9IHN0b3AgLSBzdGFydCAtIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZykgKiBzdGVwOwogICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIE1hdGgucm91bmQoZXJyb3IgLyAyKSwgc3RlcCk7CiAgICBpZiAocmV2ZXJzZSkgcmFuZ2UucmV2ZXJzZSgpOwogICAgcmFuZ2VCYW5kID0gTWF0aC5yb3VuZChzdGVwICogKDEgLSBwYWRkaW5nKSk7CiAgICByYW5nZXIgPSB7dDogInJhbmdlUm91bmRCYW5kcyIsIHg6IHgsIHA6IHBhZGRpbmd9OwogICAgcmV0dXJuIHNjYWxlOwogIH07CgogIHNjYWxlLnJhbmdlQmFuZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHJhbmdlQmFuZDsKICB9OwoKICBzY2FsZS5yYW5nZUV4dGVudCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NjYWxlRXh0ZW50KHJhbmdlci54KTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfb3JkaW5hbChkb21haW4sIHJhbmdlcik7CiAgfTsKCiAgcmV0dXJuIHNjYWxlLmRvbWFpbihkb21haW4pOwp9Ci8qCiAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjb2xvciBzcGVjaWZpY2F0aW9ucyBhbmQgZGVzaWducyBkZXZlbG9wZWQgYnkgQ3ludGhpYQogKiBCcmV3ZXIgKGh0dHA6Ly9jb2xvcmJyZXdlci5vcmcvKS4gU2VlIGxpYi9jb2xvcmJyZXdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICovCgpkMy5zY2FsZS5jYXRlZ29yeTEwID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShkM19jYXRlZ29yeTEwKTsKfTsKCmQzLnNjYWxlLmNhdGVnb3J5MjAgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjApOwp9OwoKZDMuc2NhbGUuY2F0ZWdvcnkyMGIgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjBiKTsKfTsKCmQzLnNjYWxlLmNhdGVnb3J5MjBjID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShkM19jYXRlZ29yeTIwYyk7Cn07Cgp2YXIgZDNfY2F0ZWdvcnkxMCA9IFsKICAiIzFmNzdiNCIsICIjZmY3ZjBlIiwgIiMyY2EwMmMiLCAiI2Q2MjcyOCIsICIjOTQ2N2JkIiwKICAiIzhjNTY0YiIsICIjZTM3N2MyIiwgIiM3ZjdmN2YiLCAiI2JjYmQyMiIsICIjMTdiZWNmIgpdOwoKdmFyIGQzX2NhdGVnb3J5MjAgPSBbCiAgIiMxZjc3YjQiLCAiI2FlYzdlOCIsCiAgIiNmZjdmMGUiLCAiI2ZmYmI3OCIsCiAgIiMyY2EwMmMiLCAiIzk4ZGY4YSIsCiAgIiNkNjI3MjgiLCAiI2ZmOTg5NiIsCiAgIiM5NDY3YmQiLCAiI2M1YjBkNSIsCiAgIiM4YzU2NGIiLCAiI2M0OWM5NCIsCiAgIiNlMzc3YzIiLCAiI2Y3YjZkMiIsCiAgIiM3ZjdmN2YiLCAiI2M3YzdjNyIsCiAgIiNiY2JkMjIiLCAiI2RiZGI4ZCIsCiAgIiMxN2JlY2YiLCAiIzllZGFlNSIKXTsKCnZhciBkM19jYXRlZ29yeTIwYiA9IFsKICAiIzM5M2I3OSIsICIjNTI1NGEzIiwgIiM2YjZlY2YiLCAiIzljOWVkZSIsCiAgIiM2Mzc5MzkiLCAiIzhjYTI1MiIsICIjYjVjZjZiIiwgIiNjZWRiOWMiLAogICIjOGM2ZDMxIiwgIiNiZDllMzkiLCAiI2U3YmE1MiIsICIjZTdjYjk0IiwKICAiIzg0M2MzOSIsICIjYWQ0OTRhIiwgIiNkNjYxNmIiLCAiI2U3OTY5YyIsCiAgIiM3YjQxNzMiLCAiI2E1NTE5NCIsICIjY2U2ZGJkIiwgIiNkZTllZDYiCl07Cgp2YXIgZDNfY2F0ZWdvcnkyMGMgPSBbCiAgIiMzMTgyYmQiLCAiIzZiYWVkNiIsICIjOWVjYWUxIiwgIiNjNmRiZWYiLAogICIjZTY1NTBkIiwgIiNmZDhkM2MiLCAiI2ZkYWU2YiIsICIjZmRkMGEyIiwKICAiIzMxYTM1NCIsICIjNzRjNDc2IiwgIiNhMWQ5OWIiLCAiI2M3ZTljMCIsCiAgIiM3NTZiYjEiLCAiIzllOWFjOCIsICIjYmNiZGRjIiwgIiNkYWRhZWIiLAogICIjNjM2MzYzIiwgIiM5Njk2OTYiLCAiI2JkYmRiZCIsICIjZDlkOWQ5IgpdOwpkMy5zY2FsZS5xdWFudGlsZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBkM19zY2FsZV9xdWFudGlsZShbXSwgW10pOwp9OwoKZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSkgewogIHZhciB0aHJlc2hvbGRzOwoKICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgdmFyIGsgPSAwLAogICAgICAgIG4gPSBkb21haW4ubGVuZ3RoLAogICAgICAgIHEgPSByYW5nZS5sZW5ndGg7CiAgICB0aHJlc2hvbGRzID0gW107CiAgICB3aGlsZSAoKytrIDwgcSkgdGhyZXNob2xkc1trIC0gMV0gPSBkMy5xdWFudGlsZShkb21haW4sIGsgLyBxKTsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgIGlmIChpc05hTih4ID0gK3gpKSByZXR1cm4gTmFOOwogICAgcmV0dXJuIHJhbmdlW2QzLmJpc2VjdCh0aHJlc2hvbGRzLCB4KV07CiAgfQoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47CiAgICBkb21haW4gPSB4LmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiAhaXNOYU4oZCk7IH0pLnNvcnQoZDMuYXNjZW5kaW5nKTsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKICAgIHJhbmdlID0geDsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhyZXNob2xkczsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSk7IC8vIGNvcHkgb24gd3JpdGUhCiAgfTsKCiAgcmV0dXJuIHJlc2NhbGUoKTsKfQpkMy5zY2FsZS5xdWFudGl6ZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSgwLCAxLCBbMCwgMV0pOwp9OwoKZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSkgewogIHZhciBreCwgaTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIHJhbmdlW01hdGgubWF4KDAsIE1hdGgubWluKGksIE1hdGguZmxvb3Ioa3ggKiAoeCAtIHgwKSkpKV07CiAgfQoKICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAga3ggPSByYW5nZS5sZW5ndGggLyAoeDEgLSB4MCk7CiAgICBpID0gcmFuZ2UubGVuZ3RoIC0gMTsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFt4MCwgeDFdOwogICAgeDAgPSAreFswXTsKICAgIHgxID0gK3hbeC5sZW5ndGggLSAxXTsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKICAgIHJhbmdlID0geDsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aXplKHgwLCB4MSwgcmFuZ2UpOyAvLyBjb3B5IG9uIHdyaXRlCiAgfTsKCiAgcmV0dXJuIHJlc2NhbGUoKTsKfQpkMy5zY2FsZS5pZGVudGl0eSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBkM19zY2FsZV9pZGVudGl0eShbMCwgMV0pOwp9OwoKZnVuY3Rpb24gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKSB7CgogIGZ1bmN0aW9uIGlkZW50aXR5KHgpIHsgcmV0dXJuICt4OyB9CgogIGlkZW50aXR5LmludmVydCA9IGlkZW50aXR5OwoKICBpZGVudGl0eS5kb21haW4gPSBpZGVudGl0eS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjsKICAgIGRvbWFpbiA9IHgubWFwKGlkZW50aXR5KTsKICAgIHJldHVybiBpZGVudGl0eTsKICB9OwoKICBpZGVudGl0eS50aWNrcyA9IGZ1bmN0aW9uKG0pIHsKICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pOwogIH07CgogIGlkZW50aXR5LnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtKSB7CiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0pOwogIH07CgogIGlkZW50aXR5LmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkM19zY2FsZV9pZGVudGl0eShkb21haW4pOwogIH07CgogIHJldHVybiBpZGVudGl0eTsKfQpkMy5zdmcgPSB7fTsKZDMuc3ZnLmFyYyA9IGZ1bmN0aW9uKCkgewogIHZhciBpbm5lclJhZGl1cyA9IGQzX3N2Z19hcmNJbm5lclJhZGl1cywKICAgICAgb3V0ZXJSYWRpdXMgPSBkM19zdmdfYXJjT3V0ZXJSYWRpdXMsCiAgICAgIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwKICAgICAgZW5kQW5nbGUgPSBkM19zdmdfYXJjRW5kQW5nbGU7CgogIGZ1bmN0aW9uIGFyYygpIHsKICAgIHZhciByMCA9IGlubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgcjEgPSBvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgZDNfc3ZnX2FyY09mZnNldCwKICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyBkM19zdmdfYXJjT2Zmc2V0LAogICAgICAgIGRhID0gKGExIDwgYTAgJiYgKGRhID0gYTAsIGEwID0gYTEsIGExID0gZGEpLCBhMSAtIGEwKSwKICAgICAgICBkZiA9IGRhIDwgTWF0aC5QSSA/ICIwIiA6ICIxIiwKICAgICAgICBjMCA9IE1hdGguY29zKGEwKSwKICAgICAgICBzMCA9IE1hdGguc2luKGEwKSwKICAgICAgICBjMSA9IE1hdGguY29zKGExKSwKICAgICAgICBzMSA9IE1hdGguc2luKGExKTsKICAgIHJldHVybiBkYSA+PSBkM19zdmdfYXJjTWF4CiAgICAgID8gKHIwCiAgICAgID8gIk0wLCIgKyByMQogICAgICArICJBIiArIHIxICsgIiwiICsgcjEgKyAiIDAgMSwxIDAsIiArICgtcjEpCiAgICAgICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAxLDEgMCwiICsgcjEKICAgICAgKyAiTTAsIiArIHIwCiAgICAgICsgIkEiICsgcjAgKyAiLCIgKyByMCArICIgMCAxLDAgMCwiICsgKC1yMCkKICAgICAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwIDEsMCAwLCIgKyByMAogICAgICArICJaIgogICAgICA6ICJNMCwiICsgcjEKICAgICAgKyAiQSIgKyByMSArICIsIiArIHIxICsgIiAwIDEsMSAwLCIgKyAoLXIxKQogICAgICArICJBIiArIHIxICsgIiwiICsgcjEgKyAiIDAgMSwxIDAsIiArIHIxCiAgICAgICsgIloiKQogICAgICA6IChyMAogICAgICA/ICJNIiArIHIxICogYzAgKyAiLCIgKyByMSAqIHMwCiAgICAgICsgIkEiICsgcjEgKyAiLCIgKyByMSArICIgMCAiICsgZGYgKyAiLDEgIiArIHIxICogYzEgKyAiLCIgKyByMSAqIHMxCiAgICAgICsgIkwiICsgcjAgKiBjMSArICIsIiArIHIwICogczEKICAgICAgKyAiQSIgKyByMCArICIsIiArIHIwICsgIiAwICIgKyBkZiArICIsMCAiICsgcjAgKiBjMCArICIsIiArIHIwICogczAKICAgICAgKyAiWiIKICAgICAgOiAiTSIgKyByMSAqIGMwICsgIiwiICsgcjEgKiBzMAogICAgICArICJBIiArIHIxICsgIiwiICsgcjEgKyAiIDAgIiArIGRmICsgIiwxICIgKyByMSAqIGMxICsgIiwiICsgcjEgKiBzMQogICAgICArICJMMCwwIgogICAgICArICJaIik7CiAgfQoKICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbm5lclJhZGl1czsKICAgIGlubmVyUmFkaXVzID0gZDMuZnVuY3Rvcih2KTsKICAgIHJldHVybiBhcmM7CiAgfTsKCiAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24odikgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0ZXJSYWRpdXM7CiAgICBvdXRlclJhZGl1cyA9IGQzLmZ1bmN0b3Iodik7CiAgICByZXR1cm4gYXJjOwogIH07CgogIGFyYy5zdGFydEFuZ2xlID0gZnVuY3Rpb24odikgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsKICAgIHN0YXJ0QW5nbGUgPSBkMy5mdW5jdG9yKHYpOwogICAgcmV0dXJuIGFyYzsKICB9OwoKICBhcmMuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlbmRBbmdsZTsKICAgIGVuZEFuZ2xlID0gZDMuZnVuY3Rvcih2KTsKICAgIHJldHVybiBhcmM7CiAgfTsKCiAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgciA9IChpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpCiAgICAgICAgKyBvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsCiAgICAgICAgYSA9IChzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKICAgICAgICArIGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiArIGQzX3N2Z19hcmNPZmZzZXQ7CiAgICByZXR1cm4gW01hdGguY29zKGEpICogciwgTWF0aC5zaW4oYSkgKiByXTsKICB9OwoKICByZXR1cm4gYXJjOwp9OwoKdmFyIGQzX3N2Z19hcmNPZmZzZXQgPSAtTWF0aC5QSSAvIDIsCiAgICBkM19zdmdfYXJjTWF4ID0gMiAqIE1hdGguUEkgLSAxZS02OwoKZnVuY3Rpb24gZDNfc3ZnX2FyY0lubmVyUmFkaXVzKGQpIHsKICByZXR1cm4gZC5pbm5lclJhZGl1czsKfQoKZnVuY3Rpb24gZDNfc3ZnX2FyY091dGVyUmFkaXVzKGQpIHsKICByZXR1cm4gZC5vdXRlclJhZGl1czsKfQoKZnVuY3Rpb24gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUoZCkgewogIHJldHVybiBkLnN0YXJ0QW5nbGU7Cn0KCmZ1bmN0aW9uIGQzX3N2Z19hcmNFbmRBbmdsZShkKSB7CiAgcmV0dXJuIGQuZW5kQW5nbGU7Cn0KZnVuY3Rpb24gZDNfc3ZnX2xpbmUocHJvamVjdGlvbikgewogIHZhciB4ID0gZDNfc3ZnX2xpbmVYLAogICAgICB5ID0gZDNfc3ZnX2xpbmVZLAogICAgICBpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9yRGVmYXVsdCwKICAgICAgaW50ZXJwb2xhdG9yID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChpbnRlcnBvbGF0ZSksCiAgICAgIHRlbnNpb24gPSAuNzsKCiAgZnVuY3Rpb24gbGluZShkKSB7CiAgICByZXR1cm4gZC5sZW5ndGggPCAxID8gbnVsbCA6ICJNIiArIGludGVycG9sYXRvcihwcm9qZWN0aW9uKGQzX3N2Z19saW5lUG9pbnRzKHRoaXMsIGQsIHgsIHkpKSwgdGVuc2lvbik7CiAgfQoKICBsaW5lLnggPSBmdW5jdGlvbih2KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4OwogICAgeCA9IHY7CiAgICByZXR1cm4gbGluZTsKICB9OwoKICBsaW5lLnkgPSBmdW5jdGlvbih2KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5OwogICAgeSA9IHY7CiAgICByZXR1cm4gbGluZTsKICB9OwoKICBsaW5lLmludGVycG9sYXRlID0gZnVuY3Rpb24odikgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGU7CiAgICBpZiAoIWQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5oYXModiArPSAiIikpIHYgPSBkM19zdmdfbGluZUludGVycG9sYXRvckRlZmF1bHQ7CiAgICBpbnRlcnBvbGF0b3IgPSBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZ2V0KGludGVycG9sYXRlID0gdik7CiAgICByZXR1cm4gbGluZTsKICB9OwoKICBsaW5lLnRlbnNpb24gPSBmdW5jdGlvbih2KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uOwogICAgdGVuc2lvbiA9IHY7CiAgICByZXR1cm4gbGluZTsKICB9OwoKICByZXR1cm4gbGluZTsKfQoKZDMuc3ZnLmxpbmUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDNfc3ZnX2xpbmUoT2JqZWN0KTsKfTsKCi8vIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZGF0YSBpbnRvIGFuIGFycmF5IG9mIHBvaW50cwovLyAoeC15IHR1cGxlcyksIGJ5IGV2YWx1YXRpbmcgdGhlIHNwZWNpZmllZCBgeGAgYW5kIGB5YCBmdW5jdGlvbnMgb24gZWFjaAovLyBkYXRhIHBvaW50LiBUaGUgYHRoaXNgIGNvbnRleHQgb2YgdGhlIGV2YWx1YXRlZCBmdW5jdGlvbnMgaXMgdGhlIHNwZWNpZmllZAovLyAic2VsZiIgb2JqZWN0OyBlYWNoIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgY3VycmVudCBkYXR1bSBhbmQgaW5kZXguCmZ1bmN0aW9uIGQzX3N2Z19saW5lUG9pbnRzKHNlbGYsIGQsIHgsIHkpIHsKICB2YXIgcG9pbnRzID0gW10sCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IGQubGVuZ3RoLAogICAgICBmeCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iLAogICAgICBmeSA9IHR5cGVvZiB5ID09PSAiZnVuY3Rpb24iLAogICAgICB2YWx1ZTsKICBpZiAoZnggJiYgZnkpIHsKICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbCiAgICAgIHguY2FsbChzZWxmLCB2YWx1ZSA9IGRbaV0sIGkpLAogICAgICB5LmNhbGwoc2VsZiwgdmFsdWUsIGkpCiAgICBdKTsKICB9IGVsc2UgaWYgKGZ4KSB7CiAgICB3aGlsZSAoKytpIDwgbikgcG9pbnRzLnB1c2goW3guY2FsbChzZWxmLCBkW2ldLCBpKSwgeV0pOwogIH0gZWxzZSBpZiAoZnkpIHsKICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbeCwgeS5jYWxsKHNlbGYsIGRbaV0sIGkpXSk7CiAgfSBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSBwb2ludHMucHVzaChbeCwgeV0pOwogIH0KICByZXR1cm4gcG9pbnRzOwp9CgovLyBUaGUgZGVmYXVsdCBgeGAgcHJvcGVydHksIHdoaWNoIHJlZmVyZW5jZXMgZFswXS4KZnVuY3Rpb24gZDNfc3ZnX2xpbmVYKGQpIHsKICByZXR1cm4gZFswXTsKfQoKLy8gVGhlIGRlZmF1bHQgYHlgIHByb3BlcnR5LCB3aGljaCByZWZlcmVuY2VzIGRbMV0uCmZ1bmN0aW9uIGQzX3N2Z19saW5lWShkKSB7CiAgcmV0dXJuIGRbMV07Cn0KCnZhciBkM19zdmdfbGluZUludGVycG9sYXRvckRlZmF1bHQgPSAibGluZWFyIjsKCi8vIFRoZSB2YXJpb3VzIGludGVycG9sYXRvcnMgc3VwcG9ydGVkIGJ5IHRoZSBgbGluZWAgY2xhc3MuCnZhciBkM19zdmdfbGluZUludGVycG9sYXRvcnMgPSBkMy5tYXAoewogICJsaW5lYXIiOiBkM19zdmdfbGluZUxpbmVhciwKICAic3RlcC1iZWZvcmUiOiBkM19zdmdfbGluZVN0ZXBCZWZvcmUsCiAgInN0ZXAtYWZ0ZXIiOiBkM19zdmdfbGluZVN0ZXBBZnRlciwKICAiYmFzaXMiOiBkM19zdmdfbGluZUJhc2lzLAogICJiYXNpcy1vcGVuIjogZDNfc3ZnX2xpbmVCYXNpc09wZW4sCiAgImJhc2lzLWNsb3NlZCI6IGQzX3N2Z19saW5lQmFzaXNDbG9zZWQsCiAgImJ1bmRsZSI6IGQzX3N2Z19saW5lQnVuZGxlLAogICJjYXJkaW5hbCI6IGQzX3N2Z19saW5lQ2FyZGluYWwsCiAgImNhcmRpbmFsLW9wZW4iOiBkM19zdmdfbGluZUNhcmRpbmFsT3BlbiwKICAiY2FyZGluYWwtY2xvc2VkIjogZDNfc3ZnX2xpbmVDYXJkaW5hbENsb3NlZCwKICAibW9ub3RvbmUiOiBkM19zdmdfbGluZU1vbm90b25lCn0pOwoKLy8gTGluZWFyIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiTCIgY29tbWFuZHMuCmZ1bmN0aW9uIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgewogIHZhciBpID0gMCwKICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCiAgICAgIHAgPSBwb2ludHNbMF0sCiAgICAgIHBhdGggPSBbcFswXSwgIiwiLCBwWzFdXTsKICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJMIiwgKHAgPSBwb2ludHNbaV0pWzBdLCAiLCIsIHBbMV0pOwogIHJldHVybiBwYXRoLmpvaW4oIiIpOwp9CgovLyBTdGVwIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiSCIgYW5kICJWIiBjb21tYW5kcy4KZnVuY3Rpb24gZDNfc3ZnX2xpbmVTdGVwQmVmb3JlKHBvaW50cykgewogIHZhciBpID0gMCwKICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCiAgICAgIHAgPSBwb2ludHNbMF0sCiAgICAgIHBhdGggPSBbcFswXSwgIiwiLCBwWzFdXTsKICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJWIiwgKHAgPSBwb2ludHNbaV0pWzFdLCAiSCIsIHBbMF0pOwogIHJldHVybiBwYXRoLmpvaW4oIiIpOwp9CgovLyBTdGVwIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiSCIgYW5kICJWIiBjb21tYW5kcy4KZnVuY3Rpb24gZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIocG9pbnRzKSB7CiAgdmFyIGkgPSAwLAogICAgICBuID0gcG9pbnRzLmxlbmd0aCwKICAgICAgcCA9IHBvaW50c1swXSwKICAgICAgcGF0aCA9IFtwWzBdLCAiLCIsIHBbMV1dOwogIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goIkgiLCAocCA9IHBvaW50c1tpXSlbMF0sICJWIiwgcFsxXSk7CiAgcmV0dXJuIHBhdGguam9pbigiIik7Cn0KCi8vIE9wZW4gY2FyZGluYWwgc3BsaW5lIGludGVycG9sYXRpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuCmZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxPcGVuKHBvaW50cywgdGVuc2lvbikgewogIHJldHVybiBwb2ludHMubGVuZ3RoIDwgNAogICAgICA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykKICAgICAgOiBwb2ludHNbMV0gKyBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLnNsaWNlKDEsIHBvaW50cy5sZW5ndGggLSAxKSwKICAgICAgICBkM19zdmdfbGluZUNhcmRpbmFsVGFuZ2VudHMocG9pbnRzLCB0ZW5zaW9uKSk7Cn0KCi8vIENsb3NlZCBjYXJkaW5hbCBzcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4KZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbENsb3NlZChwb2ludHMsIHRlbnNpb24pIHsKICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMKICAgICAgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpCiAgICAgIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKChwb2ludHMucHVzaChwb2ludHNbMF0pLCBwb2ludHMpLAogICAgICAgIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhbcG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXV0KICAgICAgICAuY29uY2F0KHBvaW50cywgW3BvaW50c1sxXV0pLCB0ZW5zaW9uKSk7Cn0KCi8vIENhcmRpbmFsIHNwbGluZSBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkMiIGNvbW1hbmRzLgpmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsKHBvaW50cywgdGVuc2lvbiwgY2xvc2VkKSB7CiAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzCiAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQogICAgICA6IHBvaW50c1swXSArIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsCiAgICAgICAgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpOwp9CgovLyBIZXJtaXRlIHNwbGluZSBjb25zdHJ1Y3Rpb247IGdlbmVyYXRlcyAiQyIgY29tbWFuZHMuCmZ1bmN0aW9uIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIHRhbmdlbnRzKSB7CiAgaWYgKHRhbmdlbnRzLmxlbmd0aCA8IDEKICAgICAgfHwgKHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoCiAgICAgICYmIHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoICsgMikpIHsKICAgIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpOwogIH0KCiAgdmFyIHF1YWQgPSBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCwKICAgICAgcGF0aCA9ICIiLAogICAgICBwMCA9IHBvaW50c1swXSwKICAgICAgcCA9IHBvaW50c1sxXSwKICAgICAgdDAgPSB0YW5nZW50c1swXSwKICAgICAgdCA9IHQwLAogICAgICBwaSA9IDE7CgogIGlmIChxdWFkKSB7CiAgICBwYXRoICs9ICJRIiArIChwWzBdIC0gdDBbMF0gKiAyIC8gMykgKyAiLCIgKyAocFsxXSAtIHQwWzFdICogMiAvIDMpCiAgICAgICAgKyAiLCIgKyBwWzBdICsgIiwiICsgcFsxXTsKICAgIHAwID0gcG9pbnRzWzFdOwogICAgcGkgPSAyOwogIH0KCiAgaWYgKHRhbmdlbnRzLmxlbmd0aCA+IDEpIHsKICAgIHQgPSB0YW5nZW50c1sxXTsKICAgIHAgPSBwb2ludHNbcGldOwogICAgcGkrKzsKICAgIHBhdGggKz0gIkMiICsgKHAwWzBdICsgdDBbMF0pICsgIiwiICsgKHAwWzFdICsgdDBbMV0pCiAgICAgICAgKyAiLCIgKyAocFswXSAtIHRbMF0pICsgIiwiICsgKHBbMV0gLSB0WzFdKQogICAgICAgICsgIiwiICsgcFswXSArICIsIiArIHBbMV07CiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHRhbmdlbnRzLmxlbmd0aDsgaSsrLCBwaSsrKSB7CiAgICAgIHAgPSBwb2ludHNbcGldOwogICAgICB0ID0gdGFuZ2VudHNbaV07CiAgICAgIHBhdGggKz0gIlMiICsgKHBbMF0gLSB0WzBdKSArICIsIiArIChwWzFdIC0gdFsxXSkKICAgICAgICAgICsgIiwiICsgcFswXSArICIsIiArIHBbMV07CiAgICB9CiAgfQoKICBpZiAocXVhZCkgewogICAgdmFyIGxwID0gcG9pbnRzW3BpXTsKICAgIHBhdGggKz0gIlEiICsgKHBbMF0gKyB0WzBdICogMiAvIDMpICsgIiwiICsgKHBbMV0gKyB0WzFdICogMiAvIDMpCiAgICAgICAgKyAiLCIgKyBscFswXSArICIsIiArIGxwWzFdOwogIH0KCiAgcmV0dXJuIHBhdGg7Cn0KCi8vIEdlbmVyYXRlcyB0YW5nZW50cyBmb3IgYSBjYXJkaW5hbCBzcGxpbmUuCmZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pIHsKICB2YXIgdGFuZ2VudHMgPSBbXSwKICAgICAgYSA9ICgxIC0gdGVuc2lvbikgLyAyLAogICAgICBwMCwKICAgICAgcDEgPSBwb2ludHNbMF0sCiAgICAgIHAyID0gcG9pbnRzWzFdLAogICAgICBpID0gMSwKICAgICAgbiA9IHBvaW50cy5sZW5ndGg7CiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIHAwID0gcDE7CiAgICBwMSA9IHAyOwogICAgcDIgPSBwb2ludHNbaV07CiAgICB0YW5nZW50cy5wdXNoKFthICogKHAyWzBdIC0gcDBbMF0pLCBhICogKHAyWzFdIC0gcDBbMV0pXSk7CiAgfQogIHJldHVybiB0YW5nZW50czsKfQoKLy8gQi1zcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4KZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpcyhwb2ludHMpIHsKICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpOwogIHZhciBpID0gMSwKICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCiAgICAgIHBpID0gcG9pbnRzWzBdLAogICAgICB4MCA9IHBpWzBdLAogICAgICB5MCA9IHBpWzFdLAogICAgICBweCA9IFt4MCwgeDAsIHgwLCAocGkgPSBwb2ludHNbMV0pWzBdXSwKICAgICAgcHkgPSBbeTAsIHkwLCB5MCwgcGlbMV1dLAogICAgICBwYXRoID0gW3gwLCAiLCIsIHkwXTsKICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7CiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIHBpID0gcG9pbnRzW2ldOwogICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7CiAgICBweS5zaGlmdCgpOyBweS5wdXNoKHBpWzFdKTsKICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTsKICB9CiAgaSA9IC0xOwogIHdoaWxlICgrK2kgPCAyKSB7CiAgICBweC5zaGlmdCgpOyBweC5wdXNoKHBpWzBdKTsKICAgIHB5LnNoaWZ0KCk7IHB5LnB1c2gocGlbMV0pOwogICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpOwogIH0KICByZXR1cm4gcGF0aC5qb2luKCIiKTsKfQoKLy8gT3BlbiBCLXNwbGluZSBpbnRlcnBvbGF0aW9uOyBnZW5lcmF0ZXMgIkMiIGNvbW1hbmRzLgpmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzT3Blbihwb2ludHMpIHsKICBpZiAocG9pbnRzLmxlbmd0aCA8IDQpIHJldHVybiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpOwogIHZhciBwYXRoID0gW10sCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCiAgICAgIHBpLAogICAgICBweCA9IFswXSwKICAgICAgcHkgPSBbMF07CiAgd2hpbGUgKCsraSA8IDMpIHsKICAgIHBpID0gcG9pbnRzW2ldOwogICAgcHgucHVzaChwaVswXSk7CiAgICBweS5wdXNoKHBpWzFdKTsKICB9CiAgcGF0aC5wdXNoKGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHgpCiAgICArICIsIiArIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHkpKTsKICAtLWk7IHdoaWxlICgrK2kgPCBuKSB7CiAgICBwaSA9IHBvaW50c1tpXTsKICAgIHB4LnNoaWZ0KCk7IHB4LnB1c2gocGlbMF0pOwogICAgcHkuc2hpZnQoKTsgcHkucHVzaChwaVsxXSk7CiAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7CiAgfQogIHJldHVybiBwYXRoLmpvaW4oIiIpOwp9CgovLyBDbG9zZWQgQi1zcGxpbmUgaW50ZXJwb2xhdGlvbjsgZ2VuZXJhdGVzICJDIiBjb21tYW5kcy4KZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc0Nsb3NlZChwb2ludHMpIHsKICB2YXIgcGF0aCwKICAgICAgaSA9IC0xLAogICAgICBuID0gcG9pbnRzLmxlbmd0aCwKICAgICAgbSA9IG4gKyA0LAogICAgICBwaSwKICAgICAgcHggPSBbXSwKICAgICAgcHkgPSBbXTsKICB3aGlsZSAoKytpIDwgNCkgewogICAgcGkgPSBwb2ludHNbaSAlIG5dOwogICAgcHgucHVzaChwaVswXSk7CiAgICBweS5wdXNoKHBpWzFdKTsKICB9CiAgcGF0aCA9IFsKICAgIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHgpLCAiLCIsCiAgICBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB5KQogIF07CiAgLS1pOyB3aGlsZSAoKytpIDwgbSkgewogICAgcGkgPSBwb2ludHNbaSAlIG5dOwogICAgcHguc2hpZnQoKTsgcHgucHVzaChwaVswXSk7CiAgICBweS5zaGlmdCgpOyBweS5wdXNoKHBpWzFdKTsKICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTsKICB9CiAgcmV0dXJuIHBhdGguam9pbigiIik7Cn0KCmZ1bmN0aW9uIGQzX3N2Z19saW5lQnVuZGxlKHBvaW50cywgdGVuc2lvbikgewogIHZhciBuID0gcG9pbnRzLmxlbmd0aCAtIDEsCiAgICAgIHgwID0gcG9pbnRzWzBdWzBdLAogICAgICB5MCA9IHBvaW50c1swXVsxXSwKICAgICAgZHggPSBwb2ludHNbbl1bMF0gLSB4MCwKICAgICAgZHkgPSBwb2ludHNbbl1bMV0gLSB5MCwKICAgICAgaSA9IC0xLAogICAgICBwLAogICAgICB0OwogIHdoaWxlICgrK2kgPD0gbikgewogICAgcCA9IHBvaW50c1tpXTsKICAgIHQgPSBpIC8gbjsKICAgIHBbMF0gPSB0ZW5zaW9uICogcFswXSArICgxIC0gdGVuc2lvbikgKiAoeDAgKyB0ICogZHgpOwogICAgcFsxXSA9IHRlbnNpb24gKiBwWzFdICsgKDEgLSB0ZW5zaW9uKSAqICh5MCArIHQgKiBkeSk7CiAgfQogIHJldHVybiBkM19zdmdfbGluZUJhc2lzKHBvaW50cyk7Cn0KCi8vIFJldHVybnMgdGhlIGRvdCBwcm9kdWN0IG9mIHRoZSBnaXZlbiBmb3VyLWVsZW1lbnQgdmVjdG9ycy4KZnVuY3Rpb24gZDNfc3ZnX2xpbmVEb3Q0KGEsIGIpIHsKICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107Cn0KCi8vIE1hdHJpeCB0byB0cmFuc2Zvcm0gYmFzaXMgKGItc3BsaW5lKSBjb250cm9sIHBvaW50cyB0byBiZXppZXIKLy8gY29udHJvbCBwb2ludHMuIERlcml2ZWQgZnJvbSBGdkQgMTEuMi44Lgp2YXIgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEgPSBbMCwgMi8zLCAxLzMsIDBdLAogICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIgPSBbMCwgMS8zLCAyLzMsIDBdLAogICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMgPSBbMCwgMS82LCAyLzMsIDEvNl07CgovLyBQdXNoZXMgYSAiQyIgQsOpemllciBjdXJ2ZSBvbnRvIHRoZSBzcGVjaWZpZWQgcGF0aCBhcnJheSwgZ2l2ZW4gdGhlCi8vIHR3byBzcGVjaWZpZWQgZm91ci1lbGVtZW50IGFycmF5cyB3aGljaCBkZWZpbmUgdGhlIGNvbnRyb2wgcG9pbnRzLgpmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHgsIHkpIHsKICBwYXRoLnB1c2goCiAgICAgICJDIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB4KSwKICAgICAgIiwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEsIHkpLAogICAgICAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMiwgeCksCiAgICAgICIsIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB5KSwKICAgICAgIiwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHgpLAogICAgICAiLCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgeSkpOwp9CgovLyBDb21wdXRlcyB0aGUgc2xvcGUgZnJvbSBwb2ludHMgcDAgdG8gcDEuCmZ1bmN0aW9uIGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKSB7CiAgcmV0dXJuIChwMVsxXSAtIHAwWzFdKSAvIChwMVswXSAtIHAwWzBdKTsKfQoKLy8gQ29tcHV0ZSB0aHJlZS1wb2ludCBkaWZmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIHBvaW50cy4KLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19IZXJtaXRlX3NwbGluZSNGaW5pdGVfZGlmZmVyZW5jZQpmdW5jdGlvbiBkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzKHBvaW50cykgewogIHZhciBpID0gMCwKICAgICAgaiA9IHBvaW50cy5sZW5ndGggLSAxLAogICAgICBtID0gW10sCiAgICAgIHAwID0gcG9pbnRzWzBdLAogICAgICBwMSA9IHBvaW50c1sxXSwKICAgICAgZCA9IG1bMF0gPSBkM19zdmdfbGluZVNsb3BlKHAwLCBwMSk7CiAgd2hpbGUgKCsraSA8IGopIHsKICAgIG1baV0gPSBkICsgKGQgPSBkM19zdmdfbGluZVNsb3BlKHAwID0gcDEsIHAxID0gcG9pbnRzW2kgKyAxXSkpOwogIH0KICBtW2ldID0gZDsKICByZXR1cm4gbTsKfQoKLy8gSW50ZXJwb2xhdGVzIHRoZSBnaXZlbiBwb2ludHMgdXNpbmcgRnJpdHNjaC1DYXJsc29uIE1vbm90b25lIGN1YmljIEhlcm1pdGUKLy8gaW50ZXJwb2xhdGlvbi4gUmV0dXJucyBhbiBhcnJheSBvZiB0YW5nZW50IHZlY3RvcnMuIEZvciBkZXRhaWxzLCBzZWUKLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb25vdG9uZV9jdWJpY19pbnRlcnBvbGF0aW9uCmZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpIHsKICB2YXIgdGFuZ2VudHMgPSBbXSwKICAgICAgZCwKICAgICAgYSwKICAgICAgYiwKICAgICAgcywKICAgICAgbSA9IGQzX3N2Z19saW5lRmluaXRlRGlmZmVyZW5jZXMocG9pbnRzKSwKICAgICAgaSA9IC0xLAogICAgICBqID0gcG9pbnRzLmxlbmd0aCAtIDE7CgogIC8vIFRoZSBmaXJzdCB0d28gc3RlcHMgYXJlIGRvbmUgYnkgY29tcHV0aW5nIGZpbml0ZS1kaWZmZXJlbmNlczoKICAvLyAxLiBDb21wdXRlIHRoZSBzbG9wZXMgb2YgdGhlIHNlY2FudCBsaW5lcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgcG9pbnRzLgogIC8vIDIuIEluaXRpYWxpemUgdGhlIHRhbmdlbnRzIGF0IGV2ZXJ5IHBvaW50IGFzIHRoZSBhdmVyYWdlIG9mIHRoZSBzZWNhbnRzLgoKICAvLyBUaGVuLCBmb3IgZWFjaCBzZWdtZW504oA/CiAgd2hpbGUgKCsraSA8IGopIHsKICAgIGQgPSBkM19zdmdfbGluZVNsb3BlKHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSk7CgogICAgLy8gMy4gSWYgdHdvIHN1Y2Nlc3NpdmUgeWsgPSB5e2sgKyAxfSBhcmUgZXF1YWwgKGkuZS4sIGQgaXMgemVybyksIHRoZW4gc2V0CiAgICAvLyBtayA9IG17ayArIDF9ID0gMCBhcyB0aGUgc3BsaW5lIGNvbm5lY3RpbmcgdGhlc2UgcG9pbnRzIG11c3QgYmUgZmxhdCB0bwogICAgLy8gcHJlc2VydmUgbW9ub3RvbmljaXR5LiBJZ25vcmUgc3RlcCA0IGFuZCA1IGZvciB0aG9zZSBrLgoKICAgIGlmIChNYXRoLmFicyhkKSA8IDFlLTYpIHsKICAgICAgbVtpXSA9IG1baSArIDFdID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIDQuIExldCBhayA9IG1rIC8gZGsgYW5kIGJrID0gbXtrICsgMX0gLyBkay4KICAgICAgYSA9IG1baV0gLyBkOwogICAgICBiID0gbVtpICsgMV0gLyBkOwoKICAgICAgLy8gNS4gUHJldmVudCBvdmVyc2hvb3QgYW5kIGVuc3VyZSBtb25vdG9uaWNpdHkgYnkgcmVzdHJpY3RpbmcgdGhlCiAgICAgIC8vIG1hZ25pdHVkZSBvZiB2ZWN0b3IgPGFrLCBiaz4gdG8gYSBjaXJjbGUgb2YgcmFkaXVzIDMuCiAgICAgIHMgPSBhICogYSArIGIgKiBiOwogICAgICBpZiAocyA+IDkpIHsKICAgICAgICBzID0gZCAqIDMgLyBNYXRoLnNxcnQocyk7CiAgICAgICAgbVtpXSA9IHMgKiBhOwogICAgICAgIG1baSArIDFdID0gcyAqIGI7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIENvbXB1dGUgdGhlIG5vcm1hbGl6ZWQgdGFuZ2VudCB2ZWN0b3IgZnJvbSB0aGUgc2xvcGVzLiBOb3RlIHRoYXQgaWYgeCBpcwogIC8vIG5vdCBtb25vdG9uaWMsIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgc2xvcGUgd2lsbCBiZSBpbmZpbml0ZSwgc28gd2UgcHJvdGVjdAogIC8vIGFnYWluc3QgTmFOIGJ5IHNldHRpbmcgdGhlIGNvb3JkaW5hdGUgdG8gemVyby4KICBpID0gLTE7IHdoaWxlICgrK2kgPD0gaikgewogICAgcyA9IChwb2ludHNbTWF0aC5taW4oaiwgaSArIDEpXVswXSAtIHBvaW50c1tNYXRoLm1heCgwLCBpIC0gMSldWzBdKQogICAgICAvICg2ICogKDEgKyBtW2ldICogbVtpXSkpOwogICAgdGFuZ2VudHMucHVzaChbcyB8fCAwLCBtW2ldICogcyB8fCAwXSk7CiAgfQoKICByZXR1cm4gdGFuZ2VudHM7Cn0KCmZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmUocG9pbnRzKSB7CiAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzCiAgICAgID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKQogICAgICA6IHBvaW50c1swXSArCiAgICAgICAgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywgZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzKHBvaW50cykpOwp9CmQzLnN2Zy5saW5lLnJhZGlhbCA9IGZ1bmN0aW9uKCkgewogIHZhciBsaW5lID0gZDNfc3ZnX2xpbmUoZDNfc3ZnX2xpbmVSYWRpYWwpOwogIGxpbmUucmFkaXVzID0gbGluZS54LCBkZWxldGUgbGluZS54OwogIGxpbmUuYW5nbGUgPSBsaW5lLnksIGRlbGV0ZSBsaW5lLnk7CiAgcmV0dXJuIGxpbmU7Cn07CgpmdW5jdGlvbiBkM19zdmdfbGluZVJhZGlhbChwb2ludHMpIHsKICB2YXIgcG9pbnQsCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IHBvaW50cy5sZW5ndGgsCiAgICAgIHIsCiAgICAgIGE7CiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIHBvaW50ID0gcG9pbnRzW2ldOwogICAgciA9IHBvaW50WzBdOwogICAgYSA9IHBvaW50WzFdICsgZDNfc3ZnX2FyY09mZnNldDsKICAgIHBvaW50WzBdID0gciAqIE1hdGguY29zKGEpOwogICAgcG9pbnRbMV0gPSByICogTWF0aC5zaW4oYSk7CiAgfQogIHJldHVybiBwb2ludHM7Cn0KZnVuY3Rpb24gZDNfc3ZnX2FyZWEocHJvamVjdGlvbikgewogIHZhciB4MCA9IGQzX3N2Z19saW5lWCwKICAgICAgeDEgPSBkM19zdmdfbGluZVgsCiAgICAgIHkwID0gMCwKICAgICAgeTEgPSBkM19zdmdfbGluZVksCiAgICAgIGludGVycG9sYXRlLAogICAgICBpMCwKICAgICAgaTEsCiAgICAgIHRlbnNpb24gPSAuNzsKCiAgZnVuY3Rpb24gYXJlYShkKSB7CiAgICBpZiAoZC5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDsKICAgIHZhciBwb2ludHMwID0gZDNfc3ZnX2xpbmVQb2ludHModGhpcywgZCwgeDAsIHkwKSwKICAgICAgICBwb2ludHMxID0gZDNfc3ZnX2xpbmVQb2ludHModGhpcywgZCwgeDAgPT09IHgxID8gZDNfc3ZnX2FyZWFYKHBvaW50czApIDogeDEsIHkwID09PSB5MSA/IGQzX3N2Z19hcmVhWShwb2ludHMwKSA6IHkxKTsKICAgIHJldHVybiAiTSIgKyBpMChwcm9qZWN0aW9uKHBvaW50czEpLCB0ZW5zaW9uKQogICAgICAgICArICJMIiArIGkxKHByb2plY3Rpb24ocG9pbnRzMC5yZXZlcnNlKCkpLCB0ZW5zaW9uKQogICAgICAgICArICJaIjsKICB9CgogIGFyZWEueCA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxOwogICAgeDAgPSB4MSA9IHg7CiAgICByZXR1cm4gYXJlYTsKICB9OwoKICBhcmVhLngwID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDA7CiAgICB4MCA9IHg7CiAgICByZXR1cm4gYXJlYTsKICB9OwoKICBhcmVhLngxID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7CiAgICB4MSA9IHg7CiAgICByZXR1cm4gYXJlYTsKICB9OwoKICBhcmVhLnkgPSBmdW5jdGlvbih5KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MTsKICAgIHkwID0geTEgPSB5OwogICAgcmV0dXJuIGFyZWE7CiAgfTsKCiAgYXJlYS55MCA9IGZ1bmN0aW9uKHkpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkwOwogICAgeTAgPSB5OwogICAgcmV0dXJuIGFyZWE7CiAgfTsKCiAgYXJlYS55MSA9IGZ1bmN0aW9uKHkpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxOwogICAgeTEgPSB5OwogICAgcmV0dXJuIGFyZWE7CiAgfTsKCiAgYXJlYS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlOwogICAgaWYgKCFkM19zdmdfbGluZUludGVycG9sYXRvcnMuaGFzKHggKz0gIiIpKSB4ID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JEZWZhdWx0OwogICAgaTAgPSBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZ2V0KGludGVycG9sYXRlID0geCk7CiAgICBpMSA9IGkwLnJldmVyc2UgfHwgaTA7CiAgICByZXR1cm4gYXJlYTsKICB9OwoKICBhcmVhLnRlbnNpb24gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uOwogICAgdGVuc2lvbiA9IHg7CiAgICByZXR1cm4gYXJlYTsKICB9OwoKICByZXR1cm4gYXJlYS5pbnRlcnBvbGF0ZSgibGluZWFyIik7Cn0KCmQzX3N2Z19saW5lU3RlcEJlZm9yZS5yZXZlcnNlID0gZDNfc3ZnX2xpbmVTdGVwQWZ0ZXI7CmQzX3N2Z19saW5lU3RlcEFmdGVyLnJldmVyc2UgPSBkM19zdmdfbGluZVN0ZXBCZWZvcmU7CgpkMy5zdmcuYXJlYSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBkM19zdmdfYXJlYShPYmplY3QpOwp9OwoKZnVuY3Rpb24gZDNfc3ZnX2FyZWFYKHBvaW50cykgewogIHJldHVybiBmdW5jdGlvbihkLCBpKSB7CiAgICByZXR1cm4gcG9pbnRzW2ldWzBdOwogIH07Cn0KCmZ1bmN0aW9uIGQzX3N2Z19hcmVhWShwb2ludHMpIHsKICByZXR1cm4gZnVuY3Rpb24oZCwgaSkgewogICAgcmV0dXJuIHBvaW50c1tpXVsxXTsKICB9Owp9CmQzLnN2Zy5hcmVhLnJhZGlhbCA9IGZ1bmN0aW9uKCkgewogIHZhciBhcmVhID0gZDNfc3ZnX2FyZWEoZDNfc3ZnX2xpbmVSYWRpYWwpOwogIGFyZWEucmFkaXVzID0gYXJlYS54LCBkZWxldGUgYXJlYS54OwogIGFyZWEuaW5uZXJSYWRpdXMgPSBhcmVhLngwLCBkZWxldGUgYXJlYS54MDsKICBhcmVhLm91dGVyUmFkaXVzID0gYXJlYS54MSwgZGVsZXRlIGFyZWEueDE7CiAgYXJlYS5hbmdsZSA9IGFyZWEueSwgZGVsZXRlIGFyZWEueTsKICBhcmVhLnN0YXJ0QW5nbGUgPSBhcmVhLnkwLCBkZWxldGUgYXJlYS55MDsKICBhcmVhLmVuZEFuZ2xlID0gYXJlYS55MSwgZGVsZXRlIGFyZWEueTE7CiAgcmV0dXJuIGFyZWE7Cn07CmQzLnN2Zy5jaG9yZCA9IGZ1bmN0aW9uKCkgewogIHZhciBzb3VyY2UgPSBkM19zdmdfY2hvcmRTb3VyY2UsCiAgICAgIHRhcmdldCA9IGQzX3N2Z19jaG9yZFRhcmdldCwKICAgICAgcmFkaXVzID0gZDNfc3ZnX2Nob3JkUmFkaXVzLAogICAgICBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsCiAgICAgIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlOwoKICAvLyBUT0RPIEFsbG93IGNvbnRyb2wgcG9pbnQgdG8gYmUgY3VzdG9taXplZC4KCiAgZnVuY3Rpb24gY2hvcmQoZCwgaSkgewogICAgdmFyIHMgPSBzdWJncm91cCh0aGlzLCBzb3VyY2UsIGQsIGkpLAogICAgICAgIHQgPSBzdWJncm91cCh0aGlzLCB0YXJnZXQsIGQsIGkpOwogICAgcmV0dXJuICJNIiArIHMucDAKICAgICAgKyBhcmMocy5yLCBzLnAxLCBzLmExIC0gcy5hMCkgKyAoZXF1YWxzKHMsIHQpCiAgICAgID8gY3VydmUocy5yLCBzLnAxLCBzLnIsIHMucDApCiAgICAgIDogY3VydmUocy5yLCBzLnAxLCB0LnIsIHQucDApCiAgICAgICsgYXJjKHQuciwgdC5wMSwgdC5hMSAtIHQuYTApCiAgICAgICsgY3VydmUodC5yLCB0LnAxLCBzLnIsIHMucDApKQogICAgICArICJaIjsKICB9CgogIGZ1bmN0aW9uIHN1Ymdyb3VwKHNlbGYsIGYsIGQsIGkpIHsKICAgIHZhciBzdWJncm91cCA9IGYuY2FsbChzZWxmLCBkLCBpKSwKICAgICAgICByID0gcmFkaXVzLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpLAogICAgICAgIGEwID0gc3RhcnRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSArIGQzX3N2Z19hcmNPZmZzZXQsCiAgICAgICAgYTEgPSBlbmRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSArIGQzX3N2Z19hcmNPZmZzZXQ7CiAgICByZXR1cm4gewogICAgICByOiByLAogICAgICBhMDogYTAsCiAgICAgIGExOiBhMSwKICAgICAgcDA6IFtyICogTWF0aC5jb3MoYTApLCByICogTWF0aC5zaW4oYTApXSwKICAgICAgcDE6IFtyICogTWF0aC5jb3MoYTEpLCByICogTWF0aC5zaW4oYTEpXQogICAgfTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7CiAgICByZXR1cm4gYS5hMCA9PSBiLmEwICYmIGEuYTEgPT0gYi5hMTsKICB9CgogIGZ1bmN0aW9uIGFyYyhyLCBwLCBhKSB7CiAgICByZXR1cm4gIkEiICsgciArICIsIiArIHIgKyAiIDAgIiArICsoYSA+IE1hdGguUEkpICsgIiwxICIgKyBwOwogIH0KCiAgZnVuY3Rpb24gY3VydmUocjAsIHAwLCByMSwgcDEpIHsKICAgIHJldHVybiAiUSAwLDAgIiArIHAxOwogIH0KCiAgY2hvcmQucmFkaXVzID0gZnVuY3Rpb24odikgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFkaXVzOwogICAgcmFkaXVzID0gZDMuZnVuY3Rvcih2KTsKICAgIHJldHVybiBjaG9yZDsKICB9OwoKICBjaG9yZC5zb3VyY2UgPSBmdW5jdGlvbih2KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7CiAgICBzb3VyY2UgPSBkMy5mdW5jdG9yKHYpOwogICAgcmV0dXJuIGNob3JkOwogIH07CgogIGNob3JkLnRhcmdldCA9IGZ1bmN0aW9uKHYpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDsKICAgIHRhcmdldCA9IGQzLmZ1bmN0b3Iodik7CiAgICByZXR1cm4gY2hvcmQ7CiAgfTsKCiAgY2hvcmQuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKHYpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7CiAgICBzdGFydEFuZ2xlID0gZDMuZnVuY3Rvcih2KTsKICAgIHJldHVybiBjaG9yZDsKICB9OwoKICBjaG9yZC5lbmRBbmdsZSA9IGZ1bmN0aW9uKHYpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlOwogICAgZW5kQW5nbGUgPSBkMy5mdW5jdG9yKHYpOwogICAgcmV0dXJuIGNob3JkOwogIH07CgogIHJldHVybiBjaG9yZDsKfTsKCmZ1bmN0aW9uIGQzX3N2Z19jaG9yZFNvdXJjZShkKSB7CiAgcmV0dXJuIGQuc291cmNlOwp9CgpmdW5jdGlvbiBkM19zdmdfY2hvcmRUYXJnZXQoZCkgewogIHJldHVybiBkLnRhcmdldDsKfQoKZnVuY3Rpb24gZDNfc3ZnX2Nob3JkUmFkaXVzKGQpIHsKICByZXR1cm4gZC5yYWRpdXM7Cn0KCmZ1bmN0aW9uIGQzX3N2Z19jaG9yZFN0YXJ0QW5nbGUoZCkgewogIHJldHVybiBkLnN0YXJ0QW5nbGU7Cn0KCmZ1bmN0aW9uIGQzX3N2Z19jaG9yZEVuZEFuZ2xlKGQpIHsKICByZXR1cm4gZC5lbmRBbmdsZTsKfQpkMy5zdmcuZGlhZ29uYWwgPSBmdW5jdGlvbigpIHsKICB2YXIgc291cmNlID0gZDNfc3ZnX2Nob3JkU291cmNlLAogICAgICB0YXJnZXQgPSBkM19zdmdfY2hvcmRUYXJnZXQsCiAgICAgIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uOwoKICBmdW5jdGlvbiBkaWFnb25hbChkLCBpKSB7CiAgICB2YXIgcDAgPSBzb3VyY2UuY2FsbCh0aGlzLCBkLCBpKSwKICAgICAgICBwMyA9IHRhcmdldC5jYWxsKHRoaXMsIGQsIGkpLAogICAgICAgIG0gPSAocDAueSArIHAzLnkpIC8gMiwKICAgICAgICBwID0gW3AwLCB7eDogcDAueCwgeTogbX0sIHt4OiBwMy54LCB5OiBtfSwgcDNdOwogICAgcCA9IHAubWFwKHByb2plY3Rpb24pOwogICAgcmV0dXJuICJNIiArIHBbMF0gKyAiQyIgKyBwWzFdICsgIiAiICsgcFsyXSArICIgIiArIHBbM107CiAgfQoKICBkaWFnb25hbC5zb3VyY2UgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7CiAgICBzb3VyY2UgPSBkMy5mdW5jdG9yKHgpOwogICAgcmV0dXJuIGRpYWdvbmFsOwogIH07CgogIGRpYWdvbmFsLnRhcmdldCA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDsKICAgIHRhcmdldCA9IGQzLmZ1bmN0b3IoeCk7CiAgICByZXR1cm4gZGlhZ29uYWw7CiAgfTsKCiAgZGlhZ29uYWwucHJvamVjdGlvbiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByb2plY3Rpb247CiAgICBwcm9qZWN0aW9uID0geDsKICAgIHJldHVybiBkaWFnb25hbDsKICB9OwoKICByZXR1cm4gZGlhZ29uYWw7Cn07CgpmdW5jdGlvbiBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uKGQpIHsKICByZXR1cm4gW2QueCwgZC55XTsKfQpkMy5zdmcuZGlhZ29uYWwucmFkaWFsID0gZnVuY3Rpb24oKSB7CiAgdmFyIGRpYWdvbmFsID0gZDMuc3ZnLmRpYWdvbmFsKCksCiAgICAgIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uLAogICAgICBwcm9qZWN0aW9uXyA9IGRpYWdvbmFsLnByb2plY3Rpb247CgogIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgID8gcHJvamVjdGlvbl8oZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uID0geCkpCiAgICAgICAgOiBwcm9qZWN0aW9uOwogIH07CgogIHJldHVybiBkaWFnb25hbDsKfTsKCmZ1bmN0aW9uIGQzX3N2Z19kaWFnb25hbFJhZGlhbFByb2plY3Rpb24ocHJvamVjdGlvbikgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBkID0gcHJvamVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHIgPSBkWzBdLAogICAgICAgIGEgPSBkWzFdICsgZDNfc3ZnX2FyY09mZnNldDsKICAgIHJldHVybiBbciAqIE1hdGguY29zKGEpLCByICogTWF0aC5zaW4oYSldOwogIH07Cn0KZDMuc3ZnLm1vdXNlID0gZDMubW91c2U7CmQzLnN2Zy50b3VjaGVzID0gZDMudG91Y2hlczsKZDMuc3ZnLnN5bWJvbCA9IGZ1bmN0aW9uKCkgewogIHZhciB0eXBlID0gZDNfc3ZnX3N5bWJvbFR5cGUsCiAgICAgIHNpemUgPSBkM19zdmdfc3ltYm9sU2l6ZTsKCiAgZnVuY3Rpb24gc3ltYm9sKGQsIGkpIHsKICAgIHJldHVybiAoZDNfc3ZnX3N5bWJvbHMuZ2V0KHR5cGUuY2FsbCh0aGlzLCBkLCBpKSkKICAgICAgICB8fCBkM19zdmdfc3ltYm9sQ2lyY2xlKQogICAgICAgIChzaXplLmNhbGwodGhpcywgZCwgaSkpOwogIH0KCiAgc3ltYm9sLnR5cGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0eXBlOwogICAgdHlwZSA9IGQzLmZ1bmN0b3IoeCk7CiAgICByZXR1cm4gc3ltYm9sOwogIH07CgogIC8vIHNpemUgb2Ygc3ltYm9sIGluIHNxdWFyZSBwaXhlbHMKICBzeW1ib2wuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICBzaXplID0gZDMuZnVuY3Rvcih4KTsKICAgIHJldHVybiBzeW1ib2w7CiAgfTsKCiAgcmV0dXJuIHN5bWJvbDsKfTsKCmZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xTaXplKCkgewogIHJldHVybiA2NDsKfQoKZnVuY3Rpb24gZDNfc3ZnX3N5bWJvbFR5cGUoKSB7CiAgcmV0dXJuICJjaXJjbGUiOwp9CgpmdW5jdGlvbiBkM19zdmdfc3ltYm9sQ2lyY2xlKHNpemUpIHsKICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gTWF0aC5QSSk7CiAgcmV0dXJuICJNMCwiICsgcgogICAgICArICJBIiArIHIgKyAiLCIgKyByICsgIiAwIDEsMSAwLCIgKyAoLXIpCiAgICAgICsgIkEiICsgciArICIsIiArIHIgKyAiIDAgMSwxIDAsIiArIHIKICAgICAgKyAiWiI7Cn0KCi8vIFRPRE8gY3Jvc3MtZGlhZ29uYWw/CnZhciBkM19zdmdfc3ltYm9scyA9IGQzLm1hcCh7CiAgImNpcmNsZSI6IGQzX3N2Z19zeW1ib2xDaXJjbGUsCiAgImNyb3NzIjogZnVuY3Rpb24oc2l6ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjsKICAgIHJldHVybiAiTSIgKyAtMyAqIHIgKyAiLCIgKyAtcgogICAgICAgICsgIkgiICsgLXIKICAgICAgICArICJWIiArIC0zICogcgogICAgICAgICsgIkgiICsgcgogICAgICAgICsgIlYiICsgLXIKICAgICAgICArICJIIiArIDMgKiByCiAgICAgICAgKyAiViIgKyByCiAgICAgICAgKyAiSCIgKyByCiAgICAgICAgKyAiViIgKyAzICogcgogICAgICAgICsgIkgiICsgLXIKICAgICAgICArICJWIiArIHIKICAgICAgICArICJIIiArIC0zICogcgogICAgICAgICsgIloiOwogIH0sCiAgImRpYW1vbmQiOiBmdW5jdGlvbihzaXplKSB7CiAgICB2YXIgcnkgPSBNYXRoLnNxcnQoc2l6ZSAvICgyICogZDNfc3ZnX3N5bWJvbFRhbjMwKSksCiAgICAgICAgcnggPSByeSAqIGQzX3N2Z19zeW1ib2xUYW4zMDsKICAgIHJldHVybiAiTTAsIiArIC1yeQogICAgICAgICsgIkwiICsgcnggKyAiLDAiCiAgICAgICAgKyAiIDAsIiArIHJ5CiAgICAgICAgKyAiICIgKyAtcnggKyAiLDAiCiAgICAgICAgKyAiWiI7CiAgfSwKICAic3F1YXJlIjogZnVuY3Rpb24oc2l6ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSkgLyAyOwogICAgcmV0dXJuICJNIiArIC1yICsgIiwiICsgLXIKICAgICAgICArICJMIiArIHIgKyAiLCIgKyAtcgogICAgICAgICsgIiAiICsgciArICIsIiArIHIKICAgICAgICArICIgIiArIC1yICsgIiwiICsgcgogICAgICAgICsgIloiOwogIH0sCiAgInRyaWFuZ2xlLWRvd24iOiBmdW5jdGlvbihzaXplKSB7CiAgICB2YXIgcnggPSBNYXRoLnNxcnQoc2l6ZSAvIGQzX3N2Z19zeW1ib2xTcXJ0MyksCiAgICAgICAgcnkgPSByeCAqIGQzX3N2Z19zeW1ib2xTcXJ0MyAvIDI7CiAgICByZXR1cm4gIk0wLCIgKyByeQogICAgICAgICsgIkwiICsgcnggKyIsIiArIC1yeQogICAgICAgICsgIiAiICsgLXJ4ICsgIiwiICsgLXJ5CiAgICAgICAgKyAiWiI7CiAgfSwKICAidHJpYW5nbGUtdXAiOiBmdW5jdGlvbihzaXplKSB7CiAgICB2YXIgcnggPSBNYXRoLnNxcnQoc2l6ZSAvIGQzX3N2Z19zeW1ib2xTcXJ0MyksCiAgICAgICAgcnkgPSByeCAqIGQzX3N2Z19zeW1ib2xTcXJ0MyAvIDI7CiAgICByZXR1cm4gIk0wLCIgKyAtcnkKICAgICAgICArICJMIiArIHJ4ICsiLCIgKyByeQogICAgICAgICsgIiAiICsgLXJ4ICsgIiwiICsgcnkKICAgICAgICArICJaIjsKICB9Cn0pOwoKZDMuc3ZnLnN5bWJvbFR5cGVzID0gZDNfc3ZnX3N5bWJvbHMua2V5cygpOwoKdmFyIGQzX3N2Z19zeW1ib2xTcXJ0MyA9IE1hdGguc3FydCgzKSwKICAgIGQzX3N2Z19zeW1ib2xUYW4zMCA9IE1hdGgudGFuKDMwICogTWF0aC5QSSAvIDE4MCk7CmQzLnN2Zy5heGlzID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNjYWxlID0gZDMuc2NhbGUubGluZWFyKCksCiAgICAgIG9yaWVudCA9ICJib3R0b20iLAogICAgICB0aWNrTWFqb3JTaXplID0gNiwKICAgICAgdGlja01pbm9yU2l6ZSA9IDYsCiAgICAgIHRpY2tFbmRTaXplID0gNiwKICAgICAgdGlja1BhZGRpbmcgPSAzLAogICAgICB0aWNrQXJndW1lbnRzXyA9IFsxMF0sCiAgICAgIHRpY2tWYWx1ZXMgPSBudWxsLAogICAgICB0aWNrRm9ybWF0XywKICAgICAgdGlja1N1YmRpdmlkZSA9IDA7CgogIGZ1bmN0aW9uIGF4aXMoZykgewogICAgZy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKTsKCiAgICAgIC8vIFRpY2tzLCBvciBkb21haW4gdmFsdWVzIGZvciBvcmRpbmFsIHNjYWxlcy4KICAgICAgdmFyIHRpY2tzID0gdGlja1ZhbHVlcyA9PSBudWxsID8gKHNjYWxlLnRpY2tzID8gc2NhbGUudGlja3MuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHNfKSA6IHNjYWxlLmRvbWFpbigpKSA6IHRpY2tWYWx1ZXMsCiAgICAgICAgICB0aWNrRm9ybWF0ID0gdGlja0Zvcm1hdF8gPT0gbnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50c18pIDogU3RyaW5nKSA6IHRpY2tGb3JtYXRfOwoKICAgICAgLy8gTWlub3IgdGlja3MuCiAgICAgIHZhciBzdWJ0aWNrcyA9IGQzX3N2Z19heGlzU3ViZGl2aWRlKHNjYWxlLCB0aWNrcywgdGlja1N1YmRpdmlkZSksCiAgICAgICAgICBzdWJ0aWNrID0gZy5zZWxlY3RBbGwoIi5taW5vciIpLmRhdGEoc3VidGlja3MsIFN0cmluZyksCiAgICAgICAgICBzdWJ0aWNrRW50ZXIgPSBzdWJ0aWNrLmVudGVyKCkuaW5zZXJ0KCJsaW5lIiwgImciKS5hdHRyKCJjbGFzcyIsICJ0aWNrIG1pbm9yIikuc3R5bGUoIm9wYWNpdHkiLCAxZS02KSwKICAgICAgICAgIHN1YnRpY2tFeGl0ID0gZDMudHJhbnNpdGlvbihzdWJ0aWNrLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLCAxZS02KS5yZW1vdmUoKSwKICAgICAgICAgIHN1YnRpY2tVcGRhdGUgPSBkMy50cmFuc2l0aW9uKHN1YnRpY2spLnN0eWxlKCJvcGFjaXR5IiwgMSk7CgogICAgICAvLyBNYWpvciB0aWNrcy4KICAgICAgdmFyIHRpY2sgPSBnLnNlbGVjdEFsbCgiZyIpLmRhdGEodGlja3MsIFN0cmluZyksCiAgICAgICAgICB0aWNrRW50ZXIgPSB0aWNrLmVudGVyKCkuaW5zZXJ0KCJnIiwgInBhdGgiKS5zdHlsZSgib3BhY2l0eSIsIDFlLTYpLAogICAgICAgICAgdGlja0V4aXQgPSBkMy50cmFuc2l0aW9uKHRpY2suZXhpdCgpKS5zdHlsZSgib3BhY2l0eSIsIDFlLTYpLnJlbW92ZSgpLAogICAgICAgICAgdGlja1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24odGljaykuc3R5bGUoIm9wYWNpdHkiLCAxKSwKICAgICAgICAgIHRpY2tUcmFuc2Zvcm07CgogICAgICAvLyBEb21haW4uCiAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLAogICAgICAgICAgcGF0aCA9IGcuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLAogICAgICAgICAgcGF0aEVudGVyID0gcGF0aC5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpLAogICAgICAgICAgcGF0aFVwZGF0ZSA9IGQzLnRyYW5zaXRpb24ocGF0aCk7CgogICAgICAvLyBTdGFzaCBhIHNuYXBzaG90IG9mIHRoZSBuZXcgc2NhbGUsIGFuZCByZXRyaWV2ZSB0aGUgb2xkIHNuYXBzaG90LgogICAgICB2YXIgc2NhbGUxID0gc2NhbGUuY29weSgpLAogICAgICAgICAgc2NhbGUwID0gdGhpcy5fX2NoYXJ0X18gfHwgc2NhbGUxOwogICAgICB0aGlzLl9fY2hhcnRfXyA9IHNjYWxlMTsKCiAgICAgIHRpY2tFbnRlci5hcHBlbmQoImxpbmUiKS5hdHRyKCJjbGFzcyIsICJ0aWNrIik7CiAgICAgIHRpY2tFbnRlci5hcHBlbmQoInRleHQiKTsKICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS50ZXh0KHRpY2tGb3JtYXQpOwoKICAgICAgc3dpdGNoIChvcmllbnQpIHsKICAgICAgICBjYXNlICJib3R0b20iOiB7CiAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNYOwogICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoInkyIiwgdGlja01pbm9yU2l6ZSk7CiAgICAgICAgICBzdWJ0aWNrVXBkYXRlLmF0dHIoIngyIiwgMCkuYXR0cigieTIiLCB0aWNrTWlub3JTaXplKTsKICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoImxpbmUiKS5hdHRyKCJ5MiIsIHRpY2tNYWpvclNpemUpOwogICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoInkiLCBNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKTsKICAgICAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCAwKS5hdHRyKCJ5MiIsIHRpY2tNYWpvclNpemUpOwogICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgMCkuYXR0cigieSIsIE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpLmF0dHIoImR5IiwgIi43MWVtIikuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIik7CiAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyByYW5nZVswXSArICIsIiArIHRpY2tFbmRTaXplICsgIlYwSCIgKyByYW5nZVsxXSArICJWIiArIHRpY2tFbmRTaXplKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlICJ0b3AiOiB7CiAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNYOwogICAgICAgICAgc3VidGlja0VudGVyLmF0dHIoInkyIiwgLXRpY2tNaW5vclNpemUpOwogICAgICAgICAgc3VidGlja1VwZGF0ZS5hdHRyKCJ4MiIsIDApLmF0dHIoInkyIiwgLXRpY2tNaW5vclNpemUpOwogICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgibGluZSIpLmF0dHIoInkyIiwgLXRpY2tNYWpvclNpemUpOwogICAgICAgICAgdGlja0VudGVyLnNlbGVjdCgidGV4dCIpLmF0dHIoInkiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKTsKICAgICAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCAwKS5hdHRyKCJ5MiIsIC10aWNrTWFqb3JTaXplKTsKICAgICAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJ0ZXh0IikuYXR0cigieCIsIDApLmF0dHIoInkiLCAtKE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpKS5hdHRyKCJkeSIsICIwZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsICJtaWRkbGUiKTsKICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cigiZCIsICJNIiArIHJhbmdlWzBdICsgIiwiICsgLXRpY2tFbmRTaXplICsgIlYwSCIgKyByYW5nZVsxXSArICJWIiArIC10aWNrRW5kU2l6ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAibGVmdCI6IHsKICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1k7CiAgICAgICAgICBzdWJ0aWNrRW50ZXIuYXR0cigieDIiLCAtdGlja01pbm9yU2l6ZSk7CiAgICAgICAgICBzdWJ0aWNrVXBkYXRlLmF0dHIoIngyIiwgLXRpY2tNaW5vclNpemUpLmF0dHIoInkyIiwgMCk7CiAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCAtdGlja01ham9yU2l6ZSk7CiAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJ0ZXh0IikuYXR0cigieCIsIC0oTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZykpOwogICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoImxpbmUiKS5hdHRyKCJ4MiIsIC10aWNrTWFqb3JTaXplKS5hdHRyKCJ5MiIsIDApOwogICAgICAgICAgdGlja1VwZGF0ZS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgLShNYXRoLm1heCh0aWNrTWFqb3JTaXplLCAwKSArIHRpY2tQYWRkaW5nKSkuYXR0cigieSIsIDApLmF0dHIoImR5IiwgIi4zMmVtIikuYXR0cigidGV4dC1hbmNob3IiLCAiZW5kIik7CiAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyAtdGlja0VuZFNpemUgKyAiLCIgKyByYW5nZVswXSArICJIMFYiICsgcmFuZ2VbMV0gKyAiSCIgKyAtdGlja0VuZFNpemUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgInJpZ2h0IjogewogICAgICAgICAgdGlja1RyYW5zZm9ybSA9IGQzX3N2Z19heGlzWTsKICAgICAgICAgIHN1YnRpY2tFbnRlci5hdHRyKCJ4MiIsIHRpY2tNaW5vclNpemUpOwogICAgICAgICAgc3VidGlja1VwZGF0ZS5hdHRyKCJ4MiIsIHRpY2tNaW5vclNpemUpLmF0dHIoInkyIiwgMCk7CiAgICAgICAgICB0aWNrRW50ZXIuc2VsZWN0KCJsaW5lIikuYXR0cigieDIiLCB0aWNrTWFqb3JTaXplKTsKICAgICAgICAgIHRpY2tFbnRlci5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IiwgTWF0aC5tYXgodGlja01ham9yU2l6ZSwgMCkgKyB0aWNrUGFkZGluZyk7CiAgICAgICAgICB0aWNrVXBkYXRlLnNlbGVjdCgibGluZSIpLmF0dHIoIngyIiwgdGlja01ham9yU2l6ZSkuYXR0cigieTIiLCAwKTsKICAgICAgICAgIHRpY2tVcGRhdGUuc2VsZWN0KCJ0ZXh0IikuYXR0cigieCIsIE1hdGgubWF4KHRpY2tNYWpvclNpemUsIDApICsgdGlja1BhZGRpbmcpLmF0dHIoInkiLCAwKS5hdHRyKCJkeSIsICIuMzJlbSIpLmF0dHIoInRleHQtYW5jaG9yIiwgInN0YXJ0Iik7CiAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoImQiLCAiTSIgKyB0aWNrRW5kU2l6ZSArICIsIiArIHJhbmdlWzBdICsgIkgwViIgKyByYW5nZVsxXSArICJIIiArIHRpY2tFbmRTaXplKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gRm9yIHF1YW50aXRhdGl2ZSBzY2FsZXM6CiAgICAgIC8vIC0gZW50ZXIgbmV3IHRpY2tzIGZyb20gdGhlIG9sZCBzY2FsZQogICAgICAvLyAtIGV4aXQgb2xkIHRpY2tzIHRvIHRoZSBuZXcgc2NhbGUKICAgICAgaWYgKHNjYWxlLnRpY2tzKSB7CiAgICAgICAgdGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwKTsKICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgICB0aWNrRXhpdC5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7CiAgICAgICAgc3VidGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwKTsKICAgICAgICBzdWJ0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxKTsKICAgICAgICBzdWJ0aWNrRXhpdC5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSk7CiAgICAgIH0KCiAgICAgIC8vIEZvciBvcmRpbmFsIHNjYWxlczoKICAgICAgLy8gLSBhbnkgZW50ZXJpbmcgdGlja3MgYXJlIHVuZGVmaW5lZCBpbiB0aGUgb2xkIHNjYWxlCiAgICAgIC8vIC0gYW55IGV4aXRpbmcgdGlja3MgYXJlIHVuZGVmaW5lZCBpbiB0aGUgbmV3IHNjYWxlCiAgICAgIC8vIFRoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHRvIHRyYW5zaXRpb24gdXBkYXRpbmcgdGlja3MuCiAgICAgIGVsc2UgewogICAgICAgIHZhciBkeCA9IHNjYWxlMS5yYW5nZUJhbmQoKSAvIDIsIHggPSBmdW5jdGlvbihkKSB7IHJldHVybiBzY2FsZTEoZCkgKyBkeDsgfTsKICAgICAgICB0aWNrRW50ZXIuY2FsbCh0aWNrVHJhbnNmb3JtLCB4KTsKICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgeCk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOwogICAgc2NhbGUgPSB4OwogICAgcmV0dXJuIGF4aXM7CiAgfTsKCiAgYXhpcy5vcmllbnQgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmllbnQ7CiAgICBvcmllbnQgPSB4OwogICAgcmV0dXJuIGF4aXM7CiAgfTsKCiAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0FyZ3VtZW50c187CiAgICB0aWNrQXJndW1lbnRzXyA9IGFyZ3VtZW50czsKICAgIHJldHVybiBheGlzOwogIH07CgogIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tWYWx1ZXM7CiAgICB0aWNrVmFsdWVzID0geDsKICAgIHJldHVybiBheGlzOwogIH07CgogIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tGb3JtYXRfOwogICAgdGlja0Zvcm1hdF8gPSB4OwogICAgcmV0dXJuIGF4aXM7CiAgfTsKCiAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKHgsIHksIHopIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tNYWpvclNpemU7CiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOwogICAgdGlja01ham9yU2l6ZSA9ICt4OwogICAgdGlja01pbm9yU2l6ZSA9IG4gPiAxID8gK3kgOiB0aWNrTWFqb3JTaXplOwogICAgdGlja0VuZFNpemUgPSBuID4gMCA/ICthcmd1bWVudHNbbl0gOiB0aWNrTWFqb3JTaXplOwogICAgcmV0dXJuIGF4aXM7CiAgfTsKCiAgYXhpcy50aWNrUGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tQYWRkaW5nOwogICAgdGlja1BhZGRpbmcgPSAreDsKICAgIHJldHVybiBheGlzOwogIH07CgogIGF4aXMudGlja1N1YmRpdmlkZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tTdWJkaXZpZGU7CiAgICB0aWNrU3ViZGl2aWRlID0gK3g7CiAgICByZXR1cm4gYXhpczsKICB9OwoKICByZXR1cm4gYXhpczsKfTsKCmZ1bmN0aW9uIGQzX3N2Z19heGlzWChzZWxlY3Rpb24sIHgpIHsKICBzZWxlY3Rpb24uYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgiICsgeChkKSArICIsMCkiOyB9KTsKfQoKZnVuY3Rpb24gZDNfc3ZnX2F4aXNZKHNlbGVjdGlvbiwgeSkgewogIHNlbGVjdGlvbi5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiAidHJhbnNsYXRlKDAsIiArIHkoZCkgKyAiKSI7IH0pOwp9CgpmdW5jdGlvbiBkM19zdmdfYXhpc1N1YmRpdmlkZShzY2FsZSwgdGlja3MsIG0pIHsKICBzdWJ0aWNrcyA9IFtdOwogIGlmIChtICYmIHRpY2tzLmxlbmd0aCA+IDEpIHsKICAgIHZhciBleHRlbnQgPSBkM19zY2FsZUV4dGVudChzY2FsZS5kb21haW4oKSksCiAgICAgICAgc3VidGlja3MsCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSB0aWNrcy5sZW5ndGgsCiAgICAgICAgZCA9ICh0aWNrc1sxXSAtIHRpY2tzWzBdKSAvICsrbSwKICAgICAgICBqLAogICAgICAgIHY7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBmb3IgKGogPSBtOyAtLWogPiAwOykgewogICAgICAgIGlmICgodiA9ICt0aWNrc1tpXSAtIGogKiBkKSA+PSBleHRlbnRbMF0pIHsKICAgICAgICAgIHN1YnRpY2tzLnB1c2godik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKC0taSwgaiA9IDA7ICsraiA8IG0gJiYgKHYgPSArdGlja3NbaV0gKyBqICogZCkgPCBleHRlbnRbMV07KSB7CiAgICAgIHN1YnRpY2tzLnB1c2godik7CiAgICB9CiAgfQogIHJldHVybiBzdWJ0aWNrczsKfQpkMy5zdmcuYnJ1c2ggPSBmdW5jdGlvbigpIHsKICB2YXIgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKGJydXNoLCAiYnJ1c2hzdGFydCIsICJicnVzaCIsICJicnVzaGVuZCIpLAogICAgICB4ID0gbnVsbCwgLy8geC1zY2FsZSwgb3B0aW9uYWwKICAgICAgeSA9IG51bGwsIC8vIHktc2NhbGUsIG9wdGlvbmFsCiAgICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWzBdLAogICAgICBleHRlbnQgPSBbWzAsIDBdLCBbMCwgMF1dLCAvLyBbeDAsIHkwXSwgW3gxLCB5MV0sIGluIHBpeGVscyAoaW50ZWdlcnMpCiAgICAgIGV4dGVudERvbWFpbjsgLy8gdGhlIGV4dGVudCBpbiBkYXRhIHNwYWNlLCBsYXppbHkgY3JlYXRlZAoKICBmdW5jdGlvbiBicnVzaChnKSB7CiAgICBnLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgIHZhciBnID0gZDMuc2VsZWN0KHRoaXMpLAogICAgICAgICAgYmcgPSBnLnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSksCiAgICAgICAgICBmZyA9IGcuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLAogICAgICAgICAgdHogPSBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEocmVzaXplcywgU3RyaW5nKSwKICAgICAgICAgIGU7CgogICAgICAvLyBQcmVwYXJlIHRoZSBicnVzaCBjb250YWluZXIgZm9yIGV2ZW50cy4KICAgICAgZwogICAgICAgICAgLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQogICAgICAgICAgLm9uKCJtb3VzZWRvd24uYnJ1c2giLCBicnVzaHN0YXJ0KQogICAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIiwgYnJ1c2hzdGFydCk7CgogICAgICAvLyBBbiBpbnZpc2libGUsIG1vdXNlYWJsZSBhcmVhIGZvciBzdGFydGluZyBhIG5ldyBicnVzaC4KICAgICAgYmcuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgImJhY2tncm91bmQiKQogICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpCiAgICAgICAgICAuc3R5bGUoImN1cnNvciIsICJjcm9zc2hhaXIiKTsKCiAgICAgIC8vIFRoZSB2aXNpYmxlIGJydXNoIGV4dGVudDsgc3R5bGUgdGhpcyBhcyB5b3UgbGlrZSEKICAgICAgZmcuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgImV4dGVudCIpCiAgICAgICAgICAuc3R5bGUoImN1cnNvciIsICJtb3ZlIik7CgogICAgICAvLyBNb3JlIGludmlzaWJsZSByZWN0cyBmb3IgcmVzaXppbmcgdGhlIGV4dGVudC4KICAgICAgdHouZW50ZXIoKS5hcHBlbmQoImciKQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInJlc2l6ZSAiICsgZDsgfSkKICAgICAgICAgIC5zdHlsZSgiY3Vyc29yIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfc3ZnX2JydXNoQ3Vyc29yW2RdOyB9KQogICAgICAgIC5hcHBlbmQoInJlY3QiKQogICAgICAgICAgLmF0dHIoIngiLCBmdW5jdGlvbihkKSB7IHJldHVybiAvW2V3XSQvLnRlc3QoZCkgPyAtMyA6IG51bGw7IH0pCiAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9eW25zXS8udGVzdChkKSA/IC0zIDogbnVsbDsgfSkKICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIDYpCiAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgNikKICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKCiAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgcmVzaXplcnMuCiAgICAgIHR6LnN0eWxlKCJkaXNwbGF5IiwgYnJ1c2guZW1wdHkoKSA/ICJub25lIiA6IG51bGwpOwoKICAgICAgLy8gUmVtb3ZlIGFueSBzdXBlcmZsdW91cyByZXNpemVycy4KICAgICAgdHouZXhpdCgpLnJlbW92ZSgpOwoKICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYmFja2dyb3VuZCB0byBmaWxsIHRoZSBkZWZpbmVkIHJhbmdlLgogICAgICAvLyBJZiB0aGUgcmFuZ2UgaXNuJ3QgZGVmaW5lZCwgeW91IGNhbiBwb3N0LXByb2Nlc3MuCiAgICAgIGlmICh4KSB7CiAgICAgICAgZSA9IGQzX3NjYWxlUmFuZ2UoeCk7CiAgICAgICAgYmcuYXR0cigieCIsIGVbMF0pLmF0dHIoIndpZHRoIiwgZVsxXSAtIGVbMF0pOwogICAgICAgIHJlZHJhd1goZyk7CiAgICAgIH0KICAgICAgaWYgKHkpIHsKICAgICAgICBlID0gZDNfc2NhbGVSYW5nZSh5KTsKICAgICAgICBiZy5hdHRyKCJ5IiwgZVswXSkuYXR0cigiaGVpZ2h0IiwgZVsxXSAtIGVbMF0pOwogICAgICAgIHJlZHJhd1koZyk7CiAgICAgIH0KICAgICAgcmVkcmF3KGcpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZWRyYXcoZykgewogICAgZy5zZWxlY3RBbGwoIi5yZXNpemUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyBleHRlbnRbKy9lJC8udGVzdChkKV1bMF0gKyAiLCIgKyBleHRlbnRbKy9ecy8udGVzdChkKV1bMV0gKyAiKSI7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlZHJhd1goZykgewogICAgZy5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ4IiwgZXh0ZW50WzBdWzBdKTsKICAgIGcuc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKTsKICB9CgogIGZ1bmN0aW9uIHJlZHJhd1koZykgewogICAgZy5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IiwgZXh0ZW50WzBdWzFdKTsKICAgIGcuc2VsZWN0QWxsKCIuZXh0ZW50LC5lPnJlY3QsLnc+cmVjdCIpLmF0dHIoImhlaWdodCIsIGV4dGVudFsxXVsxXSAtIGV4dGVudFswXVsxXSk7CiAgfQoKICBmdW5jdGlvbiBicnVzaHN0YXJ0KCkgewogICAgdmFyIHRhcmdldCA9IHRoaXMsCiAgICAgICAgZXZlbnRUYXJnZXQgPSBkMy5zZWxlY3QoZDMuZXZlbnQudGFyZ2V0KSwKICAgICAgICBldmVudF8gPSBldmVudC5vZih0YXJnZXQsIGFyZ3VtZW50cyksCiAgICAgICAgZyA9IGQzLnNlbGVjdCh0YXJnZXQpLAogICAgICAgIHJlc2l6aW5nID0gZXZlbnRUYXJnZXQuZGF0dW0oKSwKICAgICAgICByZXNpemluZ1ggPSAhL14obnxzKSQvLnRlc3QocmVzaXppbmcpICYmIHgsCiAgICAgICAgcmVzaXppbmdZID0gIS9eKGV8dykkLy50ZXN0KHJlc2l6aW5nKSAmJiB5LAogICAgICAgIGRyYWdnaW5nID0gZXZlbnRUYXJnZXQuY2xhc3NlZCgiZXh0ZW50IiksCiAgICAgICAgY2VudGVyLAogICAgICAgIG9yaWdpbiA9IG1vdXNlKCksCiAgICAgICAgb2Zmc2V0OwoKICAgIHZhciB3ID0gZDMuc2VsZWN0KHdpbmRvdykKICAgICAgICAub24oIm1vdXNlbW92ZS5icnVzaCIsIGJydXNobW92ZSkKICAgICAgICAub24oIm1vdXNldXAuYnJ1c2giLCBicnVzaGVuZCkKICAgICAgICAub24oInRvdWNobW92ZS5icnVzaCIsIGJydXNobW92ZSkKICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgYnJ1c2hlbmQpCiAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bikKICAgICAgICAub24oImtleXVwLmJydXNoIiwga2V5dXApOwoKICAgIC8vIElmIHRoZSBleHRlbnQgd2FzIGNsaWNrZWQgb24sIGRyYWcgcmF0aGVyIHRoYW4gYnJ1c2g7CiAgICAvLyBzdG9yZSB0aGUgcG9pbnQgYmV0d2VlbiB0aGUgbW91c2UgYW5kIGV4dGVudCBvcmlnaW4gaW5zdGVhZC4KICAgIGlmIChkcmFnZ2luZykgewogICAgICBvcmlnaW5bMF0gPSBleHRlbnRbMF1bMF0gLSBvcmlnaW5bMF07CiAgICAgIG9yaWdpblsxXSA9IGV4dGVudFswXVsxXSAtIG9yaWdpblsxXTsKICAgIH0KCiAgICAvLyBJZiBhIHJlc2l6ZXIgd2FzIGNsaWNrZWQgb24sIHJlY29yZCB3aGljaCBzaWRlIGlzIHRvIGJlIHJlc2l6ZWQuCiAgICAvLyBBbHNvLCBzZXQgdGhlIG9yaWdpbiB0byB0aGUgb3Bwb3NpdGUgc2lkZS4KICAgIGVsc2UgaWYgKHJlc2l6aW5nKSB7CiAgICAgIHZhciBleCA9ICsvdyQvLnRlc3QocmVzaXppbmcpLAogICAgICAgICAgZXkgPSArL15uLy50ZXN0KHJlc2l6aW5nKTsKICAgICAgb2Zmc2V0ID0gW2V4dGVudFsxIC0gZXhdWzBdIC0gb3JpZ2luWzBdLCBleHRlbnRbMSAtIGV5XVsxXSAtIG9yaWdpblsxXV07CiAgICAgIG9yaWdpblswXSA9IGV4dGVudFtleF1bMF07CiAgICAgIG9yaWdpblsxXSA9IGV4dGVudFtleV1bMV07CiAgICB9CgogICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgZG93biB3aGVuIHN0YXJ0aW5nIGEgYnJ1c2gsIHRoZSBjZW50ZXIgaXMgYXQgdGhlIG1vdXNlLgogICAgZWxzZSBpZiAoZDMuZXZlbnQuYWx0S2V5KSBjZW50ZXIgPSBvcmlnaW4uc2xpY2UoKTsKCiAgICAvLyBQcm9wYWdhdGUgdGhlIGFjdGl2ZSBjdXJzb3IgdG8gdGhlIGJvZHkgZm9yIHRoZSBkcmFnIGR1cmF0aW9uLgogICAgZy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCAibm9uZSIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IiwgbnVsbCk7CiAgICBkMy5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIiwgZXZlbnRUYXJnZXQuc3R5bGUoImN1cnNvciIpKTsKCiAgICAvLyBOb3RpZnkgbGlzdGVuZXJzLgogICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2hzdGFydCJ9KTsKICAgIGJydXNobW92ZSgpOwogICAgZDNfZXZlbnRDYW5jZWwoKTsKCiAgICBmdW5jdGlvbiBtb3VzZSgpIHsKICAgICAgdmFyIHRvdWNoZXMgPSBkMy5ldmVudC5jaGFuZ2VkVG91Y2hlczsKICAgICAgcmV0dXJuIHRvdWNoZXMgPyBkMy50b3VjaGVzKHRhcmdldCwgdG91Y2hlcylbMF0gOiBkMy5tb3VzZSh0YXJnZXQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGtleWRvd24oKSB7CiAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyKSB7CiAgICAgICAgaWYgKCFkcmFnZ2luZykgewogICAgICAgICAgY2VudGVyID0gbnVsbDsKICAgICAgICAgIG9yaWdpblswXSAtPSBleHRlbnRbMV1bMF07CiAgICAgICAgICBvcmlnaW5bMV0gLT0gZXh0ZW50WzFdWzFdOwogICAgICAgICAgZHJhZ2dpbmcgPSAyOwogICAgICAgIH0KICAgICAgICBkM19ldmVudENhbmNlbCgpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24ga2V5dXAoKSB7CiAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyICYmIGRyYWdnaW5nID09IDIpIHsKICAgICAgICBvcmlnaW5bMF0gKz0gZXh0ZW50WzFdWzBdOwogICAgICAgIG9yaWdpblsxXSArPSBleHRlbnRbMV1bMV07CiAgICAgICAgZHJhZ2dpbmcgPSAwOwogICAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBicnVzaG1vdmUoKSB7CiAgICAgIHZhciBwb2ludCA9IG1vdXNlKCksCiAgICAgICAgICBtb3ZlZCA9IGZhbHNlOwoKICAgICAgLy8gUHJlc2VydmUgdGhlIG9mZnNldCBmb3IgdGhpY2sgcmVzaXplcnMuCiAgICAgIGlmIChvZmZzZXQpIHsKICAgICAgICBwb2ludFswXSArPSBvZmZzZXRbMF07CiAgICAgICAgcG9pbnRbMV0gKz0gb2Zmc2V0WzFdOwogICAgICB9CgogICAgICBpZiAoIWRyYWdnaW5nKSB7CgogICAgICAgIC8vIElmIG5lZWRlZCwgZGV0ZXJtaW5lIHRoZSBjZW50ZXIgZnJvbSB0aGUgY3VycmVudCBleHRlbnQuCiAgICAgICAgaWYgKGQzLmV2ZW50LmFsdEtleSkgewogICAgICAgICAgaWYgKCFjZW50ZXIpIGNlbnRlciA9IFsoZXh0ZW50WzBdWzBdICsgZXh0ZW50WzFdWzBdKSAvIDIsIChleHRlbnRbMF1bMV0gKyBleHRlbnRbMV1bMV0pIC8gMl07CgogICAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW4sIGZvciB3aGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLgogICAgICAgICAgb3JpZ2luWzBdID0gZXh0ZW50WysocG9pbnRbMF0gPCBjZW50ZXJbMF0pXVswXTsKICAgICAgICAgIG9yaWdpblsxXSA9IGV4dGVudFsrKHBvaW50WzFdIDwgY2VudGVyWzFdKV1bMV07CiAgICAgICAgfQoKICAgICAgICAvLyBXaGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLCB3ZSBjbGVhciB0aGUgY2VudGVyLgogICAgICAgIGVsc2UgY2VudGVyID0gbnVsbDsKICAgICAgfQoKICAgICAgLy8gVXBkYXRlIHRoZSBicnVzaCBleHRlbnQgZm9yIGVhY2ggZGltZW5zaW9uLgogICAgICBpZiAocmVzaXppbmdYICYmIG1vdmUxKHBvaW50LCB4LCAwKSkgewogICAgICAgIHJlZHJhd1goZyk7CiAgICAgICAgbW92ZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChyZXNpemluZ1kgJiYgbW92ZTEocG9pbnQsIHksIDEpKSB7CiAgICAgICAgcmVkcmF3WShnKTsKICAgICAgICBtb3ZlZCA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8vIEZpbmFsIHJlZHJhdyBhbmQgbm90aWZ5IGxpc3RlbmVycy4KICAgICAgaWYgKG1vdmVkKSB7CiAgICAgICAgcmVkcmF3KGcpOwogICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoIiwgbW9kZTogZHJhZ2dpbmcgPyAibW92ZSIgOiAicmVzaXplIn0pOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbW92ZTEocG9pbnQsIHNjYWxlLCBpKSB7CiAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLAogICAgICAgICAgcjAgPSByYW5nZVswXSwKICAgICAgICAgIHIxID0gcmFuZ2VbMV0sCiAgICAgICAgICBwb3NpdGlvbiA9IG9yaWdpbltpXSwKICAgICAgICAgIHNpemUgPSBleHRlbnRbMV1baV0gLSBleHRlbnRbMF1baV0sCiAgICAgICAgICBtaW4sCiAgICAgICAgICBtYXg7CgogICAgICAvLyBXaGVuIGRyYWdnaW5nLCByZWR1Y2UgdGhlIHJhbmdlIGJ5IHRoZSBleHRlbnQgc2l6ZSBhbmQgcG9zaXRpb24uCiAgICAgIGlmIChkcmFnZ2luZykgewogICAgICAgIHIwIC09IHBvc2l0aW9uOwogICAgICAgIHIxIC09IHNpemUgKyBwb3NpdGlvbjsKICAgICAgfQoKICAgICAgLy8gQ2xhbXAgdGhlIHBvaW50IHNvIHRoYXQgdGhlIGV4dGVudCBmaXRzIHdpdGhpbiB0aGUgcmFuZ2UgZXh0ZW50LgogICAgICBtaW4gPSBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIHBvaW50W2ldKSk7CgogICAgICAvLyBDb21wdXRlIHRoZSBuZXcgZXh0ZW50IGJvdW5kcy4KICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgbWF4ID0gKG1pbiArPSBwb3NpdGlvbikgKyBzaXplOwogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBJZiB0aGUgQUxUIGtleSBpcyBwcmVzc2VkLCB0aGVuIHByZXNlcnZlIHRoZSBjZW50ZXIgb2YgdGhlIGV4dGVudC4KICAgICAgICBpZiAoY2VudGVyKSBwb3NpdGlvbiA9IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgMiAqIGNlbnRlcltpXSAtIG1pbikpOwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBtaW4gYW5kIG1heCBvZiB0aGUgcG9zaXRpb24gYW5kIHBvaW50LgogICAgICAgIGlmIChwb3NpdGlvbiA8IG1pbikgewogICAgICAgICAgbWF4ID0gbWluOwogICAgICAgICAgbWluID0gcG9zaXRpb247CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1heCA9IHBvc2l0aW9uOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gVXBkYXRlIHRoZSBzdG9yZWQgYm91bmRzLgogICAgICBpZiAoZXh0ZW50WzBdW2ldICE9PSBtaW4gfHwgZXh0ZW50WzFdW2ldICE9PSBtYXgpIHsKICAgICAgICBleHRlbnREb21haW4gPSBudWxsOwogICAgICAgIGV4dGVudFswXVtpXSA9IG1pbjsKICAgICAgICBleHRlbnRbMV1baV0gPSBtYXg7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBicnVzaGVuZCgpIHsKICAgICAgYnJ1c2htb3ZlKCk7CgogICAgICAvLyByZXNldCB0aGUgY3Vyc29yIHN0eWxlcwogICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIGJydXNoLmVtcHR5KCkgPyAibm9uZSIgOiBudWxsKTsKICAgICAgZDMuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsIG51bGwpOwoKICAgICAgdyAub24oIm1vdXNlbW92ZS5icnVzaCIsIG51bGwpCiAgICAgICAgLm9uKCJtb3VzZXVwLmJydXNoIiwgbnVsbCkKICAgICAgICAub24oInRvdWNobW92ZS5icnVzaCIsIG51bGwpCiAgICAgICAgLm9uKCJ0b3VjaGVuZC5icnVzaCIsIG51bGwpCiAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwgbnVsbCkKICAgICAgICAub24oImtleXVwLmJydXNoIiwgbnVsbCk7CgogICAgICBldmVudF8oe3R5cGU6ICJicnVzaGVuZCJ9KTsKICAgICAgZDNfZXZlbnRDYW5jZWwoKTsKICAgIH0KICB9CgogIGJydXNoLnggPSBmdW5jdGlvbih6KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4OwogICAgeCA9IHo7CiAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQogICAgcmV0dXJuIGJydXNoOwogIH07CgogIGJydXNoLnkgPSBmdW5jdGlvbih6KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5OwogICAgeSA9IHo7CiAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQogICAgcmV0dXJuIGJydXNoOwogIH07CgogIGJydXNoLmV4dGVudCA9IGZ1bmN0aW9uKHopIHsKICAgIHZhciB4MCwgeDEsIHkwLCB5MSwgdDsKCiAgICAvLyBJbnZlcnQgdGhlIHBpeGVsIGV4dGVudCB0byBkYXRhLXNwYWNlLgogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHogPSBleHRlbnREb21haW4gfHwgZXh0ZW50OwogICAgICBpZiAoeCkgewogICAgICAgIHgwID0gelswXVswXSwgeDEgPSB6WzFdWzBdOwogICAgICAgIGlmICghZXh0ZW50RG9tYWluKSB7CiAgICAgICAgICB4MCA9IGV4dGVudFswXVswXSwgeDEgPSBleHRlbnRbMV1bMF07CiAgICAgICAgICBpZiAoeC5pbnZlcnQpIHgwID0geC5pbnZlcnQoeDApLCB4MSA9IHguaW52ZXJ0KHgxKTsKICAgICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHkpIHsKICAgICAgICB5MCA9IHpbMF1bMV0sIHkxID0gelsxXVsxXTsKICAgICAgICBpZiAoIWV4dGVudERvbWFpbikgewogICAgICAgICAgeTAgPSBleHRlbnRbMF1bMV0sIHkxID0gZXh0ZW50WzFdWzFdOwogICAgICAgICAgaWYgKHkuaW52ZXJ0KSB5MCA9IHkuaW52ZXJ0KHkwKSwgeTEgPSB5LmludmVydCh5MSk7CiAgICAgICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB4ICYmIHkgPyBbW3gwLCB5MF0sIFt4MSwgeTFdXSA6IHggPyBbeDAsIHgxXSA6IHkgJiYgW3kwLCB5MV07CiAgICB9CgogICAgLy8gU2NhbGUgdGhlIGRhdGEtc3BhY2UgZXh0ZW50IHRvIHBpeGVscy4KICAgIGV4dGVudERvbWFpbiA9IFtbMCwgMF0sIFswLCAwXV07CiAgICBpZiAoeCkgewogICAgICB4MCA9IHpbMF0sIHgxID0gelsxXTsKICAgICAgaWYgKHkpIHgwID0geDBbMF0sIHgxID0geDFbMF07CiAgICAgIGV4dGVudERvbWFpblswXVswXSA9IHgwLCBleHRlbnREb21haW5bMV1bMF0gPSB4MTsKICAgICAgaWYgKHguaW52ZXJ0KSB4MCA9IHgoeDApLCB4MSA9IHgoeDEpOwogICAgICBpZiAoeDEgPCB4MCkgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7CiAgICAgIGV4dGVudFswXVswXSA9IHgwIHwgMCwgZXh0ZW50WzFdWzBdID0geDEgfCAwOwogICAgfQogICAgaWYgKHkpIHsKICAgICAgeTAgPSB6WzBdLCB5MSA9IHpbMV07CiAgICAgIGlmICh4KSB5MCA9IHkwWzFdLCB5MSA9IHkxWzFdOwogICAgICBleHRlbnREb21haW5bMF1bMV0gPSB5MCwgZXh0ZW50RG9tYWluWzFdWzFdID0geTE7CiAgICAgIGlmICh5LmludmVydCkgeTAgPSB5KHkwKSwgeTEgPSB5KHkxKTsKICAgICAgaWYgKHkxIDwgeTApIHQgPSB5MCwgeTAgPSB5MSwgeTEgPSB0OwogICAgICBleHRlbnRbMF1bMV0gPSB5MCB8IDAsIGV4dGVudFsxXVsxXSA9IHkxIHwgMDsKICAgIH0KCiAgICByZXR1cm4gYnJ1c2g7CiAgfTsKCiAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgIGV4dGVudERvbWFpbiA9IG51bGw7CiAgICBleHRlbnRbMF1bMF0gPQogICAgZXh0ZW50WzBdWzFdID0KICAgIGV4dGVudFsxXVswXSA9CiAgICBleHRlbnRbMV1bMV0gPSAwOwogICAgcmV0dXJuIGJydXNoOwogIH07CgogIGJydXNoLmVtcHR5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gKHggJiYgZXh0ZW50WzBdWzBdID09PSBleHRlbnRbMV1bMF0pCiAgICAgICAgfHwgKHkgJiYgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV0pOwogIH07CgogIHJldHVybiBkMy5yZWJpbmQoYnJ1c2gsIGV2ZW50LCAib24iKTsKfTsKCnZhciBkM19zdmdfYnJ1c2hDdXJzb3IgPSB7CiAgbjogIm5zLXJlc2l6ZSIsCiAgZTogImV3LXJlc2l6ZSIsCiAgczogIm5zLXJlc2l6ZSIsCiAgdzogImV3LXJlc2l6ZSIsCiAgbnc6ICJud3NlLXJlc2l6ZSIsCiAgbmU6ICJuZXN3LXJlc2l6ZSIsCiAgc2U6ICJud3NlLXJlc2l6ZSIsCiAgc3c6ICJuZXN3LXJlc2l6ZSIKfTsKCnZhciBkM19zdmdfYnJ1c2hSZXNpemVzID0gWwogIFsibiIsICJlIiwgInMiLCAidyIsICJudyIsICJuZSIsICJzZSIsICJzdyJdLAogIFsiZSIsICJ3Il0sCiAgWyJuIiwgInMiXSwKICBbXQpdOwpkMy5iZWhhdmlvciA9IHt9OwovLyBUT0RPIFRyYWNrIHRvdWNoIHBvaW50cyBieSBpZGVudGlmaWVyLgoKZDMuYmVoYXZpb3IuZHJhZyA9IGZ1bmN0aW9uKCkgewogIHZhciBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goZHJhZywgImRyYWciLCAiZHJhZ3N0YXJ0IiwgImRyYWdlbmQiKSwKICAgICAgb3JpZ2luID0gbnVsbDsKCiAgZnVuY3Rpb24gZHJhZygpIHsKICAgIHRoaXMub24oIm1vdXNlZG93bi5kcmFnIiwgbW91c2Vkb3duKQogICAgICAgIC5vbigidG91Y2hzdGFydC5kcmFnIiwgbW91c2Vkb3duKTsKICB9CgogIGZ1bmN0aW9uIG1vdXNlZG93bigpIHsKICAgIHZhciB0YXJnZXQgPSB0aGlzLAogICAgICAgIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwKICAgICAgICBldmVudFRhcmdldCA9IGQzLmV2ZW50LnRhcmdldCwKICAgICAgICBvZmZzZXQsCiAgICAgICAgb3JpZ2luXyA9IHBvaW50KCksCiAgICAgICAgbW92ZWQgPSAwOwoKICAgIHZhciB3ID0gZDMuc2VsZWN0KHdpbmRvdykKICAgICAgICAub24oIm1vdXNlbW92ZS5kcmFnIiwgZHJhZ21vdmUpCiAgICAgICAgLm9uKCJ0b3VjaG1vdmUuZHJhZyIsIGRyYWdtb3ZlKQogICAgICAgIC5vbigibW91c2V1cC5kcmFnIiwgZHJhZ2VuZCwgdHJ1ZSkKICAgICAgICAub24oInRvdWNoZW5kLmRyYWciLCBkcmFnZW5kLCB0cnVlKTsKCiAgICBpZiAob3JpZ2luKSB7CiAgICAgIG9mZnNldCA9IG9yaWdpbi5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIG9mZnNldCA9IFtvZmZzZXQueCAtIG9yaWdpbl9bMF0sIG9mZnNldC55IC0gb3JpZ2luX1sxXV07CiAgICB9IGVsc2UgewogICAgICBvZmZzZXQgPSBbMCwgMF07CiAgICB9CgogICAgZXZlbnRfKHt0eXBlOiAiZHJhZ3N0YXJ0In0pOwoKICAgIGZ1bmN0aW9uIHBvaW50KCkgewogICAgICB2YXIgcCA9IHRhcmdldC5wYXJlbnROb2RlLAogICAgICAgICAgdCA9IGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzOwogICAgICByZXR1cm4gdCA/IGQzLnRvdWNoZXMocCwgdClbMF0gOiBkMy5tb3VzZShwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcmFnbW92ZSgpIHsKICAgICAgaWYgKCF0YXJnZXQucGFyZW50Tm9kZSkgcmV0dXJuIGRyYWdlbmQoKTsgLy8gdGFyZ2V0IHJlbW92ZWQgZnJvbSBET00KCiAgICAgIHZhciBwID0gcG9pbnQoKSwKICAgICAgICAgIGR4ID0gcFswXSAtIG9yaWdpbl9bMF0sCiAgICAgICAgICBkeSA9IHBbMV0gLSBvcmlnaW5fWzFdOwoKICAgICAgbW92ZWQgfD0gZHggfCBkeTsKICAgICAgb3JpZ2luXyA9IHA7CiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CgogICAgICBldmVudF8oe3R5cGU6ICJkcmFnIiwgeDogcFswXSArIG9mZnNldFswXSwgeTogcFsxXSArIG9mZnNldFsxXSwgZHg6IGR4LCBkeTogZHl9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcmFnZW5kKCkgewogICAgICBldmVudF8oe3R5cGU6ICJkcmFnZW5kIn0pOwoKICAgICAgLy8gaWYgbW92ZWQsIHByZXZlbnQgdGhlIG1vdXNldXAgKGFuZCBwb3NzaWJseSBjbGljaykgZnJvbSBwcm9wYWdhdGluZwogICAgICBpZiAobW92ZWQpIHsKICAgICAgICBkM19ldmVudENhbmNlbCgpOwogICAgICAgIGlmIChkMy5ldmVudC50YXJnZXQgPT09IGV2ZW50VGFyZ2V0KSB3Lm9uKCJjbGljay5kcmFnIiwgY2xpY2ssIHRydWUpOwogICAgICB9CgogICAgICB3IC5vbigibW91c2Vtb3ZlLmRyYWciLCBudWxsKQogICAgICAgIC5vbigidG91Y2htb3ZlLmRyYWciLCBudWxsKQogICAgICAgIC5vbigibW91c2V1cC5kcmFnIiwgbnVsbCkKICAgICAgICAub24oInRvdWNoZW5kLmRyYWciLCBudWxsKTsKICAgIH0KCiAgICAvLyBwcmV2ZW50IHRoZSBzdWJzZXF1ZW50IGNsaWNrIGZyb20gcHJvcGFnYXRpbmcgKGUuZy4sIGZvciBhbmNob3JzKQogICAgZnVuY3Rpb24gY2xpY2soKSB7CiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CiAgICAgIHcub24oImNsaWNrLmRyYWciLCBudWxsKTsKICAgIH0KICB9CgogIGRyYWcub3JpZ2luID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOwogICAgb3JpZ2luID0geDsKICAgIHJldHVybiBkcmFnOwogIH07CgogIHJldHVybiBkMy5yZWJpbmQoZHJhZywgZXZlbnQsICJvbiIpOwp9OwpkMy5iZWhhdmlvci56b29tID0gZnVuY3Rpb24oKSB7CiAgdmFyIHRyYW5zbGF0ZSA9IFswLCAwXSwKICAgICAgdHJhbnNsYXRlMCwgLy8gdHJhbnNsYXRlIHdoZW4gd2Ugc3RhcnRlZCB6b29taW5nICh0byBhdm9pZCBkcmlmdCkKICAgICAgc2NhbGUgPSAxLAogICAgICBzY2FsZTAsIC8vIHNjYWxlIHdoZW4gd2Ugc3RhcnRlZCB0b3VjaGluZwogICAgICBzY2FsZUV4dGVudCA9IGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSwKICAgICAgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKHpvb20sICJ6b29tIiksCiAgICAgIHgwLAogICAgICB4MSwKICAgICAgeTAsCiAgICAgIHkxLAogICAgICB0b3VjaHRpbWU7IC8vIHRpbWUgb2YgbGFzdCB0b3VjaHN0YXJ0ICh0byBkZXRlY3QgZG91YmxlLXRhcCkKCiAgZnVuY3Rpb24gem9vbSgpIHsKICAgIHRoaXMKICAgICAgICAub24oIm1vdXNlZG93bi56b29tIiwgbW91c2Vkb3duKQogICAgICAgIC5vbigibW91c2V3aGVlbC56b29tIiwgbW91c2V3aGVlbCkKICAgICAgICAub24oIm1vdXNlbW92ZS56b29tIiwgbW91c2Vtb3ZlKQogICAgICAgIC5vbigiRE9NTW91c2VTY3JvbGwuem9vbSIsIG1vdXNld2hlZWwpCiAgICAgICAgLm9uKCJkYmxjbGljay56b29tIiwgZGJsY2xpY2spCiAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLCB0b3VjaHN0YXJ0KQogICAgICAgIC5vbigidG91Y2htb3ZlLnpvb20iLCB0b3VjaG1vdmUpCiAgICAgICAgLm9uKCJ0b3VjaGVuZC56b29tIiwgdG91Y2hzdGFydCk7CiAgfQoKICB6b29tLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsKICAgIHRyYW5zbGF0ZSA9IHgubWFwKE51bWJlcik7CiAgICByZXR1cm4gem9vbTsKICB9OwoKICB6b29tLnNjYWxlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2NhbGU7CiAgICBzY2FsZSA9ICt4OwogICAgcmV0dXJuIHpvb207CiAgfTsKCiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlRXh0ZW50OwogICAgc2NhbGVFeHRlbnQgPSB4ID09IG51bGwgPyBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgOiB4Lm1hcChOdW1iZXIpOwogICAgcmV0dXJuIHpvb207CiAgfTsKCiAgem9vbS54ID0gZnVuY3Rpb24oeikgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7CiAgICB4MSA9IHo7CiAgICB4MCA9IHouY29weSgpOwogICAgcmV0dXJuIHpvb207CiAgfTsKCiAgem9vbS55ID0gZnVuY3Rpb24oeikgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7CiAgICB5MSA9IHo7CiAgICB5MCA9IHouY29weSgpOwogICAgcmV0dXJuIHpvb207CiAgfTsKCiAgZnVuY3Rpb24gbG9jYXRpb24ocCkgewogICAgcmV0dXJuIFsocFswXSAtIHRyYW5zbGF0ZVswXSkgLyBzY2FsZSwgKHBbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGVdOwogIH0KCiAgZnVuY3Rpb24gcG9pbnQobCkgewogICAgcmV0dXJuIFtsWzBdICogc2NhbGUgKyB0cmFuc2xhdGVbMF0sIGxbMV0gKiBzY2FsZSArIHRyYW5zbGF0ZVsxXV07CiAgfQoKICBmdW5jdGlvbiBzY2FsZVRvKHMpIHsKICAgIHNjYWxlID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBzKSk7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2xhdGVUbyhwLCBsKSB7CiAgICBsID0gcG9pbnQobCk7CiAgICB0cmFuc2xhdGVbMF0gKz0gcFswXSAtIGxbMF07CiAgICB0cmFuc2xhdGVbMV0gKz0gcFsxXSAtIGxbMV07CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaChldmVudCkgewogICAgaWYgKHgxKSB4MS5kb21haW4oeDAucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGU7IH0pLm1hcCh4MC5pbnZlcnQpKTsKICAgIGlmICh5MSkgeTEuZG9tYWluKHkwLnJhbmdlKCkubWFwKGZ1bmN0aW9uKHkpIHsgcmV0dXJuICh5IC0gdHJhbnNsYXRlWzFdKSAvIHNjYWxlOyB9KS5tYXAoeTAuaW52ZXJ0KSk7CiAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgZXZlbnQoe3R5cGU6ICJ6b29tIiwgc2NhbGU6IHNjYWxlLCB0cmFuc2xhdGU6IHRyYW5zbGF0ZX0pOwogIH0KCiAgZnVuY3Rpb24gbW91c2Vkb3duKCkgewogICAgdmFyIHRhcmdldCA9IHRoaXMsCiAgICAgICAgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLAogICAgICAgIGV2ZW50VGFyZ2V0ID0gZDMuZXZlbnQudGFyZ2V0LAogICAgICAgIG1vdmVkID0gMCwKICAgICAgICB3ID0gZDMuc2VsZWN0KHdpbmRvdykub24oIm1vdXNlbW92ZS56b29tIiwgbW91c2Vtb3ZlKS5vbigibW91c2V1cC56b29tIiwgbW91c2V1cCksCiAgICAgICAgbCA9IGxvY2F0aW9uKGQzLm1vdXNlKHRhcmdldCkpOwoKICAgIHdpbmRvdy5mb2N1cygpOwogICAgZDNfZXZlbnRDYW5jZWwoKTsKCiAgICBmdW5jdGlvbiBtb3VzZW1vdmUoKSB7CiAgICAgIG1vdmVkID0gMTsKICAgICAgdHJhbnNsYXRlVG8oZDMubW91c2UodGFyZ2V0KSwgbCk7CiAgICAgIGRpc3BhdGNoKGV2ZW50Xyk7CiAgICB9CgogICAgZnVuY3Rpb24gbW91c2V1cCgpIHsKICAgICAgaWYgKG1vdmVkKSBkM19ldmVudENhbmNlbCgpOwogICAgICB3Lm9uKCJtb3VzZW1vdmUuem9vbSIsIG51bGwpLm9uKCJtb3VzZXVwLnpvb20iLCBudWxsKTsKICAgICAgaWYgKG1vdmVkICYmIGQzLmV2ZW50LnRhcmdldCA9PT0gZXZlbnRUYXJnZXQpIHcub24oImNsaWNrLnpvb20iLCBjbGljayk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xpY2soKSB7CiAgICAgIGQzX2V2ZW50Q2FuY2VsKCk7CiAgICAgIHcub24oImNsaWNrLnpvb20iLCBudWxsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG1vdXNld2hlZWwoKSB7CiAgICBpZiAoIXRyYW5zbGF0ZTApIHRyYW5zbGF0ZTAgPSBsb2NhdGlvbihkMy5tb3VzZSh0aGlzKSk7CiAgICBzY2FsZVRvKE1hdGgucG93KDIsIGQzX2JlaGF2aW9yX3pvb21EZWx0YSgpICogLjAwMikgKiBzY2FsZSk7CiAgICB0cmFuc2xhdGVUbyhkMy5tb3VzZSh0aGlzKSwgdHJhbnNsYXRlMCk7CiAgICBkaXNwYXRjaChldmVudC5vZih0aGlzLCBhcmd1bWVudHMpKTsKICB9CgogIGZ1bmN0aW9uIG1vdXNlbW92ZSgpIHsKICAgIHRyYW5zbGF0ZTAgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gZGJsY2xpY2soKSB7CiAgICB2YXIgcCA9IGQzLm1vdXNlKHRoaXMpLCBsID0gbG9jYXRpb24ocCk7CiAgICBzY2FsZVRvKGQzLmV2ZW50LnNoaWZ0S2V5ID8gc2NhbGUgLyAyIDogc2NhbGUgKiAyKTsKICAgIHRyYW5zbGF0ZVRvKHAsIGwpOwogICAgZGlzcGF0Y2goZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSk7CiAgfQoKICBmdW5jdGlvbiB0b3VjaHN0YXJ0KCkgewogICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoaXMpLAogICAgICAgIG5vdyA9IERhdGUubm93KCk7CgogICAgc2NhbGUwID0gc2NhbGU7CiAgICB0cmFuc2xhdGUwID0ge307CiAgICB0b3VjaGVzLmZvckVhY2goZnVuY3Rpb24odCkgeyB0cmFuc2xhdGUwW3QuaWRlbnRpZmllcl0gPSBsb2NhdGlvbih0KTsgfSk7CiAgICBkM19ldmVudENhbmNlbCgpOwoKICAgIGlmICgodG91Y2hlcy5sZW5ndGggPT09IDEpICYmIChub3cgLSB0b3VjaHRpbWUgPCA1MDApKSB7IC8vIGRibHRhcAogICAgICB2YXIgcCA9IHRvdWNoZXNbMF0sIGwgPSBsb2NhdGlvbih0b3VjaGVzWzBdKTsKICAgICAgc2NhbGVUbyhzY2FsZSAqIDIpOwogICAgICB0cmFuc2xhdGVUbyhwLCBsKTsKICAgICAgZGlzcGF0Y2goZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSk7CiAgICB9CiAgICB0b3VjaHRpbWUgPSBub3c7CiAgfQoKICBmdW5jdGlvbiB0b3VjaG1vdmUoKSB7CiAgICB2YXIgdG91Y2hlcyA9IGQzLnRvdWNoZXModGhpcyksCiAgICAgICAgcDAgPSB0b3VjaGVzWzBdLAogICAgICAgIGwwID0gdHJhbnNsYXRlMFtwMC5pZGVudGlmaWVyXTsKICAgIGlmIChwMSA9IHRvdWNoZXNbMV0pIHsKICAgICAgdmFyIHAxLCBsMSA9IHRyYW5zbGF0ZTBbcDEuaWRlbnRpZmllcl07CiAgICAgIHAwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdOwogICAgICBsMCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTsKICAgICAgc2NhbGVUbyhkMy5ldmVudC5zY2FsZSAqIHNjYWxlMCk7CiAgICB9CiAgICB0cmFuc2xhdGVUbyhwMCwgbDApOwogICAgZGlzcGF0Y2goZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSk7CiAgfQoKICByZXR1cm4gZDMucmViaW5kKHpvb20sIGV2ZW50LCAib24iKTsKfTsKCnZhciBkM19iZWhhdmlvcl96b29tRGl2LCAvLyBmb3IgaW50ZXJwcmV0aW5nIG1vdXNld2hlZWwgZXZlbnRzCiAgICBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgPSBbMCwgSW5maW5pdHldOyAvLyBkZWZhdWx0IHNjYWxlIGV4dGVudAoKZnVuY3Rpb24gZDNfYmVoYXZpb3Jfem9vbURlbHRhKCkgewoKICAvLyBtb3VzZXdoZWVsIGV2ZW50cyBhcmUgdG90YWxseSBicm9rZW4hCiAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQwNDQxCiAgLy8gbm90IG9ubHkgdGhhdCwgYnV0IENocm9tZSBhbmQgU2FmYXJpIGRpZmZlciBpbiByZS4gdG8gYWNjZWxlcmF0aW9uIQogIGlmICghZDNfYmVoYXZpb3Jfem9vbURpdikgewogICAgZDNfYmVoYXZpb3Jfem9vbURpdiA9IGQzLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgiZGl2IikKICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIikKICAgICAgICAuc3R5bGUoInRvcCIsIDApCiAgICAgICAgLnN0eWxlKCJoZWlnaHQiLCAwKQogICAgICAgIC5zdHlsZSgid2lkdGgiLCAwKQogICAgICAgIC5zdHlsZSgib3ZlcmZsb3cteSIsICJzY3JvbGwiKQogICAgICAuYXBwZW5kKCJkaXYiKQogICAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgIjIwMDBweCIpCiAgICAgIC5ub2RlKCkucGFyZW50Tm9kZTsKICB9CgogIHZhciBlID0gZDMuZXZlbnQsIGRlbHRhOwogIHRyeSB7CiAgICBkM19iZWhhdmlvcl96b29tRGl2LnNjcm9sbFRvcCA9IDEwMDA7CiAgICBkM19iZWhhdmlvcl96b29tRGl2LmRpc3BhdGNoRXZlbnQoZSk7CiAgICBkZWx0YSA9IDEwMDAgLSBkM19iZWhhdmlvcl96b29tRGl2LnNjcm9sbFRvcDsKICB9IGNhdGNoIChlcnJvcikgewogICAgZGVsdGEgPSBlLndoZWVsRGVsdGEgfHwgKC1lLmRldGFpbCAqIDUpOwogIH0KCiAgcmV0dXJuIGRlbHRhOwp9CmQzLmxheW91dCA9IHt9OwovLyBJbXBsZW1lbnRzIGhpZXJhcmNoaWNhbCBlZGdlIGJ1bmRsaW5nIHVzaW5nIEhvbHRlbidzIGFsZ29yaXRobS4gRm9yIGVhY2gKLy8gaW5wdXQgbGluaywgYSBwYXRoIGlzIGNvbXB1dGVkIHRoYXQgdHJhdmVscyB0aHJvdWdoIHRoZSB0cmVlLCB1cCB0aGUgcGFyZW50Ci8vIGhpZXJhcmNoeSB0byB0aGUgbGVhc3QgY29tbW9uIGFuY2VzdG9yLCBhbmQgdGhlbiBiYWNrIGRvd24gdG8gdGhlIGRlc3RpbmF0aW9uCi8vIG5vZGUuIEVhY2ggcGF0aCBpcyBzaW1wbHkgYW4gYXJyYXkgb2Ygbm9kZXMuCmQzLmxheW91dC5idW5kbGUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZnVuY3Rpb24obGlua3MpIHsKICAgIHZhciBwYXRocyA9IFtdLAogICAgICAgIGkgPSAtMSwKICAgICAgICBuID0gbGlua3MubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIHBhdGhzLnB1c2goZDNfbGF5b3V0X2J1bmRsZVBhdGgobGlua3NbaV0pKTsKICAgIHJldHVybiBwYXRoczsKICB9Owp9OwoKZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZVBhdGgobGluaykgewogIHZhciBzdGFydCA9IGxpbmsuc291cmNlLAogICAgICBlbmQgPSBsaW5rLnRhcmdldCwKICAgICAgbGNhID0gZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksCiAgICAgIHBvaW50cyA9IFtzdGFydF07CiAgd2hpbGUgKHN0YXJ0ICE9PSBsY2EpIHsKICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50OwogICAgcG9pbnRzLnB1c2goc3RhcnQpOwogIH0KICB2YXIgayA9IHBvaW50cy5sZW5ndGg7CiAgd2hpbGUgKGVuZCAhPT0gbGNhKSB7CiAgICBwb2ludHMuc3BsaWNlKGssIDAsIGVuZCk7CiAgICBlbmQgPSBlbmQucGFyZW50OwogIH0KICByZXR1cm4gcG9pbnRzOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfYnVuZGxlQW5jZXN0b3JzKG5vZGUpIHsKICB2YXIgYW5jZXN0b3JzID0gW10sCiAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50OwogIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewogICAgYW5jZXN0b3JzLnB1c2gobm9kZSk7CiAgICBub2RlID0gcGFyZW50OwogICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICB9CiAgYW5jZXN0b3JzLnB1c2gobm9kZSk7CiAgcmV0dXJuIGFuY2VzdG9yczsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikgewogIGlmIChhID09PSBiKSByZXR1cm4gYTsKICB2YXIgYU5vZGVzID0gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhhKSwKICAgICAgYk5vZGVzID0gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhiKSwKICAgICAgYU5vZGUgPSBhTm9kZXMucG9wKCksCiAgICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpLAogICAgICBzaGFyZWROb2RlID0gbnVsbDsKICB3aGlsZSAoYU5vZGUgPT09IGJOb2RlKSB7CiAgICBzaGFyZWROb2RlID0gYU5vZGU7CiAgICBhTm9kZSA9IGFOb2Rlcy5wb3AoKTsKICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpOwogIH0KICByZXR1cm4gc2hhcmVkTm9kZTsKfQpkMy5sYXlvdXQuY2hvcmQgPSBmdW5jdGlvbigpIHsKICB2YXIgY2hvcmQgPSB7fSwKICAgICAgY2hvcmRzLAogICAgICBncm91cHMsCiAgICAgIG1hdHJpeCwKICAgICAgbiwKICAgICAgcGFkZGluZyA9IDAsCiAgICAgIHNvcnRHcm91cHMsCiAgICAgIHNvcnRTdWJncm91cHMsCiAgICAgIHNvcnRDaG9yZHM7CgogIGZ1bmN0aW9uIHJlbGF5b3V0KCkgewogICAgdmFyIHN1Ymdyb3VwcyA9IHt9LAogICAgICAgIGdyb3VwU3VtcyA9IFtdLAogICAgICAgIGdyb3VwSW5kZXggPSBkMy5yYW5nZShuKSwKICAgICAgICBzdWJncm91cEluZGV4ID0gW10sCiAgICAgICAgaywKICAgICAgICB4LAogICAgICAgIHgwLAogICAgICAgIGksCiAgICAgICAgajsKCiAgICBjaG9yZHMgPSBbXTsKICAgIGdyb3VwcyA9IFtdOwoKICAgIC8vIENvbXB1dGUgdGhlIHN1bS4KICAgIGsgPSAwLCBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIHggPSAwLCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CiAgICAgICAgeCArPSBtYXRyaXhbaV1bal07CiAgICAgIH0KICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7CiAgICAgIHN1Ymdyb3VwSW5kZXgucHVzaChkMy5yYW5nZShuKSk7CiAgICAgIGsgKz0geDsKICAgIH0KCiAgICAvLyBTb3J0IGdyb3Vwc+KAPwogICAgaWYgKHNvcnRHcm91cHMpIHsKICAgICAgZ3JvdXBJbmRleC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gc29ydEdyb3Vwcyhncm91cFN1bXNbYV0sIGdyb3VwU3Vtc1tiXSk7CiAgICAgIH0pOwogICAgfQoKICAgIC8vIFNvcnQgc3ViZ3JvdXBz4oA/CiAgICBpZiAoc29ydFN1Ymdyb3VwcykgewogICAgICBzdWJncm91cEluZGV4LmZvckVhY2goZnVuY3Rpb24oZCwgaSkgewogICAgICAgIGQuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICByZXR1cm4gc29ydFN1Ymdyb3VwcyhtYXRyaXhbaV1bYV0sIG1hdHJpeFtpXVtiXSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIC8vIENvbnZlcnQgdGhlIHN1bSB0byBzY2FsaW5nIGZhY3RvciBmb3IgWzAsIDJwaV0uCiAgICAvLyBUT0RPIEFsbG93IHN0YXJ0IGFuZCBlbmQgYW5nbGUgdG8gYmUgc3BlY2lmaWVkLgogICAgLy8gVE9ETyBBbGxvdyBwYWRkaW5nIHRvIGJlIHNwZWNpZmllZCBhcyBwZXJjZW50YWdlPwogICAgayA9ICgyICogTWF0aC5QSSAtIHBhZGRpbmcgKiBuKSAvIGs7CgogICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnQgYW5kIGVuZCBhbmdsZSBmb3IgZWFjaCBncm91cCBhbmQgc3ViZ3JvdXAuCiAgICAvLyBOb3RlOiBPcGVyYSBoYXMgYSBidWcgcmVvcmRlcmluZyBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0aWVzIQogICAgeCA9IDAsIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgeDAgPSB4LCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CiAgICAgICAgdmFyIGRpID0gZ3JvdXBJbmRleFtpXSwKICAgICAgICAgICAgZGogPSBzdWJncm91cEluZGV4W2RpXVtqXSwKICAgICAgICAgICAgdiA9IG1hdHJpeFtkaV1bZGpdLAogICAgICAgICAgICBhMCA9IHgsCiAgICAgICAgICAgIGExID0geCArPSB2ICogazsKICAgICAgICBzdWJncm91cHNbZGkgKyAiLSIgKyBkal0gPSB7CiAgICAgICAgICBpbmRleDogZGksCiAgICAgICAgICBzdWJpbmRleDogZGosCiAgICAgICAgICBzdGFydEFuZ2xlOiBhMCwKICAgICAgICAgIGVuZEFuZ2xlOiBhMSwKICAgICAgICAgIHZhbHVlOiB2CiAgICAgICAgfTsKICAgICAgfQogICAgICBncm91cHMucHVzaCh7CiAgICAgICAgaW5kZXg6IGRpLAogICAgICAgIHN0YXJ0QW5nbGU6IHgwLAogICAgICAgIGVuZEFuZ2xlOiB4LAogICAgICAgIHZhbHVlOiAoeCAtIHgwKSAvIGsKICAgICAgfSk7CiAgICAgIHggKz0gcGFkZGluZzsKICAgIH0KCiAgICAvLyBHZW5lcmF0ZSBjaG9yZHMgZm9yIGVhY2ggKG5vbi1lbXB0eSkgc3ViZ3JvdXAtc3ViZ3JvdXAgbGluay4KICAgIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaiA9IGkgLSAxOyB3aGlsZSAoKytqIDwgbikgewogICAgICAgIHZhciBzb3VyY2UgPSBzdWJncm91cHNbaSArICItIiArIGpdLAogICAgICAgICAgICB0YXJnZXQgPSBzdWJncm91cHNbaiArICItIiArIGldOwogICAgICAgIGlmIChzb3VyY2UudmFsdWUgfHwgdGFyZ2V0LnZhbHVlKSB7CiAgICAgICAgICBjaG9yZHMucHVzaChzb3VyY2UudmFsdWUgPCB0YXJnZXQudmFsdWUKICAgICAgICAgICAgICA/IHtzb3VyY2U6IHRhcmdldCwgdGFyZ2V0OiBzb3VyY2V9CiAgICAgICAgICAgICAgOiB7c291cmNlOiBzb3VyY2UsIHRhcmdldDogdGFyZ2V0fSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKHNvcnRDaG9yZHMpIHJlc29ydCgpOwogIH0KCiAgZnVuY3Rpb24gcmVzb3J0KCkgewogICAgY2hvcmRzLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICByZXR1cm4gc29ydENob3JkcygKICAgICAgICAgIChhLnNvdXJjZS52YWx1ZSArIGEudGFyZ2V0LnZhbHVlKSAvIDIsCiAgICAgICAgICAoYi5zb3VyY2UudmFsdWUgKyBiLnRhcmdldC52YWx1ZSkgLyAyKTsKICAgIH0pOwogIH0KCiAgY2hvcmQubWF0cml4ID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbWF0cml4OwogICAgbiA9IChtYXRyaXggPSB4KSAmJiBtYXRyaXgubGVuZ3RoOwogICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsKICAgIHJldHVybiBjaG9yZDsKICB9OwoKICBjaG9yZC5wYWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZzsKICAgIHBhZGRpbmcgPSB4OwogICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsKICAgIHJldHVybiBjaG9yZDsKICB9OwoKICBjaG9yZC5zb3J0R3JvdXBzID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydEdyb3VwczsKICAgIHNvcnRHcm91cHMgPSB4OwogICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDsKICAgIHJldHVybiBjaG9yZDsKICB9OwoKICBjaG9yZC5zb3J0U3ViZ3JvdXBzID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydFN1Ymdyb3VwczsKICAgIHNvcnRTdWJncm91cHMgPSB4OwogICAgY2hvcmRzID0gbnVsbDsKICAgIHJldHVybiBjaG9yZDsKICB9OwoKICBjaG9yZC5zb3J0Q2hvcmRzID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydENob3JkczsKICAgIHNvcnRDaG9yZHMgPSB4OwogICAgaWYgKGNob3JkcykgcmVzb3J0KCk7CiAgICByZXR1cm4gY2hvcmQ7CiAgfTsKCiAgY2hvcmQuY2hvcmRzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIWNob3JkcykgcmVsYXlvdXQoKTsKICAgIHJldHVybiBjaG9yZHM7CiAgfTsKCiAgY2hvcmQuZ3JvdXBzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIWdyb3VwcykgcmVsYXlvdXQoKTsKICAgIHJldHVybiBncm91cHM7CiAgfTsKCiAgcmV0dXJuIGNob3JkOwp9OwovLyBBIHJ1ZGltZW50YXJ5IGZvcmNlIGxheW91dCB1c2luZyBHYXVzcy1TZWlkZWwuCmQzLmxheW91dC5mb3JjZSA9IGZ1bmN0aW9uKCkgewogIHZhciBmb3JjZSA9IHt9LAogICAgICBldmVudCA9IGQzLmRpc3BhdGNoKCJzdGFydCIsICJ0aWNrIiwgImVuZCIpLAogICAgICBzaXplID0gWzEsIDFdLAogICAgICBkcmFnLAogICAgICBhbHBoYSwKICAgICAgZnJpY3Rpb24gPSAuOSwKICAgICAgbGlua0Rpc3RhbmNlID0gZDNfbGF5b3V0X2ZvcmNlTGlua0Rpc3RhbmNlLAogICAgICBsaW5rU3RyZW5ndGggPSBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgsCiAgICAgIGNoYXJnZSA9IC0zMCwKICAgICAgZ3Jhdml0eSA9IC4xLAogICAgICB0aGV0YSA9IC44LAogICAgICBpbnRlcnZhbCwKICAgICAgbm9kZXMgPSBbXSwKICAgICAgbGlua3MgPSBbXSwKICAgICAgZGlzdGFuY2VzLAogICAgICBzdHJlbmd0aHMsCiAgICAgIGNoYXJnZXM7CgogIGZ1bmN0aW9uIHJlcHVsc2Uobm9kZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHF1YWQsIHgxLCB5MSwgeDIsIHkyKSB7CiAgICAgIGlmIChxdWFkLnBvaW50ICE9PSBub2RlKSB7CiAgICAgICAgdmFyIGR4ID0gcXVhZC5jeCAtIG5vZGUueCwKICAgICAgICAgICAgZHkgPSBxdWFkLmN5IC0gbm9kZS55LAogICAgICAgICAgICBkbiA9IDEgLyBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOwoKICAgICAgICAvKiBCYXJuZXMtSHV0IGNyaXRlcmlvbi4gKi8KICAgICAgICBpZiAoKHgyIC0geDEpICogZG4gPCB0aGV0YSkgewogICAgICAgICAgdmFyIGsgPSBxdWFkLmNoYXJnZSAqIGRuICogZG47CiAgICAgICAgICBub2RlLnB4IC09IGR4ICogazsKICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAocXVhZC5wb2ludCAmJiBpc0Zpbml0ZShkbikpIHsKICAgICAgICAgIHZhciBrID0gcXVhZC5wb2ludENoYXJnZSAqIGRuICogZG47CiAgICAgICAgICBub2RlLnB4IC09IGR4ICogazsKICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gIXF1YWQuY2hhcmdlOwogICAgfTsKICB9CgogIGZvcmNlLnRpY2sgPSBmdW5jdGlvbigpIHsKICAgIC8vIHNpbXVsYXRlZCBhbm5lYWxpbmcsIGJhc2ljYWxseQogICAgaWYgKChhbHBoYSAqPSAuOTkpIDwgLjAwNSkgewogICAgICBldmVudC5lbmQoe3R5cGU6ICJlbmQiLCBhbHBoYTogYWxwaGEgPSAwfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHZhciBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsCiAgICAgICAgcSwKICAgICAgICBpLCAvLyBjdXJyZW50IGluZGV4CiAgICAgICAgbywgLy8gY3VycmVudCBvYmplY3QKICAgICAgICBzLCAvLyBjdXJyZW50IHNvdXJjZQogICAgICAgIHQsIC8vIGN1cnJlbnQgdGFyZ2V0CiAgICAgICAgbCwgLy8gY3VycmVudCBkaXN0YW5jZQogICAgICAgIGssIC8vIGN1cnJlbnQgZm9yY2UKICAgICAgICB4LCAvLyB4LWRpc3RhbmNlCiAgICAgICAgeTsgLy8geS1kaXN0YW5jZQoKICAgIC8vIGdhdXNzLXNlaWRlbCByZWxheGF0aW9uIGZvciBsaW5rcwogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBvID0gbGlua3NbaV07CiAgICAgIHMgPSBvLnNvdXJjZTsKICAgICAgdCA9IG8udGFyZ2V0OwogICAgICB4ID0gdC54IC0gcy54OwogICAgICB5ID0gdC55IC0gcy55OwogICAgICBpZiAobCA9ICh4ICogeCArIHkgKiB5KSkgewogICAgICAgIGwgPSBhbHBoYSAqIHN0cmVuZ3Roc1tpXSAqICgobCA9IE1hdGguc3FydChsKSkgLSBkaXN0YW5jZXNbaV0pIC8gbDsKICAgICAgICB4ICo9IGw7CiAgICAgICAgeSAqPSBsOwogICAgICAgIHQueCAtPSB4ICogKGsgPSBzLndlaWdodCAvICh0LndlaWdodCArIHMud2VpZ2h0KSk7CiAgICAgICAgdC55IC09IHkgKiBrOwogICAgICAgIHMueCArPSB4ICogKGsgPSAxIC0gayk7CiAgICAgICAgcy55ICs9IHkgKiBrOwogICAgICB9CiAgICB9CgogICAgLy8gYXBwbHkgZ3Jhdml0eSBmb3JjZXMKICAgIGlmIChrID0gYWxwaGEgKiBncmF2aXR5KSB7CiAgICAgIHggPSBzaXplWzBdIC8gMjsKICAgICAgeSA9IHNpemVbMV0gLyAyOwogICAgICBpID0gLTE7IGlmIChrKSB3aGlsZSAoKytpIDwgbikgewogICAgICAgIG8gPSBub2Rlc1tpXTsKICAgICAgICBvLnggKz0gKHggLSBvLngpICogazsKICAgICAgICBvLnkgKz0gKHkgLSBvLnkpICogazsKICAgICAgfQogICAgfQoKICAgIC8vIGNvbXB1dGUgcXVhZHRyZWUgY2VudGVyIG9mIG1hc3MgYW5kIGFwcGx5IGNoYXJnZSBmb3JjZXMKICAgIGlmIChjaGFyZ2UpIHsKICAgICAgZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShxID0gZDMuZ2VvbS5xdWFkdHJlZShub2RlcyksIGFscGhhLCBjaGFyZ2VzKTsKICAgICAgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmICghKG8gPSBub2Rlc1tpXSkuZml4ZWQpIHsKICAgICAgICAgIHEudmlzaXQocmVwdWxzZShvKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gcG9zaXRpb24gdmVybGV0IGludGVncmF0aW9uCiAgICBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIG8gPSBub2Rlc1tpXTsKICAgICAgaWYgKG8uZml4ZWQpIHsKICAgICAgICBvLnggPSBvLnB4OwogICAgICAgIG8ueSA9IG8ucHk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgby54IC09IChvLnB4IC0gKG8ucHggPSBvLngpKSAqIGZyaWN0aW9uOwogICAgICAgIG8ueSAtPSAoby5weSAtIChvLnB5ID0gby55KSkgKiBmcmljdGlvbjsKICAgICAgfQogICAgfQoKICAgIGV2ZW50LnRpY2soe3R5cGU6ICJ0aWNrIiwgYWxwaGE6IGFscGhhfSk7CiAgfTsKCiAgZm9yY2Uubm9kZXMgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlczsKICAgIG5vZGVzID0geDsKICAgIHJldHVybiBmb3JjZTsKICB9OwoKICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtzOwogICAgbGlua3MgPSB4OwogICAgcmV0dXJuIGZvcmNlOwogIH07CgogIGZvcmNlLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgc2l6ZSA9IHg7CiAgICByZXR1cm4gZm9yY2U7CiAgfTsKCiAgZm9yY2UubGlua0Rpc3RhbmNlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua0Rpc3RhbmNlOwogICAgbGlua0Rpc3RhbmNlID0gZDMuZnVuY3Rvcih4KTsKICAgIHJldHVybiBmb3JjZTsKICB9OwoKICAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCiAgZm9yY2UuZGlzdGFuY2UgPSBmb3JjZS5saW5rRGlzdGFuY2U7CgogIGZvcmNlLmxpbmtTdHJlbmd0aCA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtTdHJlbmd0aDsKICAgIGxpbmtTdHJlbmd0aCA9IGQzLmZ1bmN0b3IoeCk7CiAgICByZXR1cm4gZm9yY2U7CiAgfTsKCiAgZm9yY2UuZnJpY3Rpb24gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmljdGlvbjsKICAgIGZyaWN0aW9uID0geDsKICAgIHJldHVybiBmb3JjZTsKICB9OwoKICBmb3JjZS5jaGFyZ2UgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjaGFyZ2U7CiAgICBjaGFyZ2UgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiAreDsKICAgIHJldHVybiBmb3JjZTsKICB9OwoKICBmb3JjZS5ncmF2aXR5ID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3Jhdml0eTsKICAgIGdyYXZpdHkgPSB4OwogICAgcmV0dXJuIGZvcmNlOwogIH07CgogIGZvcmNlLnRoZXRhID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhldGE7CiAgICB0aGV0YSA9IHg7CiAgICByZXR1cm4gZm9yY2U7CiAgfTsKCiAgZm9yY2UuYWxwaGEgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhbHBoYTsKCiAgICBpZiAoYWxwaGEpIHsgLy8gaWYgd2UncmUgYWxyZWFkeSBydW5uaW5nCiAgICAgIGlmICh4ID4gMCkgYWxwaGEgPSB4OyAvLyB3ZSBtaWdodCBrZWVwIGl0IGhvdAogICAgICBlbHNlIGFscGhhID0gMDsgLy8gb3IsIG5leHQgdGljayB3aWxsIGRpc3BhdGNoICJlbmQiCiAgICB9IGVsc2UgaWYgKHggPiAwKSB7IC8vIG90aGVyd2lzZSwgZmlyZSBpdCB1cCEKICAgICAgZXZlbnQuc3RhcnQoe3R5cGU6ICJzdGFydCIsIGFscGhhOiBhbHBoYSA9IHh9KTsKICAgICAgZDMudGltZXIoZm9yY2UudGljayk7CiAgICB9CgogICAgcmV0dXJuIGZvcmNlOwogIH07CgogIGZvcmNlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaSwKICAgICAgICBqLAogICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCwKICAgICAgICB3ID0gc2l6ZVswXSwKICAgICAgICBoID0gc2l6ZVsxXSwKICAgICAgICBuZWlnaGJvcnMsCiAgICAgICAgbzsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIChvID0gbm9kZXNbaV0pLmluZGV4ID0gaTsKICAgICAgby53ZWlnaHQgPSAwOwogICAgfQoKICAgIGRpc3RhbmNlcyA9IFtdOwogICAgc3RyZW5ndGhzID0gW107CiAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgIG8gPSBsaW5rc1tpXTsKICAgICAgaWYgKHR5cGVvZiBvLnNvdXJjZSA9PSAibnVtYmVyIikgby5zb3VyY2UgPSBub2Rlc1tvLnNvdXJjZV07CiAgICAgIGlmICh0eXBlb2Ygby50YXJnZXQgPT0gIm51bWJlciIpIG8udGFyZ2V0ID0gbm9kZXNbby50YXJnZXRdOwogICAgICBkaXN0YW5jZXNbaV0gPSBsaW5rRGlzdGFuY2UuY2FsbCh0aGlzLCBvLCBpKTsKICAgICAgc3RyZW5ndGhzW2ldID0gbGlua1N0cmVuZ3RoLmNhbGwodGhpcywgbywgaSk7CiAgICAgICsrby5zb3VyY2Uud2VpZ2h0OwogICAgICArK28udGFyZ2V0LndlaWdodDsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG8gPSBub2Rlc1tpXTsKICAgICAgaWYgKGlzTmFOKG8ueCkpIG8ueCA9IHBvc2l0aW9uKCJ4Iiwgdyk7CiAgICAgIGlmIChpc05hTihvLnkpKSBvLnkgPSBwb3NpdGlvbigieSIsIGgpOwogICAgICBpZiAoaXNOYU4oby5weCkpIG8ucHggPSBvLng7CiAgICAgIGlmIChpc05hTihvLnB5KSkgby5weSA9IG8ueTsKICAgIH0KCiAgICBjaGFyZ2VzID0gW107CiAgICBpZiAodHlwZW9mIGNoYXJnZSA9PT0gImZ1bmN0aW9uIikgewogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgY2hhcmdlc1tpXSA9ICtjaGFyZ2UuY2FsbCh0aGlzLCBub2Rlc1tpXSwgaSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBjaGFyZ2VzW2ldID0gY2hhcmdlOwogICAgICB9CiAgICB9CgogICAgLy8gaW5pdGlhbGl6ZSBub2RlIHBvc2l0aW9uIGJhc2VkIG9uIGZpcnN0IG5laWdoYm9yCiAgICBmdW5jdGlvbiBwb3NpdGlvbihkaW1lbnNpb24sIHNpemUpIHsKICAgICAgdmFyIG5laWdoYm9ycyA9IG5laWdoYm9yKGkpLAogICAgICAgICAgaiA9IC0xLAogICAgICAgICAgbSA9IG5laWdoYm9ycy5sZW5ndGgsCiAgICAgICAgICB4OwogICAgICB3aGlsZSAoKytqIDwgbSkgaWYgKCFpc05hTih4ID0gbmVpZ2hib3JzW2pdW2RpbWVuc2lvbl0pKSByZXR1cm4geDsKICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBzaXplOwogICAgfQoKICAgIC8vIGluaXRpYWxpemUgbmVpZ2hib3JzIGxhemlseQogICAgZnVuY3Rpb24gbmVpZ2hib3IoKSB7CiAgICAgIGlmICghbmVpZ2hib3JzKSB7CiAgICAgICAgbmVpZ2hib3JzID0gW107CiAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikgewogICAgICAgICAgbmVpZ2hib3JzW2pdID0gW107CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICAgIHZhciBvID0gbGlua3Nbal07CiAgICAgICAgICBuZWlnaGJvcnNbby5zb3VyY2UuaW5kZXhdLnB1c2goby50YXJnZXQpOwogICAgICAgICAgbmVpZ2hib3JzW28udGFyZ2V0LmluZGV4XS5wdXNoKG8uc291cmNlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5laWdoYm9yc1tpXTsKICAgIH0KCiAgICByZXR1cm4gZm9yY2UucmVzdW1lKCk7CiAgfTsKCiAgZm9yY2UucmVzdW1lID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZm9yY2UuYWxwaGEoLjEpOwogIH07CgogIGZvcmNlLnN0b3AgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmb3JjZS5hbHBoYSgwKTsKICB9OwoKICAvLyB1c2UgYG5vZGUuY2FsbChmb3JjZS5kcmFnKWAgdG8gbWFrZSBub2RlcyBkcmFnZ2FibGUKICBmb3JjZS5kcmFnID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIWRyYWcpIGRyYWcgPSBkMy5iZWhhdmlvci5kcmFnKCkKICAgICAgICAub3JpZ2luKE9iamVjdCkKICAgICAgICAub24oImRyYWdzdGFydCIsIGRyYWdzdGFydCkKICAgICAgICAub24oImRyYWciLCBkM19sYXlvdXRfZm9yY2VEcmFnKQogICAgICAgIC5vbigiZHJhZ2VuZCIsIGQzX2xheW91dF9mb3JjZURyYWdFbmQpOwoKICAgIHRoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsIGQzX2xheW91dF9mb3JjZURyYWdPdmVyKQogICAgICAgIC5vbigibW91c2VvdXQuZm9yY2UiLCBkM19sYXlvdXRfZm9yY2VEcmFnT3V0KQogICAgICAgIC5jYWxsKGRyYWcpOwogIH07CgogIGZ1bmN0aW9uIGRyYWdzdGFydChkKSB7CiAgICBkM19sYXlvdXRfZm9yY2VEcmFnT3ZlcihkM19sYXlvdXRfZm9yY2VEcmFnTm9kZSA9IGQpOwogICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ0ZvcmNlID0gZm9yY2U7CiAgfQoKICByZXR1cm4gZDMucmViaW5kKGZvcmNlLCBldmVudCwgIm9uIik7Cn07Cgp2YXIgZDNfbGF5b3V0X2ZvcmNlRHJhZ0ZvcmNlLAogICAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGU7CgpmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnT3ZlcihkKSB7CiAgZC5maXhlZCB8PSAyOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VEcmFnT3V0KGQpIHsKICBpZiAoZCAhPT0gZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUpIGQuZml4ZWQgJj0gMTsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZ0VuZCgpIHsKICBkM19sYXlvdXRfZm9yY2VEcmFnTm9kZS5maXhlZCAmPSAxOwogIGQzX2xheW91dF9mb3JjZURyYWdGb3JjZSA9IGQzX2xheW91dF9mb3JjZURyYWdOb2RlID0gbnVsbDsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZygpIHsKICBkM19sYXlvdXRfZm9yY2VEcmFnTm9kZS5weCA9IGQzLmV2ZW50Lng7CiAgZDNfbGF5b3V0X2ZvcmNlRHJhZ05vZGUucHkgPSBkMy5ldmVudC55OwogIGQzX2xheW91dF9mb3JjZURyYWdGb3JjZS5yZXN1bWUoKTsgLy8gcmVzdGFydCBhbm5lYWxpbmcKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShxdWFkLCBhbHBoYSwgY2hhcmdlcykgewogIHZhciBjeCA9IDAsCiAgICAgIGN5ID0gMDsKICBxdWFkLmNoYXJnZSA9IDA7CiAgaWYgKCFxdWFkLmxlYWYpIHsKICAgIHZhciBub2RlcyA9IHF1YWQubm9kZXMsCiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICBpID0gLTEsCiAgICAgICAgYzsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGMgPSBub2Rlc1tpXTsKICAgICAgaWYgKGMgPT0gbnVsbCkgY29udGludWU7CiAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUoYywgYWxwaGEsIGNoYXJnZXMpOwogICAgICBxdWFkLmNoYXJnZSArPSBjLmNoYXJnZTsKICAgICAgY3ggKz0gYy5jaGFyZ2UgKiBjLmN4OwogICAgICBjeSArPSBjLmNoYXJnZSAqIGMuY3k7CiAgICB9CiAgfQogIGlmIChxdWFkLnBvaW50KSB7CiAgICAvLyBqaXR0ZXIgaW50ZXJuYWwgbm9kZXMgdGhhdCBhcmUgY29pbmNpZGVudAogICAgaWYgKCFxdWFkLmxlYWYpIHsKICAgICAgcXVhZC5wb2ludC54ICs9IE1hdGgucmFuZG9tKCkgLSAuNTsKICAgICAgcXVhZC5wb2ludC55ICs9IE1hdGgucmFuZG9tKCkgLSAuNTsKICAgIH0KICAgIHZhciBrID0gYWxwaGEgKiBjaGFyZ2VzW3F1YWQucG9pbnQuaW5kZXhdOwogICAgcXVhZC5jaGFyZ2UgKz0gcXVhZC5wb2ludENoYXJnZSA9IGs7CiAgICBjeCArPSBrICogcXVhZC5wb2ludC54OwogICAgY3kgKz0gayAqIHF1YWQucG9pbnQueTsKICB9CiAgcXVhZC5jeCA9IGN4IC8gcXVhZC5jaGFyZ2U7CiAgcXVhZC5jeSA9IGN5IC8gcXVhZC5jaGFyZ2U7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZUxpbmtEaXN0YW5jZShsaW5rKSB7CiAgcmV0dXJuIDIwOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgobGluaykgewogIHJldHVybiAxOwp9CmQzLmxheW91dC5wYXJ0aXRpb24gPSBmdW5jdGlvbigpIHsKICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLAogICAgICBzaXplID0gWzEsIDFdOyAvLyB3aWR0aCwgaGVpZ2h0CgogIGZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUsIHgsIGR4LCBkeSkgewogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgIG5vZGUueCA9IHg7CiAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7CiAgICBub2RlLmR4ID0gZHg7CiAgICBub2RlLmR5ID0gZHk7CiAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7CiAgICAgIHZhciBpID0gLTEsCiAgICAgICAgICBuLAogICAgICAgICAgYywKICAgICAgICAgIGQ7CiAgICAgIGR4ID0gbm9kZS52YWx1ZSA/IGR4IC8gbm9kZS52YWx1ZSA6IDA7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgcG9zaXRpb24oYyA9IGNoaWxkcmVuW2ldLCB4LCBkID0gYy52YWx1ZSAqIGR4LCBkeSk7CiAgICAgICAgeCArPSBkOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkZXB0aChub2RlKSB7CiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLAogICAgICAgIGQgPSAwOwogICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgewogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbjsKICAgICAgd2hpbGUgKCsraSA8IG4pIGQgPSBNYXRoLm1heChkLCBkZXB0aChjaGlsZHJlbltpXSkpOwogICAgfQogICAgcmV0dXJuIDEgKyBkOwogIH0KCiAgZnVuY3Rpb24gcGFydGl0aW9uKGQsIGkpIHsKICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpOwogICAgcG9zaXRpb24obm9kZXNbMF0sIDAsIHNpemVbMF0sIHNpemVbMV0gLyBkZXB0aChub2Rlc1swXSkpOwogICAgcmV0dXJuIG5vZGVzOwogIH0KCiAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgc2l6ZSA9IHg7CiAgICByZXR1cm4gcGFydGl0aW9uOwogIH07CgogIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHBhcnRpdGlvbiwgaGllcmFyY2h5KTsKfTsKZDMubGF5b3V0LnBpZSA9IGZ1bmN0aW9uKCkgewogIHZhciB2YWx1ZSA9IE51bWJlciwKICAgICAgc29ydCA9IGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSwKICAgICAgc3RhcnRBbmdsZSA9IDAsCiAgICAgIGVuZEFuZ2xlID0gMiAqIE1hdGguUEk7CgogIGZ1bmN0aW9uIHBpZShkYXRhLCBpKSB7CgogICAgLy8gQ29tcHV0ZSB0aGUgbnVtZXJpYyB2YWx1ZXMgZm9yIGVhY2ggZGF0YSBlbGVtZW50LgogICAgdmFyIHZhbHVlcyA9IGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHsgcmV0dXJuICt2YWx1ZS5jYWxsKHBpZSwgZCwgaSk7IH0pOwoKICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0IGFuZ2xlLgogICAgdmFyIGEgPSArKHR5cGVvZiBzdGFydEFuZ2xlID09PSAiZnVuY3Rpb24iCiAgICAgICAgPyBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKICAgICAgICA6IHN0YXJ0QW5nbGUpOwoKICAgIC8vIENvbXB1dGUgdGhlIGFuZ3VsYXIgc2NhbGUgZmFjdG9yOiBmcm9tIHZhbHVlIHRvIHJhZGlhbnMuCiAgICB2YXIgayA9ICgodHlwZW9mIGVuZEFuZ2xlID09PSAiZnVuY3Rpb24iCiAgICAgICAgPyBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpCiAgICAgICAgOiBlbmRBbmdsZSkgLSBzdGFydEFuZ2xlKQogICAgICAgIC8gZDMuc3VtKHZhbHVlcyk7CgogICAgLy8gT3B0aW9uYWxseSBzb3J0IHRoZSBkYXRhLgogICAgdmFyIGluZGV4ID0gZDMucmFuZ2UoZGF0YS5sZW5ndGgpOwogICAgaWYgKHNvcnQgIT0gbnVsbCkgaW5kZXguc29ydChzb3J0ID09PSBkM19sYXlvdXRfcGllU29ydEJ5VmFsdWUKICAgICAgICA/IGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIHZhbHVlc1tqXSAtIHZhbHVlc1tpXTsgfQogICAgICAgIDogZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7CgogICAgLy8gQ29tcHV0ZSB0aGUgYXJjcyEKICAgIC8vIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSdzIG9yZGVyLgogICAgdmFyIGFyY3MgPSBbXTsKICAgIGluZGV4LmZvckVhY2goZnVuY3Rpb24oaSkgewogICAgICBhcmNzW2ldID0gewogICAgICAgIGRhdGE6IGRhdGFbaV0sCiAgICAgICAgdmFsdWU6IGQgPSB2YWx1ZXNbaV0sCiAgICAgICAgc3RhcnRBbmdsZTogYSwKICAgICAgICBlbmRBbmdsZTogYSArPSBkICogawogICAgICB9OwogICAgfSk7CiAgICByZXR1cm4gYXJjczsKICB9CgogIC8qKgogICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgZnVuY3Rpb24gKngqLCB3aGljaCByZXR1cm5zIGEgbm9ubmVnYXRpdmUgbnVtZXJpYyB2YWx1ZQogICAqIGZvciBlYWNoIGRhdHVtLiBUaGUgZGVmYXVsdCB2YWx1ZSBmdW5jdGlvbiBpcyBgTnVtYmVyYC4gVGhlIHZhbHVlIGZ1bmN0aW9uCiAgICogaXMgcGFzc2VkIHR3byBhcmd1bWVudHM6IHRoZSBjdXJyZW50IGRhdHVtIGFuZCB0aGUgY3VycmVudCBpbmRleC4KICAgKi8KICBwaWUudmFsdWUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZTsKICAgIHZhbHVlID0geDsKICAgIHJldHVybiBwaWU7CiAgfTsKCiAgLyoqCiAgICogU3BlY2lmaWVzIGEgc29ydCBjb21wYXJpc29uIG9wZXJhdG9yICp4Ki4gVGhlIGNvbXBhcmF0b3IgaXMgcGFzc2VkIHR3byBkYXRhCiAgICogZWxlbWVudHMgZnJvbSB0aGUgZGF0YSBhcnJheSwgYSBhbmQgYjsgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIGEgaXMKICAgKiBsZXNzIHRoYW4gYiwgYSBwb3NpdGl2ZSB2YWx1ZSBpZiBhIGlzIGdyZWF0ZXIgdGhhbiBiLCBhbmQgemVybyBpZiBhIGVxdWFscwogICAqIGIuCiAgICovCiAgcGllLnNvcnQgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0OwogICAgc29ydCA9IHg7CiAgICByZXR1cm4gcGllOwogIH07CgogIC8qKgogICAqIFNwZWNpZmllcyB0aGUgb3ZlcmFsbCBzdGFydCBhbmdsZSBvZiB0aGUgcGllIGNoYXJ0LiBEZWZhdWx0cyB0byAwLiBUaGUKICAgKiBzdGFydCBhbmdsZSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGNvbnN0YW50IG9yIGFzIGEgZnVuY3Rpb247IGluIHRoZQogICAqIGNhc2Ugb2YgYSBmdW5jdGlvbiwgaXQgaXMgZXZhbHVhdGVkIG9uY2UgcGVyIGFycmF5IChhcyBvcHBvc2VkIHRvIHBlcgogICAqIGVsZW1lbnQpLgogICAqLwogIHBpZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTsKICAgIHN0YXJ0QW5nbGUgPSB4OwogICAgcmV0dXJuIHBpZTsKICB9OwoKICAvKioKICAgKiBTcGVjaWZpZXMgdGhlIG92ZXJhbGwgZW5kIGFuZ2xlIG9mIHRoZSBwaWUgY2hhcnQuIERlZmF1bHRzIHRvIDLPgC4gVGhlCiAgICogZW5kIGFuZ2xlIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgY29uc3RhbnQgb3IgYXMgYSBmdW5jdGlvbjsgaW4gdGhlCiAgICogY2FzZSBvZiBhIGZ1bmN0aW9uLCBpdCBpcyBldmFsdWF0ZWQgb25jZSBwZXIgYXJyYXkgKGFzIG9wcG9zZWQgdG8gcGVyCiAgICogZWxlbWVudCkuCiAgICovCiAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7CiAgICBlbmRBbmdsZSA9IHg7CiAgICByZXR1cm4gcGllOwogIH07CgogIHJldHVybiBwaWU7Cn07Cgp2YXIgZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID0ge307Ci8vIGRhdGEgaXMgdHdvLWRpbWVuc2lvbmFsIGFycmF5IG9mIHgseTsgd2UgcG9wdWxhdGUgeTAKZDMubGF5b3V0LnN0YWNrID0gZnVuY3Rpb24oKSB7CiAgdmFyIHZhbHVlcyA9IE9iamVjdCwKICAgICAgb3JkZXIgPSBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQsCiAgICAgIG9mZnNldCA9IGQzX2xheW91dF9zdGFja09mZnNldFplcm8sCiAgICAgIG91dCA9IGQzX2xheW91dF9zdGFja091dCwKICAgICAgeCA9IGQzX2xheW91dF9zdGFja1gsCiAgICAgIHkgPSBkM19sYXlvdXRfc3RhY2tZOwoKICBmdW5jdGlvbiBzdGFjayhkYXRhLCBpbmRleCkgewoKICAgIC8vIENvbnZlcnQgc2VyaWVzIHRvIGNhbm9uaWNhbCB0d28tZGltZW5zaW9uYWwgcmVwcmVzZW50YXRpb24uCiAgICB2YXIgc2VyaWVzID0gZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkgewogICAgICByZXR1cm4gdmFsdWVzLmNhbGwoc3RhY2ssIGQsIGkpOwogICAgfSk7CgogICAgLy8gQ29udmVydCBlYWNoIHNlcmllcyB0byBjYW5vbmljYWwgW1t4LHldXSByZXByZXNlbnRhdGlvbi4KICAgIHZhciBwb2ludHMgPSBzZXJpZXMubWFwKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgcmV0dXJuIGQubWFwKGZ1bmN0aW9uKHYsIGkpIHsKICAgICAgICByZXR1cm4gW3guY2FsbChzdGFjaywgdiwgaSksIHkuY2FsbChzdGFjaywgdiwgaSldOwogICAgICB9KTsKICAgIH0pOwoKICAgIC8vIENvbXB1dGUgdGhlIG9yZGVyIG9mIHNlcmllcywgYW5kIHBlcm11dGUgdGhlbS4KICAgIHZhciBvcmRlcnMgPSBvcmRlci5jYWxsKHN0YWNrLCBwb2ludHMsIGluZGV4KTsKICAgIHNlcmllcyA9IGQzLnBlcm11dGUoc2VyaWVzLCBvcmRlcnMpOwogICAgcG9pbnRzID0gZDMucGVybXV0ZShwb2ludHMsIG9yZGVycyk7CgogICAgLy8gQ29tcHV0ZSB0aGUgYmFzZWxpbmXigD8KICAgIHZhciBvZmZzZXRzID0gb2Zmc2V0LmNhbGwoc3RhY2ssIHBvaW50cywgaW5kZXgpOwoKICAgIC8vIEFuZCBwcm9wYWdhdGUgaXQgdG8gb3RoZXIgc2VyaWVzLgogICAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLAogICAgICAgIG0gPSBzZXJpZXNbMF0ubGVuZ3RoLAogICAgICAgIGksCiAgICAgICAgaiwKICAgICAgICBvOwogICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICBvdXQuY2FsbChzdGFjaywgc2VyaWVzWzBdW2pdLCBvID0gb2Zmc2V0c1tqXSwgcG9pbnRzWzBdW2pdWzFdKTsKICAgICAgZm9yIChpID0gMTsgaSA8IG47ICsraSkgewogICAgICAgIG91dC5jYWxsKHN0YWNrLCBzZXJpZXNbaV1bal0sIG8gKz0gcG9pbnRzW2kgLSAxXVtqXVsxXSwgcG9pbnRzW2ldW2pdWzFdKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBkYXRhOwogIH0KCiAgc3RhY2sudmFsdWVzID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVzOwogICAgdmFsdWVzID0geDsKICAgIHJldHVybiBzdGFjazsKICB9OwoKICBzdGFjay5vcmRlciA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yZGVyOwogICAgb3JkZXIgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBkM19sYXlvdXRfc3RhY2tPcmRlcnMuZ2V0KHgpIHx8IGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdDsKICAgIHJldHVybiBzdGFjazsKICB9OwoKICBzdGFjay5vZmZzZXQgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvZmZzZXQ7CiAgICBvZmZzZXQgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRzLmdldCh4KSB8fCBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvOwogICAgcmV0dXJuIHN0YWNrOwogIH07CgogIHN0YWNrLnggPSBmdW5jdGlvbih6KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4OwogICAgeCA9IHo7CiAgICByZXR1cm4gc3RhY2s7CiAgfTsKCiAgc3RhY2sueSA9IGZ1bmN0aW9uKHopIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7CiAgICB5ID0gejsKICAgIHJldHVybiBzdGFjazsKICB9OwoKICBzdGFjay5vdXQgPSBmdW5jdGlvbih6KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvdXQ7CiAgICBvdXQgPSB6OwogICAgcmV0dXJuIHN0YWNrOwogIH07CgogIHJldHVybiBzdGFjazsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWChkKSB7CiAgcmV0dXJuIGQueDsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWShkKSB7CiAgcmV0dXJuIGQueTsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrT3V0KGQsIHkwLCB5KSB7CiAgZC55MCA9IHkwOwogIGQueSA9IHk7Cn0KCnZhciBkM19sYXlvdXRfc3RhY2tPcmRlcnMgPSBkMy5tYXAoewoKICAiaW5zaWRlLW91dCI6IGZ1bmN0aW9uKGRhdGEpIHsKICAgIHZhciBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgaSwKICAgICAgICBqLAogICAgICAgIG1heCA9IGRhdGEubWFwKGQzX2xheW91dF9zdGFja01heEluZGV4KSwKICAgICAgICBzdW1zID0gZGF0YS5tYXAoZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKSwKICAgICAgICBpbmRleCA9IGQzLnJhbmdlKG4pLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gbWF4W2FdIC0gbWF4W2JdOyB9KSwKICAgICAgICB0b3AgPSAwLAogICAgICAgIGJvdHRvbSA9IDAsCiAgICAgICAgdG9wcyA9IFtdLAogICAgICAgIGJvdHRvbXMgPSBbXTsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaiA9IGluZGV4W2ldOwogICAgICBpZiAodG9wIDwgYm90dG9tKSB7CiAgICAgICAgdG9wICs9IHN1bXNbal07CiAgICAgICAgdG9wcy5wdXNoKGopOwogICAgICB9IGVsc2UgewogICAgICAgIGJvdHRvbSArPSBzdW1zW2pdOwogICAgICAgIGJvdHRvbXMucHVzaChqKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTsKICB9LAoKICAicmV2ZXJzZSI6IGZ1bmN0aW9uKGRhdGEpIHsKICAgIHJldHVybiBkMy5yYW5nZShkYXRhLmxlbmd0aCkucmV2ZXJzZSgpOwogIH0sCgogICJkZWZhdWx0IjogZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0Cgp9KTsKCnZhciBkM19sYXlvdXRfc3RhY2tPZmZzZXRzID0gZDMubWFwKHsKCiAgInNpbGhvdWV0dGUiOiBmdW5jdGlvbihkYXRhKSB7CiAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIG0gPSBkYXRhWzBdLmxlbmd0aCwKICAgICAgICBzdW1zID0gW10sCiAgICAgICAgbWF4ID0gMCwKICAgICAgICBpLAogICAgICAgIGosCiAgICAgICAgbywKICAgICAgICB5MCA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdOwogICAgICBpZiAobyA+IG1heCkgbWF4ID0gbzsKICAgICAgc3Vtcy5wdXNoKG8pOwogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICB5MFtqXSA9IChtYXggLSBzdW1zW2pdKSAvIDI7CiAgICB9CiAgICByZXR1cm4geTA7CiAgfSwKCiAgIndpZ2dsZSI6IGZ1bmN0aW9uKGRhdGEpIHsKICAgIHZhciBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgeCA9IGRhdGFbMF0sCiAgICAgICAgbSA9IHgubGVuZ3RoLAogICAgICAgIG1heCA9IDAsCiAgICAgICAgaSwKICAgICAgICBqLAogICAgICAgIGssCiAgICAgICAgczEsCiAgICAgICAgczIsCiAgICAgICAgczMsCiAgICAgICAgZHgsCiAgICAgICAgbywKICAgICAgICBvMCwKICAgICAgICB5MCA9IFtdOwogICAgeTBbMF0gPSBvID0gbzAgPSAwOwogICAgZm9yIChqID0gMTsgaiA8IG07ICsraikgewogICAgICBmb3IgKGkgPSAwLCBzMSA9IDA7IGkgPCBuOyArK2kpIHMxICs9IGRhdGFbaV1bal1bMV07CiAgICAgIGZvciAoaSA9IDAsIHMyID0gMCwgZHggPSB4W2pdWzBdIC0geFtqIC0gMV1bMF07IGkgPCBuOyArK2kpIHsKICAgICAgICBmb3IgKGsgPSAwLCBzMyA9IChkYXRhW2ldW2pdWzFdIC0gZGF0YVtpXVtqIC0gMV1bMV0pIC8gKDIgKiBkeCk7IGsgPCBpOyArK2spIHsKICAgICAgICAgIHMzICs9IChkYXRhW2tdW2pdWzFdIC0gZGF0YVtrXVtqIC0gMV1bMV0pIC8gZHg7CiAgICAgICAgfQogICAgICAgIHMyICs9IHMzICogZGF0YVtpXVtqXVsxXTsKICAgICAgfQogICAgICB5MFtqXSA9IG8gLT0gczEgPyBzMiAvIHMxICogZHggOiAwOwogICAgICBpZiAobyA8IG8wKSBvMCA9IG87CiAgICB9CiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB5MFtqXSAtPSBvMDsKICAgIHJldHVybiB5MDsKICB9LAoKICAiZXhwYW5kIjogZnVuY3Rpb24oZGF0YSkgewogICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICBtID0gZGF0YVswXS5sZW5ndGgsCiAgICAgICAgayA9IDEgLyBuLAogICAgICAgIGksCiAgICAgICAgaiwKICAgICAgICBvLAogICAgICAgIHkwID0gW107CiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbjsgaSsrKSBvICs9IGRhdGFbaV1bal1bMV07CiAgICAgIGlmIChvKSBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkYXRhW2ldW2pdWzFdIC89IG87CiAgICAgIGVsc2UgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZGF0YVtpXVtqXVsxXSA9IGs7CiAgICB9CiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB5MFtqXSA9IDA7CiAgICByZXR1cm4geTA7CiAgfSwKCiAgInplcm8iOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvCgp9KTsKCmZ1bmN0aW9uIGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdChkYXRhKSB7CiAgcmV0dXJuIGQzLnJhbmdlKGRhdGEubGVuZ3RoKTsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVybyhkYXRhKSB7CiAgdmFyIGogPSAtMSwKICAgICAgbSA9IGRhdGFbMF0ubGVuZ3RoLAogICAgICB5MCA9IFtdOwogIHdoaWxlICgrK2ogPCBtKSB5MFtqXSA9IDA7CiAgcmV0dXJuIHkwOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tNYXhJbmRleChhcnJheSkgewogIHZhciBpID0gMSwKICAgICAgaiA9IDAsCiAgICAgIHYgPSBhcnJheVswXVsxXSwKICAgICAgaywKICAgICAgbiA9IGFycmF5Lmxlbmd0aDsKICBmb3IgKDsgaSA8IG47ICsraSkgewogICAgaWYgKChrID0gYXJyYXlbaV1bMV0pID4gdikgewogICAgICBqID0gaTsKICAgICAgdiA9IGs7CiAgICB9CiAgfQogIHJldHVybiBqOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tSZWR1Y2VTdW0oZCkgewogIHJldHVybiBkLnJlZHVjZShkM19sYXlvdXRfc3RhY2tTdW0sIDApOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tTdW0ocCwgZCkgewogIHJldHVybiBwICsgZFsxXTsKfQpkMy5sYXlvdXQuaGlzdG9ncmFtID0gZnVuY3Rpb24oKSB7CiAgdmFyIGZyZXF1ZW5jeSA9IHRydWUsCiAgICAgIHZhbHVlciA9IE51bWJlciwKICAgICAgcmFuZ2VyID0gZDNfbGF5b3V0X2hpc3RvZ3JhbVJhbmdlLAogICAgICBiaW5uZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtQmluU3R1cmdlczsKCiAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEsIGkpIHsKICAgIHZhciBiaW5zID0gW10sCiAgICAgICAgdmFsdWVzID0gZGF0YS5tYXAodmFsdWVyLCB0aGlzKSwKICAgICAgICByYW5nZSA9IHJhbmdlci5jYWxsKHRoaXMsIHZhbHVlcywgaSksCiAgICAgICAgdGhyZXNob2xkcyA9IGJpbm5lci5jYWxsKHRoaXMsIHJhbmdlLCB2YWx1ZXMsIGkpLAogICAgICAgIGJpbiwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgbSA9IHRocmVzaG9sZHMubGVuZ3RoIC0gMSwKICAgICAgICBrID0gZnJlcXVlbmN5ID8gMSA6IDEgLyBuLAogICAgICAgIHg7CgogICAgLy8gSW5pdGlhbGl6ZSB0aGUgYmlucy4KICAgIHdoaWxlICgrK2kgPCBtKSB7CiAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTsKICAgICAgYmluLmR4ID0gdGhyZXNob2xkc1tpICsgMV0gLSAoYmluLnggPSB0aHJlc2hvbGRzW2ldKTsKICAgICAgYmluLnkgPSAwOwogICAgfQoKICAgIC8vIEZpbGwgdGhlIGJpbnMsIGlnbm9yaW5nIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZS4KICAgIGkgPSAtMTsgd2hpbGUoKytpIDwgbikgewogICAgICB4ID0gdmFsdWVzW2ldOwogICAgICBpZiAoKHggPj0gcmFuZ2VbMF0pICYmICh4IDw9IHJhbmdlWzFdKSkgewogICAgICAgIGJpbiA9IGJpbnNbZDMuYmlzZWN0KHRocmVzaG9sZHMsIHgsIDEsIG0pIC0gMV07CiAgICAgICAgYmluLnkgKz0gazsKICAgICAgICBiaW4ucHVzaChkYXRhW2ldKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBiaW5zOwogIH0KCiAgLy8gU3BlY2lmaWVzIGhvdyB0byBleHRyYWN0IGEgdmFsdWUgZnJvbSB0aGUgYXNzb2NpYXRlZCBkYXRhLiBUaGUgZGVmYXVsdAogIC8vIHZhbHVlIGZ1bmN0aW9uIGlzIGBOdW1iZXJgLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBpZGVudGl0eSBmdW5jdGlvbi4KICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZXI7CiAgICB2YWx1ZXIgPSB4OwogICAgcmV0dXJuIGhpc3RvZ3JhbTsKICB9OwoKICAvLyBTcGVjaWZpZXMgdGhlIHJhbmdlIG9mIHRoZSBoaXN0b2dyYW0uIFZhbHVlcyBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgcmFuZ2UKICAvLyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBhcmd1bWVudCBgeGAgbWF5IGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgYSB0d28tZWxlbWVudAogIC8vIGFycmF5IHJlcHJlc2VudGluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2UsIG9yIGFzIGEKICAvLyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJhbmdlIGdpdmVuIHRoZSBhcnJheSBvZiB2YWx1ZXMgYW5kIHRoZSBjdXJyZW50CiAgLy8gaW5kZXggYGlgLiBUaGUgZGVmYXVsdCByYW5nZSBpcyB0aGUgZXh0ZW50IChtaW5pbXVtIGFuZCBtYXhpbXVtKSBvZiB0aGUKICAvLyB2YWx1ZXMuCiAgaGlzdG9ncmFtLnJhbmdlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2VyOwogICAgcmFuZ2VyID0gZDMuZnVuY3Rvcih4KTsKICAgIHJldHVybiBoaXN0b2dyYW07CiAgfTsKCiAgLy8gU3BlY2lmaWVzIGhvdyB0byBiaW4gdmFsdWVzIGluIHRoZSBoaXN0b2dyYW0uIFRoZSBhcmd1bWVudCBgeGAgbWF5IGJlCiAgLy8gc3BlY2lmaWVkIGFzIGEgbnVtYmVyLCBpbiB3aGljaCBjYXNlIHRoZSByYW5nZSBvZiB2YWx1ZXMgd2lsbCBiZSBzcGxpdAogIC8vIHVuaWZvcm1seSBpbnRvIHRoZSBnaXZlbiBudW1iZXIgb2YgYmlucy4gT3IsIGB4YCBtYXkgYmUgYW4gYXJyYXkgb2YKICAvLyB0aHJlc2hvbGQgdmFsdWVzLCBkZWZpbmluZyB0aGUgYmluczsgdGhlIHNwZWNpZmllZCBhcnJheSBtdXN0IGNvbnRhaW4gdGhlCiAgLy8gcmlnaHRtb3N0ICh1cHBlcikgdmFsdWUsIHRodXMgc3BlY2lmeWluZyBuICsgMSB2YWx1ZXMgZm9yIG4gYmlucy4gT3IsIGB4YAogIC8vIG1heSBiZSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGV2YWx1YXRlZCwgYmVpbmcgcGFzc2VkIHRoZSByYW5nZSwgdGhlIGFycmF5IG9mCiAgLy8gdmFsdWVzLCBhbmQgdGhlIGN1cnJlbnQgaW5kZXggYGlgLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhyZXNob2xkcy4gVGhlCiAgLy8gZGVmYXVsdCBiaW4gZnVuY3Rpb24gd2lsbCBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHVuaWZvcm0gYmlucyB1c2luZwogIC8vIFN0dXJnZXMnIGZvcm11bGEuCiAgaGlzdG9ncmFtLmJpbnMgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBiaW5uZXI7CiAgICBiaW5uZXIgPSB0eXBlb2YgeCA9PT0gIm51bWJlciIKICAgICAgICA/IGZ1bmN0aW9uKHJhbmdlKSB7IHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIHgpOyB9CiAgICAgICAgOiBkMy5mdW5jdG9yKHgpOwogICAgcmV0dXJuIGhpc3RvZ3JhbTsKICB9OwoKICAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgaGlzdG9ncmFtJ3MgYHlgIHZhbHVlIGlzIGEgY291bnQgKGZyZXF1ZW5jeSkgb3IgYQogIC8vIHByb2JhYmlsaXR5IChkZW5zaXR5KS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KICBoaXN0b2dyYW0uZnJlcXVlbmN5ID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZnJlcXVlbmN5OwogICAgZnJlcXVlbmN5ID0gISF4OwogICAgcmV0dXJuIGhpc3RvZ3JhbTsKICB9OwoKICByZXR1cm4gaGlzdG9ncmFtOwp9OwoKZnVuY3Rpb24gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpblN0dXJnZXMocmFuZ2UsIHZhbHVlcykgewogIHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4yICsgMSkpOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIG4pIHsKICB2YXIgeCA9IC0xLAogICAgICBiID0gK3JhbmdlWzBdLAogICAgICBtID0gKHJhbmdlWzFdIC0gYikgLyBuLAogICAgICBmID0gW107CiAgd2hpbGUgKCsreCA8PSBuKSBmW3hdID0gbSAqIHggKyBiOwogIHJldHVybiBmOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfaGlzdG9ncmFtUmFuZ2UodmFsdWVzKSB7CiAgcmV0dXJuIFtkMy5taW4odmFsdWVzKSwgZDMubWF4KHZhbHVlcyldOwp9CmQzLmxheW91dC5oaWVyYXJjaHkgPSBmdW5jdGlvbigpIHsKICB2YXIgc29ydCA9IGQzX2xheW91dF9oaWVyYXJjaHlTb3J0LAogICAgICBjaGlsZHJlbiA9IGQzX2xheW91dF9oaWVyYXJjaHlDaGlsZHJlbiwKICAgICAgdmFsdWUgPSBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWU7CgogIC8vIFJlY3Vyc2l2ZWx5IGNvbXB1dGUgdGhlIG5vZGUgZGVwdGggYW5kIHZhbHVlLgogIC8vIEFsc28gY29udmVydHMgdGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaW50byBhIHN0YW5kYXJkIGhpZXJhcmNoeSBzdHJ1Y3R1cmUuCiAgZnVuY3Rpb24gcmVjdXJzZShkYXRhLCBkZXB0aCwgbm9kZXMpIHsKICAgIHZhciBjaGlsZHMgPSBjaGlsZHJlbi5jYWxsKGhpZXJhcmNoeSwgZGF0YSwgZGVwdGgpLAogICAgICAgIG5vZGUgPSBkM19sYXlvdXRfaGllcmFyY2h5SW5saW5lID8gZGF0YSA6IHtkYXRhOiBkYXRhfTsKICAgIG5vZGUuZGVwdGggPSBkZXB0aDsKICAgIG5vZGVzLnB1c2gobm9kZSk7CiAgICBpZiAoY2hpbGRzICYmIChuID0gY2hpbGRzLmxlbmd0aCkpIHsKICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgIG4sCiAgICAgICAgICBjID0gbm9kZS5jaGlsZHJlbiA9IFtdLAogICAgICAgICAgdiA9IDAsCiAgICAgICAgICBqID0gZGVwdGggKyAxOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGQgPSByZWN1cnNlKGNoaWxkc1tpXSwgaiwgbm9kZXMpOwogICAgICAgIGQucGFyZW50ID0gbm9kZTsKICAgICAgICBjLnB1c2goZCk7CiAgICAgICAgdiArPSBkLnZhbHVlOwogICAgICB9CiAgICAgIGlmIChzb3J0KSBjLnNvcnQoc29ydCk7CiAgICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9IHY7CiAgICB9IGVsc2UgaWYgKHZhbHVlKSB7CiAgICAgIG5vZGUudmFsdWUgPSArdmFsdWUuY2FsbChoaWVyYXJjaHksIGRhdGEsIGRlcHRoKSB8fCAwOwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQoKICAvLyBSZWN1cnNpdmVseSByZS1ldmFsdWF0ZXMgdGhlIG5vZGUgdmFsdWUuCiAgZnVuY3Rpb24gcmV2YWx1ZShub2RlLCBkZXB0aCkgewogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwKICAgICAgICB2ID0gMDsKICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgIG4sCiAgICAgICAgICBqID0gZGVwdGggKyAxOwogICAgICB3aGlsZSAoKytpIDwgbikgdiArPSByZXZhbHVlKGNoaWxkcmVuW2ldLCBqKTsKICAgIH0gZWxzZSBpZiAodmFsdWUpIHsKICAgICAgdiA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgZDNfbGF5b3V0X2hpZXJhcmNoeUlubGluZSA/IG5vZGUgOiBub2RlLmRhdGEsIGRlcHRoKSB8fCAwOwogICAgfQogICAgaWYgKHZhbHVlKSBub2RlLnZhbHVlID0gdjsKICAgIHJldHVybiB2OwogIH0KCiAgZnVuY3Rpb24gaGllcmFyY2h5KGQpIHsKICAgIHZhciBub2RlcyA9IFtdOwogICAgcmVjdXJzZShkLCAwLCBub2Rlcyk7CiAgICByZXR1cm4gbm9kZXM7CiAgfQoKICBoaWVyYXJjaHkuc29ydCA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7CiAgICBzb3J0ID0geDsKICAgIHJldHVybiBoaWVyYXJjaHk7CiAgfTsKCiAgaGllcmFyY2h5LmNoaWxkcmVuID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hpbGRyZW47CiAgICBjaGlsZHJlbiA9IHg7CiAgICByZXR1cm4gaGllcmFyY2h5OwogIH07CgogIGhpZXJhcmNoeS52YWx1ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlOwogICAgdmFsdWUgPSB4OwogICAgcmV0dXJuIGhpZXJhcmNoeTsKICB9OwoKICAvLyBSZS1ldmFsdWF0ZXMgdGhlIGB2YWx1ZWAgcHJvcGVydHkgZm9yIHRoZSBzcGVjaWZpZWQgaGllcmFyY2h5LgogIGhpZXJhcmNoeS5yZXZhbHVlID0gZnVuY3Rpb24ocm9vdCkgewogICAgcmV2YWx1ZShyb290LCAwKTsKICAgIHJldHVybiByb290OwogIH07CgogIHJldHVybiBoaWVyYXJjaHk7Cn07CgovLyBBIG1ldGhvZCBhc3NpZ25tZW50IGhlbHBlciBmb3IgaGllcmFyY2h5IHN1YmNsYXNzZXMuCmZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQob2JqZWN0LCBoaWVyYXJjaHkpIHsKICBkMy5yZWJpbmQob2JqZWN0LCBoaWVyYXJjaHksICJzb3J0IiwgImNoaWxkcmVuIiwgInZhbHVlIik7CgogIC8vIEFkZCBhbiBhbGlhcyBmb3IgbGlua3MsIGZvciBjb252ZW5pZW5jZS4KICBvYmplY3QubGlua3MgPSBkM19sYXlvdXRfaGllcmFyY2h5TGlua3M7CgogIC8vIElmIHRoZSBuZXcgQVBJIGlzIHVzZWQsIGVuYWJsaW5nIGlubGluaW5nLgogIG9iamVjdC5ub2RlcyA9IGZ1bmN0aW9uKGQpIHsKICAgIGQzX2xheW91dF9oaWVyYXJjaHlJbmxpbmUgPSB0cnVlOwogICAgcmV0dXJuIChvYmplY3Qubm9kZXMgPSBvYmplY3QpKGQpOwogIH07CgogIHJldHVybiBvYmplY3Q7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlDaGlsZHJlbihkKSB7CiAgcmV0dXJuIGQuY2hpbGRyZW47Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWYWx1ZShkKSB7CiAgcmV0dXJuIGQudmFsdWU7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlTb3J0KGEsIGIpIHsKICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7Cn0KCi8vIFJldHVybnMgYW4gYXJyYXkgc291cmNlK3RhcmdldCBvYmplY3RzIGZvciB0aGUgc3BlY2lmaWVkIG5vZGVzLgpmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5TGlua3Mobm9kZXMpIHsKICByZXR1cm4gZDMubWVyZ2Uobm9kZXMubWFwKGZ1bmN0aW9uKHBhcmVudCkgewogICAgcmV0dXJuIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLm1hcChmdW5jdGlvbihjaGlsZCkgewogICAgICByZXR1cm4ge3NvdXJjZTogcGFyZW50LCB0YXJnZXQ6IGNoaWxkfTsKICAgIH0pOwogIH0pKTsKfQoKLy8gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBkb24ndCBlbmFibGUgaW5saW5pbmcgYnkgZGVmYXVsdC4KdmFyIGQzX2xheW91dF9oaWVyYXJjaHlJbmxpbmUgPSBmYWxzZTsKZDMubGF5b3V0LnBhY2sgPSBmdW5jdGlvbigpIHsKICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQoZDNfbGF5b3V0X3BhY2tTb3J0KSwKICAgICAgc2l6ZSA9IFsxLCAxXTsKCiAgZnVuY3Rpb24gcGFjayhkLCBpKSB7CiAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwKICAgICAgICByb290ID0gbm9kZXNbMF07CgogICAgLy8gUmVjdXJzaXZlbHkgY29tcHV0ZSB0aGUgbGF5b3V0LgogICAgcm9vdC54ID0gMDsKICAgIHJvb3QueSA9IDA7CiAgICBkM19sYXlvdXRfcGFja1RyZWUocm9vdCk7CgogICAgLy8gU2NhbGUgdGhlIGxheW91dCB0byBmaXQgdGhlIHJlcXVlc3RlZCBzaXplLgogICAgdmFyIHcgPSBzaXplWzBdLAogICAgICAgIGggPSBzaXplWzFdLAogICAgICAgIGsgPSAxIC8gTWF0aC5tYXgoMiAqIHJvb3QuciAvIHcsIDIgKiByb290LnIgLyBoKTsKICAgIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKHJvb3QsIHcgLyAyLCBoIC8gMiwgayk7CgogICAgcmV0dXJuIG5vZGVzOwogIH0KCiAgcGFjay5zaXplID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsKICAgIHNpemUgPSB4OwogICAgcmV0dXJuIHBhY2s7CiAgfTsKCiAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFjaywgaGllcmFyY2h5KTsKfTsKCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrU29ydChhLCBiKSB7CiAgcmV0dXJuIGEudmFsdWUgLSBiLnZhbHVlOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfcGFja0luc2VydChhLCBiKSB7CiAgdmFyIGMgPSBhLl9wYWNrX25leHQ7CiAgYS5fcGFja19uZXh0ID0gYjsKICBiLl9wYWNrX3ByZXYgPSBhOwogIGIuX3BhY2tfbmV4dCA9IGM7CiAgYy5fcGFja19wcmV2ID0gYjsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSwgYikgewogIGEuX3BhY2tfbmV4dCA9IGI7CiAgYi5fcGFja19wcmV2ID0gYTsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGEsIGIpIHsKICB2YXIgZHggPSBiLnggLSBhLngsCiAgICAgIGR5ID0gYi55IC0gYS55LAogICAgICBkciA9IGEuciArIGIucjsKICByZXR1cm4gZHIgKiBkciAtIGR4ICogZHggLSBkeSAqIGR5ID4gLjAwMTsgLy8gd2l0aGluIGVwc2lsb24KfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tDaXJjbGUobm9kZXMpIHsKICB2YXIgeE1pbiA9IEluZmluaXR5LAogICAgICB4TWF4ID0gLUluZmluaXR5LAogICAgICB5TWluID0gSW5maW5pdHksCiAgICAgIHlNYXggPSAtSW5maW5pdHksCiAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgIGEsIGIsIGMsIGosIGs7CgogIGZ1bmN0aW9uIGJvdW5kKG5vZGUpIHsKICAgIHhNaW4gPSBNYXRoLm1pbihub2RlLnggLSBub2RlLnIsIHhNaW4pOwogICAgeE1heCA9IE1hdGgubWF4KG5vZGUueCArIG5vZGUuciwgeE1heCk7CiAgICB5TWluID0gTWF0aC5taW4obm9kZS55IC0gbm9kZS5yLCB5TWluKTsKICAgIHlNYXggPSBNYXRoLm1heChub2RlLnkgKyBub2RlLnIsIHlNYXgpOwogIH0KCiAgLy8gQ3JlYXRlIG5vZGUgbGlua3MuCiAgbm9kZXMuZm9yRWFjaChkM19sYXlvdXRfcGFja0xpbmspOwoKICAvLyBDcmVhdGUgZmlyc3Qgbm9kZS4KICBhID0gbm9kZXNbMF07CiAgYS54ID0gLWEucjsKICBhLnkgPSAwOwogIGJvdW5kKGEpOwoKICAvLyBDcmVhdGUgc2Vjb25kIG5vZGUuCiAgaWYgKG4gPiAxKSB7CiAgICBiID0gbm9kZXNbMV07CiAgICBiLnggPSBiLnI7CiAgICBiLnkgPSAwOwogICAgYm91bmQoYik7CgogICAgLy8gQ3JlYXRlIHRoaXJkIG5vZGUgYW5kIGJ1aWxkIGNoYWluLgogICAgaWYgKG4gPiAyKSB7CiAgICAgIGMgPSBub2Rlc1syXTsKICAgICAgZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjKTsKICAgICAgYm91bmQoYyk7CiAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpOwogICAgICBhLl9wYWNrX3ByZXYgPSBjOwogICAgICBkM19sYXlvdXRfcGFja0luc2VydChjLCBiKTsKICAgICAgYiA9IGEuX3BhY2tfbmV4dDsKCiAgICAgIC8vIE5vdyBpdGVyYXRlIHRocm91Z2ggdGhlIHJlc3QuCiAgICAgIGZvciAodmFyIGkgPSAzOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjID0gbm9kZXNbaV0pOwoKICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBjbG9zZXN0IGludGVyc2VjdGlvbi4KICAgICAgICB2YXIgaXNlY3QgPSAwLCBzMSA9IDEsIHMyID0gMTsKICAgICAgICBmb3IgKGogPSBiLl9wYWNrX25leHQ7IGogIT09IGI7IGogPSBqLl9wYWNrX25leHQsIHMxKyspIHsKICAgICAgICAgIGlmIChkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoaiwgYykpIHsKICAgICAgICAgICAgaXNlY3QgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzZWN0ID09IDEpIHsKICAgICAgICAgIGZvciAoayA9IGEuX3BhY2tfcHJldjsgayAhPT0gai5fcGFja19wcmV2OyBrID0gay5fcGFja19wcmV2LCBzMisrKSB7CiAgICAgICAgICAgIGlmIChkM19sYXlvdXRfcGFja0ludGVyc2VjdHMoaywgYykpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVXBkYXRlIG5vZGUgY2hhaW4uCiAgICAgICAgaWYgKGlzZWN0KSB7CiAgICAgICAgICBpZiAoczEgPCBzMiB8fCAoczEgPT0gczIgJiYgYi5yIDwgYS5yKSkgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSwgYiA9IGopOwogICAgICAgICAgZWxzZSBkM19sYXlvdXRfcGFja1NwbGljZShhID0gaywgYik7CiAgICAgICAgICBpLS07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpOwogICAgICAgICAgYiA9IGM7CiAgICAgICAgICBib3VuZChjKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlLWNlbnRlciB0aGUgY2lyY2xlcyBhbmQgcmV0dXJuIHRoZSBlbmNvbXBhc3NpbmcgcmFkaXVzLgogIHZhciBjeCA9ICh4TWluICsgeE1heCkgLyAyLAogICAgICBjeSA9ICh5TWluICsgeU1heCkgLyAyLAogICAgICBjciA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgIHZhciBub2RlID0gbm9kZXNbaV07CiAgICBub2RlLnggLT0gY3g7CiAgICBub2RlLnkgLT0gY3k7CiAgICBjciA9IE1hdGgubWF4KGNyLCBub2RlLnIgKyBNYXRoLnNxcnQobm9kZS54ICogbm9kZS54ICsgbm9kZS55ICogbm9kZS55KSk7CiAgfQoKICAvLyBSZW1vdmUgbm9kZSBsaW5rcy4KICBub2Rlcy5mb3JFYWNoKGQzX2xheW91dF9wYWNrVW5saW5rKTsKCiAgcmV0dXJuIGNyOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfcGFja0xpbmsobm9kZSkgewogIG5vZGUuX3BhY2tfbmV4dCA9IG5vZGUuX3BhY2tfcHJldiA9IG5vZGU7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVW5saW5rKG5vZGUpIHsKICBkZWxldGUgbm9kZS5fcGFja19uZXh0OwogIGRlbGV0ZSBub2RlLl9wYWNrX3ByZXY7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJlZShub2RlKSB7CiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICBjaGlsZHJlbi5mb3JFYWNoKGQzX2xheW91dF9wYWNrVHJlZSk7CiAgICBub2RlLnIgPSBkM19sYXlvdXRfcGFja0NpcmNsZShjaGlsZHJlbik7CiAgfSBlbHNlIHsKICAgIG5vZGUuciA9IE1hdGguc3FydChub2RlLnZhbHVlKTsKICB9Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKG5vZGUsIHgsIHksIGspIHsKICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogIG5vZGUueCA9ICh4ICs9IGsgKiBub2RlLngpOwogIG5vZGUueSA9ICh5ICs9IGsgKiBub2RlLnkpOwogIG5vZGUuciAqPSBrOwogIGlmIChjaGlsZHJlbikgewogICAgdmFyIGkgPSAtMSwgbiA9IGNoaWxkcmVuLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShjaGlsZHJlbltpXSwgeCwgeSwgayk7CiAgfQp9CgpmdW5jdGlvbiBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMpIHsKICB2YXIgZGIgPSBhLnIgKyBjLnIsCiAgICAgIGR4ID0gYi54IC0gYS54LAogICAgICBkeSA9IGIueSAtIGEueTsKICBpZiAoZGIgJiYgKGR4IHx8IGR5KSkgewogICAgdmFyIGRhID0gYi5yICsgYy5yLAogICAgICAgIGRjID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KSwKICAgICAgICBjb3MgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgKGRiICogZGIgKyBkYyAqIGRjIC0gZGEgKiBkYSkgLyAoMiAqIGRiICogZGMpKSksCiAgICAgICAgdGhldGEgPSBNYXRoLmFjb3MoY29zKSwKICAgICAgICB4ID0gY29zICogKGRiIC89IGRjKSwKICAgICAgICB5ID0gTWF0aC5zaW4odGhldGEpICogZGI7CiAgICBjLnggPSBhLnggKyB4ICogZHggKyB5ICogZHk7CiAgICBjLnkgPSBhLnkgKyB4ICogZHkgLSB5ICogZHg7CiAgfSBlbHNlIHsKICAgIGMueCA9IGEueCArIGRiOwogICAgYy55ID0gYS55OwogIH0KfQovLyBJbXBsZW1lbnRzIGEgaGllcmFyY2hpY2FsIGxheW91dCB1c2luZyB0aGUgY2x1c3RlciAob3IgZGVuZHJvZ3JhbSkKLy8gYWxnb3JpdGhtLgpkMy5sYXlvdXQuY2x1c3RlciA9IGZ1bmN0aW9uKCkgewogIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSwKICAgICAgc2VwYXJhdGlvbiA9IGQzX2xheW91dF90cmVlU2VwYXJhdGlvbiwKICAgICAgc2l6ZSA9IFsxLCAxXTsgLy8gd2lkdGgsIGhlaWdodAoKICBmdW5jdGlvbiBjbHVzdGVyKGQsIGkpIHsKICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLAogICAgICAgIHJvb3QgPSBub2Rlc1swXSwKICAgICAgICBwcmV2aW91c05vZGUsCiAgICAgICAgeCA9IDAsCiAgICAgICAga3gsCiAgICAgICAga3k7CgogICAgLy8gRmlyc3Qgd2FsaywgY29tcHV0aW5nIHRoZSBpbml0aWFsIHggJiB5IHZhbHVlcy4KICAgIGQzX2xheW91dF90cmVlVmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlKSB7CiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICBub2RlLnggPSBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pOwogICAgICAgIG5vZGUueSA9IGQzX2xheW91dF9jbHVzdGVyWShjaGlsZHJlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOwogICAgICAgIG5vZGUueSA9IDA7CiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsKICAgICAgfQogICAgfSk7CgogICAgLy8gQ29tcHV0ZSB0aGUgbGVmdC1tb3N0LCByaWdodC1tb3N0LCBhbmQgZGVwdGgtbW9zdCBub2RlcyBmb3IgZXh0ZW50cy4KICAgIHZhciBsZWZ0ID0gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KHJvb3QpLAogICAgICAgIHJpZ2h0ID0gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChyb290KSwKICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwKICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7CgogICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuCiAgICBkM19sYXlvdXRfdHJlZVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogc2l6ZVswXTsKICAgICAgbm9kZS55ID0gKDEgLSAocm9vdC55ID8gbm9kZS55IC8gcm9vdC55IDogMSkpICogc2l6ZVsxXTsKICAgIH0pOwoKICAgIHJldHVybiBub2RlczsKICB9CgogIGNsdXN0ZXIuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247CiAgICBzZXBhcmF0aW9uID0geDsKICAgIHJldHVybiBjbHVzdGVyOwogIH07CgogIGNsdXN0ZXIuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7CiAgICBzaXplID0geDsKICAgIHJldHVybiBjbHVzdGVyOwogIH07CgogIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKGNsdXN0ZXIsIGhpZXJhcmNoeSk7Cn07CgpmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pIHsKICByZXR1cm4gMSArIGQzLm1heChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsKICAgIHJldHVybiBjaGlsZC55OwogIH0pOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pIHsKICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uKHgsIGNoaWxkKSB7CiAgICByZXR1cm4geCArIGNoaWxkLng7CiAgfSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyTGVmdChub2RlKSB7CiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICByZXR1cm4gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID8gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KGNoaWxkcmVuWzBdKSA6IG5vZGU7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyUmlnaHQobm9kZSkgewogIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIG47CiAgcmV0dXJuIGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSA/IGQzX2xheW91dF9jbHVzdGVyUmlnaHQoY2hpbGRyZW5bbiAtIDFdKSA6IG5vZGU7Cn0KLy8gTm9kZS1saW5rIHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCAidGlkeSIgYWxnb3JpdGhtCmQzLmxheW91dC50cmVlID0gZnVuY3Rpb24oKSB7CiAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLAogICAgICBzZXBhcmF0aW9uID0gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uLAogICAgICBzaXplID0gWzEsIDFdOyAvLyB3aWR0aCwgaGVpZ2h0CgogIGZ1bmN0aW9uIHRyZWUoZCwgaSkgewogICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSksCiAgICAgICAgcm9vdCA9IG5vZGVzWzBdOwoKICAgIGZ1bmN0aW9uIGZpcnN0V2Fsayhub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsKICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwKICAgICAgICAgIGxheW91dCA9IG5vZGUuX3RyZWU7CiAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKICAgICAgICB2YXIgbiwKICAgICAgICAgICAgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdLAogICAgICAgICAgICBwcmV2aW91c0NoaWxkLAogICAgICAgICAgICBhbmNlc3RvciA9IGZpcnN0Q2hpbGQsCiAgICAgICAgICAgIGNoaWxkLAogICAgICAgICAgICBpID0gLTE7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICBmaXJzdFdhbGsoY2hpbGQsIHByZXZpb3VzQ2hpbGQpOwogICAgICAgICAgYW5jZXN0b3IgPSBhcHBvcnRpb24oY2hpbGQsIHByZXZpb3VzQ2hpbGQsIGFuY2VzdG9yKTsKICAgICAgICAgIHByZXZpb3VzQ2hpbGQgPSBjaGlsZDsKICAgICAgICB9CiAgICAgICAgZDNfbGF5b3V0X3RyZWVTaGlmdChub2RlKTsKICAgICAgICB2YXIgbWlkcG9pbnQgPSAuNSAqIChmaXJzdENoaWxkLl90cmVlLnByZWxpbSArIGNoaWxkLl90cmVlLnByZWxpbSk7CiAgICAgICAgaWYgKHByZXZpb3VzU2libGluZykgewogICAgICAgICAgbGF5b3V0LnByZWxpbSA9IHByZXZpb3VzU2libGluZy5fdHJlZS5wcmVsaW0gKyBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzU2libGluZyk7CiAgICAgICAgICBsYXlvdXQubW9kID0gbGF5b3V0LnByZWxpbSAtIG1pZHBvaW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsYXlvdXQucHJlbGltID0gbWlkcG9pbnQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICAgIGxheW91dC5wcmVsaW0gPSBwcmV2aW91c1NpYmxpbmcuX3RyZWUucHJlbGltICsgc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNlY29uZFdhbGsobm9kZSwgeCkgewogICAgICBub2RlLnggPSBub2RlLl90cmVlLnByZWxpbSArIHg7CiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgICBuOwogICAgICAgIHggKz0gbm9kZS5fdHJlZS5tb2Q7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIHNlY29uZFdhbGsoY2hpbGRyZW5baV0sIHgpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcG9ydGlvbihub2RlLCBwcmV2aW91c1NpYmxpbmcsIGFuY2VzdG9yKSB7CiAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcpIHsKICAgICAgICB2YXIgdmlwID0gbm9kZSwKICAgICAgICAgICAgdm9wID0gbm9kZSwKICAgICAgICAgICAgdmltID0gcHJldmlvdXNTaWJsaW5nLAogICAgICAgICAgICB2b20gPSBub2RlLnBhcmVudC5jaGlsZHJlblswXSwKICAgICAgICAgICAgc2lwID0gdmlwLl90cmVlLm1vZCwKICAgICAgICAgICAgc29wID0gdm9wLl90cmVlLm1vZCwKICAgICAgICAgICAgc2ltID0gdmltLl90cmVlLm1vZCwKICAgICAgICAgICAgc29tID0gdm9tLl90cmVlLm1vZCwKICAgICAgICAgICAgc2hpZnQ7CiAgICAgICAgd2hpbGUgKHZpbSA9IGQzX2xheW91dF90cmVlUmlnaHQodmltKSwgdmlwID0gZDNfbGF5b3V0X3RyZWVMZWZ0KHZpcCksIHZpbSAmJiB2aXApIHsKICAgICAgICAgIHZvbSA9IGQzX2xheW91dF90cmVlTGVmdCh2b20pOwogICAgICAgICAgdm9wID0gZDNfbGF5b3V0X3RyZWVSaWdodCh2b3ApOwogICAgICAgICAgdm9wLl90cmVlLmFuY2VzdG9yID0gbm9kZTsKICAgICAgICAgIHNoaWZ0ID0gdmltLl90cmVlLnByZWxpbSArIHNpbSAtIHZpcC5fdHJlZS5wcmVsaW0gLSBzaXAgKyBzZXBhcmF0aW9uKHZpbSwgdmlwKTsKICAgICAgICAgIGlmIChzaGlmdCA+IDApIHsKICAgICAgICAgICAgZDNfbGF5b3V0X3RyZWVNb3ZlKGQzX2xheW91dF90cmVlQW5jZXN0b3IodmltLCBub2RlLCBhbmNlc3RvciksIG5vZGUsIHNoaWZ0KTsKICAgICAgICAgICAgc2lwICs9IHNoaWZ0OwogICAgICAgICAgICBzb3AgKz0gc2hpZnQ7CiAgICAgICAgICB9CiAgICAgICAgICBzaW0gKz0gdmltLl90cmVlLm1vZDsKICAgICAgICAgIHNpcCArPSB2aXAuX3RyZWUubW9kOwogICAgICAgICAgc29tICs9IHZvbS5fdHJlZS5tb2Q7CiAgICAgICAgICBzb3AgKz0gdm9wLl90cmVlLm1vZDsKICAgICAgICB9CiAgICAgICAgaWYgKHZpbSAmJiAhZDNfbGF5b3V0X3RyZWVSaWdodCh2b3ApKSB7CiAgICAgICAgICB2b3AuX3RyZWUudGhyZWFkID0gdmltOwogICAgICAgICAgdm9wLl90cmVlLm1vZCArPSBzaW0gLSBzb3A7CiAgICAgICAgfQogICAgICAgIGlmICh2aXAgJiYgIWQzX2xheW91dF90cmVlTGVmdCh2b20pKSB7CiAgICAgICAgICB2b20uX3RyZWUudGhyZWFkID0gdmlwOwogICAgICAgICAgdm9tLl90cmVlLm1vZCArPSBzaXAgLSBzb207CiAgICAgICAgICBhbmNlc3RvciA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhbmNlc3RvcjsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIHRlbXBvcmFyeSBsYXlvdXQgdmFyaWFibGVzLgogICAgZDNfbGF5b3V0X3RyZWVWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUsIHByZXZpb3VzU2libGluZykgewogICAgICBub2RlLl90cmVlID0gewogICAgICAgIGFuY2VzdG9yOiBub2RlLAogICAgICAgIHByZWxpbTogMCwKICAgICAgICBtb2Q6IDAsCiAgICAgICAgY2hhbmdlOiAwLAogICAgICAgIHNoaWZ0OiAwLAogICAgICAgIG51bWJlcjogcHJldmlvdXNTaWJsaW5nID8gcHJldmlvdXNTaWJsaW5nLl90cmVlLm51bWJlciArIDEgOiAwCiAgICAgIH07CiAgICB9KTsKCiAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwuJ3MgYWxnb3JpdGhtLgogICAgZmlyc3RXYWxrKHJvb3QpOwogICAgc2Vjb25kV2Fsayhyb290LCAtcm9vdC5fdHJlZS5wcmVsaW0pOwoKICAgIC8vIENvbXB1dGUgdGhlIGxlZnQtbW9zdCwgcmlnaHQtbW9zdCwgYW5kIGRlcHRoLW1vc3Qgbm9kZXMgZm9yIGV4dGVudHMuCiAgICB2YXIgbGVmdCA9IGQzX2xheW91dF90cmVlU2VhcmNoKHJvb3QsIGQzX2xheW91dF90cmVlTGVmdG1vc3QpLAogICAgICAgIHJpZ2h0ID0gZDNfbGF5b3V0X3RyZWVTZWFyY2gocm9vdCwgZDNfbGF5b3V0X3RyZWVSaWdodG1vc3QpLAogICAgICAgIGRlZXAgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChyb290LCBkM19sYXlvdXRfdHJlZURlZXBlc3QpLAogICAgICAgIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLAogICAgICAgIHgxID0gcmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMiwKICAgICAgICB5MSA9IGRlZXAuZGVwdGggfHwgMTsKCiAgICAvLyBDbGVhciB0ZW1wb3JhcnkgbGF5b3V0IHZhcmlhYmxlczsgdHJhbnNmb3JtIHggYW5kIHkuCiAgICBkM19sYXlvdXRfdHJlZVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogc2l6ZVswXTsKICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAvIHkxICogc2l6ZVsxXTsKICAgICAgZGVsZXRlIG5vZGUuX3RyZWU7CiAgICB9KTsKCiAgICByZXR1cm4gbm9kZXM7CiAgfQoKICB0cmVlLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uOwogICAgc2VwYXJhdGlvbiA9IHg7CiAgICByZXR1cm4gdHJlZTsKICB9OwoKICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplOwogICAgc2l6ZSA9IHg7CiAgICByZXR1cm4gdHJlZTsKICB9OwoKICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZCh0cmVlLCBoaWVyYXJjaHkpOwp9OwoKZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uKGEsIGIpIHsKICByZXR1cm4gYS5wYXJlbnQgPT0gYi5wYXJlbnQgPyAxIDogMjsKfQoKLy8gZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uUmFkaWFsKGEsIGIpIHsKLy8gICByZXR1cm4gKGEucGFyZW50ID09IGIucGFyZW50ID8gMSA6IDIpIC8gYS5kZXB0aDsKLy8gfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0KG5vZGUpIHsKICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlblswXSA6IG5vZGUuX3RyZWUudGhyZWFkOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVJpZ2h0KG5vZGUpIHsKICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLAogICAgICBuOwogIHJldHVybiBjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBjaGlsZHJlbltuIC0gMV0gOiBub2RlLl90cmVlLnRocmVhZDsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVTZWFyY2gobm9kZSwgY29tcGFyZSkgewogIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkgewogICAgdmFyIGNoaWxkLAogICAgICAgIG4sCiAgICAgICAgaSA9IC0xOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaWYgKGNvbXBhcmUoY2hpbGQgPSBkM19sYXlvdXRfdHJlZVNlYXJjaChjaGlsZHJlbltpXSwgY29tcGFyZSksIG5vZGUpID4gMCkgewogICAgICAgIG5vZGUgPSBjaGlsZDsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gbm9kZTsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVSaWdodG1vc3QoYSwgYikgewogIHJldHVybiBhLnggLSBiLng7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlTGVmdG1vc3QoYSwgYikgewogIHJldHVybiBiLnggLSBhLng7Cn0KCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlRGVlcGVzdChhLCBiKSB7CiAgcmV0dXJuIGEuZGVwdGggLSBiLmRlcHRoOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVZpc2l0QWZ0ZXIobm9kZSwgY2FsbGJhY2spIHsKICBmdW5jdGlvbiB2aXNpdChub2RlLCBwcmV2aW91c1NpYmxpbmcpIHsKICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7CiAgICAgIHZhciBjaGlsZCwKICAgICAgICAgIHByZXZpb3VzQ2hpbGQgPSBudWxsLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgbjsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgIHZpc2l0KGNoaWxkLCBwcmV2aW91c0NoaWxkKTsKICAgICAgICBwcmV2aW91c0NoaWxkID0gY2hpbGQ7CiAgICAgIH0KICAgIH0KICAgIGNhbGxiYWNrKG5vZGUsIHByZXZpb3VzU2libGluZyk7CiAgfQogIHZpc2l0KG5vZGUsIG51bGwpOwp9CgpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNoaWZ0KG5vZGUpIHsKICB2YXIgc2hpZnQgPSAwLAogICAgICBjaGFuZ2UgPSAwLAogICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sCiAgICAgIGkgPSBjaGlsZHJlbi5sZW5ndGgsCiAgICAgIGNoaWxkOwogIHdoaWxlICgtLWkgPj0gMCkgewogICAgY2hpbGQgPSBjaGlsZHJlbltpXS5fdHJlZTsKICAgIGNoaWxkLnByZWxpbSArPSBzaGlmdDsKICAgIGNoaWxkLm1vZCArPSBzaGlmdDsKICAgIHNoaWZ0ICs9IGNoaWxkLnNoaWZ0ICsgKGNoYW5nZSArPSBjaGlsZC5jaGFuZ2UpOwogIH0KfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVNb3ZlKGFuY2VzdG9yLCBub2RlLCBzaGlmdCkgewogIGFuY2VzdG9yID0gYW5jZXN0b3IuX3RyZWU7CiAgbm9kZSA9IG5vZGUuX3RyZWU7CiAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKG5vZGUubnVtYmVyIC0gYW5jZXN0b3IubnVtYmVyKTsKICBhbmNlc3Rvci5jaGFuZ2UgKz0gY2hhbmdlOwogIG5vZGUuY2hhbmdlIC09IGNoYW5nZTsKICBub2RlLnNoaWZ0ICs9IHNoaWZ0OwogIG5vZGUucHJlbGltICs9IHNoaWZ0OwogIG5vZGUubW9kICs9IHNoaWZ0Owp9CgpmdW5jdGlvbiBkM19sYXlvdXRfdHJlZUFuY2VzdG9yKHZpbSwgbm9kZSwgYW5jZXN0b3IpIHsKICByZXR1cm4gdmltLl90cmVlLmFuY2VzdG9yLnBhcmVudCA9PSBub2RlLnBhcmVudAogICAgICA/IHZpbS5fdHJlZS5hbmNlc3RvcgogICAgICA6IGFuY2VzdG9yOwp9Ci8vIFNxdWFyaWZpZWQgVHJlZW1hcHMgYnkgTWFyayBCcnVscywgS2VlcyBIdWl6aW5nLCBhbmQgSmFya2UgSi4gdmFuIFdpamsKLy8gTW9kaWZpZWQgdG8gc3VwcG9ydCBhIHRhcmdldCBhc3BlY3QgcmF0aW8gYnkgSmVmZiBIZWVyCmQzLmxheW91dC50cmVlbWFwID0gZnVuY3Rpb24oKSB7CiAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKSwKICAgICAgcm91bmQgPSBNYXRoLnJvdW5kLAogICAgICBzaXplID0gWzEsIDFdLCAvLyB3aWR0aCwgaGVpZ2h0CiAgICAgIHBhZGRpbmcgPSBudWxsLAogICAgICBwYWQgPSBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwsCiAgICAgIHN0aWNreSA9IGZhbHNlLAogICAgICBzdGlja2llcywKICAgICAgcmF0aW8gPSAwLjUgKiAoMSArIE1hdGguc3FydCg1KSk7IC8vIGdvbGRlbiByYXRpbwoKICAvLyBDb21wdXRlIHRoZSBhcmVhIGZvciBlYWNoIGNoaWxkIGJhc2VkIG9uIHZhbHVlICYgc2NhbGUuCiAgZnVuY3Rpb24gc2NhbGUoY2hpbGRyZW4sIGspIHsKICAgIHZhciBpID0gLTEsCiAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCwKICAgICAgICBjaGlsZCwKICAgICAgICBhcmVhOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgYXJlYSA9IChjaGlsZCA9IGNoaWxkcmVuW2ldKS52YWx1ZSAqIChrIDwgMCA/IDAgOiBrKTsKICAgICAgY2hpbGQuYXJlYSA9IGlzTmFOKGFyZWEpIHx8IGFyZWEgPD0gMCA/IDAgOiBhcmVhOwogICAgfQogIH0KCiAgLy8gUmVjdXJzaXZlbHkgYXJyYW5nZXMgdGhlIHNwZWNpZmllZCBub2RlJ3MgY2hpbGRyZW4gaW50byBzcXVhcmlmaWVkIHJvd3MuCiAgZnVuY3Rpb24gc3F1YXJpZnkobm9kZSkgewogICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksCiAgICAgICAgICByb3cgPSBbXSwKICAgICAgICAgIHJlbWFpbmluZyA9IGNoaWxkcmVuLnNsaWNlKCksIC8vIGNvcHktb24td3JpdGUKICAgICAgICAgIGNoaWxkLAogICAgICAgICAgYmVzdCA9IEluZmluaXR5LCAvLyB0aGUgYmVzdCByb3cgc2NvcmUgc28gZmFyCiAgICAgICAgICBzY29yZSwgLy8gdGhlIGN1cnJlbnQgcm93IHNjb3JlCiAgICAgICAgICB1ID0gTWF0aC5taW4ocmVjdC5keCwgcmVjdC5keSksIC8vIGluaXRpYWwgb3JpZW50YXRpb24KICAgICAgICAgIG47CiAgICAgIHNjYWxlKHJlbWFpbmluZywgcmVjdC5keCAqIHJlY3QuZHkgLyBub2RlLnZhbHVlKTsKICAgICAgcm93LmFyZWEgPSAwOwogICAgICB3aGlsZSAoKG4gPSByZW1haW5pbmcubGVuZ3RoKSA+IDApIHsKICAgICAgICByb3cucHVzaChjaGlsZCA9IHJlbWFpbmluZ1tuIC0gMV0pOwogICAgICAgIHJvdy5hcmVhICs9IGNoaWxkLmFyZWE7CiAgICAgICAgaWYgKChzY29yZSA9IHdvcnN0KHJvdywgdSkpIDw9IGJlc3QpIHsgLy8gY29udGludWUgd2l0aCB0aGlzIG9yaWVudGF0aW9uCiAgICAgICAgICByZW1haW5pbmcucG9wKCk7CiAgICAgICAgICBiZXN0ID0gc2NvcmU7CiAgICAgICAgfSBlbHNlIHsgLy8gYWJvcnQsIGFuZCB0cnkgYSBkaWZmZXJlbnQgb3JpZW50YXRpb24KICAgICAgICAgIHJvdy5hcmVhIC09IHJvdy5wb3AoKS5hcmVhOwogICAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCBmYWxzZSk7CiAgICAgICAgICB1ID0gTWF0aC5taW4ocmVjdC5keCwgcmVjdC5keSk7CiAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwOwogICAgICAgICAgYmVzdCA9IEluZmluaXR5OwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocm93Lmxlbmd0aCkgewogICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgdHJ1ZSk7CiAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDsKICAgICAgfQogICAgICBjaGlsZHJlbi5mb3JFYWNoKHNxdWFyaWZ5KTsKICAgIH0KICB9CgogIC8vIFJlY3Vyc2l2ZWx5IHJlc2l6ZXMgdGhlIHNwZWNpZmllZCBub2RlJ3MgY2hpbGRyZW4gaW50byBleGlzdGluZyByb3dzLgogIC8vIFByZXNlcnZlcyB0aGUgZXhpc3RpbmcgbGF5b3V0IQogIGZ1bmN0aW9uIHN0aWNraWZ5KG5vZGUpIHsKICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgIHZhciByZWN0ID0gcGFkKG5vZGUpLAogICAgICAgICAgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgLy8gY29weS1vbi13cml0ZQogICAgICAgICAgY2hpbGQsCiAgICAgICAgICByb3cgPSBbXTsKICAgICAgc2NhbGUocmVtYWluaW5nLCByZWN0LmR4ICogcmVjdC5keSAvIG5vZGUudmFsdWUpOwogICAgICByb3cuYXJlYSA9IDA7CiAgICAgIHdoaWxlIChjaGlsZCA9IHJlbWFpbmluZy5wb3AoKSkgewogICAgICAgIHJvdy5wdXNoKGNoaWxkKTsKICAgICAgICByb3cuYXJlYSArPSBjaGlsZC5hcmVhOwogICAgICAgIGlmIChjaGlsZC56ICE9IG51bGwpIHsKICAgICAgICAgIHBvc2l0aW9uKHJvdywgY2hpbGQueiA/IHJlY3QuZHggOiByZWN0LmR5LCByZWN0LCAhcmVtYWluaW5nLmxlbmd0aCk7CiAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGlsZHJlbi5mb3JFYWNoKHN0aWNraWZ5KTsKICAgIH0KICB9CgogIC8vIENvbXB1dGVzIHRoZSBzY29yZSBmb3IgdGhlIHNwZWNpZmllZCByb3csIGFzIHRoZSB3b3JzdCBhc3BlY3QgcmF0aW8uCiAgZnVuY3Rpb24gd29yc3Qocm93LCB1KSB7CiAgICB2YXIgcyA9IHJvdy5hcmVhLAogICAgICAgIHIsCiAgICAgICAgcm1heCA9IDAsCiAgICAgICAgcm1pbiA9IEluZmluaXR5LAogICAgICAgIGkgPSAtMSwKICAgICAgICBuID0gcm93Lmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghKHIgPSByb3dbaV0uYXJlYSkpIGNvbnRpbnVlOwogICAgICBpZiAociA8IHJtaW4pIHJtaW4gPSByOwogICAgICBpZiAociA+IHJtYXgpIHJtYXggPSByOwogICAgfQogICAgcyAqPSBzOwogICAgdSAqPSB1OwogICAgcmV0dXJuIHMKICAgICAgICA/IE1hdGgubWF4KCh1ICogcm1heCAqIHJhdGlvKSAvIHMsIHMgLyAodSAqIHJtaW4gKiByYXRpbykpCiAgICAgICAgOiBJbmZpbml0eTsKICB9CgogIC8vIFBvc2l0aW9ucyB0aGUgc3BlY2lmaWVkIHJvdyBvZiBub2Rlcy4gTW9kaWZpZXMgYHJlY3RgLgogIGZ1bmN0aW9uIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmx1c2gpIHsKICAgIHZhciBpID0gLTEsCiAgICAgICAgbiA9IHJvdy5sZW5ndGgsCiAgICAgICAgeCA9IHJlY3QueCwKICAgICAgICB5ID0gcmVjdC55LAogICAgICAgIHYgPSB1ID8gcm91bmQocm93LmFyZWEgLyB1KSA6IDAsCiAgICAgICAgbzsKICAgIGlmICh1ID09IHJlY3QuZHgpIHsgLy8gaG9yaXpvbnRhbCBzdWJkaXZpc2lvbgogICAgICBpZiAoZmx1c2ggfHwgdiA+IHJlY3QuZHkpIHYgPSByZWN0LmR5OyAvLyBvdmVyK3VuZGVyZmxvdwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIG8gPSByb3dbaV07CiAgICAgICAgby54ID0geDsKICAgICAgICBvLnkgPSB5OwogICAgICAgIG8uZHkgPSB2OwogICAgICAgIHggKz0gby5keCA9IE1hdGgubWluKHJlY3QueCArIHJlY3QuZHggLSB4LCB2ID8gcm91bmQoby5hcmVhIC8gdikgOiAwKTsKICAgICAgfQogICAgICBvLnogPSB0cnVlOwogICAgICBvLmR4ICs9IHJlY3QueCArIHJlY3QuZHggLSB4OyAvLyByb3VuZGluZyBlcnJvcgogICAgICByZWN0LnkgKz0gdjsKICAgICAgcmVjdC5keSAtPSB2OwogICAgfSBlbHNlIHsgLy8gdmVydGljYWwgc3ViZGl2aXNpb24KICAgICAgaWYgKGZsdXNoIHx8IHYgPiByZWN0LmR4KSB2ID0gcmVjdC5keDsgLy8gb3Zlcit1bmRlcmZsb3cKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBvID0gcm93W2ldOwogICAgICAgIG8ueCA9IHg7CiAgICAgICAgby55ID0geTsKICAgICAgICBvLmR4ID0gdjsKICAgICAgICB5ICs9IG8uZHkgPSBNYXRoLm1pbihyZWN0LnkgKyByZWN0LmR5IC0geSwgdiA/IHJvdW5kKG8uYXJlYSAvIHYpIDogMCk7CiAgICAgIH0KICAgICAgby56ID0gZmFsc2U7CiAgICAgIG8uZHkgKz0gcmVjdC55ICsgcmVjdC5keSAtIHk7IC8vIHJvdW5kaW5nIGVycm9yCiAgICAgIHJlY3QueCArPSB2OwogICAgICByZWN0LmR4IC09IHY7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0cmVlbWFwKGQpIHsKICAgIHZhciBub2RlcyA9IHN0aWNraWVzIHx8IGhpZXJhcmNoeShkKSwKICAgICAgICByb290ID0gbm9kZXNbMF07CiAgICByb290LnggPSAwOwogICAgcm9vdC55ID0gMDsKICAgIHJvb3QuZHggPSBzaXplWzBdOwogICAgcm9vdC5keSA9IHNpemVbMV07CiAgICBpZiAoc3RpY2tpZXMpIGhpZXJhcmNoeS5yZXZhbHVlKHJvb3QpOwogICAgc2NhbGUoW3Jvb3RdLCByb290LmR4ICogcm9vdC5keSAvIHJvb3QudmFsdWUpOwogICAgKHN0aWNraWVzID8gc3RpY2tpZnkgOiBzcXVhcmlmeSkocm9vdCk7CiAgICBpZiAoc3RpY2t5KSBzdGlja2llcyA9IG5vZGVzOwogICAgcmV0dXJuIG5vZGVzOwogIH0KCiAgdHJlZW1hcC5zaXplID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTsKICAgIHNpemUgPSB4OwogICAgcmV0dXJuIHRyZWVtYXA7CiAgfTsKCiAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZzsKCiAgICBmdW5jdGlvbiBwYWRGdW5jdGlvbihub2RlKSB7CiAgICAgIHZhciBwID0geC5jYWxsKHRyZWVtYXAsIG5vZGUsIG5vZGUuZGVwdGgpOwogICAgICByZXR1cm4gcCA9PSBudWxsCiAgICAgICAgICA/IGQzX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKQogICAgICAgICAgOiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB0eXBlb2YgcCA9PT0gIm51bWJlciIgPyBbcCwgcCwgcCwgcF0gOiBwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYWRDb25zdGFudChub2RlKSB7CiAgICAgIHJldHVybiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB4KTsKICAgIH0KCiAgICB2YXIgdHlwZTsKICAgIHBhZCA9IChwYWRkaW5nID0geCkgPT0gbnVsbCA/IGQzX2xheW91dF90cmVlbWFwUGFkTnVsbAogICAgICAgIDogKHR5cGUgPSB0eXBlb2YgeCkgPT09ICJmdW5jdGlvbiIgPyBwYWRGdW5jdGlvbgogICAgICAgIDogdHlwZSA9PT0gIm51bWJlciIgPyAoeCA9IFt4LCB4LCB4LCB4XSwgcGFkQ29uc3RhbnQpCiAgICAgICAgOiBwYWRDb25zdGFudDsKICAgIHJldHVybiB0cmVlbWFwOwogIH07CgogIHRyZWVtYXAucm91bmQgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb3VuZCAhPSBOdW1iZXI7CiAgICByb3VuZCA9IHggPyBNYXRoLnJvdW5kIDogTnVtYmVyOwogICAgcmV0dXJuIHRyZWVtYXA7CiAgfTsKCiAgdHJlZW1hcC5zdGlja3kgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGlja3k7CiAgICBzdGlja3kgPSB4OwogICAgc3RpY2tpZXMgPSBudWxsOwogICAgcmV0dXJuIHRyZWVtYXA7CiAgfTsKCiAgdHJlZW1hcC5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhdGlvOwogICAgcmF0aW8gPSB4OwogICAgcmV0dXJuIHRyZWVtYXA7CiAgfTsKCiAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZW1hcCwgaGllcmFyY2h5KTsKfTsKCmZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKSB7CiAgcmV0dXJuIHt4OiBub2RlLngsIHk6IG5vZGUueSwgZHg6IG5vZGUuZHgsIGR5OiBub2RlLmR5fTsKfQoKZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVtYXBQYWQobm9kZSwgcGFkZGluZykgewogIHZhciB4ID0gbm9kZS54ICsgcGFkZGluZ1szXSwKICAgICAgeSA9IG5vZGUueSArIHBhZGRpbmdbMF0sCiAgICAgIGR4ID0gbm9kZS5keCAtIHBhZGRpbmdbMV0gLSBwYWRkaW5nWzNdLAogICAgICBkeSA9IG5vZGUuZHkgLSBwYWRkaW5nWzBdIC0gcGFkZGluZ1syXTsKICBpZiAoZHggPCAwKSB7IHggKz0gZHggLyAyOyBkeCA9IDA7IH0KICBpZiAoZHkgPCAwKSB7IHkgKz0gZHkgLyAyOyBkeSA9IDA7IH0KICByZXR1cm4ge3g6IHgsIHk6IHksIGR4OiBkeCwgZHk6IGR5fTsKfQpkMy5jc3YgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgZDMudGV4dCh1cmwsICJ0ZXh0L2NzdiIsIGZ1bmN0aW9uKHRleHQpIHsKICAgIGNhbGxiYWNrKHRleHQgJiYgZDMuY3N2LnBhcnNlKHRleHQpKTsKICB9KTsKfTsKZDMuY3N2LnBhcnNlID0gZnVuY3Rpb24odGV4dCkgewogIHZhciBoZWFkZXI7CiAgcmV0dXJuIGQzLmNzdi5wYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7CiAgICBpZiAoaSkgewogICAgICB2YXIgbyA9IHt9LCBqID0gLTEsIG0gPSBoZWFkZXIubGVuZ3RoOwogICAgICB3aGlsZSAoKytqIDwgbSkgb1toZWFkZXJbal1dID0gcm93W2pdOwogICAgICByZXR1cm4gbzsKICAgIH0gZWxzZSB7CiAgICAgIGhlYWRlciA9IHJvdzsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfSk7Cn07CgpkMy5jc3YucGFyc2VSb3dzID0gZnVuY3Rpb24odGV4dCwgZikgewogIHZhciBFT0wgPSB7fSwgLy8gc2VudGluZWwgdmFsdWUgZm9yIGVuZC1vZi1saW5lCiAgICAgIEVPRiA9IHt9LCAvLyBzZW50aW5lbCB2YWx1ZSBmb3IgZW5kLW9mLWZpbGUKICAgICAgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93cwogICAgICByZSA9IC9cclxufFssXHJcbl0vZywgLy8gZmllbGQgc2VwYXJhdG9yIHJlZ2V4CiAgICAgIG4gPSAwLCAvLyB0aGUgY3VycmVudCBsaW5lIG51bWJlcgogICAgICB0LCAvLyB0aGUgY3VycmVudCB0b2tlbgogICAgICBlb2w7IC8vIGlzIHRoZSBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD8KCiAgcmUubGFzdEluZGV4ID0gMDsgLy8gd29yay1hcm91bmQgYnVnIGluIEZGIDMuNgoKICAvKiogQHByaXZhdGUgUmV0dXJucyB0aGUgbmV4dCB0b2tlbi4gKi8KICBmdW5jdGlvbiB0b2tlbigpIHsKICAgIGlmIChyZS5sYXN0SW5kZXggPj0gdGV4dC5sZW5ndGgpIHJldHVybiBFT0Y7IC8vIHNwZWNpYWwgY2FzZTogZW5kIG9mIGZpbGUKICAgIGlmIChlb2wpIHsgZW9sID0gZmFsc2U7IHJldHVybiBFT0w7IH0gLy8gc3BlY2lhbCBjYXNlOiBlbmQgb2YgbGluZQoKICAgIC8vIHNwZWNpYWwgY2FzZTogcXVvdGVzCiAgICB2YXIgaiA9IHJlLmxhc3RJbmRleDsKICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IDM0KSB7CiAgICAgIHZhciBpID0gajsKICAgICAgd2hpbGUgKGkrKyA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMzQpIHsKICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSArIDEpICE9PSAzNCkgYnJlYWs7CiAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlLmxhc3RJbmRleCA9IGkgKyAyOwogICAgICB2YXIgYyA9IHRleHQuY2hhckNvZGVBdChpICsgMSk7CiAgICAgIGlmIChjID09PSAxMykgewogICAgICAgIGVvbCA9IHRydWU7CiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpICsgMikgPT09IDEwKSByZS5sYXN0SW5kZXgrKzsKICAgICAgfSBlbHNlIGlmIChjID09PSAxMCkgewogICAgICAgIGVvbCA9IHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGogKyAxLCBpKS5yZXBsYWNlKC8iIi9nLCAiXCIiKTsKICAgIH0KCiAgICAvLyBjb21tb24gY2FzZQogICAgdmFyIG0gPSByZS5leGVjKHRleHQpOwogICAgaWYgKG0pIHsKICAgICAgZW9sID0gbVswXS5jaGFyQ29kZUF0KDApICE9PSA0NDsKICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGosIG0uaW5kZXgpOwogICAgfQogICAgcmUubGFzdEluZGV4ID0gdGV4dC5sZW5ndGg7CiAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoaik7CiAgfQoKICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7CiAgICB2YXIgYSA9IFtdOwogICAgd2hpbGUgKCh0ICE9PSBFT0wpICYmICh0ICE9PSBFT0YpKSB7CiAgICAgIGEucHVzaCh0KTsKICAgICAgdCA9IHRva2VuKCk7CiAgICB9CiAgICBpZiAoZiAmJiAhKGEgPSBmKGEsIG4rKykpKSBjb250aW51ZTsKICAgIHJvd3MucHVzaChhKTsKICB9CgogIHJldHVybiByb3dzOwp9OwpkMy5jc3YuZm9ybWF0ID0gZnVuY3Rpb24ocm93cykgewogIHJldHVybiByb3dzLm1hcChkM19jc3ZfZm9ybWF0Um93KS5qb2luKCJcbiIpOwp9OwoKZnVuY3Rpb24gZDNfY3N2X2Zvcm1hdFJvdyhyb3cpIHsKICByZXR1cm4gcm93Lm1hcChkM19jc3ZfZm9ybWF0VmFsdWUpLmpvaW4oIiwiKTsKfQoKZnVuY3Rpb24gZDNfY3N2X2Zvcm1hdFZhbHVlKHRleHQpIHsKICByZXR1cm4gL1siLFxuXS8udGVzdCh0ZXh0KQogICAgICA/ICJcIiIgKyB0ZXh0LnJlcGxhY2UoL1wiL2csICJcIlwiIikgKyAiXCIiCiAgICAgIDogdGV4dDsKfQpkMy5nZW8gPSB7fTsKCnZhciBkM19nZW9fcmFkaWFucyA9IE1hdGguUEkgLyAxODA7Ci8vIFRPRE8gY2xpcCBpbnB1dCBjb29yZGluYXRlcyBvbiBvcHBvc2l0ZSBoZW1pc3BoZXJlCmQzLmdlby5hemltdXRoYWwgPSBmdW5jdGlvbigpIHsKICB2YXIgbW9kZSA9ICJvcnRob2dyYXBoaWMiLCAvLyBvciBzdGVyZW9ncmFwaGljLCBnbm9tb25pYywgZXF1aWRpc3RhbnQgb3IgZXF1YWxhcmVhCiAgICAgIG9yaWdpbiwKICAgICAgc2NhbGUgPSAyMDAsCiAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF0sCiAgICAgIHgwLAogICAgICB5MCwKICAgICAgY3kwLAogICAgICBzeTA7CgogIGZ1bmN0aW9uIGF6aW11dGhhbChjb29yZGluYXRlcykgewogICAgdmFyIHgxID0gY29vcmRpbmF0ZXNbMF0gKiBkM19nZW9fcmFkaWFucyAtIHgwLAogICAgICAgIHkxID0gY29vcmRpbmF0ZXNbMV0gKiBkM19nZW9fcmFkaWFucywKICAgICAgICBjeDEgPSBNYXRoLmNvcyh4MSksCiAgICAgICAgc3gxID0gTWF0aC5zaW4oeDEpLAogICAgICAgIGN5MSA9IE1hdGguY29zKHkxKSwKICAgICAgICBzeTEgPSBNYXRoLnNpbih5MSksCiAgICAgICAgY2MgPSBtb2RlICE9PSAib3J0aG9ncmFwaGljIiA/IHN5MCAqIHN5MSArIGN5MCAqIGN5MSAqIGN4MSA6IG51bGwsCiAgICAgICAgYywKICAgICAgICBrID0gbW9kZSA9PT0gInN0ZXJlb2dyYXBoaWMiID8gMSAvICgxICsgY2MpCiAgICAgICAgICA6IG1vZGUgPT09ICJnbm9tb25pYyIgPyAxIC8gY2MKICAgICAgICAgIDogbW9kZSA9PT0gImVxdWlkaXN0YW50IiA/IChjID0gTWF0aC5hY29zKGNjKSwgYyA/IGMgLyBNYXRoLnNpbihjKSA6IDApCiAgICAgICAgICA6IG1vZGUgPT09ICJlcXVhbGFyZWEiID8gTWF0aC5zcXJ0KDIgLyAoMSArIGNjKSkKICAgICAgICAgIDogMSwKICAgICAgICB4ID0gayAqIGN5MSAqIHN4MSwKICAgICAgICB5ID0gayAqIChzeTAgKiBjeTEgKiBjeDEgLSBjeTAgKiBzeTEpOwogICAgcmV0dXJuIFsKICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLAogICAgICBzY2FsZSAqIHkgKyB0cmFuc2xhdGVbMV0KICAgIF07CiAgfQoKICBhemltdXRoYWwuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsKICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLAogICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGUsCiAgICAgICAgcCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KSwKICAgICAgICBjID0gbW9kZSA9PT0gInN0ZXJlb2dyYXBoaWMiID8gMiAqIE1hdGguYXRhbihwKQogICAgICAgICAgOiBtb2RlID09PSAiZ25vbW9uaWMiID8gTWF0aC5hdGFuKHApCiAgICAgICAgICA6IG1vZGUgPT09ICJlcXVpZGlzdGFudCIgPyBwCiAgICAgICAgICA6IG1vZGUgPT09ICJlcXVhbGFyZWEiID8gMiAqIE1hdGguYXNpbiguNSAqIHApCiAgICAgICAgICA6IE1hdGguYXNpbihwKSwKICAgICAgICBzYyA9IE1hdGguc2luKGMpLAogICAgICAgIGNjID0gTWF0aC5jb3MoYyk7CiAgICByZXR1cm4gWwogICAgICAoeDAgKyBNYXRoLmF0YW4yKHggKiBzYywgcCAqIGN5MCAqIGNjICsgeSAqIHN5MCAqIHNjKSkgLyBkM19nZW9fcmFkaWFucywKICAgICAgTWF0aC5hc2luKGNjICogc3kwIC0gKHAgPyAoeSAqIHNjICogY3kwKSAvIHAgOiAwKSkgLyBkM19nZW9fcmFkaWFucwogICAgXTsKICB9OwoKICBhemltdXRoYWwubW9kZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1vZGU7CiAgICBtb2RlID0geCArICIiOwogICAgcmV0dXJuIGF6aW11dGhhbDsKICB9OwoKICBhemltdXRoYWwub3JpZ2luID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luOwogICAgb3JpZ2luID0geDsKICAgIHgwID0gb3JpZ2luWzBdICogZDNfZ2VvX3JhZGlhbnM7CiAgICB5MCA9IG9yaWdpblsxXSAqIGQzX2dlb19yYWRpYW5zOwogICAgY3kwID0gTWF0aC5jb3MoeTApOwogICAgc3kwID0gTWF0aC5zaW4oeTApOwogICAgcmV0dXJuIGF6aW11dGhhbDsKICB9OwoKICBhemltdXRoYWwuc2NhbGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKICAgIHNjYWxlID0gK3g7CiAgICByZXR1cm4gYXppbXV0aGFsOwogIH07CgogIGF6aW11dGhhbC50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7CiAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsKICAgIHJldHVybiBhemltdXRoYWw7CiAgfTsKCiAgcmV0dXJuIGF6aW11dGhhbC5vcmlnaW4oWzAsIDBdKTsKfTsKLy8gRGVyaXZlZCBmcm9tIFRvbSBDYXJkZW4ncyBBbGJlcnMgaW1wbGVtZW50YXRpb24gZm9yIFByb3RvdmlzLgovLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzQ3NjIzOAovLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0FsYmVyc0VxdWFsLUFyZWFDb25pY1Byb2plY3Rpb24uaHRtbAoKZDMuZ2VvLmFsYmVycyA9IGZ1bmN0aW9uKCkgewogIHZhciBvcmlnaW4gPSBbLTk4LCAzOF0sCiAgICAgIHBhcmFsbGVscyA9IFsyOS41LCA0NS41XSwKICAgICAgc2NhbGUgPSAxMDAwLAogICAgICB0cmFuc2xhdGUgPSBbNDgwLCAyNTBdLAogICAgICBsbmcwLCAvLyBkM19nZW9fcmFkaWFucyAqIG9yaWdpblswXQogICAgICBuLAogICAgICBDLAogICAgICBwMDsKCiAgZnVuY3Rpb24gYWxiZXJzKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgdCA9IG4gKiAoZDNfZ2VvX3JhZGlhbnMgKiBjb29yZGluYXRlc1swXSAtIGxuZzApLAogICAgICAgIHAgPSBNYXRoLnNxcnQoQyAtIDIgKiBuICogTWF0aC5zaW4oZDNfZ2VvX3JhZGlhbnMgKiBjb29yZGluYXRlc1sxXSkpIC8gbjsKICAgIHJldHVybiBbCiAgICAgIHNjYWxlICogcCAqIE1hdGguc2luKHQpICsgdHJhbnNsYXRlWzBdLAogICAgICBzY2FsZSAqIChwICogTWF0aC5jb3ModCkgLSBwMCkgKyB0cmFuc2xhdGVbMV0KICAgIF07CiAgfQoKICBhbGJlcnMuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHsKICAgIHZhciB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdHJhbnNsYXRlWzBdKSAvIHNjYWxlLAogICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0cmFuc2xhdGVbMV0pIC8gc2NhbGUsCiAgICAgICAgcDB5ID0gcDAgKyB5LAogICAgICAgIHQgPSBNYXRoLmF0YW4yKHgsIHAweSksCiAgICAgICAgcCA9IE1hdGguc3FydCh4ICogeCArIHAweSAqIHAweSk7CiAgICByZXR1cm4gWwogICAgICAobG5nMCArIHQgLyBuKSAvIGQzX2dlb19yYWRpYW5zLAogICAgICBNYXRoLmFzaW4oKEMgLSBwICogcCAqIG4gKiBuKSAvICgyICogbikpIC8gZDNfZ2VvX3JhZGlhbnMKICAgIF07CiAgfTsKCiAgZnVuY3Rpb24gcmVsb2FkKCkgewogICAgdmFyIHBoaTEgPSBkM19nZW9fcmFkaWFucyAqIHBhcmFsbGVsc1swXSwKICAgICAgICBwaGkyID0gZDNfZ2VvX3JhZGlhbnMgKiBwYXJhbGxlbHNbMV0sCiAgICAgICAgbGF0MCA9IGQzX2dlb19yYWRpYW5zICogb3JpZ2luWzFdLAogICAgICAgIHMgPSBNYXRoLnNpbihwaGkxKSwKICAgICAgICBjID0gTWF0aC5jb3MocGhpMSk7CiAgICBsbmcwID0gZDNfZ2VvX3JhZGlhbnMgKiBvcmlnaW5bMF07CiAgICBuID0gLjUgKiAocyArIE1hdGguc2luKHBoaTIpKTsKICAgIEMgPSBjICogYyArIDIgKiBuICogczsKICAgIHAwID0gTWF0aC5zcXJ0KEMgLSAyICogbiAqIE1hdGguc2luKGxhdDApKSAvIG47CiAgICByZXR1cm4gYWxiZXJzOwogIH0KCiAgYWxiZXJzLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjsKICAgIG9yaWdpbiA9IFsreFswXSwgK3hbMV1dOwogICAgcmV0dXJuIHJlbG9hZCgpOwogIH07CgogIGFsYmVycy5wYXJhbGxlbHMgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYXJhbGxlbHM7CiAgICBwYXJhbGxlbHMgPSBbK3hbMF0sICt4WzFdXTsKICAgIHJldHVybiByZWxvYWQoKTsKICB9OwoKICBhbGJlcnMuc2NhbGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKICAgIHNjYWxlID0gK3g7CiAgICByZXR1cm4gYWxiZXJzOwogIH07CgogIGFsYmVycy50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7CiAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsKICAgIHJldHVybiBhbGJlcnM7CiAgfTsKCiAgcmV0dXJuIHJlbG9hZCgpOwp9OwoKLy8gQSBjb21wb3NpdGUgcHJvamVjdGlvbiBmb3IgdGhlIFVuaXRlZCBTdGF0ZXMsIDk2MHg1MDAuIFRoZSBzZXQgb2Ygc3RhbmRhcmQKLy8gcGFyYWxsZWxzIGZvciBlYWNoIHJlZ2lvbiBjb21lcyBmcm9tIFVTR1MsIHdoaWNoIGlzIHB1Ymxpc2hlZCBoZXJlOgovLyBodHRwOi8vZWdzYy51c2dzLmdvdi9pc2IvcHVicy9NYXBQcm9qZWN0aW9ucy9wcm9qZWN0aW9ucy5odG1sI2FsYmVycwovLyBUT0RPIGFsbG93IHRoZSBjb21wb3NpdGUgcHJvamVjdGlvbiB0byBiZSByZXNjYWxlZD8KZDMuZ2VvLmFsYmVyc1VzYSA9IGZ1bmN0aW9uKCkgewogIHZhciBsb3dlcjQ4ID0gZDMuZ2VvLmFsYmVycygpOwoKICB2YXIgYWxhc2thID0gZDMuZ2VvLmFsYmVycygpCiAgICAgIC5vcmlnaW4oWy0xNjAsIDYwXSkKICAgICAgLnBhcmFsbGVscyhbNTUsIDY1XSk7CgogIHZhciBoYXdhaWkgPSBkMy5nZW8uYWxiZXJzKCkKICAgICAgLm9yaWdpbihbLTE2MCwgMjBdKQogICAgICAucGFyYWxsZWxzKFs4LCAxOF0pOwoKICB2YXIgcHVlcnRvUmljbyA9IGQzLmdlby5hbGJlcnMoKQogICAgICAub3JpZ2luKFstNjAsIDEwXSkKICAgICAgLnBhcmFsbGVscyhbOCwgMThdKTsKCiAgZnVuY3Rpb24gYWxiZXJzVXNhKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgbG9uID0gY29vcmRpbmF0ZXNbMF0sCiAgICAgICAgbGF0ID0gY29vcmRpbmF0ZXNbMV07CiAgICByZXR1cm4gKGxhdCA+IDUwID8gYWxhc2thCiAgICAgICAgOiBsb24gPCAtMTQwID8gaGF3YWlpCiAgICAgICAgOiBsYXQgPCAyMSA/IHB1ZXJ0b1JpY28KICAgICAgICA6IGxvd2VyNDgpKGNvb3JkaW5hdGVzKTsKICB9CgogIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDguc2NhbGUoKTsKICAgIGxvd2VyNDguc2NhbGUoeCk7CiAgICBhbGFza2Euc2NhbGUoeCAqIC42KTsKICAgIGhhd2FpaS5zY2FsZSh4KTsKICAgIHB1ZXJ0b1JpY28uc2NhbGUoeCAqIDEuNSk7CiAgICByZXR1cm4gYWxiZXJzVXNhLnRyYW5zbGF0ZShsb3dlcjQ4LnRyYW5zbGF0ZSgpKTsKICB9OwoKICBhbGJlcnNVc2EudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTsKICAgIHZhciBkeiA9IGxvd2VyNDguc2NhbGUoKSAvIDEwMDAsCiAgICAgICAgZHggPSB4WzBdLAogICAgICAgIGR5ID0geFsxXTsKICAgIGxvd2VyNDgudHJhbnNsYXRlKHgpOwogICAgYWxhc2thLnRyYW5zbGF0ZShbZHggLSA0MDAgKiBkeiwgZHkgKyAxNzAgKiBkel0pOwogICAgaGF3YWlpLnRyYW5zbGF0ZShbZHggLSAxOTAgKiBkeiwgZHkgKyAyMDAgKiBkel0pOwogICAgcHVlcnRvUmljby50cmFuc2xhdGUoW2R4ICsgNTgwICogZHosIGR5ICsgNDMwICogZHpdKTsKICAgIHJldHVybiBhbGJlcnNVc2E7CiAgfTsKCiAgcmV0dXJuIGFsYmVyc1VzYS5zY2FsZShsb3dlcjQ4LnNjYWxlKCkpOwp9OwpkMy5nZW8uYm9ubmUgPSBmdW5jdGlvbigpIHsKICB2YXIgc2NhbGUgPSAyMDAsCiAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF0sCiAgICAgIHgwLCAvLyBvcmlnaW4gbG9uZ2l0dWRlIGluIHJhZGlhbnMKICAgICAgeTAsIC8vIG9yaWdpbiBsYXRpdHVkZSBpbiByYWRpYW5zCiAgICAgIHkxLCAvLyBwYXJhbGxlbCBsYXRpdHVkZSBpbiByYWRpYW5zCiAgICAgIGMxOyAvLyBjb3QoeTEpCgogIGZ1bmN0aW9uIGJvbm5lKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgeCA9IGNvb3JkaW5hdGVzWzBdICogZDNfZ2VvX3JhZGlhbnMgLSB4MCwKICAgICAgICB5ID0gY29vcmRpbmF0ZXNbMV0gKiBkM19nZW9fcmFkaWFucyAtIHkwOwogICAgaWYgKHkxKSB7CiAgICAgIHZhciBwID0gYzEgKyB5MSAtIHksIEUgPSB4ICogTWF0aC5jb3MoeSkgLyBwOwogICAgICB4ID0gcCAqIE1hdGguc2luKEUpOwogICAgICB5ID0gcCAqIE1hdGguY29zKEUpIC0gYzE7CiAgICB9IGVsc2UgewogICAgICB4ICo9IE1hdGguY29zKHkpOwogICAgICB5ICo9IC0xOwogICAgfQogICAgcmV0dXJuIFsKICAgICAgc2NhbGUgKiB4ICsgdHJhbnNsYXRlWzBdLAogICAgICBzY2FsZSAqIHkgKyB0cmFuc2xhdGVbMV0KICAgIF07CiAgfQoKICBib25uZS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgdmFyIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGUsCiAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsKICAgIGlmICh5MSkgewogICAgICB2YXIgYyA9IGMxICsgeSwgcCA9IE1hdGguc3FydCh4ICogeCArIGMgKiBjKTsKICAgICAgeSA9IGMxICsgeTEgLSBwOwogICAgICB4ID0geDAgKyBwICogTWF0aC5hdGFuMih4LCBjKSAvIE1hdGguY29zKHkpOwogICAgfSBlbHNlIHsKICAgICAgeSAqPSAtMTsKICAgICAgeCAvPSBNYXRoLmNvcyh5KTsKICAgIH0KICAgIHJldHVybiBbCiAgICAgIHggLyBkM19nZW9fcmFkaWFucywKICAgICAgeSAvIGQzX2dlb19yYWRpYW5zCiAgICBdOwogIH07CgogIC8vIDkwwrAgZm9yIFdlcm5lciwgMMKwIGZvciBTaW51c29pZGFsCiAgYm9ubmUucGFyYWxsZWwgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MSAvIGQzX2dlb19yYWRpYW5zOwogICAgYzEgPSAxIC8gTWF0aC50YW4oeTEgPSB4ICogZDNfZ2VvX3JhZGlhbnMpOwogICAgcmV0dXJuIGJvbm5lOwogIH07CgogIGJvbm5lLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFt4MCAvIGQzX2dlb19yYWRpYW5zLCB5MCAvIGQzX2dlb19yYWRpYW5zXTsKICAgIHgwID0geFswXSAqIGQzX2dlb19yYWRpYW5zOwogICAgeTAgPSB4WzFdICogZDNfZ2VvX3JhZGlhbnM7CiAgICByZXR1cm4gYm9ubmU7CiAgfTsKCiAgYm9ubmUuc2NhbGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTsKICAgIHNjYWxlID0gK3g7CiAgICByZXR1cm4gYm9ubmU7CiAgfTsKCiAgYm9ubmUudHJhbnNsYXRlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdHJhbnNsYXRlOwogICAgdHJhbnNsYXRlID0gWyt4WzBdLCAreFsxXV07CiAgICByZXR1cm4gYm9ubmU7CiAgfTsKCiAgcmV0dXJuIGJvbm5lLm9yaWdpbihbMCwgMF0pLnBhcmFsbGVsKDQ1KTsKfTsKZDMuZ2VvLmVxdWlyZWN0YW5ndWxhciA9IGZ1bmN0aW9uKCkgewogIHZhciBzY2FsZSA9IDUwMCwKICAgICAgdHJhbnNsYXRlID0gWzQ4MCwgMjUwXTsKCiAgZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgeCA9IGNvb3JkaW5hdGVzWzBdIC8gMzYwLAogICAgICAgIHkgPSAtY29vcmRpbmF0ZXNbMV0gLyAzNjA7CiAgICByZXR1cm4gWwogICAgICBzY2FsZSAqIHggKyB0cmFuc2xhdGVbMF0sCiAgICAgIHNjYWxlICogeSArIHRyYW5zbGF0ZVsxXQogICAgXTsKICB9CgogIGVxdWlyZWN0YW5ndWxhci5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgdmFyIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGUsCiAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsKICAgIHJldHVybiBbCiAgICAgIDM2MCAqIHgsCiAgICAgIC0zNjAgKiB5CiAgICBdOwogIH07CgogIGVxdWlyZWN0YW5ndWxhci5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOwogICAgc2NhbGUgPSAreDsKICAgIHJldHVybiBlcXVpcmVjdGFuZ3VsYXI7CiAgfTsKCiAgZXF1aXJlY3Rhbmd1bGFyLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRyYW5zbGF0ZTsKICAgIHRyYW5zbGF0ZSA9IFsreFswXSwgK3hbMV1dOwogICAgcmV0dXJuIGVxdWlyZWN0YW5ndWxhcjsKICB9OwoKICByZXR1cm4gZXF1aXJlY3Rhbmd1bGFyOwp9OwpkMy5nZW8ubWVyY2F0b3IgPSBmdW5jdGlvbigpIHsKICB2YXIgc2NhbGUgPSA1MDAsCiAgICAgIHRyYW5zbGF0ZSA9IFs0ODAsIDI1MF07CgogIGZ1bmN0aW9uIG1lcmNhdG9yKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgeCA9IGNvb3JkaW5hdGVzWzBdIC8gMzYwLAogICAgICAgIHkgPSAtKE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgY29vcmRpbmF0ZXNbMV0gKiBkM19nZW9fcmFkaWFucyAvIDIpKSAvIGQzX2dlb19yYWRpYW5zKSAvIDM2MDsKICAgIHJldHVybiBbCiAgICAgIHNjYWxlICogeCArIHRyYW5zbGF0ZVswXSwKICAgICAgc2NhbGUgKiBNYXRoLm1heCgtLjUsIE1hdGgubWluKC41LCB5KSkgKyB0cmFuc2xhdGVbMV0KICAgIF07CiAgfQoKICBtZXJjYXRvci5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgdmFyIHggPSAoY29vcmRpbmF0ZXNbMF0gLSB0cmFuc2xhdGVbMF0pIC8gc2NhbGUsCiAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRyYW5zbGF0ZVsxXSkgLyBzY2FsZTsKICAgIHJldHVybiBbCiAgICAgIDM2MCAqIHgsCiAgICAgIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoLTM2MCAqIHkgKiBkM19nZW9fcmFkaWFucykpIC8gZDNfZ2VvX3JhZGlhbnMgLSA5MAogICAgXTsKICB9OwoKICBtZXJjYXRvci5zY2FsZSA9IGZ1bmN0aW9uKHgpIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlOwogICAgc2NhbGUgPSAreDsKICAgIHJldHVybiBtZXJjYXRvcjsKICB9OwoKICBtZXJjYXRvci50cmFuc2xhdGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0cmFuc2xhdGU7CiAgICB0cmFuc2xhdGUgPSBbK3hbMF0sICt4WzFdXTsKICAgIHJldHVybiBtZXJjYXRvcjsKICB9OwoKICByZXR1cm4gbWVyY2F0b3I7Cn07CmZ1bmN0aW9uIGQzX2dlb190eXBlKHR5cGVzLCBkZWZhdWx0VmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICByZXR1cm4gb2JqZWN0ICYmIHR5cGVzLmhhc093blByb3BlcnR5KG9iamVjdC50eXBlKSA/IHR5cGVzW29iamVjdC50eXBlXShvYmplY3QpIDogZGVmYXVsdFZhbHVlOwogIH07Cn0KLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIEdlb0pTT04gb2JqZWN0IChlLmcuLCBhIGZlYXR1cmUpLCByZXR1cm5zCiAqIHRoZSBjb3JyZXNwb25kaW5nIFNWRyBwYXRoLiBUaGUgZnVuY3Rpb24gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZyB0aGUKICogcHJvamVjdGlvbi4gUG9pbnQgZmVhdHVyZXMgYXJlIG1hcHBlZCB0byBjaXJjbGVzIHdpdGggYSBkZWZhdWx0IHJhZGl1cyBvZgogKiA0LjVweDsgdGhlIHJhZGl1cyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGNvbnN0YW50IG9yIGEgZnVuY3Rpb24gdGhhdAogKiBpcyBldmFsdWF0ZWQgcGVyIG9iamVjdC4KICovCmQzLmdlby5wYXRoID0gZnVuY3Rpb24oKSB7CiAgdmFyIHBvaW50UmFkaXVzID0gNC41LAogICAgICBwb2ludENpcmNsZSA9IGQzX3BhdGhfY2lyY2xlKHBvaW50UmFkaXVzKSwKICAgICAgcHJvamVjdGlvbiA9IGQzLmdlby5hbGJlcnNVc2EoKTsKCiAgZnVuY3Rpb24gcGF0aChkLCBpKSB7CiAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHBvaW50Q2lyY2xlID0gZDNfcGF0aF9jaXJjbGUocG9pbnRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICB9CiAgICByZXR1cm4gcGF0aFR5cGUoZCkgfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9uIHByb2plY3QoY29vcmRpbmF0ZXMpIHsKICAgIHJldHVybiBwcm9qZWN0aW9uKGNvb3JkaW5hdGVzKS5qb2luKCIsIik7CiAgfQoKICB2YXIgcGF0aFR5cGUgPSBkM19nZW9fdHlwZSh7CgogICAgRmVhdHVyZUNvbGxlY3Rpb246IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIHBhdGggPSBbXSwKICAgICAgICAgIGZlYXR1cmVzID0gby5mZWF0dXJlcywKICAgICAgICAgIGkgPSAtMSwgLy8gZmVhdHVyZXMuaW5kZXgKICAgICAgICAgIG4gPSBmZWF0dXJlcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2gocGF0aFR5cGUoZmVhdHVyZXNbaV0uZ2VvbWV0cnkpKTsKICAgICAgcmV0dXJuIHBhdGguam9pbigiIik7CiAgICB9LAoKICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgcmV0dXJuIHBhdGhUeXBlKG8uZ2VvbWV0cnkpOwogICAgfSwKCiAgICBQb2ludDogZnVuY3Rpb24obykgewogICAgICByZXR1cm4gIk0iICsgcHJvamVjdChvLmNvb3JkaW5hdGVzKSArIHBvaW50Q2lyY2xlOwogICAgfSwKCiAgICBNdWx0aVBvaW50OiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBwYXRoID0gW10sCiAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsCiAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzLmluZGV4CiAgICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKCJNIiwgcHJvamVjdChjb29yZGluYXRlc1tpXSksIHBvaW50Q2lyY2xlKTsKICAgICAgcmV0dXJuIHBhdGguam9pbigiIik7CiAgICB9LAoKICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIHBhdGggPSBbIk0iXSwKICAgICAgICAgIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcywKICAgICAgICAgIGkgPSAtMSwgLy8gY29vcmRpbmF0ZXMuaW5kZXgKICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2gocHJvamVjdChjb29yZGluYXRlc1tpXSksICJMIik7CiAgICAgIHBhdGgucG9wKCk7CiAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogICAgfSwKCiAgICBNdWx0aUxpbmVTdHJpbmc6IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIHBhdGggPSBbXSwKICAgICAgICAgIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcywKICAgICAgICAgIGkgPSAtMSwgLy8gY29vcmRpbmF0ZXMuaW5kZXgKICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsCiAgICAgICAgICBzdWJjb29yZGluYXRlcywgLy8gY29vcmRpbmF0ZXNbaV0KICAgICAgICAgIGosIC8vIHN1YmNvb3JkaW5hdGVzLmluZGV4CiAgICAgICAgICBtOyAvLyBzdWJjb29yZGluYXRlcy5sZW5ndGgKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBzdWJjb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzW2ldOwogICAgICAgIGogPSAtMTsKICAgICAgICBtID0gc3ViY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIHBhdGgucHVzaCgiTSIpOwogICAgICAgIHdoaWxlICgrK2ogPCBtKSBwYXRoLnB1c2gocHJvamVjdChzdWJjb29yZGluYXRlc1tqXSksICJMIik7CiAgICAgICAgcGF0aC5wb3AoKTsKICAgICAgfQogICAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKICAgIH0sCgogICAgUG9seWdvbjogZnVuY3Rpb24obykgewogICAgICB2YXIgcGF0aCA9IFtdLAogICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLAogICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcy5pbmRleAogICAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwKICAgICAgICAgIHN1YmNvb3JkaW5hdGVzLCAvLyBjb29yZGluYXRlc1tpXQogICAgICAgICAgaiwgLy8gc3ViY29vcmRpbmF0ZXMuaW5kZXgKICAgICAgICAgIG07IC8vIHN1YmNvb3JkaW5hdGVzLmxlbmd0aAogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHN1YmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbaV07CiAgICAgICAgaiA9IC0xOwogICAgICAgIGlmICgobSA9IHN1YmNvb3JkaW5hdGVzLmxlbmd0aCAtIDEpID4gMCkgewogICAgICAgICAgcGF0aC5wdXNoKCJNIik7CiAgICAgICAgICB3aGlsZSAoKytqIDwgbSkgcGF0aC5wdXNoKHByb2plY3Qoc3ViY29vcmRpbmF0ZXNbal0pLCAiTCIpOwogICAgICAgICAgcGF0aFtwYXRoLmxlbmd0aCAtIDFdID0gIloiOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcGF0aC5qb2luKCIiKTsKICAgIH0sCgogICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBwYXRoID0gW10sCiAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsCiAgICAgICAgICBpID0gLTEsIC8vIGNvb3JkaW5hdGVzIGluZGV4CiAgICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLAogICAgICAgICAgc3ViY29vcmRpbmF0ZXMsIC8vIGNvb3JkaW5hdGVzW2ldCiAgICAgICAgICBqLCAvLyBzdWJjb29yZGluYXRlcyBpbmRleAogICAgICAgICAgbSwgLy8gc3ViY29vcmRpbmF0ZXMubGVuZ3RoCiAgICAgICAgICBzdWJzdWJjb29yZGluYXRlcywgLy8gc3ViY29vcmRpbmF0ZXNbal0KICAgICAgICAgIGssIC8vIHN1YnN1YmNvb3JkaW5hdGVzIGluZGV4CiAgICAgICAgICBwOyAvLyBzdWJzdWJjb29yZGluYXRlcy5sZW5ndGgKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBzdWJjb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzW2ldOwogICAgICAgIGogPSAtMTsKICAgICAgICBtID0gc3ViY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2ogPCBtKSB7CiAgICAgICAgICBzdWJzdWJjb29yZGluYXRlcyA9IHN1YmNvb3JkaW5hdGVzW2pdOwogICAgICAgICAgayA9IC0xOwogICAgICAgICAgaWYgKChwID0gc3Vic3ViY29vcmRpbmF0ZXMubGVuZ3RoIC0gMSkgPiAwKSB7CiAgICAgICAgICAgIHBhdGgucHVzaCgiTSIpOwogICAgICAgICAgICB3aGlsZSAoKytrIDwgcCkgcGF0aC5wdXNoKHByb2plY3Qoc3Vic3ViY29vcmRpbmF0ZXNba10pLCAiTCIpOwogICAgICAgICAgICBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPSAiWiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogICAgfSwKCiAgICBHZW9tZXRyeUNvbGxlY3Rpb246IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIHBhdGggPSBbXSwKICAgICAgICAgIGdlb21ldHJpZXMgPSBvLmdlb21ldHJpZXMsCiAgICAgICAgICBpID0gLTEsIC8vIGdlb21ldHJpZXMgaW5kZXgKICAgICAgICAgIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHBhdGgucHVzaChwYXRoVHlwZShnZW9tZXRyaWVzW2ldKSk7CiAgICAgIHJldHVybiBwYXRoLmpvaW4oIiIpOwogICAgfQoKICB9KTsKCiAgdmFyIGFyZWFUeXBlID0gcGF0aC5hcmVhID0gZDNfZ2VvX3R5cGUoewoKICAgIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBhcmVhID0gMCwKICAgICAgICAgIGZlYXR1cmVzID0gby5mZWF0dXJlcywKICAgICAgICAgIGkgPSAtMSwgLy8gZmVhdHVyZXMuaW5kZXgKICAgICAgICAgIG4gPSBmZWF0dXJlcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBhcmVhICs9IGFyZWFUeXBlKGZlYXR1cmVzW2ldKTsKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9LAoKICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgcmV0dXJuIGFyZWFUeXBlKG8uZ2VvbWV0cnkpOwogICAgfSwKCiAgICBQb2x5Z29uOiBmdW5jdGlvbihvKSB7CiAgICAgIHJldHVybiBwb2x5Z29uQXJlYShvLmNvb3JkaW5hdGVzKTsKICAgIH0sCgogICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBzdW0gPSAwLAogICAgICAgICAgY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLAogICAgICAgICAgaSA9IC0xLCAvLyBjb29yZGluYXRlcyBpbmRleAogICAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHN1bSArPSBwb2x5Z29uQXJlYShjb29yZGluYXRlc1tpXSk7CiAgICAgIHJldHVybiBzdW07CiAgICB9LAoKICAgIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24obykgewogICAgICB2YXIgc3VtID0gMCwKICAgICAgICAgIGdlb21ldHJpZXMgPSBvLmdlb21ldHJpZXMsCiAgICAgICAgICBpID0gLTEsIC8vIGdlb21ldHJpZXMgaW5kZXgKICAgICAgICAgIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHN1bSArPSBhcmVhVHlwZShnZW9tZXRyaWVzW2ldKTsKICAgICAgcmV0dXJuIHN1bTsKICAgIH0KCiAgfSwgMCk7CgogIGZ1bmN0aW9uIHBvbHlnb25BcmVhKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgc3VtID0gYXJlYShjb29yZGluYXRlc1swXSksIC8vIGV4dGVyaW9yIHJpbmcKICAgICAgICBpID0gMCwgLy8gY29vcmRpbmF0ZXMuaW5kZXgKICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIHN1bSAtPSBhcmVhKGNvb3JkaW5hdGVzW2ldKTsgLy8gaG9sZXMKICAgIHJldHVybiBzdW07CiAgfQoKICBmdW5jdGlvbiBwb2x5Z29uQ2VudHJvaWQoY29vcmRpbmF0ZXMpIHsKICAgIHZhciBwb2x5Z29uID0gZDMuZ2VvbS5wb2x5Z29uKGNvb3JkaW5hdGVzWzBdLm1hcChwcm9qZWN0aW9uKSksIC8vIGV4dGVyaW9yIHJpbmcKICAgICAgICBhcmVhID0gcG9seWdvbi5hcmVhKCksCiAgICAgICAgY2VudHJvaWQgPSBwb2x5Z29uLmNlbnRyb2lkKGFyZWEgPCAwID8gKGFyZWEgKj0gLTEsIDEpIDogLTEpLAogICAgICAgIHggPSBjZW50cm9pZFswXSwKICAgICAgICB5ID0gY2VudHJvaWRbMV0sCiAgICAgICAgeiA9IGFyZWEsCiAgICAgICAgaSA9IDAsIC8vIGNvb3JkaW5hdGVzIGluZGV4CiAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIHBvbHlnb24gPSBkMy5nZW9tLnBvbHlnb24oY29vcmRpbmF0ZXNbaV0ubWFwKHByb2plY3Rpb24pKTsgLy8gaG9sZXMKICAgICAgYXJlYSA9IHBvbHlnb24uYXJlYSgpOwogICAgICBjZW50cm9pZCA9IHBvbHlnb24uY2VudHJvaWQoYXJlYSA8IDAgPyAoYXJlYSAqPSAtMSwgMSkgOiAtMSk7CiAgICAgIHggLT0gY2VudHJvaWRbMF07CiAgICAgIHkgLT0gY2VudHJvaWRbMV07CiAgICAgIHogLT0gYXJlYTsKICAgIH0KICAgIHJldHVybiBbeCwgeSwgNiAqIHpdOyAvLyB3ZWlnaHRlZCBjZW50cm9pZAogIH0KCiAgdmFyIGNlbnRyb2lkVHlwZSA9IHBhdGguY2VudHJvaWQgPSBkM19nZW9fdHlwZSh7CgogICAgLy8gVE9ETyBGZWF0dXJlQ29sbGVjdGlvbgogICAgLy8gVE9ETyBQb2ludAogICAgLy8gVE9ETyBNdWx0aVBvaW50CiAgICAvLyBUT0RPIExpbmVTdHJpbmcKICAgIC8vIFRPRE8gTXVsdGlMaW5lU3RyaW5nCiAgICAvLyBUT0RPIEdlb21ldHJ5Q29sbGVjdGlvbgoKICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgcmV0dXJuIGNlbnRyb2lkVHlwZShvLmdlb21ldHJ5KTsKICAgIH0sCgogICAgUG9seWdvbjogZnVuY3Rpb24obykgewogICAgICB2YXIgY2VudHJvaWQgPSBwb2x5Z29uQ2VudHJvaWQoby5jb29yZGluYXRlcyk7CiAgICAgIHJldHVybiBbY2VudHJvaWRbMF0gLyBjZW50cm9pZFsyXSwgY2VudHJvaWRbMV0gLyBjZW50cm9pZFsyXV07CiAgICB9LAoKICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24obykgewogICAgICB2YXIgYXJlYSA9IDAsCiAgICAgICAgICBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMsCiAgICAgICAgICBjZW50cm9pZCwKICAgICAgICAgIHggPSAwLAogICAgICAgICAgeSA9IDAsCiAgICAgICAgICB6ID0gMCwKICAgICAgICAgIGkgPSAtMSwgLy8gY29vcmRpbmF0ZXMgaW5kZXgKICAgICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgY2VudHJvaWQgPSBwb2x5Z29uQ2VudHJvaWQoY29vcmRpbmF0ZXNbaV0pOwogICAgICAgIHggKz0gY2VudHJvaWRbMF07CiAgICAgICAgeSArPSBjZW50cm9pZFsxXTsKICAgICAgICB6ICs9IGNlbnRyb2lkWzJdOwogICAgICB9CiAgICAgIHJldHVybiBbeCAvIHosIHkgLyB6XTsKICAgIH0KCiAgfSk7CgogIGZ1bmN0aW9uIGFyZWEoY29vcmRpbmF0ZXMpIHsKICAgIHJldHVybiBNYXRoLmFicyhkMy5nZW9tLnBvbHlnb24oY29vcmRpbmF0ZXMubWFwKHByb2plY3Rpb24pKS5hcmVhKCkpOwogIH0KCiAgcGF0aC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oeCkgewogICAgcHJvamVjdGlvbiA9IHg7CiAgICByZXR1cm4gcGF0aDsKICB9OwoKICBwYXRoLnBvaW50UmFkaXVzID0gZnVuY3Rpb24oeCkgewogICAgaWYgKHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iKSBwb2ludFJhZGl1cyA9IHg7CiAgICBlbHNlIHsKICAgICAgcG9pbnRSYWRpdXMgPSAreDsKICAgICAgcG9pbnRDaXJjbGUgPSBkM19wYXRoX2NpcmNsZShwb2ludFJhZGl1cyk7CiAgICB9CiAgICByZXR1cm4gcGF0aDsKICB9OwoKICByZXR1cm4gcGF0aDsKfTsKCmZ1bmN0aW9uIGQzX3BhdGhfY2lyY2xlKHJhZGl1cykgewogIHJldHVybiAibTAsIiArIHJhZGl1cwogICAgICArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgKC0yICogcmFkaXVzKQogICAgICArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgKCsyICogcmFkaXVzKQogICAgICArICJ6IjsKfQovKioKICogR2l2ZW4gYSBHZW9KU09OIG9iamVjdCwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBib3VuZGluZyBib3guIFRoZSBib3VuZGluZwogKiBib3ggaXMgcmVwcmVzZW50ZWQgYnkgYSB0d28tZGltZW5zaW9uYWwgYXJyYXk6IFtbbGVmdCwgYm90dG9tXSwgW3JpZ2h0LAogKiB0b3BdXSwgd2hlcmUgbGVmdCBpcyB0aGUgbWluaW11bSBsb25naXR1ZGUsIGJvdHRvbSBpcyB0aGUgbWluaW11bSBsYXRpdHVkZSwKICogcmlnaHQgaXMgbWF4aW11bSBsb25naXR1ZGUsIGFuZCB0b3AgaXMgdGhlIG1heGltdW0gbGF0aXR1ZGUuCiAqLwpkMy5nZW8uYm91bmRzID0gZnVuY3Rpb24oZmVhdHVyZSkgewogIHZhciBsZWZ0ID0gSW5maW5pdHksCiAgICAgIGJvdHRvbSA9IEluZmluaXR5LAogICAgICByaWdodCA9IC1JbmZpbml0eSwKICAgICAgdG9wID0gLUluZmluaXR5OwogIGQzX2dlb19ib3VuZHMoZmVhdHVyZSwgZnVuY3Rpb24oeCwgeSkgewogICAgaWYgKHggPCBsZWZ0KSBsZWZ0ID0geDsKICAgIGlmICh4ID4gcmlnaHQpIHJpZ2h0ID0geDsKICAgIGlmICh5IDwgYm90dG9tKSBib3R0b20gPSB5OwogICAgaWYgKHkgPiB0b3ApIHRvcCA9IHk7CiAgfSk7CiAgcmV0dXJuIFtbbGVmdCwgYm90dG9tXSwgW3JpZ2h0LCB0b3BdXTsKfTsKCmZ1bmN0aW9uIGQzX2dlb19ib3VuZHMobywgZikgewogIGlmIChkM19nZW9fYm91bmRzVHlwZXMuaGFzT3duUHJvcGVydHkoby50eXBlKSkgZDNfZ2VvX2JvdW5kc1R5cGVzW28udHlwZV0obywgZik7Cn0KCnZhciBkM19nZW9fYm91bmRzVHlwZXMgPSB7CiAgRmVhdHVyZTogZDNfZ2VvX2JvdW5kc0ZlYXR1cmUsCiAgRmVhdHVyZUNvbGxlY3Rpb246IGQzX2dlb19ib3VuZHNGZWF0dXJlQ29sbGVjdGlvbiwKICBHZW9tZXRyeUNvbGxlY3Rpb246IGQzX2dlb19ib3VuZHNHZW9tZXRyeUNvbGxlY3Rpb24sCiAgTGluZVN0cmluZzogZDNfZ2VvX2JvdW5kc0xpbmVTdHJpbmcsCiAgTXVsdGlMaW5lU3RyaW5nOiBkM19nZW9fYm91bmRzTXVsdGlMaW5lU3RyaW5nLAogIE11bHRpUG9pbnQ6IGQzX2dlb19ib3VuZHNMaW5lU3RyaW5nLAogIE11bHRpUG9seWdvbjogZDNfZ2VvX2JvdW5kc011bHRpUG9seWdvbiwKICBQb2ludDogZDNfZ2VvX2JvdW5kc1BvaW50LAogIFBvbHlnb246IGQzX2dlb19ib3VuZHNQb2x5Z29uCn07CgpmdW5jdGlvbiBkM19nZW9fYm91bmRzRmVhdHVyZShvLCBmKSB7CiAgZDNfZ2VvX2JvdW5kcyhvLmdlb21ldHJ5LCBmKTsKfQoKZnVuY3Rpb24gZDNfZ2VvX2JvdW5kc0ZlYXR1cmVDb2xsZWN0aW9uKG8sIGYpIHsKICBmb3IgKHZhciBhID0gby5mZWF0dXJlcywgaSA9IDAsIG4gPSBhLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgZDNfZ2VvX2JvdW5kcyhhW2ldLmdlb21ldHJ5LCBmKTsKICB9Cn0KCmZ1bmN0aW9uIGQzX2dlb19ib3VuZHNHZW9tZXRyeUNvbGxlY3Rpb24obywgZikgewogIGZvciAodmFyIGEgPSBvLmdlb21ldHJpZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgIGQzX2dlb19ib3VuZHMoYVtpXSwgZik7CiAgfQp9CgpmdW5jdGlvbiBkM19nZW9fYm91bmRzTGluZVN0cmluZyhvLCBmKSB7CiAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXMsIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgIGYuYXBwbHkobnVsbCwgYVtpXSk7CiAgfQp9CgpmdW5jdGlvbiBkM19nZW9fYm91bmRzTXVsdGlMaW5lU3RyaW5nKG8sIGYpIHsKICBmb3IgKHZhciBhID0gby5jb29yZGluYXRlcywgaSA9IDAsIG4gPSBhLmxlbmd0aDsgaSA8IG47IGkrKykgewogICAgZm9yICh2YXIgYiA9IGFbaV0sIGogPSAwLCBtID0gYi5sZW5ndGg7IGogPCBtOyBqKyspIHsKICAgICAgZi5hcHBseShudWxsLCBiW2pdKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGQzX2dlb19ib3VuZHNNdWx0aVBvbHlnb24obywgZikgewogIGZvciAodmFyIGEgPSBvLmNvb3JkaW5hdGVzLCBpID0gMCwgbiA9IGEubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICBmb3IgKHZhciBiID0gYVtpXVswXSwgaiA9IDAsIG0gPSBiLmxlbmd0aDsgaiA8IG07IGorKykgewogICAgICBmLmFwcGx5KG51bGwsIGJbal0pOwogICAgfQogIH0KfQoKZnVuY3Rpb24gZDNfZ2VvX2JvdW5kc1BvaW50KG8sIGYpIHsKICBmLmFwcGx5KG51bGwsIG8uY29vcmRpbmF0ZXMpOwp9CgpmdW5jdGlvbiBkM19nZW9fYm91bmRzUG9seWdvbihvLCBmKSB7CiAgZm9yICh2YXIgYSA9IG8uY29vcmRpbmF0ZXNbMF0sIGkgPSAwLCBuID0gYS5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgIGYuYXBwbHkobnVsbCwgYVtpXSk7CiAgfQp9Ci8vIFRPRE8gYnJlYWtBdERhdGVMaW5lPwoKZDMuZ2VvLmNpcmNsZSA9IGZ1bmN0aW9uKCkgewogIHZhciBvcmlnaW4gPSBbMCwgMF0sCiAgICAgIGRlZ3JlZXMgPSA5MCAtIDFlLTIsCiAgICAgIHJhZGlhbnMgPSBkZWdyZWVzICogZDNfZ2VvX3JhZGlhbnMsCiAgICAgIGFyYyA9IGQzLmdlby5ncmVhdEFyYygpLnRhcmdldChPYmplY3QpOwoKICBmdW5jdGlvbiBjaXJjbGUoKSB7CiAgICAvLyBUT0RPIHJlbmRlciBhIGNpcmNsZSBhcyBhIFBvbHlnb24KICB9CgogIGZ1bmN0aW9uIHZpc2libGUocG9pbnQpIHsKICAgIHJldHVybiBhcmMuZGlzdGFuY2UocG9pbnQpIDwgcmFkaWFuczsKICB9CgogIGNpcmNsZS5jbGlwID0gZnVuY3Rpb24oZCkgewogICAgYXJjLnNvdXJjZSh0eXBlb2Ygb3JpZ2luID09PSAiZnVuY3Rpb24iID8gb3JpZ2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBvcmlnaW4pOwogICAgcmV0dXJuIGNsaXBUeXBlKGQpOwogIH07CgogIHZhciBjbGlwVHlwZSA9IGQzX2dlb190eXBlKHsKCiAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24obykgewogICAgICB2YXIgZmVhdHVyZXMgPSBvLmZlYXR1cmVzLm1hcChjbGlwVHlwZSkuZmlsdGVyKE9iamVjdCk7CiAgICAgIHJldHVybiBmZWF0dXJlcyAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uZmVhdHVyZXMgPSBmZWF0dXJlcywgbyk7CiAgICB9LAoKICAgIEZlYXR1cmU6IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGdlb21ldHJ5ID0gY2xpcFR5cGUoby5nZW9tZXRyeSk7CiAgICAgIHJldHVybiBnZW9tZXRyeSAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uZ2VvbWV0cnkgPSBnZW9tZXRyeSwgbyk7CiAgICB9LAoKICAgIFBvaW50OiBmdW5jdGlvbihvKSB7CiAgICAgIHJldHVybiB2aXNpYmxlKG8uY29vcmRpbmF0ZXMpICYmIG87CiAgICB9LAoKICAgIE11bHRpUG9pbnQ6IGZ1bmN0aW9uKG8pIHsKICAgICAgdmFyIGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcy5maWx0ZXIodmlzaWJsZSk7CiAgICAgIHJldHVybiBjb29yZGluYXRlcy5sZW5ndGggJiYgewogICAgICAgIHR5cGU6IG8udHlwZSwKICAgICAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXMKICAgICAgfTsKICAgIH0sCgogICAgTGluZVN0cmluZzogZnVuY3Rpb24obykgewogICAgICB2YXIgY29vcmRpbmF0ZXMgPSBjbGlwKG8uY29vcmRpbmF0ZXMpOwogICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLCBvKTsKICAgIH0sCgogICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKGNsaXApLmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiBkLmxlbmd0aDsgfSk7CiAgICAgIHJldHVybiBjb29yZGluYXRlcy5sZW5ndGggJiYgKG8gPSBPYmplY3QuY3JlYXRlKG8pLCBvLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXMsIG8pOwogICAgfSwKCiAgICBQb2x5Z29uOiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKGNsaXApOwogICAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0ubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLCBvKTsKICAgIH0sCgogICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQubWFwKGNsaXApOyB9KS5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZFswXS5sZW5ndGg7IH0pOwogICAgICByZXR1cm4gY29vcmRpbmF0ZXMubGVuZ3RoICYmIChvID0gT2JqZWN0LmNyZWF0ZShvKSwgby5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLCBvKTsKICAgIH0sCgogICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvKSB7CiAgICAgIHZhciBnZW9tZXRyaWVzID0gby5nZW9tZXRyaWVzLm1hcChjbGlwVHlwZSkuZmlsdGVyKE9iamVjdCk7CiAgICAgIHJldHVybiBnZW9tZXRyaWVzLmxlbmd0aCAmJiAobyA9IE9iamVjdC5jcmVhdGUobyksIG8uZ2VvbWV0cmllcyA9IGdlb21ldHJpZXMsIG8pOwogICAgfQoKICB9KTsKCiAgZnVuY3Rpb24gY2xpcChjb29yZGluYXRlcykgewogICAgdmFyIGkgPSAtMSwKICAgICAgICBuID0gY29vcmRpbmF0ZXMubGVuZ3RoLAogICAgICAgIGNsaXBwZWQgPSBbXSwKICAgICAgICBwMCwKICAgICAgICBwMSwKICAgICAgICBwMiwKICAgICAgICBkMCwKICAgICAgICBkMTsKCiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBkMSA9IGFyYy5kaXN0YW5jZShwMiA9IGNvb3JkaW5hdGVzW2ldKTsKICAgICAgaWYgKGQxIDwgcmFkaWFucykgewogICAgICAgIGlmIChwMSkgY2xpcHBlZC5wdXNoKGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKHAxLCBwMikoKGQwIC0gcmFkaWFucykgLyAoZDAgLSBkMSkpKTsKICAgICAgICBjbGlwcGVkLnB1c2gocDIpOwogICAgICAgIHAwID0gcDEgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHAxID0gcDI7CiAgICAgICAgaWYgKCFwMCAmJiBjbGlwcGVkLmxlbmd0aCkgewogICAgICAgICAgY2xpcHBlZC5wdXNoKGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGNsaXBwZWRbY2xpcHBlZC5sZW5ndGggLSAxXSwgcDEpKChyYWRpYW5zIC0gZDApIC8gKGQxIC0gZDApKSk7CiAgICAgICAgICBwMCA9IHAxOwogICAgICAgIH0KICAgICAgfQogICAgICBkMCA9IGQxOwogICAgfQoKICAgIGlmIChwMSAmJiBjbGlwcGVkLmxlbmd0aCkgewogICAgICBkMSA9IGFyYy5kaXN0YW5jZShwMiA9IGNsaXBwZWRbMF0pOwogICAgICBjbGlwcGVkLnB1c2goZDNfZ2VvX2dyZWF0QXJjSW50ZXJwb2xhdGUocDEsIHAyKSgoZDAgLSByYWRpYW5zKSAvIChkMCAtIGQxKSkpOwogICAgfQoKICAgIHJldHVybiByZXNhbXBsZShjbGlwcGVkKTsKICB9CgogIC8vIFJlc2FtcGxlIGNvb3JkaW5hdGVzLCBjcmVhdGluZyBncmVhdCBhcmNzIGJldHdlZW4gZWFjaC4KICBmdW5jdGlvbiByZXNhbXBsZShjb29yZGluYXRlcykgewogICAgdmFyIGkgPSAwLAogICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsCiAgICAgICAgaiwKICAgICAgICBtLAogICAgICAgIHJlc2FtcGxlZCA9IG4gPyBbY29vcmRpbmF0ZXNbMF1dIDogY29vcmRpbmF0ZXMsCiAgICAgICAgcmVzYW1wbGVzLAogICAgICAgIG9yaWdpbiA9IGFyYy5zb3VyY2UoKTsKCiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICByZXNhbXBsZXMgPSBhcmMuc291cmNlKGNvb3JkaW5hdGVzW2kgLSAxXSkoY29vcmRpbmF0ZXNbaV0pLmNvb3JkaW5hdGVzOwogICAgICBmb3IgKGogPSAwLCBtID0gcmVzYW1wbGVzLmxlbmd0aDsgKytqIDwgbTspIHJlc2FtcGxlZC5wdXNoKHJlc2FtcGxlc1tqXSk7CiAgICB9CgogICAgYXJjLnNvdXJjZShvcmlnaW4pOwogICAgcmV0dXJuIHJlc2FtcGxlZDsKICB9CgogIGNpcmNsZS5vcmlnaW4gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmlnaW47CiAgICBvcmlnaW4gPSB4OwogICAgcmV0dXJuIGNpcmNsZTsKICB9OwoKICBjaXJjbGUuYW5nbGUgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkZWdyZWVzOwogICAgcmFkaWFucyA9IChkZWdyZWVzID0gK3gpICogZDNfZ2VvX3JhZGlhbnM7CiAgICByZXR1cm4gY2lyY2xlOwogIH07CgogIC8vIFByZWNpc2lvbiBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcy4KICBjaXJjbGUucHJlY2lzaW9uID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYXJjLnByZWNpc2lvbigpOwogICAgYXJjLnByZWNpc2lvbih4KTsKICAgIHJldHVybiBjaXJjbGU7CiAgfTsKCiAgcmV0dXJuIGNpcmNsZTsKfQpkMy5nZW8uZ3JlYXRBcmMgPSBmdW5jdGlvbigpIHsKICB2YXIgc291cmNlID0gZDNfZ2VvX2dyZWF0QXJjU291cmNlLAogICAgICB0YXJnZXQgPSBkM19nZW9fZ3JlYXRBcmNUYXJnZXQsCiAgICAgIHByZWNpc2lvbiA9IDYgKiBkM19nZW9fcmFkaWFuczsKCiAgZnVuY3Rpb24gZ3JlYXRBcmMoKSB7CiAgICB2YXIgYSA9IHR5cGVvZiBzb3VyY2UgPT09ICJmdW5jdGlvbiIgPyBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNvdXJjZSwKICAgICAgICBiID0gdHlwZW9mIHRhcmdldCA9PT0gImZ1bmN0aW9uIiA/IHRhcmdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdGFyZ2V0LAogICAgICAgIGkgPSBkM19nZW9fZ3JlYXRBcmNJbnRlcnBvbGF0ZShhLCBiKSwKICAgICAgICBkdCA9IHByZWNpc2lvbiAvIGkuZCwKICAgICAgICB0ID0gMCwKICAgICAgICBjb29yZGluYXRlcyA9IFthXTsKICAgIHdoaWxlICgodCArPSBkdCkgPCAxKSBjb29yZGluYXRlcy5wdXNoKGkodCkpOwogICAgY29vcmRpbmF0ZXMucHVzaChiKTsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJMaW5lU3RyaW5nIiwKICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzCiAgICB9OwogIH0KCiAgLy8gTGVuZ3RoIHJldHVybmVkIGluIHJhZGlhbnM7IG11bHRpcGx5IGJ5IHJhZGl1cyBmb3IgZGlzdGFuY2UuCiAgZ3JlYXRBcmMuZGlzdGFuY2UgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhID0gdHlwZW9mIHNvdXJjZSA9PT0gImZ1bmN0aW9uIiA/IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc291cmNlLAogICAgICAgIGIgPSB0eXBlb2YgdGFyZ2V0ID09PSAiZnVuY3Rpb24iID8gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0YXJnZXQ7CiAgICAgcmV0dXJuIGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpLmQ7CiAgfTsKCiAgZ3JlYXRBcmMuc291cmNlID0gZnVuY3Rpb24oeCkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc291cmNlOwogICAgc291cmNlID0geDsKICAgIHJldHVybiBncmVhdEFyYzsKICB9OwoKICBncmVhdEFyYy50YXJnZXQgPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0YXJnZXQ7CiAgICB0YXJnZXQgPSB4OwogICAgcmV0dXJuIGdyZWF0QXJjOwogIH07CgogIC8vIFByZWNpc2lvbiBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcy4KICBncmVhdEFyYy5wcmVjaXNpb24gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcmVjaXNpb24gLyBkM19nZW9fcmFkaWFuczsKICAgIHByZWNpc2lvbiA9IHggKiBkM19nZW9fcmFkaWFuczsKICAgIHJldHVybiBncmVhdEFyYzsKICB9OwoKICByZXR1cm4gZ3JlYXRBcmM7Cn07CgpmdW5jdGlvbiBkM19nZW9fZ3JlYXRBcmNTb3VyY2UoZCkgewogIHJldHVybiBkLnNvdXJjZTsKfQoKZnVuY3Rpb24gZDNfZ2VvX2dyZWF0QXJjVGFyZ2V0KGQpIHsKICByZXR1cm4gZC50YXJnZXQ7Cn0KCmZ1bmN0aW9uIGQzX2dlb19ncmVhdEFyY0ludGVycG9sYXRlKGEsIGIpIHsKICB2YXIgeDAgPSBhWzBdICogZDNfZ2VvX3JhZGlhbnMsIGN4MCA9IE1hdGguY29zKHgwKSwgc3gwID0gTWF0aC5zaW4oeDApLAogICAgICB5MCA9IGFbMV0gKiBkM19nZW9fcmFkaWFucywgY3kwID0gTWF0aC5jb3MoeTApLCBzeTAgPSBNYXRoLnNpbih5MCksCiAgICAgIHgxID0gYlswXSAqIGQzX2dlb19yYWRpYW5zLCBjeDEgPSBNYXRoLmNvcyh4MSksIHN4MSA9IE1hdGguc2luKHgxKSwKICAgICAgeTEgPSBiWzFdICogZDNfZ2VvX3JhZGlhbnMsIGN5MSA9IE1hdGguY29zKHkxKSwgc3kxID0gTWF0aC5zaW4oeTEpLAogICAgICBkID0gaW50ZXJwb2xhdGUuZCA9IE1hdGguYWNvcyhNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgc3kwICogc3kxICsgY3kwICogY3kxICogTWF0aC5jb3MoeDEgLSB4MCkpKSksCiAgICAgIHNkID0gTWF0aC5zaW4oZCk7CgogIC8vIEZyb20gaHR0cDovL3dpbGxpYW1zLmJlc3QudndoLm5ldC9hdmZvcm0uaHRtI0ludGVybWVkaWF0ZQogIGZ1bmN0aW9uIGludGVycG9sYXRlKHQpIHsKICAgIHZhciBBID0gTWF0aC5zaW4oZCAtICh0ICo9IGQpKSAvIHNkLAogICAgICAgIEIgPSBNYXRoLnNpbih0KSAvIHNkLAogICAgICAgIHggPSBBICogY3kwICogY3gwICsgQiAqIGN5MSAqIGN4MSwKICAgICAgICB5ID0gQSAqIGN5MCAqIHN4MCArIEIgKiBjeTEgKiBzeDEsCiAgICAgICAgeiA9IEEgKiBzeTAgICAgICAgKyBCICogc3kxOwogICAgcmV0dXJuIFsKICAgICAgTWF0aC5hdGFuMih5LCB4KSAvIGQzX2dlb19yYWRpYW5zLAogICAgICBNYXRoLmF0YW4yKHosIE1hdGguc3FydCh4ICogeCArIHkgKiB5KSkgLyBkM19nZW9fcmFkaWFucwogICAgXTsKICB9CgogIHJldHVybiBpbnRlcnBvbGF0ZTsKfQpkMy5nZW8uZ3JlYXRDaXJjbGUgPSBkMy5nZW8uY2lyY2xlOwpkMy5nZW9tID0ge307Ci8qKgogKiBDb21wdXRlcyBhIGNvbnRvdXIgZm9yIGEgZ2l2ZW4gaW5wdXQgZ3JpZCBmdW5jdGlvbiB1c2luZyB0aGUgPGEKICogaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NYXJjaGluZ19zcXVhcmVzIj5tYXJjaGluZwogKiBzcXVhcmVzPC9hPiBhbGdvcml0aG0uIFJldHVybnMgdGhlIGNvbnRvdXIgcG9seWdvbiBhcyBhbiBhcnJheSBvZiBwb2ludHMuCiAqCiAqIEBwYXJhbSBncmlkIGEgdHdvLWlucHV0IGZ1bmN0aW9uKHgsIHkpIHRoYXQgcmV0dXJucyB0cnVlIGZvciB2YWx1ZXMKICogaW5zaWRlIHRoZSBjb250b3VyIGFuZCBmYWxzZSBmb3IgdmFsdWVzIG91dHNpZGUgdGhlIGNvbnRvdXIuCiAqIEBwYXJhbSBzdGFydCBhbiBvcHRpb25hbCBzdGFydGluZyBwb2ludCBbeCwgeV0gb24gdGhlIGdyaWQuCiAqIEByZXR1cm5zIHBvbHlnb24gW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQogKi8KZDMuZ2VvbS5jb250b3VyID0gZnVuY3Rpb24oZ3JpZCwgc3RhcnQpIHsKICB2YXIgcyA9IHN0YXJ0IHx8IGQzX2dlb21fY29udG91clN0YXJ0KGdyaWQpLCAvLyBzdGFydGluZyBwb2ludAogICAgICBjID0gW10sICAgIC8vIGNvbnRvdXIgcG9seWdvbgogICAgICB4ID0gc1swXSwgIC8vIGN1cnJlbnQgeCBwb3NpdGlvbgogICAgICB5ID0gc1sxXSwgIC8vIGN1cnJlbnQgeSBwb3NpdGlvbgogICAgICBkeCA9IDAsICAgIC8vIG5leHQgeCBkaXJlY3Rpb24KICAgICAgZHkgPSAwLCAgICAvLyBuZXh0IHkgZGlyZWN0aW9uCiAgICAgIHBkeCA9IE5hTiwgLy8gcHJldmlvdXMgeCBkaXJlY3Rpb24KICAgICAgcGR5ID0gTmFOLCAvLyBwcmV2aW91cyB5IGRpcmVjdGlvbgogICAgICBpID0gMDsKCiAgZG8gewogICAgLy8gZGV0ZXJtaW5lIG1hcmNoaW5nIHNxdWFyZXMgaW5kZXgKICAgIGkgPSAwOwogICAgaWYgKGdyaWQoeC0xLCB5LTEpKSBpICs9IDE7CiAgICBpZiAoZ3JpZCh4LCAgIHktMSkpIGkgKz0gMjsKICAgIGlmIChncmlkKHgtMSwgeSAgKSkgaSArPSA0OwogICAgaWYgKGdyaWQoeCwgICB5ICApKSBpICs9IDg7CgogICAgLy8gZGV0ZXJtaW5lIG5leHQgZGlyZWN0aW9uCiAgICBpZiAoaSA9PT0gNikgewogICAgICBkeCA9IHBkeSA9PT0gLTEgPyAtMSA6IDE7CiAgICAgIGR5ID0gMDsKICAgIH0gZWxzZSBpZiAoaSA9PT0gOSkgewogICAgICBkeCA9IDA7CiAgICAgIGR5ID0gcGR4ID09PSAxID8gLTEgOiAxOwogICAgfSBlbHNlIHsKICAgICAgZHggPSBkM19nZW9tX2NvbnRvdXJEeFtpXTsKICAgICAgZHkgPSBkM19nZW9tX2NvbnRvdXJEeVtpXTsKICAgIH0KCiAgICAvLyB1cGRhdGUgY29udG91ciBwb2x5Z29uCiAgICBpZiAoZHggIT0gcGR4ICYmIGR5ICE9IHBkeSkgewogICAgICBjLnB1c2goW3gsIHldKTsKICAgICAgcGR4ID0gZHg7CiAgICAgIHBkeSA9IGR5OwogICAgfQoKICAgIHggKz0gZHg7CiAgICB5ICs9IGR5OwogIH0gd2hpbGUgKHNbMF0gIT0geCB8fCBzWzFdICE9IHkpOwoKICByZXR1cm4gYzsKfTsKCi8vIGxvb2t1cCB0YWJsZXMgZm9yIG1hcmNoaW5nIGRpcmVjdGlvbnMKdmFyIGQzX2dlb21fY29udG91ckR4ID0gWzEsIDAsIDEsIDEsLTEsIDAsLTEsIDEsMCwgMCwwLDAsLTEsIDAsLTEsTmFOXSwKICAgIGQzX2dlb21fY29udG91ckR5ID0gWzAsLTEsIDAsIDAsIDAsLTEsIDAsIDAsMSwtMSwxLDEsIDAsLTEsIDAsTmFOXTsKCmZ1bmN0aW9uIGQzX2dlb21fY29udG91clN0YXJ0KGdyaWQpIHsKICB2YXIgeCA9IDAsCiAgICAgIHkgPSAwOwoKICAvLyBzZWFyY2ggZm9yIGEgc3RhcnRpbmcgcG9pbnQ7IGJlZ2luIGF0IG9yaWdpbgogIC8vIGFuZCBwcm9jZWVkIGFsb25nIG91dHdhcmQtZXhwYW5kaW5nIGRpYWdvbmFscwogIHdoaWxlICh0cnVlKSB7CiAgICBpZiAoZ3JpZCh4LHkpKSB7CiAgICAgIHJldHVybiBbeCx5XTsKICAgIH0KICAgIGlmICh4ID09PSAwKSB7CiAgICAgIHggPSB5ICsgMTsKICAgICAgeSA9IDA7CiAgICB9IGVsc2UgewogICAgICB4ID0geCAtIDE7CiAgICAgIHkgPSB5ICsgMTsKICAgIH0KICB9Cn0KLyoqCiAqIENvbXB1dGVzIHRoZSAyRCBjb252ZXggaHVsbCBvZiBhIHNldCBvZiBwb2ludHMgdXNpbmcgR3JhaGFtJ3Mgc2Nhbm5pbmcKICogYWxnb3JpdGhtLiBUaGUgYWxnb3JpdGhtIGhhcyBiZWVuIGltcGxlbWVudGVkIGFzIGRlc2NyaWJlZCBpbiBDb3JtZW4sCiAqIExlaXNlcnNvbiwgYW5kIFJpdmVzdCdzIEludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zLiBUaGUgcnVubmluZyB0aW1lIG9mCiAqIHRoaXMgYWxnb3JpdGhtIGlzIE8obiBsb2cgbiksIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBpbnB1dCBwb2ludHMuCiAqCiAqIEBwYXJhbSB2ZXJ0aWNlcyBbW3gxLCB5MV0sIFt4MiwgeTJdLCDigKZdCiAqIEByZXR1cm5zIHBvbHlnb24gW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQogKi8KZDMuZ2VvbS5odWxsID0gZnVuY3Rpb24odmVydGljZXMpIHsKICBpZiAodmVydGljZXMubGVuZ3RoIDwgMykgcmV0dXJuIFtdOwoKICB2YXIgbGVuID0gdmVydGljZXMubGVuZ3RoLAogICAgICBwbGVuID0gbGVuIC0gMSwKICAgICAgcG9pbnRzID0gW10sCiAgICAgIHN0YWNrID0gW10sCiAgICAgIGksIGosIGggPSAwLCB4MSwgeTEsIHgyLCB5MiwgdSwgdiwgYSwgc3A7CgogIC8vIGZpbmQgdGhlIHN0YXJ0aW5nIHJlZiBwb2ludDogbGVmdG1vc3QgcG9pbnQgd2l0aCB0aGUgbWluaW11bSB5IGNvb3JkCiAgZm9yIChpPTE7IGk8bGVuOyArK2kpIHsKICAgIGlmICh2ZXJ0aWNlc1tpXVsxXSA8IHZlcnRpY2VzW2hdWzFdKSB7CiAgICAgIGggPSBpOwogICAgfSBlbHNlIGlmICh2ZXJ0aWNlc1tpXVsxXSA9PSB2ZXJ0aWNlc1toXVsxXSkgewogICAgICBoID0gKHZlcnRpY2VzW2ldWzBdIDwgdmVydGljZXNbaF1bMF0gPyBpIDogaCk7CiAgICB9CiAgfQoKICAvLyBjYWxjdWxhdGUgcG9sYXIgYW5nbGVzIGZyb20gcmVmIHBvaW50IGFuZCBzb3J0CiAgZm9yIChpPTA7IGk8bGVuOyArK2kpIHsKICAgIGlmIChpID09PSBoKSBjb250aW51ZTsKICAgIHkxID0gdmVydGljZXNbaV1bMV0gLSB2ZXJ0aWNlc1toXVsxXTsKICAgIHgxID0gdmVydGljZXNbaV1bMF0gLSB2ZXJ0aWNlc1toXVswXTsKICAgIHBvaW50cy5wdXNoKHthbmdsZTogTWF0aC5hdGFuMih5MSwgeDEpLCBpbmRleDogaX0pOwogIH0KICBwb2ludHMuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLmFuZ2xlIC0gYi5hbmdsZTsgfSk7CgogIC8vIHRvc3Mgb3V0IGR1cGxpY2F0ZSBhbmdsZXMKICBhID0gcG9pbnRzWzBdLmFuZ2xlOwogIHYgPSBwb2ludHNbMF0uaW5kZXg7CiAgdSA9IDA7CiAgZm9yIChpPTE7IGk8cGxlbjsgKytpKSB7CiAgICBqID0gcG9pbnRzW2ldLmluZGV4OwogICAgaWYgKGEgPT0gcG9pbnRzW2ldLmFuZ2xlKSB7CiAgICAgIC8vIGtlZXAgYW5nbGUgZm9yIHBvaW50IG1vc3QgZGlzdGFudCBmcm9tIHRoZSByZWZlcmVuY2UKICAgICAgeDEgPSB2ZXJ0aWNlc1t2XVswXSAtIHZlcnRpY2VzW2hdWzBdOwogICAgICB5MSA9IHZlcnRpY2VzW3ZdWzFdIC0gdmVydGljZXNbaF1bMV07CiAgICAgIHgyID0gdmVydGljZXNbal1bMF0gLSB2ZXJ0aWNlc1toXVswXTsKICAgICAgeTIgPSB2ZXJ0aWNlc1tqXVsxXSAtIHZlcnRpY2VzW2hdWzFdOwogICAgICBpZiAoKHgxKngxICsgeTEqeTEpID49ICh4Mip4MiArIHkyKnkyKSkgewogICAgICAgIHBvaW50c1tpXS5pbmRleCA9IC0xOwogICAgICB9IGVsc2UgewogICAgICAgIHBvaW50c1t1XS5pbmRleCA9IC0xOwogICAgICAgIGEgPSBwb2ludHNbaV0uYW5nbGU7CiAgICAgICAgdSA9IGk7CiAgICAgICAgdiA9IGo7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGEgPSBwb2ludHNbaV0uYW5nbGU7CiAgICAgIHUgPSBpOwogICAgICB2ID0gajsKICAgIH0KICB9CgogIC8vIGluaXRpYWxpemUgdGhlIHN0YWNrCiAgc3RhY2sucHVzaChoKTsKICBmb3IgKGk9MCwgaj0wOyBpPDI7ICsraikgewogICAgaWYgKHBvaW50c1tqXS5pbmRleCAhPT0gLTEpIHsKICAgICAgc3RhY2sucHVzaChwb2ludHNbal0uaW5kZXgpOwogICAgICBpKys7CiAgICB9CiAgfQogIHNwID0gc3RhY2subGVuZ3RoOwoKICAvLyBkbyBncmFoYW0ncyBzY2FuCiAgZm9yICg7IGo8cGxlbjsgKytqKSB7CiAgICBpZiAocG9pbnRzW2pdLmluZGV4ID09PSAtMSkgY29udGludWU7IC8vIHNraXAgdG9zc2VkIG91dCBwb2ludHMKICAgIHdoaWxlICghZDNfZ2VvbV9odWxsQ0NXKHN0YWNrW3NwLTJdLCBzdGFja1tzcC0xXSwgcG9pbnRzW2pdLmluZGV4LCB2ZXJ0aWNlcykpIHsKICAgICAgLS1zcDsKICAgIH0KICAgIHN0YWNrW3NwKytdID0gcG9pbnRzW2pdLmluZGV4OwogIH0KCiAgLy8gY29uc3RydWN0IHRoZSBodWxsCiAgdmFyIHBvbHkgPSBbXTsKICBmb3IgKGk9MDsgaTxzcDsgKytpKSB7CiAgICBwb2x5LnB1c2godmVydGljZXNbc3RhY2tbaV1dKTsKICB9CiAgcmV0dXJuIHBvbHk7Cn0KCi8vIGFyZSB0aHJlZSBwb2ludHMgaW4gY291bnRlci1jbG9ja3dpc2Ugb3JkZXI/CmZ1bmN0aW9uIGQzX2dlb21faHVsbENDVyhpMSwgaTIsIGkzLCB2KSB7CiAgdmFyIHQsIGEsIGIsIGMsIGQsIGUsIGY7CiAgdCA9IHZbaTFdOyBhID0gdFswXTsgYiA9IHRbMV07CiAgdCA9IHZbaTJdOyBjID0gdFswXTsgZCA9IHRbMV07CiAgdCA9IHZbaTNdOyBlID0gdFswXTsgZiA9IHRbMV07CiAgcmV0dXJuICgoZi1iKSooYy1hKSAtIChkLWIpKihlLWEpKSA+IDA7Cn0KLy8gTm90ZTogcmVxdWlyZXMgY29vcmRpbmF0ZXMgdG8gYmUgY291bnRlcmNsb2Nrd2lzZSBhbmQgY29udmV4IQpkMy5nZW9tLnBvbHlnb24gPSBmdW5jdGlvbihjb29yZGluYXRlcykgewoKICBjb29yZGluYXRlcy5hcmVhID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgaSA9IDAsCiAgICAgICAgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCwKICAgICAgICBhID0gY29vcmRpbmF0ZXNbbiAtIDFdWzBdICogY29vcmRpbmF0ZXNbMF1bMV0sCiAgICAgICAgYiA9IGNvb3JkaW5hdGVzW24gLSAxXVsxXSAqIGNvb3JkaW5hdGVzWzBdWzBdOwogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgYSArPSBjb29yZGluYXRlc1tpIC0gMV1bMF0gKiBjb29yZGluYXRlc1tpXVsxXTsKICAgICAgYiArPSBjb29yZGluYXRlc1tpIC0gMV1bMV0gKiBjb29yZGluYXRlc1tpXVswXTsKICAgIH0KICAgIHJldHVybiAoYiAtIGEpICogLjU7CiAgfTsKCiAgY29vcmRpbmF0ZXMuY2VudHJvaWQgPSBmdW5jdGlvbihrKSB7CiAgICB2YXIgaSA9IC0xLAogICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsCiAgICAgICAgeCA9IDAsCiAgICAgICAgeSA9IDAsCiAgICAgICAgYSwKICAgICAgICBiID0gY29vcmRpbmF0ZXNbbiAtIDFdLAogICAgICAgIGM7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIGsgPSAtMSAvICg2ICogY29vcmRpbmF0ZXMuYXJlYSgpKTsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGEgPSBiOwogICAgICBiID0gY29vcmRpbmF0ZXNbaV07CiAgICAgIGMgPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdOwogICAgICB4ICs9IChhWzBdICsgYlswXSkgKiBjOwogICAgICB5ICs9IChhWzFdICsgYlsxXSkgKiBjOwogICAgfQogICAgcmV0dXJuIFt4ICogaywgeSAqIGtdOwogIH07CgogIC8vIFRoZSBTdXRoZXJsYW5kLUhvZGdtYW4gY2xpcHBpbmcgYWxnb3JpdGhtLgogIGNvb3JkaW5hdGVzLmNsaXAgPSBmdW5jdGlvbihzdWJqZWN0KSB7CiAgICB2YXIgaW5wdXQsCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSBjb29yZGluYXRlcy5sZW5ndGgsCiAgICAgICAgaiwKICAgICAgICBtLAogICAgICAgIGEgPSBjb29yZGluYXRlc1tuIC0gMV0sCiAgICAgICAgYiwKICAgICAgICBjLAogICAgICAgIGQ7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpbnB1dCA9IHN1YmplY3Quc2xpY2UoKTsKICAgICAgc3ViamVjdC5sZW5ndGggPSAwOwogICAgICBiID0gY29vcmRpbmF0ZXNbaV07CiAgICAgIGMgPSBpbnB1dFsobSA9IGlucHV0Lmxlbmd0aCkgLSAxXTsKICAgICAgaiA9IC0xOwogICAgICB3aGlsZSAoKytqIDwgbSkgewogICAgICAgIGQgPSBpbnB1dFtqXTsKICAgICAgICBpZiAoZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGQsIGEsIGIpKSB7CiAgICAgICAgICBpZiAoIWQzX2dlb21fcG9seWdvbkluc2lkZShjLCBhLCBiKSkgewogICAgICAgICAgICBzdWJqZWN0LnB1c2goZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0KGMsIGQsIGEsIGIpKTsKICAgICAgICAgIH0KICAgICAgICAgIHN1YmplY3QucHVzaChkKTsKICAgICAgICB9IGVsc2UgaWYgKGQzX2dlb21fcG9seWdvbkluc2lkZShjLCBhLCBiKSkgewogICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7CiAgICAgICAgfQogICAgICAgIGMgPSBkOwogICAgICB9CiAgICAgIGEgPSBiOwogICAgfQogICAgcmV0dXJuIHN1YmplY3Q7CiAgfTsKCiAgcmV0dXJuIGNvb3JkaW5hdGVzOwp9OwoKZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKHAsIGEsIGIpIHsKICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChwWzFdIC0gYVsxXSkgPCAoYlsxXSAtIGFbMV0pICogKHBbMF0gLSBhWzBdKTsKfQoKLy8gSW50ZXJzZWN0IHR3byBpbmZpbml0ZSBsaW5lcyBjZCBhbmQgYWIuCmZ1bmN0aW9uIGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSB7CiAgdmFyIHgxID0gY1swXSwgeDIgPSBkWzBdLCB4MyA9IGFbMF0sIHg0ID0gYlswXSwKICAgICAgeTEgPSBjWzFdLCB5MiA9IGRbMV0sIHkzID0gYVsxXSwgeTQgPSBiWzFdLAogICAgICB4MTMgPSB4MSAtIHgzLAogICAgICB4MjEgPSB4MiAtIHgxLAogICAgICB4NDMgPSB4NCAtIHgzLAogICAgICB5MTMgPSB5MSAtIHkzLAogICAgICB5MjEgPSB5MiAtIHkxLAogICAgICB5NDMgPSB5NCAtIHkzLAogICAgICB1YSA9ICh4NDMgKiB5MTMgLSB5NDMgKiB4MTMpIC8gKHk0MyAqIHgyMSAtIHg0MyAqIHkyMSk7CiAgcmV0dXJuIFt4MSArIHVhICogeDIxLCB5MSArIHVhICogeTIxXTsKfQovLyBBZGFwdGVkIGZyb20gTmljb2xhcyBHYXJjaWEgQmVsbW9udGUncyBKSVQgaW1wbGVtZW50YXRpb246Ci8vIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvMjAxMC8wMi8xMi92b3Jvbm9pLXRlc3NlbGxhdGlvbi8KLy8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9hc3NldHMvdm9yb25vaWpzL3Zvcm9ub2kuanMKLy8gU2VlIGxpYi9qaXQvTElDRU5TRSBmb3IgZGV0YWlscy4KCi8vIE5vdGVzOgovLwovLyBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNsaXAgdGhlIHJldHVybmVkIHBvbHlnb25zLCBzbyBpZiB5b3Ugd2FudCB0bwovLyBjbGlwIHRoZW0gdG8gYSBwYXJ0aWN1bGFyIHNoYXBlIHlvdSB3aWxsIG5lZWQgdG8gZG8gdGhhdCBlaXRoZXIgaW4gU1ZHIG9yIGJ5Ci8vIHBvc3QtcHJvY2Vzc2luZyB3aXRoIGQzLmdlb20ucG9seWdvbidzIGNsaXAgbWV0aG9kLgovLwovLyBJZiBhbnkgdmVydGljZXMgYXJlIGNvaW5jaWRlbnQgb3IgaGF2ZSBOYU4gcG9zaXRpb25zLCB0aGUgYmVoYXZpb3Igb2YgdGhpcwovLyBtZXRob2QgaXMgdW5kZWZpbmVkLiBNb3N0IGxpa2VseSBpbnZhbGlkIHBvbHlnb25zIHdpbGwgYmUgcmV0dXJuZWQuIFlvdQovLyBzaG91bGQgZmlsdGVyIGludmFsaWQgcG9pbnRzLCBhbmQgY29uc29saWRhdGUgY29pbmNpZGVudCBwb2ludHMsIGJlZm9yZQovLyBjb21wdXRpbmcgdGhlIHRlc3NlbGxhdGlvbi4KCi8qKgogKiBAcGFyYW0gdmVydGljZXMgW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXQogKiBAcmV0dXJucyBwb2x5Z29ucyBbW1t4MSwgeTFdLCBbeDIsIHkyXSwg4oCmXSwg4oCmXQogKi8KZDMuZ2VvbS52b3Jvbm9pID0gZnVuY3Rpb24odmVydGljZXMpIHsKICB2YXIgcG9seWdvbnMgPSB2ZXJ0aWNlcy5tYXAoZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7CgogIGQzX3Zvcm9ub2lfdGVzc2VsbGF0ZSh2ZXJ0aWNlcywgZnVuY3Rpb24oZSkgewogICAgdmFyIHMxLAogICAgICAgIHMyLAogICAgICAgIHgxLAogICAgICAgIHgyLAogICAgICAgIHkxLAogICAgICAgIHkyOwogICAgaWYgKGUuYSA9PT0gMSAmJiBlLmIgPj0gMCkgewogICAgICBzMSA9IGUuZXAucjsKICAgICAgczIgPSBlLmVwLmw7CiAgICB9IGVsc2UgewogICAgICBzMSA9IGUuZXAubDsKICAgICAgczIgPSBlLmVwLnI7CiAgICB9CiAgICBpZiAoZS5hID09PSAxKSB7CiAgICAgIHkxID0gczEgPyBzMS55IDogLTFlNjsKICAgICAgeDEgPSBlLmMgLSBlLmIgKiB5MTsKICAgICAgeTIgPSBzMiA/IHMyLnkgOiAxZTY7CiAgICAgIHgyID0gZS5jIC0gZS5iICogeTI7CiAgICB9IGVsc2UgewogICAgICB4MSA9IHMxID8gczEueCA6IC0xZTY7CiAgICAgIHkxID0gZS5jIC0gZS5hICogeDE7CiAgICAgIHgyID0gczIgPyBzMi54IDogMWU2OwogICAgICB5MiA9IGUuYyAtIGUuYSAqIHgyOwogICAgfQogICAgdmFyIHYxID0gW3gxLCB5MV0sCiAgICAgICAgdjIgPSBbeDIsIHkyXTsKICAgIHBvbHlnb25zW2UucmVnaW9uLmwuaW5kZXhdLnB1c2godjEsIHYyKTsKICAgIHBvbHlnb25zW2UucmVnaW9uLnIuaW5kZXhdLnB1c2godjEsIHYyKTsKICB9KTsKCiAgLy8gUmVjb25uZWN0IHRoZSBwb2x5Z29uIHNlZ21lbnRzIGludG8gY291bnRlcmNsb2Nrd2lzZSBsb29wcy4KICByZXR1cm4gcG9seWdvbnMubWFwKGZ1bmN0aW9uKHBvbHlnb24sIGkpIHsKICAgIHZhciBjeCA9IHZlcnRpY2VzW2ldWzBdLAogICAgICAgIGN5ID0gdmVydGljZXNbaV1bMV07CiAgICBwb2x5Z29uLmZvckVhY2goZnVuY3Rpb24odikgewogICAgICB2LmFuZ2xlID0gTWF0aC5hdGFuMih2WzBdIC0gY3gsIHZbMV0gLSBjeSk7CiAgICB9KTsKICAgIHJldHVybiBwb2x5Z29uLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICByZXR1cm4gYS5hbmdsZSAtIGIuYW5nbGU7CiAgICB9KS5maWx0ZXIoZnVuY3Rpb24oZCwgaSkgewogICAgICByZXR1cm4gIWkgfHwgKGQuYW5nbGUgLSBwb2x5Z29uW2kgLSAxXS5hbmdsZSA+IDFlLTEwKTsKICAgIH0pOwogIH0pOwp9OwoKdmFyIGQzX3Zvcm9ub2lfb3Bwb3NpdGUgPSB7ImwiOiAiciIsICJyIjogImwifTsKCmZ1bmN0aW9uIGQzX3Zvcm9ub2lfdGVzc2VsbGF0ZSh2ZXJ0aWNlcywgY2FsbGJhY2spIHsKCiAgdmFyIFNpdGVzID0gewogICAgbGlzdDogdmVydGljZXMKICAgICAgLm1hcChmdW5jdGlvbih2LCBpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGluZGV4OiBpLAogICAgICAgICAgeDogdlswXSwKICAgICAgICAgIHk6IHZbMV0KICAgICAgICB9OwogICAgICB9KQogICAgICAuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEueSA8IGIueSA/IC0xCiAgICAgICAgICA6IGEueSA+IGIueSA/IDEKICAgICAgICAgIDogYS54IDwgYi54ID8gLTEKICAgICAgICAgIDogYS54ID4gYi54ID8gMQogICAgICAgICAgOiAwOwogICAgICB9KSwKICAgIGJvdHRvbVNpdGU6IG51bGwKICB9OwoKICB2YXIgRWRnZUxpc3QgPSB7CiAgICBsaXN0OiBbXSwKICAgIGxlZnRFbmQ6IG51bGwsCiAgICByaWdodEVuZDogbnVsbCwKCiAgICBpbml0OiBmdW5jdGlvbigpIHsKICAgICAgRWRnZUxpc3QubGVmdEVuZCA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKG51bGwsICJsIik7CiAgICAgIEVkZ2VMaXN0LnJpZ2h0RW5kID0gRWRnZUxpc3QuY3JlYXRlSGFsZkVkZ2UobnVsbCwgImwiKTsKICAgICAgRWRnZUxpc3QubGVmdEVuZC5yID0gRWRnZUxpc3QucmlnaHRFbmQ7CiAgICAgIEVkZ2VMaXN0LnJpZ2h0RW5kLmwgPSBFZGdlTGlzdC5sZWZ0RW5kOwogICAgICBFZGdlTGlzdC5saXN0LnVuc2hpZnQoRWRnZUxpc3QubGVmdEVuZCwgRWRnZUxpc3QucmlnaHRFbmQpOwogICAgfSwKCiAgICBjcmVhdGVIYWxmRWRnZTogZnVuY3Rpb24oZWRnZSwgc2lkZSkgewogICAgICByZXR1cm4gewogICAgICAgIGVkZ2U6IGVkZ2UsCiAgICAgICAgc2lkZTogc2lkZSwKICAgICAgICB2ZXJ0ZXg6IG51bGwsCiAgICAgICAgImwiOiBudWxsLAogICAgICAgICJyIjogbnVsbAogICAgICB9OwogICAgfSwKCiAgICBpbnNlcnQ6IGZ1bmN0aW9uKGxiLCBoZSkgewogICAgICBoZS5sID0gbGI7CiAgICAgIGhlLnIgPSBsYi5yOwogICAgICBsYi5yLmwgPSBoZTsKICAgICAgbGIuciA9IGhlOwogICAgfSwKCiAgICBsZWZ0Qm91bmQ6IGZ1bmN0aW9uKHApIHsKICAgICAgdmFyIGhlID0gRWRnZUxpc3QubGVmdEVuZDsKICAgICAgZG8gewogICAgICAgIGhlID0gaGUucjsKICAgICAgfSB3aGlsZSAoaGUgIT0gRWRnZUxpc3QucmlnaHRFbmQgJiYgR2VvbS5yaWdodE9mKGhlLCBwKSk7CiAgICAgIGhlID0gaGUubDsKICAgICAgcmV0dXJuIGhlOwogICAgfSwKCiAgICBkZWw6IGZ1bmN0aW9uKGhlKSB7CiAgICAgIGhlLmwuciA9IGhlLnI7CiAgICAgIGhlLnIubCA9IGhlLmw7CiAgICAgIGhlLmVkZ2UgPSBudWxsOwogICAgfSwKCiAgICByaWdodDogZnVuY3Rpb24oaGUpIHsKICAgICAgcmV0dXJuIGhlLnI7CiAgICB9LAoKICAgIGxlZnQ6IGZ1bmN0aW9uKGhlKSB7CiAgICAgIHJldHVybiBoZS5sOwogICAgfSwKCiAgICBsZWZ0UmVnaW9uOiBmdW5jdGlvbihoZSkgewogICAgICByZXR1cm4gaGUuZWRnZSA9PSBudWxsCiAgICAgICAgICA/IFNpdGVzLmJvdHRvbVNpdGUKICAgICAgICAgIDogaGUuZWRnZS5yZWdpb25baGUuc2lkZV07CiAgICB9LAoKICAgIHJpZ2h0UmVnaW9uOiBmdW5jdGlvbihoZSkgewogICAgICByZXR1cm4gaGUuZWRnZSA9PSBudWxsCiAgICAgICAgICA/IFNpdGVzLmJvdHRvbVNpdGUKICAgICAgICAgIDogaGUuZWRnZS5yZWdpb25bZDNfdm9yb25vaV9vcHBvc2l0ZVtoZS5zaWRlXV07CiAgICB9CiAgfTsKCiAgdmFyIEdlb20gPSB7CgogICAgYmlzZWN0OiBmdW5jdGlvbihzMSwgczIpIHsKICAgICAgdmFyIG5ld0VkZ2UgPSB7CiAgICAgICAgcmVnaW9uOiB7ImwiOiBzMSwgInIiOiBzMn0sCiAgICAgICAgZXA6IHsibCI6IG51bGwsICJyIjogbnVsbH0KICAgICAgfTsKCiAgICAgIHZhciBkeCA9IHMyLnggLSBzMS54LAogICAgICAgICAgZHkgPSBzMi55IC0gczEueSwKICAgICAgICAgIGFkeCA9IGR4ID4gMCA/IGR4IDogLWR4LAogICAgICAgICAgYWR5ID0gZHkgPiAwID8gZHkgOiAtZHk7CgogICAgICBuZXdFZGdlLmMgPSBzMS54ICogZHggKyBzMS55ICogZHkKICAgICAgICAgICsgKGR4ICogZHggKyBkeSAqIGR5KSAqIC41OwoKICAgICAgaWYgKGFkeCA+IGFkeSkgewogICAgICAgIG5ld0VkZ2UuYSA9IDE7CiAgICAgICAgbmV3RWRnZS5iID0gZHkgLyBkeDsKICAgICAgICBuZXdFZGdlLmMgLz0gZHg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3RWRnZS5iID0gMTsKICAgICAgICBuZXdFZGdlLmEgPSBkeCAvIGR5OwogICAgICAgIG5ld0VkZ2UuYyAvPSBkeTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ld0VkZ2U7CiAgICB9LAoKICAgIGludGVyc2VjdDogZnVuY3Rpb24oZWwxLCBlbDIpIHsKICAgICAgdmFyIGUxID0gZWwxLmVkZ2UsCiAgICAgICAgICBlMiA9IGVsMi5lZGdlOwogICAgICBpZiAoIWUxIHx8ICFlMiB8fCAoZTEucmVnaW9uLnIgPT0gZTIucmVnaW9uLnIpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdmFyIGQgPSAoZTEuYSAqIGUyLmIpIC0gKGUxLmIgKiBlMi5hKTsKICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtMTApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB2YXIgeGludCA9IChlMS5jICogZTIuYiAtIGUyLmMgKiBlMS5iKSAvIGQsCiAgICAgICAgICB5aW50ID0gKGUyLmMgKiBlMS5hIC0gZTEuYyAqIGUyLmEpIC8gZCwKICAgICAgICAgIGUxciA9IGUxLnJlZ2lvbi5yLAogICAgICAgICAgZTJyID0gZTIucmVnaW9uLnIsCiAgICAgICAgICBlbCwKICAgICAgICAgIGU7CiAgICAgIGlmICgoZTFyLnkgPCBlMnIueSkgfHwKICAgICAgICAgKGUxci55ID09IGUyci55ICYmIGUxci54IDwgZTJyLngpKSB7CiAgICAgICAgZWwgPSBlbDE7CiAgICAgICAgZSA9IGUxOwogICAgICB9IGVsc2UgewogICAgICAgIGVsID0gZWwyOwogICAgICAgIGUgPSBlMjsKICAgICAgfQogICAgICB2YXIgcmlnaHRPZlNpdGUgPSAoeGludCA+PSBlLnJlZ2lvbi5yLngpOwogICAgICBpZiAoKHJpZ2h0T2ZTaXRlICYmIChlbC5zaWRlID09PSAibCIpKSB8fAogICAgICAgICghcmlnaHRPZlNpdGUgJiYgKGVsLnNpZGUgPT09ICJyIikpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICB4OiB4aW50LAogICAgICAgIHk6IHlpbnQKICAgICAgfTsKICAgIH0sCgogICAgcmlnaHRPZjogZnVuY3Rpb24oaGUsIHApIHsKICAgICAgdmFyIGUgPSBoZS5lZGdlLAogICAgICAgICAgdG9wc2l0ZSA9IGUucmVnaW9uLnIsCiAgICAgICAgICByaWdodE9mU2l0ZSA9IChwLnggPiB0b3BzaXRlLngpOwoKICAgICAgaWYgKHJpZ2h0T2ZTaXRlICYmIChoZS5zaWRlID09PSAibCIpKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgaWYgKCFyaWdodE9mU2l0ZSAmJiAoaGUuc2lkZSA9PT0gInIiKSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGlmIChlLmEgPT09IDEpIHsKICAgICAgICB2YXIgZHlwID0gcC55IC0gdG9wc2l0ZS55LAogICAgICAgICAgICBkeHAgPSBwLnggLSB0b3BzaXRlLngsCiAgICAgICAgICAgIGZhc3QgPSAwLAogICAgICAgICAgICBhYm92ZSA9IDA7CgogICAgICAgIGlmICgoIXJpZ2h0T2ZTaXRlICYmIChlLmIgPCAwKSkgfHwKICAgICAgICAgIChyaWdodE9mU2l0ZSAmJiAoZS5iID49IDApKSkgewogICAgICAgICAgYWJvdmUgPSBmYXN0ID0gKGR5cCA+PSBlLmIgKiBkeHApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhYm92ZSA9ICgocC54ICsgcC55ICogZS5iKSA+IGUuYyk7CiAgICAgICAgICBpZiAoZS5iIDwgMCkgewogICAgICAgICAgICBhYm92ZSA9ICFhYm92ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghYWJvdmUpIHsKICAgICAgICAgICAgZmFzdCA9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZmFzdCkgewogICAgICAgICAgdmFyIGR4cyA9IHRvcHNpdGUueCAtIGUucmVnaW9uLmwueDsKICAgICAgICAgIGFib3ZlID0gKGUuYiAqIChkeHAgKiBkeHAgLSBkeXAgKiBkeXApKSA8CiAgICAgICAgICAgIChkeHMgKiBkeXAgKiAoMSArIDIgKiBkeHAgLyBkeHMgKyBlLmIgKiBlLmIpKTsKCiAgICAgICAgICBpZiAoZS5iIDwgMCkgewogICAgICAgICAgICBhYm92ZSA9ICFhYm92ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSAvKiBlLmIgPT0gMSAqLyB7CiAgICAgICAgdmFyIHlsID0gZS5jIC0gZS5hICogcC54LAogICAgICAgICAgICB0MSA9IHAueSAtIHlsLAogICAgICAgICAgICB0MiA9IHAueCAtIHRvcHNpdGUueCwKICAgICAgICAgICAgdDMgPSB5bCAtIHRvcHNpdGUueTsKCiAgICAgICAgYWJvdmUgPSAodDEgKiB0MSkgPiAodDIgKiB0MiArIHQzICogdDMpOwogICAgICB9CiAgICAgIHJldHVybiBoZS5zaWRlID09PSAibCIgPyBhYm92ZSA6ICFhYm92ZTsKICAgIH0sCgogICAgZW5kUG9pbnQ6IGZ1bmN0aW9uKGVkZ2UsIHNpZGUsIHNpdGUpIHsKICAgICAgZWRnZS5lcFtzaWRlXSA9IHNpdGU7CiAgICAgIGlmICghZWRnZS5lcFtkM192b3Jvbm9pX29wcG9zaXRlW3NpZGVdXSkgcmV0dXJuOwogICAgICBjYWxsYmFjayhlZGdlKTsKICAgIH0sCgogICAgZGlzdGFuY2U6IGZ1bmN0aW9uKHMsIHQpIHsKICAgICAgdmFyIGR4ID0gcy54IC0gdC54LAogICAgICAgICAgZHkgPSBzLnkgLSB0Lnk7CiAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogICAgfQogIH07CgogIHZhciBFdmVudFF1ZXVlID0gewogICAgbGlzdDogW10sCgogICAgaW5zZXJ0OiBmdW5jdGlvbihoZSwgc2l0ZSwgb2Zmc2V0KSB7CiAgICAgIGhlLnZlcnRleCA9IHNpdGU7CiAgICAgIGhlLnlzdGFyID0gc2l0ZS55ICsgb2Zmc2V0OwogICAgICBmb3IgKHZhciBpPTAsIGxpc3Q9RXZlbnRRdWV1ZS5saXN0LCBsPWxpc3QubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgIHZhciBuZXh0ID0gbGlzdFtpXTsKICAgICAgICBpZiAoaGUueXN0YXIgPiBuZXh0LnlzdGFyIHx8CiAgICAgICAgICAoaGUueXN0YXIgPT0gbmV4dC55c3RhciAmJgogICAgICAgICAgc2l0ZS54ID4gbmV4dC52ZXJ0ZXgueCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGlzdC5zcGxpY2UoaSwgMCwgaGUpOwogICAgfSwKCiAgICBkZWw6IGZ1bmN0aW9uKGhlKSB7CiAgICAgIGZvciAodmFyIGk9MCwgbHM9RXZlbnRRdWV1ZS5saXN0LCBsPWxzLmxlbmd0aDsgaTxsICYmIChsc1tpXSAhPSBoZSk7ICsraSkge30KICAgICAgbHMuc3BsaWNlKGksIDEpOwogICAgfSwKCiAgICBlbXB0eTogZnVuY3Rpb24oKSB7IHJldHVybiBFdmVudFF1ZXVlLmxpc3QubGVuZ3RoID09PSAwOyB9LAoKICAgIG5leHRFdmVudDogZnVuY3Rpb24oaGUpIHsKICAgICAgZm9yICh2YXIgaT0wLCBscz1FdmVudFF1ZXVlLmxpc3QsIGw9bHMubGVuZ3RoOyBpPGw7ICsraSkgewogICAgICAgIGlmIChsc1tpXSA9PSBoZSkgcmV0dXJuIGxzW2krMV07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIG1pbjogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlbGVtID0gRXZlbnRRdWV1ZS5saXN0WzBdOwogICAgICByZXR1cm4gewogICAgICAgIHg6IGVsZW0udmVydGV4LngsCiAgICAgICAgeTogZWxlbS55c3RhcgogICAgICB9OwogICAgfSwKCiAgICBleHRyYWN0TWluOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIEV2ZW50UXVldWUubGlzdC5zaGlmdCgpOwogICAgfQogIH07CgogIEVkZ2VMaXN0LmluaXQoKTsKICBTaXRlcy5ib3R0b21TaXRlID0gU2l0ZXMubGlzdC5zaGlmdCgpOwoKICB2YXIgbmV3U2l0ZSA9IFNpdGVzLmxpc3Quc2hpZnQoKSwgbmV3SW50U3RhcjsKICB2YXIgbGJuZCwgcmJuZCwgbGxibmQsIHJyYm5kLCBiaXNlY3RvcjsKICB2YXIgYm90LCB0b3AsIHRlbXAsIHAsIHY7CiAgdmFyIGUsIHBtOwoKICB3aGlsZSAodHJ1ZSkgewogICAgaWYgKCFFdmVudFF1ZXVlLmVtcHR5KCkpIHsKICAgICAgbmV3SW50U3RhciA9IEV2ZW50UXVldWUubWluKCk7CiAgICB9CiAgICBpZiAobmV3U2l0ZSAmJiAoRXZlbnRRdWV1ZS5lbXB0eSgpCiAgICAgIHx8IG5ld1NpdGUueSA8IG5ld0ludFN0YXIueQogICAgICB8fCAobmV3U2l0ZS55ID09IG5ld0ludFN0YXIueQogICAgICAmJiBuZXdTaXRlLnggPCBuZXdJbnRTdGFyLngpKSkgeyAvL25ldyBzaXRlIGlzIHNtYWxsZXN0CiAgICAgIGxibmQgPSBFZGdlTGlzdC5sZWZ0Qm91bmQobmV3U2l0ZSk7CiAgICAgIHJibmQgPSBFZGdlTGlzdC5yaWdodChsYm5kKTsKICAgICAgYm90ID0gRWRnZUxpc3QucmlnaHRSZWdpb24obGJuZCk7CiAgICAgIGUgPSBHZW9tLmJpc2VjdChib3QsIG5ld1NpdGUpOwogICAgICBiaXNlY3RvciA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKGUsICJsIik7CiAgICAgIEVkZ2VMaXN0Lmluc2VydChsYm5kLCBiaXNlY3Rvcik7CiAgICAgIHAgPSBHZW9tLmludGVyc2VjdChsYm5kLCBiaXNlY3Rvcik7CiAgICAgIGlmIChwKSB7CiAgICAgICAgRXZlbnRRdWV1ZS5kZWwobGJuZCk7CiAgICAgICAgRXZlbnRRdWV1ZS5pbnNlcnQobGJuZCwgcCwgR2VvbS5kaXN0YW5jZShwLCBuZXdTaXRlKSk7CiAgICAgIH0KICAgICAgbGJuZCA9IGJpc2VjdG9yOwogICAgICBiaXNlY3RvciA9IEVkZ2VMaXN0LmNyZWF0ZUhhbGZFZGdlKGUsICJyIik7CiAgICAgIEVkZ2VMaXN0Lmluc2VydChsYm5kLCBiaXNlY3Rvcik7CiAgICAgIHAgPSBHZW9tLmludGVyc2VjdChiaXNlY3RvciwgcmJuZCk7CiAgICAgIGlmIChwKSB7CiAgICAgICAgRXZlbnRRdWV1ZS5pbnNlcnQoYmlzZWN0b3IsIHAsIEdlb20uZGlzdGFuY2UocCwgbmV3U2l0ZSkpOwogICAgICB9CiAgICAgIG5ld1NpdGUgPSBTaXRlcy5saXN0LnNoaWZ0KCk7CiAgICB9IGVsc2UgaWYgKCFFdmVudFF1ZXVlLmVtcHR5KCkpIHsgLy9pbnRlcnNlY3Rpb24gaXMgc21hbGxlc3QKICAgICAgbGJuZCA9IEV2ZW50UXVldWUuZXh0cmFjdE1pbigpOwogICAgICBsbGJuZCA9IEVkZ2VMaXN0LmxlZnQobGJuZCk7CiAgICAgIHJibmQgPSBFZGdlTGlzdC5yaWdodChsYm5kKTsKICAgICAgcnJibmQgPSBFZGdlTGlzdC5yaWdodChyYm5kKTsKICAgICAgYm90ID0gRWRnZUxpc3QubGVmdFJlZ2lvbihsYm5kKTsKICAgICAgdG9wID0gRWRnZUxpc3QucmlnaHRSZWdpb24ocmJuZCk7CiAgICAgIHYgPSBsYm5kLnZlcnRleDsKICAgICAgR2VvbS5lbmRQb2ludChsYm5kLmVkZ2UsIGxibmQuc2lkZSwgdik7CiAgICAgIEdlb20uZW5kUG9pbnQocmJuZC5lZGdlLCByYm5kLnNpZGUsIHYpOwogICAgICBFZGdlTGlzdC5kZWwobGJuZCk7CiAgICAgIEV2ZW50UXVldWUuZGVsKHJibmQpOwogICAgICBFZGdlTGlzdC5kZWwocmJuZCk7CiAgICAgIHBtID0gImwiOwogICAgICBpZiAoYm90LnkgPiB0b3AueSkgewogICAgICAgIHRlbXAgPSBib3Q7CiAgICAgICAgYm90ID0gdG9wOwogICAgICAgIHRvcCA9IHRlbXA7CiAgICAgICAgcG0gPSAiciI7CiAgICAgIH0KICAgICAgZSA9IEdlb20uYmlzZWN0KGJvdCwgdG9wKTsKICAgICAgYmlzZWN0b3IgPSBFZGdlTGlzdC5jcmVhdGVIYWxmRWRnZShlLCBwbSk7CiAgICAgIEVkZ2VMaXN0Lmluc2VydChsbGJuZCwgYmlzZWN0b3IpOwogICAgICBHZW9tLmVuZFBvaW50KGUsIGQzX3Zvcm9ub2lfb3Bwb3NpdGVbcG1dLCB2KTsKICAgICAgcCA9IEdlb20uaW50ZXJzZWN0KGxsYm5kLCBiaXNlY3Rvcik7CiAgICAgIGlmIChwKSB7CiAgICAgICAgRXZlbnRRdWV1ZS5kZWwobGxibmQpOwogICAgICAgIEV2ZW50UXVldWUuaW5zZXJ0KGxsYm5kLCBwLCBHZW9tLmRpc3RhbmNlKHAsIGJvdCkpOwogICAgICB9CiAgICAgIHAgPSBHZW9tLmludGVyc2VjdChiaXNlY3RvciwgcnJibmQpOwogICAgICBpZiAocCkgewogICAgICAgIEV2ZW50UXVldWUuaW5zZXJ0KGJpc2VjdG9yLCBwLCBHZW9tLmRpc3RhbmNlKHAsIGJvdCkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9Ly9lbmQgd2hpbGUKCiAgZm9yIChsYm5kID0gRWRnZUxpc3QucmlnaHQoRWRnZUxpc3QubGVmdEVuZCk7CiAgICAgIGxibmQgIT0gRWRnZUxpc3QucmlnaHRFbmQ7CiAgICAgIGxibmQgPSBFZGdlTGlzdC5yaWdodChsYm5kKSkgewogICAgY2FsbGJhY2sobGJuZC5lZGdlKTsKICB9Cn0KLyoqCiogQHBhcmFtIHZlcnRpY2VzIFtbeDEsIHkxXSwgW3gyLCB5Ml0sIOKApl0KKiBAcmV0dXJucyB0cmlhbmdsZXMgW1tbeDEsIHkxXSwgW3gyLCB5Ml0sIFt4MywgeTNdXSwg4oCmXQogKi8KZDMuZ2VvbS5kZWxhdW5heSA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7CiAgdmFyIGVkZ2VzID0gdmVydGljZXMubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pLAogICAgICB0cmlhbmdsZXMgPSBbXTsKCiAgLy8gVXNlIHRoZSBWb3Jvbm9pIHRlc3NlbGxhdGlvbiB0byBkZXRlcm1pbmUgRGVsYXVuYXkgZWRnZXMuCiAgZDNfdm9yb25vaV90ZXNzZWxsYXRlKHZlcnRpY2VzLCBmdW5jdGlvbihlKSB7CiAgICBlZGdlc1tlLnJlZ2lvbi5sLmluZGV4XS5wdXNoKHZlcnRpY2VzW2UucmVnaW9uLnIuaW5kZXhdKTsKICB9KTsKCiAgLy8gUmVjb25uZWN0IHRoZSBlZGdlcyBpbnRvIGNvdW50ZXJjbG9ja3dpc2UgdHJpYW5nbGVzLgogIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZWRnZSwgaSkgewogICAgdmFyIHYgPSB2ZXJ0aWNlc1tpXSwKICAgICAgICBjeCA9IHZbMF0sCiAgICAgICAgY3kgPSB2WzFdOwogICAgZWRnZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsKICAgICAgdi5hbmdsZSA9IE1hdGguYXRhbjIodlswXSAtIGN4LCB2WzFdIC0gY3kpOwogICAgfSk7CiAgICBlZGdlLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICByZXR1cm4gYS5hbmdsZSAtIGIuYW5nbGU7CiAgICB9KTsKICAgIGZvciAodmFyIGogPSAwLCBtID0gZWRnZS5sZW5ndGggLSAxOyBqIDwgbTsgaisrKSB7CiAgICAgIHRyaWFuZ2xlcy5wdXNoKFt2LCBlZGdlW2pdLCBlZGdlW2ogKyAxXV0pOwogICAgfQogIH0pOwoKICByZXR1cm4gdHJpYW5nbGVzOwp9OwovLyBDb25zdHJ1Y3RzIGEgbmV3IHF1YWR0cmVlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIHBvaW50cy4gQSBxdWFkdHJlZSBpcyBhCi8vIHR3by1kaW1lbnNpb25hbCByZWN1cnNpdmUgc3BhdGlhbCBzdWJkaXZpc2lvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi8vIHNxdWFyZSBwYXJ0aXRpb25zLCBkaXZpZGluZyBlYWNoIHNxdWFyZSBpbnRvIGZvdXIgZXF1YWxseS1zaXplZCBzcXVhcmVzLiBFYWNoCi8vIHBvaW50IGV4aXN0cyBpbiBhIHVuaXF1ZSBub2RlOyBpZiBtdWx0aXBsZSBwb2ludHMgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uLAovLyBzb21lIHBvaW50cyBtYXkgYmUgc3RvcmVkIG9uIGludGVybmFsIG5vZGVzIHJhdGhlciB0aGFuIGxlYWYgbm9kZXMuIFF1YWR0cmVlcwovLyBjYW4gYmUgdXNlZCB0byBhY2NlbGVyYXRlIHZhcmlvdXMgc3BhdGlhbCBvcGVyYXRpb25zLCBzdWNoIGFzIHRoZSBCYXJuZXMtSHV0Ci8vIGFwcHJveGltYXRpb24gZm9yIGNvbXB1dGluZyBuLWJvZHkgZm9yY2VzLCBvciBjb2xsaXNpb24gZGV0ZWN0aW9uLgpkMy5nZW9tLnF1YWR0cmVlID0gZnVuY3Rpb24ocG9pbnRzLCB4MSwgeTEsIHgyLCB5MikgewogIHZhciBwLAogICAgICBpID0gLTEsCiAgICAgIG4gPSBwb2ludHMubGVuZ3RoOwoKICAvLyBUeXBlIGNvbnZlcnNpb24gZm9yIGRlcHJlY2F0ZWQgQVBJLgogIGlmIChuICYmIGlzTmFOKHBvaW50c1swXS54KSkgcG9pbnRzID0gcG9pbnRzLm1hcChkM19nZW9tX3F1YWR0cmVlUG9pbnQpOwoKICAvLyBBbGxvdyBib3VuZHMgdG8gYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA1KSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykgewogICAgICB5MiA9IHgyID0geTE7CiAgICAgIHkxID0geDE7CiAgICB9IGVsc2UgewogICAgICB4MSA9IHkxID0gSW5maW5pdHk7CiAgICAgIHgyID0geTIgPSAtSW5maW5pdHk7CgogICAgICAvLyBDb21wdXRlIGJvdW5kcy4KICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBwID0gcG9pbnRzW2ldOwogICAgICAgIGlmIChwLnggPCB4MSkgeDEgPSBwLng7CiAgICAgICAgaWYgKHAueSA8IHkxKSB5MSA9IHAueTsKICAgICAgICBpZiAocC54ID4geDIpIHgyID0gcC54OwogICAgICAgIGlmIChwLnkgPiB5MikgeTIgPSBwLnk7CiAgICAgIH0KCiAgICAgIC8vIFNxdWFyaWZ5IHRoZSBib3VuZHMuCiAgICAgIHZhciBkeCA9IHgyIC0geDEsCiAgICAgICAgICBkeSA9IHkyIC0geTE7CiAgICAgIGlmIChkeCA+IGR5KSB5MiA9IHkxICsgZHg7CiAgICAgIGVsc2UgeDIgPSB4MSArIGR5OwogICAgfQogIH0KCiAgLy8gUmVjdXJzaXZlbHkgaW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBvaW50IHAgYXQgdGhlIG5vZGUgbiBvciBvbmUgb2YgaXRzCiAgLy8gZGVzY2VuZGFudHMuIFRoZSBib3VuZHMgYXJlIGRlZmluZWQgYnkgW3gxLCB4Ml0gYW5kIFt5MSwgeTJdLgogIGZ1bmN0aW9uIGluc2VydChuLCBwLCB4MSwgeTEsIHgyLCB5MikgewogICAgaWYgKGlzTmFOKHAueCkgfHwgaXNOYU4ocC55KSkgcmV0dXJuOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHMKICAgIGlmIChuLmxlYWYpIHsKICAgICAgdmFyIHYgPSBuLnBvaW50OwogICAgICBpZiAodikgewogICAgICAgIC8vIElmIHRoZSBwb2ludCBhdCB0aGlzIGxlYWYgbm9kZSBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgbmV3CiAgICAgICAgLy8gcG9pbnQgd2UgYXJlIGFkZGluZywgd2UgbGVhdmUgdGhlIHBvaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgICAvLyBpbnRlcm5hbCBub2RlIHdoaWxlIGFkZGluZyB0aGUgbmV3IHBvaW50IHRvIGEgY2hpbGQgbm9kZS4gVGhpcwogICAgICAgIC8vIGF2b2lkcyBpbmZpbml0ZSByZWN1cnNpb24uCiAgICAgICAgaWYgKChNYXRoLmFicyh2LnggLSBwLngpICsgTWF0aC5hYnModi55IC0gcC55KSkgPCAuMDEpIHsKICAgICAgICAgIGluc2VydENoaWxkKG4sIHAsIHgxLCB5MSwgeDIsIHkyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbi5wb2ludCA9IG51bGw7CiAgICAgICAgICBpbnNlcnRDaGlsZChuLCB2LCB4MSwgeTEsIHgyLCB5Mik7CiAgICAgICAgICBpbnNlcnRDaGlsZChuLCBwLCB4MSwgeTEsIHgyLCB5Mik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG4ucG9pbnQgPSBwOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpbnNlcnRDaGlsZChuLCBwLCB4MSwgeTEsIHgyLCB5Mik7CiAgICB9CiAgfQoKICAvLyBSZWN1cnNpdmVseSBpbnNlcnRzIHRoZSBzcGVjaWZpZWQgcG9pbnQgcCBpbnRvIGEgZGVzY2VuZGFudCBvZiBub2RlIG4uIFRoZQogIC8vIGJvdW5kcyBhcmUgZGVmaW5lZCBieSBbeDEsIHgyXSBhbmQgW3kxLCB5Ml0uCiAgZnVuY3Rpb24gaW5zZXJ0Q2hpbGQobiwgcCwgeDEsIHkxLCB4MiwgeTIpIHsKICAgIC8vIENvbXB1dGUgdGhlIHNwbGl0IHBvaW50LCBhbmQgdGhlIHF1YWRyYW50IGluIHdoaWNoIHRvIGluc2VydCBwLgogICAgdmFyIHN4ID0gKHgxICsgeDIpICogLjUsCiAgICAgICAgc3kgPSAoeTEgKyB5MikgKiAuNSwKICAgICAgICByaWdodCA9IHAueCA+PSBzeCwKICAgICAgICBib3R0b20gPSBwLnkgPj0gc3ksCiAgICAgICAgaSA9IChib3R0b20gPDwgMSkgKyByaWdodDsKCiAgICAvLyBSZWN1cnNpdmVseSBpbnNlcnQgaW50byB0aGUgY2hpbGQgbm9kZS4KICAgIG4ubGVhZiA9IGZhbHNlOwogICAgbiA9IG4ubm9kZXNbaV0gfHwgKG4ubm9kZXNbaV0gPSBkM19nZW9tX3F1YWR0cmVlTm9kZSgpKTsKCiAgICAvLyBVcGRhdGUgdGhlIGJvdW5kcyBhcyB3ZSByZWN1cnNlLgogICAgaWYgKHJpZ2h0KSB4MSA9IHN4OyBlbHNlIHgyID0gc3g7CiAgICBpZiAoYm90dG9tKSB5MSA9IHN5OyBlbHNlIHkyID0gc3k7CiAgICBpbnNlcnQobiwgcCwgeDEsIHkxLCB4MiwgeTIpOwogIH0KCiAgLy8gQ3JlYXRlIHRoZSByb290IG5vZGUuCiAgdmFyIHJvb3QgPSBkM19nZW9tX3F1YWR0cmVlTm9kZSgpOwoKICByb290LmFkZCA9IGZ1bmN0aW9uKHApIHsKICAgIGluc2VydChyb290LCBwLCB4MSwgeTEsIHgyLCB5Mik7CiAgfTsKCiAgcm9vdC52aXNpdCA9IGZ1bmN0aW9uKGYpIHsKICAgIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCByb290LCB4MSwgeTEsIHgyLCB5Mik7CiAgfTsKCiAgLy8gSW5zZXJ0IGFsbCBwb2ludHMuCiAgcG9pbnRzLmZvckVhY2gocm9vdC5hZGQpOwogIHJldHVybiByb290Owp9OwoKZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSB7CiAgcmV0dXJuIHsKICAgIGxlYWY6IHRydWUsCiAgICBub2RlczogW10sCiAgICBwb2ludDogbnVsbAogIH07Cn0KCmZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBub2RlLCB4MSwgeTEsIHgyLCB5MikgewogIGlmICghZihub2RlLCB4MSwgeTEsIHgyLCB5MikpIHsKICAgIHZhciBzeCA9ICh4MSArIHgyKSAqIC41LAogICAgICAgIHN5ID0gKHkxICsgeTIpICogLjUsCiAgICAgICAgY2hpbGRyZW4gPSBub2RlLm5vZGVzOwogICAgaWYgKGNoaWxkcmVuWzBdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMF0sIHgxLCB5MSwgc3gsIHN5KTsKICAgIGlmIChjaGlsZHJlblsxXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzFdLCBzeCwgeTEsIHgyLCBzeSk7CiAgICBpZiAoY2hpbGRyZW5bMl0pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblsyXSwgeDEsIHN5LCBzeCwgeTIpOwogICAgaWYgKGNoaWxkcmVuWzNdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bM10sIHN4LCBzeSwgeDIsIHkyKTsKICB9Cn0KCmZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVQb2ludChwKSB7CiAgcmV0dXJuIHsKICAgIHg6IHBbMF0sCiAgICB5OiBwWzFdCiAgfTsKfQpkMy50aW1lID0ge307Cgp2YXIgZDNfdGltZSA9IERhdGU7CgpmdW5jdGlvbiBkM190aW1lX3V0YygpIHsKICB0aGlzLl8gPSBuZXcgRGF0ZShhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICA/IERhdGUuVVRDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKICAgICAgOiBhcmd1bWVudHNbMF0pOwp9CgpkM190aW1lX3V0Yy5wcm90b3R5cGUgPSB7CiAgZ2V0RGF0ZTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDRGF0ZSgpOyB9LAogIGdldERheTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCk7IH0sCiAgZ2V0RnVsbFllYXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCk7IH0sCiAgZ2V0SG91cnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLmdldFVUQ0hvdXJzKCk7IH0sCiAgZ2V0TWlsbGlzZWNvbmRzOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKTsgfSwKICBnZXRNaW51dGVzOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCk7IH0sCiAgZ2V0TW9udGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLmdldFVUQ01vbnRoKCk7IH0sCiAgZ2V0U2Vjb25kczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpOyB9LAogIGdldFRpbWU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLmdldFRpbWUoKTsgfSwKICBnZXRUaW1lem9uZU9mZnNldDogZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9LAogIHZhbHVlT2Y6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fLnZhbHVlT2YoKTsgfSwKICBzZXREYXRlOiBmdW5jdGlvbigpIHsgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sCiAgc2V0RGF5OiBmdW5jdGlvbigpIHsgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKICBzZXRGdWxsWWVhcjogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKICBzZXRIb3VyczogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKICBzZXRNaWxsaXNlY29uZHM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9LAogIHNldE1pbnV0ZXM6IGZ1bmN0aW9uKCkgeyBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKICBzZXRNb250aDogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsgfSwKICBzZXRTZWNvbmRzOiBmdW5jdGlvbigpIHsgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7IH0sCiAgc2V0VGltZTogZnVuY3Rpb24oKSB7IGQzX3RpbWVfcHJvdG90eXBlLnNldFRpbWUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOyB9Cn07Cgp2YXIgZDNfdGltZV9wcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTsKZDMudGltZS5mb3JtYXQgPSBmdW5jdGlvbih0ZW1wbGF0ZSkgewogIHZhciBuID0gdGVtcGxhdGUubGVuZ3RoOwoKICBmdW5jdGlvbiBmb3JtYXQoZGF0ZSkgewogICAgdmFyIHN0cmluZyA9IFtdLAogICAgICAgIGkgPSAtMSwKICAgICAgICBqID0gMCwKICAgICAgICBjLAogICAgICAgIGY7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpZiAodGVtcGxhdGUuY2hhckNvZGVBdChpKSA9PSAzNykgewogICAgICAgIHN0cmluZy5wdXNoKAogICAgICAgICAgICB0ZW1wbGF0ZS5zdWJzdHJpbmcoaiwgaSksCiAgICAgICAgICAgIChmID0gZDNfdGltZV9mb3JtYXRzW2MgPSB0ZW1wbGF0ZS5jaGFyQXQoKytpKV0pCiAgICAgICAgICAgID8gZihkYXRlKSA6IGMpOwogICAgICAgIGogPSBpICsgMTsKICAgICAgfQogICAgfQogICAgc3RyaW5nLnB1c2godGVtcGxhdGUuc3Vic3RyaW5nKGosIGkpKTsKICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7CiAgfQoKICBmb3JtYXQucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHsKICAgIHZhciBkID0ge3k6IDE5MDAsIG06IDAsIGQ6IDEsIEg6IDAsIE06IDAsIFM6IDAsIEw6IDB9LAogICAgICAgIGkgPSBkM190aW1lX3BhcnNlKGQsIHRlbXBsYXRlLCBzdHJpbmcsIDApOwogICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7CgogICAgLy8gVGhlIGFtLXBtIGZsYWcgaXMgMCBmb3IgQU0sIGFuZCAxIGZvciBQTS4KICAgIGlmICgicCIgaW4gZCkgZC5IID0gZC5IICUgMTIgKyBkLnAgKiAxMjsKCiAgICB2YXIgZGF0ZSA9IG5ldyBkM190aW1lKCk7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGQueSwgZC5tLCBkLmQpOwogICAgZGF0ZS5zZXRIb3VycyhkLkgsIGQuTSwgZC5TLCBkLkwpOwogICAgcmV0dXJuIGRhdGU7CiAgfTsKCiAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGVtcGxhdGU7CiAgfTsKCiAgcmV0dXJuIGZvcm1hdDsKfTsKCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2UoZGF0ZSwgdGVtcGxhdGUsIHN0cmluZywgaikgewogIHZhciBjLAogICAgICBwLAogICAgICBpID0gMCwKICAgICAgbiA9IHRlbXBsYXRlLmxlbmd0aCwKICAgICAgbSA9IHN0cmluZy5sZW5ndGg7CiAgd2hpbGUgKGkgPCBuKSB7CiAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7CiAgICBjID0gdGVtcGxhdGUuY2hhckNvZGVBdChpKyspOwogICAgaWYgKGMgPT0gMzcpIHsKICAgICAgcCA9IGQzX3RpbWVfcGFyc2Vyc1t0ZW1wbGF0ZS5jaGFyQXQoaSsrKV07CiAgICAgIGlmICghcCB8fCAoKGogPSBwKGRhdGUsIHN0cmluZywgaikpIDwgMCkpIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICB9CiAgcmV0dXJuIGo7Cn0KCnZhciBkM190aW1lX3pmaWxsMiA9IGQzLmZvcm1hdCgiMDJkIiksCiAgICBkM190aW1lX3pmaWxsMyA9IGQzLmZvcm1hdCgiMDNkIiksCiAgICBkM190aW1lX3pmaWxsNCA9IGQzLmZvcm1hdCgiMDRkIiksCiAgICBkM190aW1lX3NmaWxsMiA9IGQzLmZvcm1hdCgiMmQiKTsKCnZhciBkM190aW1lX2Zvcm1hdHMgPSB7CiAgYTogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV93ZWVrZGF5c1tkLmdldERheSgpXS5zdWJzdHJpbmcoMCwgMyk7IH0sCiAgQTogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV93ZWVrZGF5c1tkLmdldERheSgpXTsgfSwKICBiOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX21vbnRoc1tkLmdldE1vbnRoKCldLnN1YnN0cmluZygwLCAzKTsgfSwKICBCOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX21vbnRoc1tkLmdldE1vbnRoKCldOyB9LAogIGM6IGQzLnRpbWUuZm9ybWF0KCIlYSAlYiAlZSAlSDolTTolUyAlWSIpLAogIGQ6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQuZ2V0RGF0ZSgpKTsgfSwKICBlOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3NmaWxsMihkLmdldERhdGUoKSk7IH0sCiAgSDogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZC5nZXRIb3VycygpKTsgfSwKICBJOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldEhvdXJzKCkgJSAxMiB8fCAxMik7IH0sCiAgajogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDMoMSArIGQzLnRpbWUuZGF5T2ZZZWFyKGQpKTsgfSwKICBMOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMyhkLmdldE1pbGxpc2Vjb25kcygpKTsgfSwKICBtOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldE1vbnRoKCkgKyAxKTsgfSwKICBNOiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldE1pbnV0ZXMoKSk7IH0sCiAgcDogZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRIb3VycygpID49IDEyID8gIlBNIiA6ICJBTSI7IH0sCiAgUzogZnVuY3Rpb24oZCkgeyByZXR1cm4gZDNfdGltZV96ZmlsbDIoZC5nZXRTZWNvbmRzKCkpOyB9LAogIFU6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQzLnRpbWUuc3VuZGF5T2ZZZWFyKGQpKTsgfSwKICB3OiBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldERheSgpOyB9LAogIFc6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGwyKGQzLnRpbWUubW9uZGF5T2ZZZWFyKGQpKTsgfSwKICB4OiBkMy50aW1lLmZvcm1hdCgiJW0vJWQvJXkiKSwKICBYOiBkMy50aW1lLmZvcm1hdCgiJUg6JU06JVMiKSwKICB5OiBmdW5jdGlvbihkKSB7IHJldHVybiBkM190aW1lX3pmaWxsMihkLmdldEZ1bGxZZWFyKCkgJSAxMDApOyB9LAogIFk6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQzX3RpbWVfemZpbGw0KGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwKTsgfSwKICBaOiBkM190aW1lX3pvbmUsCiAgIiUiOiBmdW5jdGlvbihkKSB7IHJldHVybiAiJSI7IH0KfTsKCnZhciBkM190aW1lX3BhcnNlcnMgPSB7CiAgYTogZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYsCiAgQTogZDNfdGltZV9wYXJzZVdlZWtkYXksCiAgYjogZDNfdGltZV9wYXJzZU1vbnRoQWJicmV2LAogIEI6IGQzX3RpbWVfcGFyc2VNb250aCwKICBjOiBkM190aW1lX3BhcnNlTG9jYWxlRnVsbCwKICBkOiBkM190aW1lX3BhcnNlRGF5LAogIGU6IGQzX3RpbWVfcGFyc2VEYXksCiAgSDogZDNfdGltZV9wYXJzZUhvdXIyNCwKICBJOiBkM190aW1lX3BhcnNlSG91cjI0LAogIC8vIGo6IGZ1bmN0aW9uKGQsIHMsIGkpIHsgLypUT0RPIGRheSBvZiB5ZWFyIFswMDEsMzY2XSAqLyByZXR1cm4gaTsgfSwKICBMOiBkM190aW1lX3BhcnNlTWlsbGlzZWNvbmRzLAogIG06IGQzX3RpbWVfcGFyc2VNb250aE51bWJlciwKICBNOiBkM190aW1lX3BhcnNlTWludXRlcywKICBwOiBkM190aW1lX3BhcnNlQW1QbSwKICBTOiBkM190aW1lX3BhcnNlU2Vjb25kcywKICAvLyBVOiBmdW5jdGlvbihkLCBzLCBpKSB7IC8qVE9ETyB3ZWVrIG51bWJlciAoc3VuZGF5KSBbMDAsNTNdICovIHJldHVybiBpOyB9LAogIC8vIHc6IGZ1bmN0aW9uKGQsIHMsIGkpIHsgLypUT0RPIHdlZWtkYXkgWzAsNl0gKi8gcmV0dXJuIGk7IH0sCiAgLy8gVzogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gd2VlayBudW1iZXIgKG1vbmRheSkgWzAwLDUzXSAqLyByZXR1cm4gaTsgfSwKICB4OiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZSwKICBYOiBkM190aW1lX3BhcnNlTG9jYWxlVGltZSwKICB5OiBkM190aW1lX3BhcnNlWWVhciwKICBZOiBkM190aW1lX3BhcnNlRnVsbFllYXIKICAvLyAsCiAgLy8gWjogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gdGltZSB6b25lICovIHJldHVybiBpOyB9LAogIC8vICIlIjogZnVuY3Rpb24oZCwgcywgaSkgeyAvKlRPRE8gbGl0ZXJhbCAlICovIHJldHVybiBpOyB9Cn07CgovLyBOb3RlOiB3ZWVrZGF5IGlzIHZhbGlkYXRlZCwgYnV0IGRvZXMgbm90IHNldCB0aGUgZGF0ZS4KZnVuY3Rpb24gZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgcmV0dXJuIGQzX3RpbWVfd2Vla2RheUFiYnJldlJlLnRlc3Qoc3RyaW5nLnN1YnN0cmluZyhpLCBpICs9IDMpKSA/IGkgOiAtMTsKfQoKLy8gTm90ZTogd2Vla2RheSBpcyB2YWxpZGF0ZWQsIGJ1dCBkb2VzIG5vdCBzZXQgdGhlIGRhdGUuCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5KGRhdGUsIHN0cmluZywgaSkgewogIGQzX3RpbWVfd2Vla2RheVJlLmxhc3RJbmRleCA9IDA7CiAgdmFyIG4gPSBkM190aW1lX3dlZWtkYXlSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDEwKSk7CiAgcmV0dXJuIG4gPyBpICs9IG5bMF0ubGVuZ3RoIDogLTE7Cn0KCnZhciBkM190aW1lX3dlZWtkYXlBYmJyZXZSZSA9IC9eKD86c3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLAogICAgZDNfdGltZV93ZWVrZGF5UmUgPSAvXig/OlN1bmRheXxNb25kYXl8VHVlc2RheXxXZWRuZXNkYXl8VGh1cnNkYXl8RnJpZGF5fFNhdHVyZGF5KS9pOwogICAgZDNfdGltZV93ZWVrZGF5cyA9IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXTsKCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aEFiYnJldihkYXRlLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IGQzX3RpbWVfbW9udGhBYmJyZXZMb29rdXAuZ2V0KHN0cmluZy5zdWJzdHJpbmcoaSwgaSArPSAzKS50b0xvd2VyQ2FzZSgpKTsKICByZXR1cm4gbiA9PSBudWxsID8gLTEgOiAoZGF0ZS5tID0gbiwgaSk7Cn0KCnZhciBkM190aW1lX21vbnRoQWJicmV2TG9va3VwID0gZDMubWFwKHsKICBqYW46IDAsCiAgZmViOiAxLAogIG1hcjogMiwKICBhcHI6IDMsCiAgbWF5OiA0LAogIGp1bjogNSwKICBqdWw6IDYsCiAgYXVnOiA3LAogIHNlcDogOCwKICBvY3Q6IDksCiAgbm92OiAxMCwKICBkZWM6IDExCn0pOwoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1vbnRoKGRhdGUsIHN0cmluZywgaSkgewogIGQzX3RpbWVfbW9udGhSZS5sYXN0SW5kZXggPSAwOwogIHZhciBuID0gZDNfdGltZV9tb250aFJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMTIpKTsKICByZXR1cm4gbiA/IChkYXRlLm0gPSBkM190aW1lX21vbnRoTG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwp9Cgp2YXIgZDNfdGltZV9tb250aFJlID0gL14oPzpKYW51YXJ5fEZlYnJ1YXJ5fE1hcmNofEFwcmlsfE1heXxKdW5lfEp1bHl8QXVndXN0fFNlcHRlbWJlcnxPY3RvYmVyfE5vdmVtYmVyfERlY2VtYmVyKS9pZzsKCnZhciBkM190aW1lX21vbnRoTG9va3VwID0gZDMubWFwKHsKICBqYW51YXJ5OiAwLAogIGZlYnJ1YXJ5OiAxLAogIG1hcmNoOiAyLAogIGFwcmlsOiAzLAogIG1heTogNCwKICBqdW5lOiA1LAogIGp1bHk6IDYsCiAgYXVndXN0OiA3LAogIHNlcHRlbWJlcjogOCwKICBvY3RvYmVyOiA5LAogIG5vdmVtYmVyOiAxMCwKICBkZWNlbWJlcjogMTEKfSk7Cgp2YXIgZDNfdGltZV9tb250aHMgPSBbCiAgIkphbnVhcnkiLAogICJGZWJydWFyeSIsCiAgIk1hcmNoIiwKICAiQXByaWwiLAogICJNYXkiLAogICJKdW5lIiwKICAiSnVseSIsCiAgIkF1Z3VzdCIsCiAgIlNlcHRlbWJlciIsCiAgIk9jdG9iZXIiLAogICJOb3ZlbWJlciIsCiAgIkRlY2VtYmVyIgpdOwoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLmMudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsKfQoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZURhdGUoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLngudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsKfQoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZVRpbWUoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLlgudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTsKfQoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZUZ1bGxZZWFyKGRhdGUsIHN0cmluZywgaSkgewogIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyA0KSk7CiAgcmV0dXJuIG4gPyAoZGF0ZS55ID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VZZWFyKGRhdGUsIHN0cmluZywgaSkgewogIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZGF0ZS55ID0gZDNfdGltZV9jZW50dXJ5KCkgKyArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gZDNfdGltZV9jZW50dXJ5KCkgewogIHJldHVybiB+fihuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLyAxMDAwKSAqIDEwMDA7Cn0KCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aE51bWJlcihkYXRlLCBzdHJpbmcsIGkpIHsKICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMikpOwogIHJldHVybiBuID8gKGRhdGUubSA9IG5bMF0gLSAxLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5KGRhdGUsIHN0cmluZywgaSkgewogIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDsKICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZGF0ZS5kID0gK25bMF0sIGkgKz0gblswXS5sZW5ndGgpIDogLTE7Cn0KCi8vIE5vdGU6IHdlIGRvbid0IHZhbGlkYXRlIHRoYXQgdGhlIGhvdXIgaXMgaW4gdGhlIHJhbmdlIFswLDIzXSBvciBbMSwxMl0uCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VIb3VyMjQoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkYXRlLkggPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1pbnV0ZXMoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkYXRlLk0gPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZVNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7CiAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwOwogIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zdWJzdHJpbmcoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkYXRlLlMgPSArblswXSwgaSArPSBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1pbGxpc2Vjb25kcyhkYXRlLCBzdHJpbmcsIGkpIHsKICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7CiAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMykpOwogIHJldHVybiBuID8gKGRhdGUuTCA9ICtuWzBdLCBpICs9IG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgovLyBOb3RlOiB3ZSBkb24ndCBsb29rIGF0IHRoZSBuZXh0IGRpcmVjdGl2ZS4KdmFyIGQzX3RpbWVfbnVtYmVyUmUgPSAvXHMqXGQrLzsKCmZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VBbVBtKGRhdGUsIHN0cmluZywgaSkgewogIHZhciBuID0gZDNfdGltZV9hbVBtTG9va3VwLmdldChzdHJpbmcuc3Vic3RyaW5nKGksIGkgKz0gMikudG9Mb3dlckNhc2UoKSk7CiAgcmV0dXJuIG4gPT0gbnVsbCA/IC0xIDogKGRhdGUucCA9IG4sIGkpOwp9Cgp2YXIgZDNfdGltZV9hbVBtTG9va3VwID0gZDMubWFwKHsKICBhbTogMCwKICBwbTogMQp9KTsKCi8vIFRPRE8gdGFibGUgb2YgdGltZSB6b25lIG9mZnNldCBuYW1lcz8KZnVuY3Rpb24gZDNfdGltZV96b25lKGQpIHsKICB2YXIgeiA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSwKICAgICAgenMgPSB6ID4gMCA/ICItIiA6ICIrIiwKICAgICAgemggPSB+fihNYXRoLmFicyh6KSAvIDYwKSwKICAgICAgem0gPSBNYXRoLmFicyh6KSAlIDYwOwogIHJldHVybiB6cyArIGQzX3RpbWVfemZpbGwyKHpoKSArIGQzX3RpbWVfemZpbGwyKHptKTsKfQpkMy50aW1lLmZvcm1hdC51dGMgPSBmdW5jdGlvbih0ZW1wbGF0ZSkgewogIHZhciBsb2NhbCA9IGQzLnRpbWUuZm9ybWF0KHRlbXBsYXRlKTsKCiAgZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHsKICAgIHRyeSB7CiAgICAgIGQzX3RpbWUgPSBkM190aW1lX3V0YzsKICAgICAgdmFyIHV0YyA9IG5ldyBkM190aW1lKCk7CiAgICAgIHV0Yy5fID0gZGF0ZTsKICAgICAgcmV0dXJuIGxvY2FsKHV0Yyk7CiAgICB9IGZpbmFsbHkgewogICAgICBkM190aW1lID0gRGF0ZTsKICAgIH0KICB9CgogIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgdHJ5IHsKICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOwogICAgICB2YXIgZGF0ZSA9IGxvY2FsLnBhcnNlKHN0cmluZyk7CiAgICAgIHJldHVybiBkYXRlICYmIGRhdGUuXzsKICAgIH0gZmluYWxseSB7CiAgICAgIGQzX3RpbWUgPSBEYXRlOwogICAgfQogIH07CgogIGZvcm1hdC50b1N0cmluZyA9IGxvY2FsLnRvU3RyaW5nOwoKICByZXR1cm4gZm9ybWF0Owp9Owp2YXIgZDNfdGltZV9mb3JtYXRJc28gPSBkMy50aW1lLmZvcm1hdC51dGMoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpOwoKZDMudGltZS5mb3JtYXQuaXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgPyBkM190aW1lX2Zvcm1hdElzb05hdGl2ZSA6IGQzX3RpbWVfZm9ybWF0SXNvOwoKZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUoZGF0ZSkgewogIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7Cn0KCmQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlLnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7CiAgcmV0dXJuIG5ldyBEYXRlKHN0cmluZyk7Cn07CgpkM190aW1lX2Zvcm1hdElzb05hdGl2ZS50b1N0cmluZyA9IGQzX3RpbWVfZm9ybWF0SXNvLnRvU3RyaW5nOwpmdW5jdGlvbiBkM190aW1lX2ludGVydmFsKGxvY2FsLCBzdGVwLCBudW1iZXIpIHsKCiAgZnVuY3Rpb24gcm91bmQoZGF0ZSkgewogICAgdmFyIGQwID0gbG9jYWwoZGF0ZSksIGQxID0gb2Zmc2V0KGQwLCAxKTsKICAgIHJldHVybiBkYXRlIC0gZDAgPCBkMSAtIGRhdGUgPyBkMCA6IGQxOwogIH0KCiAgZnVuY3Rpb24gY2VpbChkYXRlKSB7CiAgICBzdGVwKGRhdGUgPSBsb2NhbChuZXcgZDNfdGltZShkYXRlIC0gMSkpLCAxKTsKICAgIHJldHVybiBkYXRlOwogIH0KCiAgZnVuY3Rpb24gb2Zmc2V0KGRhdGUsIGspIHsKICAgIHN0ZXAoZGF0ZSA9IG5ldyBkM190aW1lKCtkYXRlKSwgayk7CiAgICByZXR1cm4gZGF0ZTsKICB9CgogIGZ1bmN0aW9uIHJhbmdlKHQwLCB0MSwgZHQpIHsKICAgIHZhciB0aW1lID0gY2VpbCh0MCksIHRpbWVzID0gW107CiAgICBpZiAoZHQgPiAxKSB7CiAgICAgIHdoaWxlICh0aW1lIDwgdDEpIHsKICAgICAgICBpZiAoIShudW1iZXIodGltZSkgJSBkdCkpIHRpbWVzLnB1c2gobmV3IERhdGUoK3RpbWUpKTsKICAgICAgICBzdGVwKHRpbWUsIDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAodGltZSA8IHQxKSB0aW1lcy5wdXNoKG5ldyBEYXRlKCt0aW1lKSksIHN0ZXAodGltZSwgMSk7CiAgICB9CiAgICByZXR1cm4gdGltZXM7CiAgfQoKICBmdW5jdGlvbiByYW5nZV91dGModDAsIHQxLCBkdCkgewogICAgdHJ5IHsKICAgICAgZDNfdGltZSA9IGQzX3RpbWVfdXRjOwogICAgICB2YXIgdXRjID0gbmV3IGQzX3RpbWVfdXRjKCk7CiAgICAgIHV0Yy5fID0gdDA7CiAgICAgIHJldHVybiByYW5nZSh1dGMsIHQxLCBkdCk7CiAgICB9IGZpbmFsbHkgewogICAgICBkM190aW1lID0gRGF0ZTsKICAgIH0KICB9CgogIGxvY2FsLmZsb29yID0gbG9jYWw7CiAgbG9jYWwucm91bmQgPSByb3VuZDsKICBsb2NhbC5jZWlsID0gY2VpbDsKICBsb2NhbC5vZmZzZXQgPSBvZmZzZXQ7CiAgbG9jYWwucmFuZ2UgPSByYW5nZTsKCiAgdmFyIHV0YyA9IGxvY2FsLnV0YyA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKGxvY2FsKTsKICB1dGMuZmxvb3IgPSB1dGM7CiAgdXRjLnJvdW5kID0gZDNfdGltZV9pbnRlcnZhbF91dGMocm91bmQpOwogIHV0Yy5jZWlsID0gZDNfdGltZV9pbnRlcnZhbF91dGMoY2VpbCk7CiAgdXRjLm9mZnNldCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG9mZnNldCk7CiAgdXRjLnJhbmdlID0gcmFuZ2VfdXRjOwoKICByZXR1cm4gbG9jYWw7Cn0KCmZ1bmN0aW9uIGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG1ldGhvZCkgewogIHJldHVybiBmdW5jdGlvbihkYXRlLCBrKSB7CiAgICB0cnkgewogICAgICBkM190aW1lID0gZDNfdGltZV91dGM7CiAgICAgIHZhciB1dGMgPSBuZXcgZDNfdGltZV91dGMoKTsKICAgICAgdXRjLl8gPSBkYXRlOwogICAgICByZXR1cm4gbWV0aG9kKHV0YywgaykuXzsKICAgIH0gZmluYWxseSB7CiAgICAgIGQzX3RpbWUgPSBEYXRlOwogICAgfQogIH07Cn0KZDMudGltZS5zZWNvbmQgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gbmV3IGQzX3RpbWUoTWF0aC5mbG9vcihkYXRlIC8gMWUzKSAqIDFlMyk7Cn0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDFlMyk7IC8vIERTVCBicmVha3Mgc2V0U2Vjb25kcwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0U2Vjb25kcygpOwp9KTsKCmQzLnRpbWUuc2Vjb25kcyA9IGQzLnRpbWUuc2Vjb25kLnJhbmdlOwpkMy50aW1lLnNlY29uZHMudXRjID0gZDMudGltZS5zZWNvbmQudXRjLnJhbmdlOwpkMy50aW1lLm1pbnV0ZSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBuZXcgZDNfdGltZShNYXRoLmZsb29yKGRhdGUgLyA2ZTQpICogNmU0KTsKfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogNmU0KTsgLy8gRFNUIGJyZWFrcyBzZXRNaW51dGVzCn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRNaW51dGVzKCk7Cn0pOwoKZDMudGltZS5taW51dGVzID0gZDMudGltZS5taW51dGUucmFuZ2U7CmQzLnRpbWUubWludXRlcy51dGMgPSBkMy50aW1lLm1pbnV0ZS51dGMucmFuZ2U7CmQzLnRpbWUuaG91ciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIHZhciB0aW1lem9uZSA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwOwogIHJldHVybiBuZXcgZDNfdGltZSgoTWF0aC5mbG9vcihkYXRlIC8gMzZlNSAtIHRpbWV6b25lKSArIHRpbWV6b25lKSAqIDM2ZTUpOwp9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHsKICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiAzNmU1KTsgLy8gRFNUIGJyZWFrcyBzZXRIb3Vycwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTsKfSk7CgpkMy50aW1lLmhvdXJzID0gZDMudGltZS5ob3VyLnJhbmdlOwpkMy50aW1lLmhvdXJzLnV0YyA9IGQzLnRpbWUuaG91ci51dGMucmFuZ2U7CmQzLnRpbWUuZGF5ID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIG5ldyBkM190aW1lKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7Cn0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkgewogIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG9mZnNldCk7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxOwp9KTsKCmQzLnRpbWUuZGF5cyA9IGQzLnRpbWUuZGF5LnJhbmdlOwpkMy50aW1lLmRheXMudXRjID0gZDMudGltZS5kYXkudXRjLnJhbmdlOwoKZDMudGltZS5kYXlPZlllYXIgPSBmdW5jdGlvbihkYXRlKSB7CiAgdmFyIHllYXIgPSBkMy50aW1lLnllYXIoZGF0ZSk7CiAgcmV0dXJuIE1hdGguZmxvb3IoKGRhdGUgLSB5ZWFyKSAvIDg2NGU1IC0gKGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHllYXIuZ2V0VGltZXpvbmVPZmZzZXQoKSkgLyAxNDQwKTsKfTsKZDNfdGltZV93ZWVrZGF5cy5mb3JFYWNoKGZ1bmN0aW9uKGRheSwgaSkgewogIGRheSA9IGRheS50b0xvd2VyQ2FzZSgpOwogIGkgPSA3IC0gaTsKCiAgdmFyIGludGVydmFsID0gZDMudGltZVtkYXldID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICAoZGF0ZSA9IGQzLnRpbWUuZGF5KGRhdGUpKS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyBpKSAlIDcpOwogICAgcmV0dXJuIGRhdGU7CiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiA3KTsKICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICB2YXIgZGF5ID0gZDMudGltZS55ZWFyKGRhdGUpLmdldERheSgpOwogICAgcmV0dXJuIE1hdGguZmxvb3IoKGQzLnRpbWUuZGF5T2ZZZWFyKGRhdGUpICsgKGRheSArIGkpICUgNykgLyA3KSAtIChkYXkgIT09IGkpOwogIH0pOwoKICBkMy50aW1lW2RheSArICJzIl0gPSBpbnRlcnZhbC5yYW5nZTsKICBkMy50aW1lW2RheSArICJzIl0udXRjID0gaW50ZXJ2YWwudXRjLnJhbmdlOwoKICBkMy50aW1lW2RheSArICJPZlllYXIiXSA9IGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciBkYXkgPSBkMy50aW1lLnllYXIoZGF0ZSkuZ2V0RGF5KCk7CiAgICByZXR1cm4gTWF0aC5mbG9vcigoZDMudGltZS5kYXlPZlllYXIoZGF0ZSkgKyAoZGF5ICsgaSkgJSA3KSAvIDcpOwogIH07Cn0pOwoKZDMudGltZS53ZWVrID0gZDMudGltZS5zdW5kYXk7CmQzLnRpbWUud2Vla3MgPSBkMy50aW1lLnN1bmRheS5yYW5nZTsKZDMudGltZS53ZWVrcy51dGMgPSBkMy50aW1lLnN1bmRheS51dGMucmFuZ2U7CmQzLnRpbWUud2Vla09mWWVhciA9IGQzLnRpbWUuc3VuZGF5T2ZZZWFyOwpkMy50aW1lLm1vbnRoID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIG5ldyBkM190aW1lKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKTsKfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBvZmZzZXQpOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsKfSk7CgpkMy50aW1lLm1vbnRocyA9IGQzLnRpbWUubW9udGgucmFuZ2U7CmQzLnRpbWUubW9udGhzLnV0YyA9IGQzLnRpbWUubW9udGgudXRjLnJhbmdlOwpkMy50aW1lLnllYXIgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gbmV3IGQzX3RpbWUoZGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTsKfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7CiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsKfSk7CgpkMy50aW1lLnllYXJzID0gZDMudGltZS55ZWFyLnJhbmdlOwpkMy50aW1lLnllYXJzLnV0YyA9IGQzLnRpbWUueWVhci51dGMucmFuZ2U7CmZ1bmN0aW9uIGQzX3RpbWVfc2NhbGUobGluZWFyLCBtZXRob2RzLCBmb3JtYXQpIHsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIGxpbmVhcih4KTsKICB9CgogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBkM190aW1lX3NjYWxlRGF0ZShsaW5lYXIuaW52ZXJ0KHgpKTsKICB9OwoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5lYXIuZG9tYWluKCkubWFwKGQzX3RpbWVfc2NhbGVEYXRlKTsKICAgIGxpbmVhci5kb21haW4oeCk7CiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKG0pIHsKICAgIHZhciBleHRlbnQgPSBkM190aW1lX3NjYWxlRXh0ZW50KHNjYWxlLmRvbWFpbigpKTsKICAgIHJldHVybiBzY2FsZS5kb21haW4oW20uZmxvb3IoZXh0ZW50WzBdKSwgbS5jZWlsKGV4dGVudFsxXSldKTsKICB9OwoKICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0sIGspIHsKICAgIHZhciBleHRlbnQgPSBkM190aW1lX3NjYWxlRXh0ZW50KHNjYWxlLmRvbWFpbigpKTsKICAgIGlmICh0eXBlb2YgbSAhPT0gImZ1bmN0aW9uIikgewogICAgICB2YXIgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwKICAgICAgICAgIHRhcmdldCA9IHNwYW4gLyBtLAogICAgICAgICAgaSA9IGQzLmJpc2VjdChkM190aW1lX3NjYWxlU3RlcHMsIHRhcmdldCk7CiAgICAgIGlmIChpID09IGQzX3RpbWVfc2NhbGVTdGVwcy5sZW5ndGgpIHJldHVybiBtZXRob2RzLnllYXIoZXh0ZW50LCBtKTsKICAgICAgaWYgKCFpKSByZXR1cm4gbGluZWFyLnRpY2tzKG0pLm1hcChkM190aW1lX3NjYWxlRGF0ZSk7CiAgICAgIGlmIChNYXRoLmxvZyh0YXJnZXQgLyBkM190aW1lX3NjYWxlU3RlcHNbaSAtIDFdKSA8IE1hdGgubG9nKGQzX3RpbWVfc2NhbGVTdGVwc1tpXSAvIHRhcmdldCkpIC0taTsKICAgICAgbSA9IG1ldGhvZHNbaV07CiAgICAgIGsgPSBtWzFdOwogICAgICBtID0gbVswXS5yYW5nZTsKICAgIH0KICAgIHJldHVybiBtKGV4dGVudFswXSwgbmV3IERhdGUoK2V4dGVudFsxXSArIDEpLCBrKTsgLy8gaW5jbHVzaXZlIHVwcGVyIGJvdW5kCiAgfTsKCiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGZvcm1hdDsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZDNfdGltZV9zY2FsZShsaW5lYXIuY29weSgpLCBtZXRob2RzLCBmb3JtYXQpOwogIH07CgogIC8vIFRPT0QgZXhwb3NlIGQzX3NjYWxlX2xpbmVhcl9yZWJpbmQ/CiAgcmV0dXJuIGQzLnJlYmluZChzY2FsZSwgbGluZWFyLCAicmFuZ2UiLCAicmFuZ2VSb3VuZCIsICJpbnRlcnBvbGF0ZSIsICJjbGFtcCIpOwp9CgovLyBUT0RPIGV4cG9zZSBkM19zY2FsZUV4dGVudD8KZnVuY3Rpb24gZDNfdGltZV9zY2FsZUV4dGVudChkb21haW4pIHsKICB2YXIgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdOwogIHJldHVybiBzdGFydCA8IHN0b3AgPyBbc3RhcnQsIHN0b3BdIDogW3N0b3AsIHN0YXJ0XTsKfQoKZnVuY3Rpb24gZDNfdGltZV9zY2FsZURhdGUodCkgewogIHJldHVybiBuZXcgRGF0ZSh0KTsKfQoKZnVuY3Rpb24gZDNfdGltZV9zY2FsZUZvcm1hdChmb3JtYXRzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpIHsKICAgIHZhciBpID0gZm9ybWF0cy5sZW5ndGggLSAxLCBmID0gZm9ybWF0c1tpXTsKICAgIHdoaWxlICghZlsxXShkYXRlKSkgZiA9IGZvcm1hdHNbLS1pXTsKICAgIHJldHVybiBmWzBdKGRhdGUpOwogIH07Cn0KCmZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVTZXRZZWFyKHkpIHsKICB2YXIgZCA9IG5ldyBEYXRlKHksIDAsIDEpOwogIGQuc2V0RnVsbFllYXIoeSk7IC8vIFkySyBmYWlsCiAgcmV0dXJuIGQ7Cn0KCmZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVHZXRZZWFyKGQpIHsKICB2YXIgeSA9IGQuZ2V0RnVsbFllYXIoKSwKICAgICAgZDAgPSBkM190aW1lX3NjYWxlU2V0WWVhcih5KSwKICAgICAgZDEgPSBkM190aW1lX3NjYWxlU2V0WWVhcih5ICsgMSk7CiAgcmV0dXJuIHkgKyAoZCAtIGQwKSAvIChkMSAtIGQwKTsKfQoKdmFyIGQzX3RpbWVfc2NhbGVTdGVwcyA9IFsKICAxZTMsICAgIC8vIDEtc2Vjb25kCiAgNWUzLCAgICAvLyA1LXNlY29uZAogIDE1ZTMsICAgLy8gMTUtc2Vjb25kCiAgM2U0LCAgICAvLyAzMC1zZWNvbmQKICA2ZTQsICAgIC8vIDEtbWludXRlCiAgM2U1LCAgICAvLyA1LW1pbnV0ZQogIDllNSwgICAgLy8gMTUtbWludXRlCiAgMThlNSwgICAvLyAzMC1taW51dGUKICAzNmU1LCAgIC8vIDEtaG91cgogIDEwOGU1LCAgLy8gMy1ob3VyCiAgMjE2ZTUsICAvLyA2LWhvdXIKICA0MzJlNSwgIC8vIDEyLWhvdXIKICA4NjRlNSwgIC8vIDEtZGF5CiAgMTcyOGU1LCAvLyAyLWRheQogIDYwNDhlNSwgLy8gMS13ZWVrCiAgMjU5MmU2LCAvLyAxLW1vbnRoCiAgNzc3NmU2LCAvLyAzLW1vbnRoCiAgMzE1MzZlNiAvLyAxLXllYXIKXTsKCnZhciBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzID0gWwogIFtkMy50aW1lLnNlY29uZCwgMV0sCiAgW2QzLnRpbWUuc2Vjb25kLCA1XSwKICBbZDMudGltZS5zZWNvbmQsIDE1XSwKICBbZDMudGltZS5zZWNvbmQsIDMwXSwKICBbZDMudGltZS5taW51dGUsIDFdLAogIFtkMy50aW1lLm1pbnV0ZSwgNV0sCiAgW2QzLnRpbWUubWludXRlLCAxNV0sCiAgW2QzLnRpbWUubWludXRlLCAzMF0sCiAgW2QzLnRpbWUuaG91ciwgMV0sCiAgW2QzLnRpbWUuaG91ciwgM10sCiAgW2QzLnRpbWUuaG91ciwgNl0sCiAgW2QzLnRpbWUuaG91ciwgMTJdLAogIFtkMy50aW1lLmRheSwgMV0sCiAgW2QzLnRpbWUuZGF5LCAyXSwKICBbZDMudGltZS53ZWVrLCAxXSwKICBbZDMudGltZS5tb250aCwgMV0sCiAgW2QzLnRpbWUubW9udGgsIDNdLAogIFtkMy50aW1lLnllYXIsIDFdCl07Cgp2YXIgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0cyA9IFsKICBbZDMudGltZS5mb3JtYXQoIiVZIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRydWU7IH1dLAogIFtkMy50aW1lLmZvcm1hdCgiJUIiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRNb250aCgpOyB9XSwKICBbZDMudGltZS5mb3JtYXQoIiViICVkIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0RGF0ZSgpICE9IDE7IH1dLAogIFtkMy50aW1lLmZvcm1hdCgiJWEgJWQiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXREYXkoKSAmJiBkLmdldERhdGUoKSAhPSAxOyB9XSwKICBbZDMudGltZS5mb3JtYXQoIiVJICVwIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0SG91cnMoKTsgfV0sCiAgW2QzLnRpbWUuZm9ybWF0KCIlSTolTSIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldE1pbnV0ZXMoKTsgfV0sCiAgW2QzLnRpbWUuZm9ybWF0KCI6JVMiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRTZWNvbmRzKCk7IH1dLAogIFtkMy50aW1lLmZvcm1hdCgiLiVMIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0TWlsbGlzZWNvbmRzKCk7IH1dCl07Cgp2YXIgZDNfdGltZV9zY2FsZUxpbmVhciA9IGQzLnNjYWxlLmxpbmVhcigpLAogICAgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0ID0gZDNfdGltZV9zY2FsZUZvcm1hdChkM190aW1lX3NjYWxlTG9jYWxGb3JtYXRzKTsKCmQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMueWVhciA9IGZ1bmN0aW9uKGV4dGVudCwgbSkgewogIHJldHVybiBkM190aW1lX3NjYWxlTGluZWFyLmRvbWFpbihleHRlbnQubWFwKGQzX3RpbWVfc2NhbGVHZXRZZWFyKSkudGlja3MobSkubWFwKGQzX3RpbWVfc2NhbGVTZXRZZWFyKTsKfTsKCmQzLnRpbWUuc2NhbGUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDNfdGltZV9zY2FsZShkMy5zY2FsZS5saW5lYXIoKSwgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcywgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0KTsKfTsKdmFyIGQzX3RpbWVfc2NhbGVVVENNZXRob2RzID0gZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcy5tYXAoZnVuY3Rpb24obSkgewogIHJldHVybiBbbVswXS51dGMsIG1bMV1dOwp9KTsKCnZhciBkM190aW1lX3NjYWxlVVRDRm9ybWF0cyA9IFsKICBbZDMudGltZS5mb3JtYXQudXRjKCIlWSIpLCBmdW5jdGlvbihkKSB7IHJldHVybiB0cnVlOyB9XSwKICBbZDMudGltZS5mb3JtYXQudXRjKCIlQiIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ01vbnRoKCk7IH1dLAogIFtkMy50aW1lLmZvcm1hdC51dGMoIiViICVkIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDRGF0ZSgpICE9IDE7IH1dLAogIFtkMy50aW1lLmZvcm1hdC51dGMoIiVhICVkIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDRGF5KCkgJiYgZC5nZXRVVENEYXRlKCkgIT0gMTsgfV0sCiAgW2QzLnRpbWUuZm9ybWF0LnV0YygiJUkgJXAiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRVVENIb3VycygpOyB9XSwKICBbZDMudGltZS5mb3JtYXQudXRjKCIlSTolTSIpLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmdldFVUQ01pbnV0ZXMoKTsgfV0sCiAgW2QzLnRpbWUuZm9ybWF0LnV0YygiOiVTIiksIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZ2V0VVRDU2Vjb25kcygpOyB9XSwKICBbZDMudGltZS5mb3JtYXQudXRjKCIuJUwiKSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5nZXRVVENNaWxsaXNlY29uZHMoKTsgfV0KXTsKCnZhciBkM190aW1lX3NjYWxlVVRDRm9ybWF0ID0gZDNfdGltZV9zY2FsZUZvcm1hdChkM190aW1lX3NjYWxlVVRDRm9ybWF0cyk7CgpmdW5jdGlvbiBkM190aW1lX3NjYWxlVVRDU2V0WWVhcih5KSB7CiAgdmFyIGQgPSBuZXcgRGF0ZShEYXRlLlVUQyh5LCAwLCAxKSk7CiAgZC5zZXRVVENGdWxsWWVhcih5KTsgLy8gWTJLIGZhaWwKICByZXR1cm4gZDsKfQoKZnVuY3Rpb24gZDNfdGltZV9zY2FsZVVUQ0dldFllYXIoZCkgewogIHZhciB5ID0gZC5nZXRVVENGdWxsWWVhcigpLAogICAgICBkMCA9IGQzX3RpbWVfc2NhbGVVVENTZXRZZWFyKHkpLAogICAgICBkMSA9IGQzX3RpbWVfc2NhbGVVVENTZXRZZWFyKHkgKyAxKTsKICByZXR1cm4geSArIChkIC0gZDApIC8gKGQxIC0gZDApOwp9CgpkM190aW1lX3NjYWxlVVRDTWV0aG9kcy55ZWFyID0gZnVuY3Rpb24oZXh0ZW50LCBtKSB7CiAgcmV0dXJuIGQzX3RpbWVfc2NhbGVMaW5lYXIuZG9tYWluKGV4dGVudC5tYXAoZDNfdGltZV9zY2FsZVVUQ0dldFllYXIpKS50aWNrcyhtKS5tYXAoZDNfdGltZV9zY2FsZVVUQ1NldFllYXIpOwp9OwoKZDMudGltZS5zY2FsZS51dGMgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZDNfdGltZV9zY2FsZShkMy5zY2FsZS5saW5lYXIoKSwgZDNfdGltZV9zY2FsZVVUQ01ldGhvZHMsIGQzX3RpbWVfc2NhbGVVVENGb3JtYXQpOwp9Owp9KSgpOwo=