Overview Dashboard Plugin

linkPlugin settings

name

Overview Dashboard (Beta)

Information

description

Multifunctional dashboard prototype.


icon

dashboard


setting

Tag to apply to planning notes

Default is "planning/quarterly"

instructions

This [beta as of March 1 2026] plugin allows you to get a high-level glimpse of what's going on in your world. Here is the help page on how to install it.



You can reorder the components by clicking "Layout" in the top-left. You can add an LLM key under "Settings," which will unlock a forthcoming component that interprets your goal notes into suggested tasks. ✨



linkCodes

(() => {
// client-bundle:client-bundle
var clientBase64 = "KCgpID0+IHsKICB2YXIgX19jcmVhdGUgPSBPYmplY3QuY3JlYXRlOwogIHZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgdmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogIHZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzOwogIHZhciBfX2dldFByb3RvT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7CiAgdmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgdmFyIF9fY29tbW9uSlMgPSAoY2IsIG1vZCkgPT4gZnVuY3Rpb24gX19yZXF1aXJlKCkgewogICAgcmV0dXJuIG1vZCB8fCAoMCwgY2JbX19nZXRPd25Qcm9wTmFtZXMoY2IpWzBdXSkoKG1vZCA9IHsgZXhwb3J0czoge30gfSkuZXhwb3J0cywgbW9kKSwgbW9kLmV4cG9ydHM7CiAgfTsKICB2YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4gewogICAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09ICJvYmplY3QiIHx8IHR5cGVvZiBmcm9tID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSkKICAgICAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpICYmIGtleSAhPT0gZXhjZXB0KQogICAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pOwogICAgfQogICAgcmV0dXJuIHRvOwogIH07CiAgdmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcygKICAgIC8vIElmIHRoZSBpbXBvcnRlciBpcyBpbiBub2RlIGNvbXBhdGliaWxpdHkgbW9kZSBvciB0aGlzIGlzIG5vdCBhbiBFU00KICAgIC8vIGZpbGUgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBDb21tb25KUyBmaWxlIHVzaW5nIGEgQmFiZWwtCiAgICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiAiX19lc01vZHVsZSIgaGFzIG5vdCBiZWVuIHNldCksIHRoZW4gc2V0CiAgICAvLyAiZGVmYXVsdCIgdG8gdGhlIENvbW1vbkpTICJtb2R1bGUuZXhwb3J0cyIgZm9yIG5vZGUgY29tcGF0aWJpbGl0eS4KICAgIGlzTm9kZU1vZGUgfHwgIW1vZCB8fCAhbW9kLl9fZXNNb2R1bGUgPyBfX2RlZlByb3AodGFyZ2V0LCAiZGVmYXVsdCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCwKICAgIG1vZAogICkpOwoKICAvLyBub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzCiAgdmFyIHJlcXVpcmVfcmVhY3RfcHJvZHVjdGlvbl9taW4gPSBfX2NvbW1vbkpTKHsKICAgICJub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzIihleHBvcnRzKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgdmFyIGwgPSBTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iik7CiAgICAgIHZhciBuID0gU3ltYm9sLmZvcigicmVhY3QucG9ydGFsIik7CiAgICAgIHZhciBwID0gU3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKTsKICAgICAgdmFyIHEgPSBTeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpOwogICAgICB2YXIgciA9IFN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIik7CiAgICAgIHZhciB0ID0gU3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKTsKICAgICAgdmFyIHUgPSBTeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0Iik7CiAgICAgIHZhciB2ID0gU3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKTsKICAgICAgdmFyIHcgPSBTeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpOwogICAgICB2YXIgeCA9IFN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKTsKICAgICAgdmFyIHkgPSBTeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iik7CiAgICAgIHZhciB6ID0gU3ltYm9sLml0ZXJhdG9yOwogICAgICBmdW5jdGlvbiBBKGEpIHsKICAgICAgICBpZiAobnVsbCA9PT0gYSB8fCAib2JqZWN0IiAhPT0gdHlwZW9mIGEpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBhID0geiAmJiBhW3pdIHx8IGFbIkBAaXRlcmF0b3IiXTsKICAgICAgICByZXR1cm4gImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGEgPyBhIDogbnVsbDsKICAgICAgfQogICAgICB2YXIgQiA9IHsgaXNNb3VudGVkOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIH0sIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICB9LCBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICB9IH07CiAgICAgIHZhciBDID0gT2JqZWN0LmFzc2lnbjsKICAgICAgdmFyIEQgPSB7fTsKICAgICAgZnVuY3Rpb24gRShhLCBiLCBlKSB7CiAgICAgICAgdGhpcy5wcm9wcyA9IGE7CiAgICAgICAgdGhpcy5jb250ZXh0ID0gYjsKICAgICAgICB0aGlzLnJlZnMgPSBEOwogICAgICAgIHRoaXMudXBkYXRlciA9IGUgfHwgQjsKICAgICAgfQogICAgICBFLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307CiAgICAgIEUucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgIGlmICgib2JqZWN0IiAhPT0gdHlwZW9mIGEgJiYgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGEgJiYgbnVsbCAhPSBhKQogICAgICAgICAgdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpOwogICAgICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgYSwgYiwgInNldFN0YXRlIik7CiAgICAgIH07CiAgICAgIEUucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24oYSkgewogICAgICAgIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcywgYSwgImZvcmNlVXBkYXRlIik7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIEYoKSB7CiAgICAgIH0KICAgICAgRi5wcm90b3R5cGUgPSBFLnByb3RvdHlwZTsKICAgICAgZnVuY3Rpb24gRyhhLCBiLCBlKSB7CiAgICAgICAgdGhpcy5wcm9wcyA9IGE7CiAgICAgICAgdGhpcy5jb250ZXh0ID0gYjsKICAgICAgICB0aGlzLnJlZnMgPSBEOwogICAgICAgIHRoaXMudXBkYXRlciA9IGUgfHwgQjsKICAgICAgfQogICAgICB2YXIgSCA9IEcucHJvdG90eXBlID0gbmV3IEYoKTsKICAgICAgSC5jb25zdHJ1Y3RvciA9IEc7CiAgICAgIEMoSCwgRS5wcm90b3R5cGUpOwogICAgICBILmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTsKICAgICAgdmFyIEkgPSBBcnJheS5pc0FycmF5OwogICAgICB2YXIgSiA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICAgIHZhciBLID0geyBjdXJyZW50OiBudWxsIH07CiAgICAgIHZhciBMID0geyBrZXk6IHRydWUsIHJlZjogdHJ1ZSwgX19zZWxmOiB0cnVlLCBfX3NvdXJjZTogdHJ1ZSB9OwogICAgICBmdW5jdGlvbiBNKGEsIGIsIGUpIHsKICAgICAgICB2YXIgZCwgYyA9IHt9LCBrID0gbnVsbCwgaCA9IG51bGw7CiAgICAgICAgaWYgKG51bGwgIT0gYikKICAgICAgICAgIGZvciAoZCBpbiB2b2lkIDAgIT09IGIucmVmICYmIChoID0gYi5yZWYpLCB2b2lkIDAgIT09IGIua2V5ICYmIChrID0gIiIgKyBiLmtleSksIGIpCiAgICAgICAgICAgIEouY2FsbChiLCBkKSAmJiAhTC5oYXNPd25Qcm9wZXJ0eShkKSAmJiAoY1tkXSA9IGJbZF0pOwogICAgICAgIHZhciBnID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7CiAgICAgICAgaWYgKDEgPT09IGcpCiAgICAgICAgICBjLmNoaWxkcmVuID0gZTsKICAgICAgICBlbHNlIGlmICgxIDwgZykgewogICAgICAgICAgZm9yICh2YXIgZiA9IEFycmF5KGcpLCBtID0gMDsgbSA8IGc7IG0rKykKICAgICAgICAgICAgZlttXSA9IGFyZ3VtZW50c1ttICsgMl07CiAgICAgICAgICBjLmNoaWxkcmVuID0gZjsKICAgICAgICB9CiAgICAgICAgaWYgKGEgJiYgYS5kZWZhdWx0UHJvcHMpCiAgICAgICAgICBmb3IgKGQgaW4gZyA9IGEuZGVmYXVsdFByb3BzLCBnKQogICAgICAgICAgICB2b2lkIDAgPT09IGNbZF0gJiYgKGNbZF0gPSBnW2RdKTsKICAgICAgICByZXR1cm4geyAkJHR5cGVvZjogbCwgdHlwZTogYSwga2V5OiBrLCByZWY6IGgsIHByb3BzOiBjLCBfb3duZXI6IEsuY3VycmVudCB9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIE4oYSwgYikgewogICAgICAgIHJldHVybiB7ICQkdHlwZW9mOiBsLCB0eXBlOiBhLnR5cGUsIGtleTogYiwgcmVmOiBhLnJlZiwgcHJvcHM6IGEucHJvcHMsIF9vd25lcjogYS5fb3duZXIgfTsKICAgICAgfQogICAgICBmdW5jdGlvbiBPKGEpIHsKICAgICAgICByZXR1cm4gIm9iamVjdCIgPT09IHR5cGVvZiBhICYmIG51bGwgIT09IGEgJiYgYS4kJHR5cGVvZiA9PT0gbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBlc2NhcGUzKGEpIHsKICAgICAgICB2YXIgYiA9IHsgIj0iOiAiPTAiLCAiOiI6ICI9MiIgfTsKICAgICAgICByZXR1cm4gIiQiICsgYS5yZXBsYWNlKC9bPTpdL2csIGZ1bmN0aW9uKGEyKSB7CiAgICAgICAgICByZXR1cm4gYlthMl07CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdmFyIFAgPSAvXC8rL2c7CiAgICAgIGZ1bmN0aW9uIFEoYSwgYikgewogICAgICAgIHJldHVybiAib2JqZWN0IiA9PT0gdHlwZW9mIGEgJiYgbnVsbCAhPT0gYSAmJiBudWxsICE9IGEua2V5ID8gZXNjYXBlMygiIiArIGEua2V5KSA6IGIudG9TdHJpbmcoMzYpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFIoYSwgYiwgZSwgZCwgYykgewogICAgICAgIHZhciBrID0gdHlwZW9mIGE7CiAgICAgICAgaWYgKCJ1bmRlZmluZWQiID09PSBrIHx8ICJib29sZWFuIiA9PT0gaykKICAgICAgICAgIGEgPSBudWxsOwogICAgICAgIHZhciBoID0gZmFsc2U7CiAgICAgICAgaWYgKG51bGwgPT09IGEpCiAgICAgICAgICBoID0gdHJ1ZTsKICAgICAgICBlbHNlCiAgICAgICAgICBzd2l0Y2ggKGspIHsKICAgICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgICAgICBoID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgICAgICBzd2l0Y2ggKGEuJCR0eXBlb2YpIHsKICAgICAgICAgICAgICAgIGNhc2UgbDoKICAgICAgICAgICAgICAgIGNhc2UgbjoKICAgICAgICAgICAgICAgICAgaCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIGlmIChoKQogICAgICAgICAgcmV0dXJuIGggPSBhLCBjID0gYyhoKSwgYSA9ICIiID09PSBkID8gIi4iICsgUShoLCAwKSA6IGQsIEkoYykgPyAoZSA9ICIiLCBudWxsICE9IGEgJiYgKGUgPSBhLnJlcGxhY2UoUCwgIiQmLyIpICsgIi8iKSwgUihjLCBiLCBlLCAiIiwgZnVuY3Rpb24oYTIpIHsKICAgICAgICAgICAgcmV0dXJuIGEyOwogICAgICAgICAgfSkpIDogbnVsbCAhPSBjICYmIChPKGMpICYmIChjID0gTihjLCBlICsgKCFjLmtleSB8fCBoICYmIGgua2V5ID09PSBjLmtleSA/ICIiIDogKCIiICsgYy5rZXkpLnJlcGxhY2UoUCwgIiQmLyIpICsgIi8iKSArIGEpKSwgYi5wdXNoKGMpKSwgMTsKICAgICAgICBoID0gMDsKICAgICAgICBkID0gIiIgPT09IGQgPyAiLiIgOiBkICsgIjoiOwogICAgICAgIGlmIChJKGEpKQogICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBhLmxlbmd0aDsgZysrKSB7CiAgICAgICAgICAgIGsgPSBhW2ddOwogICAgICAgICAgICB2YXIgZiA9IGQgKyBRKGssIGcpOwogICAgICAgICAgICBoICs9IFIoaywgYiwgZSwgZiwgYyk7CiAgICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZiA9IEEoYSksICJmdW5jdGlvbiIgPT09IHR5cGVvZiBmKQogICAgICAgICAgZm9yIChhID0gZi5jYWxsKGEpLCBnID0gMDsgIShrID0gYS5uZXh0KCkpLmRvbmU7ICkKICAgICAgICAgICAgayA9IGsudmFsdWUsIGYgPSBkICsgUShrLCBnKyspLCBoICs9IFIoaywgYiwgZSwgZiwgYyk7CiAgICAgICAgZWxzZSBpZiAoIm9iamVjdCIgPT09IGspCiAgICAgICAgICB0aHJvdyBiID0gU3RyaW5nKGEpLCBFcnJvcigiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAiICsgKCJbb2JqZWN0IE9iamVjdF0iID09PSBiID8gIm9iamVjdCB3aXRoIGtleXMgeyIgKyBPYmplY3Qua2V5cyhhKS5qb2luKCIsICIpICsgIn0iIDogYikgKyAiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiBoOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFMoYSwgYiwgZSkgewogICAgICAgIGlmIChudWxsID09IGEpCiAgICAgICAgICByZXR1cm4gYTsKICAgICAgICB2YXIgZCA9IFtdLCBjID0gMDsKICAgICAgICBSKGEsIGQsICIiLCAiIiwgZnVuY3Rpb24oYTIpIHsKICAgICAgICAgIHJldHVybiBiLmNhbGwoZSwgYTIsIGMrKyk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gVChhKSB7CiAgICAgICAgaWYgKC0xID09PSBhLl9zdGF0dXMpIHsKICAgICAgICAgIHZhciBiID0gYS5fcmVzdWx0OwogICAgICAgICAgYiA9IGIoKTsKICAgICAgICAgIGIudGhlbihmdW5jdGlvbihiMikgewogICAgICAgICAgICBpZiAoMCA9PT0gYS5fc3RhdHVzIHx8IC0xID09PSBhLl9zdGF0dXMpCiAgICAgICAgICAgICAgYS5fc3RhdHVzID0gMSwgYS5fcmVzdWx0ID0gYjI7CiAgICAgICAgICB9LCBmdW5jdGlvbihiMikgewogICAgICAgICAgICBpZiAoMCA9PT0gYS5fc3RhdHVzIHx8IC0xID09PSBhLl9zdGF0dXMpCiAgICAgICAgICAgICAgYS5fc3RhdHVzID0gMiwgYS5fcmVzdWx0ID0gYjI7CiAgICAgICAgICB9KTsKICAgICAgICAgIC0xID09PSBhLl9zdGF0dXMgJiYgKGEuX3N0YXR1cyA9IDAsIGEuX3Jlc3VsdCA9IGIpOwogICAgICAgIH0KICAgICAgICBpZiAoMSA9PT0gYS5fc3RhdHVzKQogICAgICAgICAgcmV0dXJuIGEuX3Jlc3VsdC5kZWZhdWx0OwogICAgICAgIHRocm93IGEuX3Jlc3VsdDsKICAgICAgfQogICAgICB2YXIgVSA9IHsgY3VycmVudDogbnVsbCB9OwogICAgICB2YXIgViA9IHsgdHJhbnNpdGlvbjogbnVsbCB9OwogICAgICB2YXIgVyA9IHsgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogVSwgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFYsIFJlYWN0Q3VycmVudE93bmVyOiBLIH07CiAgICAgIGZ1bmN0aW9uIFgoKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoImFjdCguLi4pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMgb2YgUmVhY3QuIik7CiAgICAgIH0KICAgICAgZXhwb3J0cy5DaGlsZHJlbiA9IHsgbWFwOiBTLCBmb3JFYWNoOiBmdW5jdGlvbihhLCBiLCBlKSB7CiAgICAgICAgUyhhLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9LCBlKTsKICAgICAgfSwgY291bnQ6IGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiA9IDA7CiAgICAgICAgUyhhLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGIrKzsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gYjsKICAgICAgfSwgdG9BcnJheTogZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiBTKGEsIGZ1bmN0aW9uKGEyKSB7CiAgICAgICAgICByZXR1cm4gYTI7CiAgICAgICAgfSkgfHwgW107CiAgICAgIH0sIG9ubHk6IGZ1bmN0aW9uKGEpIHsKICAgICAgICBpZiAoIU8oYSkpCiAgICAgICAgICB0aHJvdyBFcnJvcigiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuIik7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0gfTsKICAgICAgZXhwb3J0cy5Db21wb25lbnQgPSBFOwogICAgICBleHBvcnRzLkZyYWdtZW50ID0gcDsKICAgICAgZXhwb3J0cy5Qcm9maWxlciA9IHI7CiAgICAgIGV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IEc7CiAgICAgIGV4cG9ydHMuU3RyaWN0TW9kZSA9IHE7CiAgICAgIGV4cG9ydHMuU3VzcGVuc2UgPSB3OwogICAgICBleHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gVzsKICAgICAgZXhwb3J0cy5hY3QgPSBYOwogICAgICBleHBvcnRzLmNsb25lRWxlbWVudCA9IGZ1bmN0aW9uKGEsIGIsIGUpIHsKICAgICAgICBpZiAobnVsbCA9PT0gYSB8fCB2b2lkIDAgPT09IGEpCiAgICAgICAgICB0aHJvdyBFcnJvcigiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgIiArIGEgKyAiLiIpOwogICAgICAgIHZhciBkID0gQyh7fSwgYS5wcm9wcyksIGMgPSBhLmtleSwgayA9IGEucmVmLCBoID0gYS5fb3duZXI7CiAgICAgICAgaWYgKG51bGwgIT0gYikgewogICAgICAgICAgdm9pZCAwICE9PSBiLnJlZiAmJiAoayA9IGIucmVmLCBoID0gSy5jdXJyZW50KTsKICAgICAgICAgIHZvaWQgMCAhPT0gYi5rZXkgJiYgKGMgPSAiIiArIGIua2V5KTsKICAgICAgICAgIGlmIChhLnR5cGUgJiYgYS50eXBlLmRlZmF1bHRQcm9wcykKICAgICAgICAgICAgdmFyIGcgPSBhLnR5cGUuZGVmYXVsdFByb3BzOwogICAgICAgICAgZm9yIChmIGluIGIpCiAgICAgICAgICAgIEouY2FsbChiLCBmKSAmJiAhTC5oYXNPd25Qcm9wZXJ0eShmKSAmJiAoZFtmXSA9IHZvaWQgMCA9PT0gYltmXSAmJiB2b2lkIDAgIT09IGcgPyBnW2ZdIDogYltmXSk7CiAgICAgICAgfQogICAgICAgIHZhciBmID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7CiAgICAgICAgaWYgKDEgPT09IGYpCiAgICAgICAgICBkLmNoaWxkcmVuID0gZTsKICAgICAgICBlbHNlIGlmICgxIDwgZikgewogICAgICAgICAgZyA9IEFycmF5KGYpOwogICAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBmOyBtKyspCiAgICAgICAgICAgIGdbbV0gPSBhcmd1bWVudHNbbSArIDJdOwogICAgICAgICAgZC5jaGlsZHJlbiA9IGc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7ICQkdHlwZW9mOiBsLCB0eXBlOiBhLnR5cGUsIGtleTogYywgcmVmOiBrLCBwcm9wczogZCwgX293bmVyOiBoIH07CiAgICAgIH07CiAgICAgIGV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICBhID0geyAkJHR5cGVvZjogdSwgX2N1cnJlbnRWYWx1ZTogYSwgX2N1cnJlbnRWYWx1ZTI6IGEsIF90aHJlYWRDb3VudDogMCwgUHJvdmlkZXI6IG51bGwsIENvbnN1bWVyOiBudWxsLCBfZGVmYXVsdFZhbHVlOiBudWxsLCBfZ2xvYmFsTmFtZTogbnVsbCB9OwogICAgICAgIGEuUHJvdmlkZXIgPSB7ICQkdHlwZW9mOiB0LCBfY29udGV4dDogYSB9OwogICAgICAgIHJldHVybiBhLkNvbnN1bWVyID0gYTsKICAgICAgfTsKICAgICAgZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gTTsKICAgICAgZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gZnVuY3Rpb24oYSkgewogICAgICAgIHZhciBiID0gTS5iaW5kKG51bGwsIGEpOwogICAgICAgIGIudHlwZSA9IGE7CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH07CiAgICAgIGV4cG9ydHMuY3JlYXRlUmVmID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHsgY3VycmVudDogbnVsbCB9OwogICAgICB9OwogICAgICBleHBvcnRzLmZvcndhcmRSZWYgPSBmdW5jdGlvbihhKSB7CiAgICAgICAgcmV0dXJuIHsgJCR0eXBlb2Y6IHYsIHJlbmRlcjogYSB9OwogICAgICB9OwogICAgICBleHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gTzsKICAgICAgZXhwb3J0cy5sYXp5ID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiB7ICQkdHlwZW9mOiB5LCBfcGF5bG9hZDogeyBfc3RhdHVzOiAtMSwgX3Jlc3VsdDogYSB9LCBfaW5pdDogVCB9OwogICAgICB9OwogICAgICBleHBvcnRzLm1lbW8gPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIHsgJCR0eXBlb2Y6IHgsIHR5cGU6IGEsIGNvbXBhcmU6IHZvaWQgMCA9PT0gYiA/IG51bGwgOiBiIH07CiAgICAgIH07CiAgICAgIGV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gZnVuY3Rpb24oYSkgewogICAgICAgIHZhciBiID0gVi50cmFuc2l0aW9uOwogICAgICAgIFYudHJhbnNpdGlvbiA9IHt9OwogICAgICAgIHRyeSB7CiAgICAgICAgICBhKCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFYudHJhbnNpdGlvbiA9IGI7CiAgICAgICAgfQogICAgICB9OwogICAgICBleHBvcnRzLnVuc3RhYmxlX2FjdCA9IFg7CiAgICAgIGV4cG9ydHMudXNlQ2FsbGJhY2sgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIFUuY3VycmVudC51c2VDYWxsYmFjayhhLCBiKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy51c2VDb250ZXh0ID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiBVLmN1cnJlbnQudXNlQ29udGV4dChhKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gZnVuY3Rpb24oKSB7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZSA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICByZXR1cm4gVS5jdXJyZW50LnVzZURlZmVycmVkVmFsdWUoYSk7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudXNlRWZmZWN0ID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBVLmN1cnJlbnQudXNlRWZmZWN0KGEsIGIpOwogICAgICB9OwogICAgICBleHBvcnRzLnVzZUlkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIFUuY3VycmVudC51c2VJZCgpOwogICAgICB9OwogICAgICBleHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSBmdW5jdGlvbihhLCBiLCBlKSB7CiAgICAgICAgcmV0dXJuIFUuY3VycmVudC51c2VJbXBlcmF0aXZlSGFuZGxlKGEsIGIsIGUpOwogICAgICB9OwogICAgICBleHBvcnRzLnVzZUluc2VydGlvbkVmZmVjdCA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gVS5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChhLCBiKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIFUuY3VycmVudC51c2VMYXlvdXRFZmZlY3QoYSwgYik7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudXNlTWVtbyA9IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gVS5jdXJyZW50LnVzZU1lbW8oYSwgYik7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudXNlUmVkdWNlciA9IGZ1bmN0aW9uKGEsIGIsIGUpIHsKICAgICAgICByZXR1cm4gVS5jdXJyZW50LnVzZVJlZHVjZXIoYSwgYiwgZSk7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudXNlUmVmID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiBVLmN1cnJlbnQudXNlUmVmKGEpOwogICAgICB9OwogICAgICBleHBvcnRzLnVzZVN0YXRlID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiBVLmN1cnJlbnQudXNlU3RhdGUoYSk7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPSBmdW5jdGlvbihhLCBiLCBlKSB7CiAgICAgICAgcmV0dXJuIFUuY3VycmVudC51c2VTeW5jRXh0ZXJuYWxTdG9yZShhLCBiLCBlKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIFUuY3VycmVudC51c2VUcmFuc2l0aW9uKCk7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudmVyc2lvbiA9ICIxOC4zLjEiOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMKICB2YXIgcmVxdWlyZV9yZWFjdCA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgaWYgKHRydWUpIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmVfcmVhY3RfcHJvZHVjdGlvbl9taW4oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG51bGw7CiAgICAgIH0KICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAgdmFyIHJlcXVpcmVfc2NoZWR1bGVyX3Byb2R1Y3Rpb25fbWluID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzIihleHBvcnRzKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgZnVuY3Rpb24gZihhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBhLmxlbmd0aDsKICAgICAgICBhLnB1c2goYik7CiAgICAgICAgYToKICAgICAgICAgIGZvciAoOyAwIDwgYzsgKSB7CiAgICAgICAgICAgIHZhciBkID0gYyAtIDEgPj4+IDEsIGUgPSBhW2RdOwogICAgICAgICAgICBpZiAoMCA8IGcoZSwgYikpCiAgICAgICAgICAgICAgYVtkXSA9IGIsIGFbY10gPSBlLCBjID0gZDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaChhKSB7CiAgICAgICAgcmV0dXJuIDAgPT09IGEubGVuZ3RoID8gbnVsbCA6IGFbMF07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gayhhKSB7CiAgICAgICAgaWYgKDAgPT09IGEubGVuZ3RoKQogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIGIgPSBhWzBdLCBjID0gYS5wb3AoKTsKICAgICAgICBpZiAoYyAhPT0gYikgewogICAgICAgICAgYVswXSA9IGM7CiAgICAgICAgICBhOgogICAgICAgICAgICBmb3IgKHZhciBkID0gMCwgZSA9IGEubGVuZ3RoLCB3ID0gZSA+Pj4gMTsgZCA8IHc7ICkgewogICAgICAgICAgICAgIHZhciBtID0gMiAqIChkICsgMSkgLSAxLCBDID0gYVttXSwgbiA9IG0gKyAxLCB4ID0gYVtuXTsKICAgICAgICAgICAgICBpZiAoMCA+IGcoQywgYykpCiAgICAgICAgICAgICAgICBuIDwgZSAmJiAwID4gZyh4LCBDKSA/IChhW2RdID0geCwgYVtuXSA9IGMsIGQgPSBuKSA6IChhW2RdID0gQywgYVttXSA9IGMsIGQgPSBtKTsKICAgICAgICAgICAgICBlbHNlIGlmIChuIDwgZSAmJiAwID4gZyh4LCBjKSkKICAgICAgICAgICAgICAgIGFbZF0gPSB4LCBhW25dID0gYywgZCA9IG47CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYjsKICAgICAgfQogICAgICBmdW5jdGlvbiBnKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGEuc29ydEluZGV4IC0gYi5zb3J0SW5kZXg7CiAgICAgICAgcmV0dXJuIDAgIT09IGMgPyBjIDogYS5pZCAtIGIuaWQ7CiAgICAgIH0KICAgICAgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgcGVyZm9ybWFuY2UgJiYgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHBlcmZvcm1hbmNlLm5vdykgewogICAgICAgIGwgPSBwZXJmb3JtYW5jZTsKICAgICAgICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGwubm93KCk7CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwID0gRGF0ZSwgcSA9IHAubm93KCk7CiAgICAgICAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBwLm5vdygpIC0gcTsKICAgICAgICB9OwogICAgICB9CiAgICAgIHZhciBsOwogICAgICB2YXIgcDsKICAgICAgdmFyIHE7CiAgICAgIHZhciByID0gW107CiAgICAgIHZhciB0ID0gW107CiAgICAgIHZhciB1ID0gMTsKICAgICAgdmFyIHYgPSBudWxsOwogICAgICB2YXIgeSA9IDM7CiAgICAgIHZhciB6ID0gZmFsc2U7CiAgICAgIHZhciBBID0gZmFsc2U7CiAgICAgIHZhciBCID0gZmFsc2U7CiAgICAgIHZhciBEID0gImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHNldFRpbWVvdXQgPyBzZXRUaW1lb3V0IDogbnVsbDsKICAgICAgdmFyIEUgPSAiZnVuY3Rpb24iID09PSB0eXBlb2YgY2xlYXJUaW1lb3V0ID8gY2xlYXJUaW1lb3V0IDogbnVsbDsKICAgICAgdmFyIEYgPSAidW5kZWZpbmVkIiAhPT0gdHlwZW9mIHNldEltbWVkaWF0ZSA/IHNldEltbWVkaWF0ZSA6IG51bGw7CiAgICAgICJ1bmRlZmluZWQiICE9PSB0eXBlb2YgbmF2aWdhdG9yICYmIHZvaWQgMCAhPT0gbmF2aWdhdG9yLnNjaGVkdWxpbmcgJiYgdm9pZCAwICE9PSBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTsKICAgICAgZnVuY3Rpb24gRyhhKSB7CiAgICAgICAgZm9yICh2YXIgYiA9IGgodCk7IG51bGwgIT09IGI7ICkgewogICAgICAgICAgaWYgKG51bGwgPT09IGIuY2FsbGJhY2spCiAgICAgICAgICAgIGsodCk7CiAgICAgICAgICBlbHNlIGlmIChiLnN0YXJ0VGltZSA8PSBhKQogICAgICAgICAgICBrKHQpLCBiLnNvcnRJbmRleCA9IGIuZXhwaXJhdGlvblRpbWUsIGYociwgYik7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgYiA9IGgodCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIEgoYSkgewogICAgICAgIEIgPSBmYWxzZTsKICAgICAgICBHKGEpOwogICAgICAgIGlmICghQSkKICAgICAgICAgIGlmIChudWxsICE9PSBoKHIpKQogICAgICAgICAgICBBID0gdHJ1ZSwgSShKKTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgYiA9IGgodCk7CiAgICAgICAgICAgIG51bGwgIT09IGIgJiYgSyhILCBiLnN0YXJ0VGltZSAtIGEpOwogICAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIEooYSwgYikgewogICAgICAgIEEgPSBmYWxzZTsKICAgICAgICBCICYmIChCID0gZmFsc2UsIEUoTCksIEwgPSAtMSk7CiAgICAgICAgeiA9IHRydWU7CiAgICAgICAgdmFyIGMgPSB5OwogICAgICAgIHRyeSB7CiAgICAgICAgICBHKGIpOwogICAgICAgICAgZm9yICh2ID0gaChyKTsgbnVsbCAhPT0gdiAmJiAoISh2LmV4cGlyYXRpb25UaW1lID4gYikgfHwgYSAmJiAhTSgpKTsgKSB7CiAgICAgICAgICAgIHZhciBkID0gdi5jYWxsYmFjazsKICAgICAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBkKSB7CiAgICAgICAgICAgICAgdi5jYWxsYmFjayA9IG51bGw7CiAgICAgICAgICAgICAgeSA9IHYucHJpb3JpdHlMZXZlbDsKICAgICAgICAgICAgICB2YXIgZSA9IGQodi5leHBpcmF0aW9uVGltZSA8PSBiKTsKICAgICAgICAgICAgICBiID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTsKICAgICAgICAgICAgICAiZnVuY3Rpb24iID09PSB0eXBlb2YgZSA/IHYuY2FsbGJhY2sgPSBlIDogdiA9PT0gaChyKSAmJiBrKHIpOwogICAgICAgICAgICAgIEcoYik7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgIGsocik7CiAgICAgICAgICAgIHYgPSBoKHIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG51bGwgIT09IHYpCiAgICAgICAgICAgIHZhciB3ID0gdHJ1ZTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgbSA9IGgodCk7CiAgICAgICAgICAgIG51bGwgIT09IG0gJiYgSyhILCBtLnN0YXJ0VGltZSAtIGIpOwogICAgICAgICAgICB3ID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdzsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgdiA9IG51bGwsIHkgPSBjLCB6ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBOID0gZmFsc2U7CiAgICAgIHZhciBPID0gbnVsbDsKICAgICAgdmFyIEwgPSAtMTsKICAgICAgdmFyIFAgPSA1OwogICAgICB2YXIgUSA9IC0xOwogICAgICBmdW5jdGlvbiBNKCkgewogICAgICAgIHJldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gUSA8IFAgPyBmYWxzZSA6IHRydWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gUigpIHsKICAgICAgICBpZiAobnVsbCAhPT0gTykgewogICAgICAgICAgdmFyIGEgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOwogICAgICAgICAgUSA9IGE7CiAgICAgICAgICB2YXIgYiA9IHRydWU7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBiID0gTyh0cnVlLCBhKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGIgPyBTKCkgOiAoTiA9IGZhbHNlLCBPID0gbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBOID0gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIFM7CiAgICAgIGlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgRikKICAgICAgICBTID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBGKFIpOwogICAgICAgIH07CiAgICAgIGVsc2UgaWYgKCJ1bmRlZmluZWQiICE9PSB0eXBlb2YgTWVzc2FnZUNoYW5uZWwpIHsKICAgICAgICBUID0gbmV3IE1lc3NhZ2VDaGFubmVsKCksIFUgPSBULnBvcnQyOwogICAgICAgIFQucG9ydDEub25tZXNzYWdlID0gUjsKICAgICAgICBTID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBVLnBvc3RNZXNzYWdlKG51bGwpOwogICAgICAgIH07CiAgICAgIH0gZWxzZQogICAgICAgIFMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIEQoUiwgMCk7CiAgICAgICAgfTsKICAgICAgdmFyIFQ7CiAgICAgIHZhciBVOwogICAgICBmdW5jdGlvbiBJKGEpIHsKICAgICAgICBPID0gYTsKICAgICAgICBOIHx8IChOID0gdHJ1ZSwgUygpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBLKGEsIGIpIHsKICAgICAgICBMID0gRChmdW5jdGlvbigpIHsKICAgICAgICAgIGEoZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7CiAgICAgICAgfSwgYik7CiAgICAgIH0KICAgICAgZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSA1OwogICAgICBleHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gMTsKICAgICAgZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IDQ7CiAgICAgIGV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSAzOwogICAgICBleHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IG51bGw7CiAgICAgIGV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyOwogICAgICBleHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gZnVuY3Rpb24oYSkgewogICAgICAgIGEuY2FsbGJhY2sgPSBudWxsOwogICAgICB9OwogICAgICBleHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgQSB8fCB6IHx8IChBID0gdHJ1ZSwgSShKKSk7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmdW5jdGlvbihhKSB7CiAgICAgICAgMCA+IGEgfHwgMTI1IDwgYSA/IGNvbnNvbGUuZXJyb3IoImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCIpIDogUCA9IDAgPCBhID8gTWF0aC5mbG9vcigxZTMgLyBhKSA6IDU7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geTsKICAgICAgfTsKICAgICAgZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBoKHIpOwogICAgICB9OwogICAgICBleHBvcnRzLnVuc3RhYmxlX25leHQgPSBmdW5jdGlvbihhKSB7CiAgICAgICAgc3dpdGNoICh5KSB7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHZhciBiID0gMzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBiID0geTsKICAgICAgICB9CiAgICAgICAgdmFyIGMgPSB5OwogICAgICAgIHkgPSBiOwogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gYSgpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICB5ID0gYzsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgfTsKICAgICAgZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSBmdW5jdGlvbigpIHsKICAgICAgfTsKICAgICAgZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgc3dpdGNoIChhKSB7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYSA9IDM7CiAgICAgICAgfQogICAgICAgIHZhciBjID0geTsKICAgICAgICB5ID0gYTsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIGIoKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgeSA9IGM7CiAgICAgICAgfQogICAgICB9OwogICAgICBleHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICAgICAgdmFyIGQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOwogICAgICAgICJvYmplY3QiID09PSB0eXBlb2YgYyAmJiBudWxsICE9PSBjID8gKGMgPSBjLmRlbGF5LCBjID0gIm51bWJlciIgPT09IHR5cGVvZiBjICYmIDAgPCBjID8gZCArIGMgOiBkKSA6IGMgPSBkOwogICAgICAgIHN3aXRjaCAoYSkgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICB2YXIgZSA9IC0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgZSA9IDI1MDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGUgPSAxMDczNzQxODIzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgZSA9IDFlNDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBlID0gNWUzOwogICAgICAgIH0KICAgICAgICBlID0gYyArIGU7CiAgICAgICAgYSA9IHsgaWQ6IHUrKywgY2FsbGJhY2s6IGIsIHByaW9yaXR5TGV2ZWw6IGEsIHN0YXJ0VGltZTogYywgZXhwaXJhdGlvblRpbWU6IGUsIHNvcnRJbmRleDogLTEgfTsKICAgICAgICBjID4gZCA/IChhLnNvcnRJbmRleCA9IGMsIGYodCwgYSksIG51bGwgPT09IGgocikgJiYgYSA9PT0gaCh0KSAmJiAoQiA/IChFKEwpLCBMID0gLTEpIDogQiA9IHRydWUsIEsoSCwgYyAtIGQpKSkgOiAoYS5zb3J0SW5kZXggPSBlLCBmKHIsIGEpLCBBIHx8IHogfHwgKEEgPSB0cnVlLCBJKEopKSk7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBNOwogICAgICBleHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiA9IHk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGMgPSB5OwogICAgICAgICAgeSA9IGI7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gYS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgeSA9IGM7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfTsKICAgIH0KICB9KTsKCiAgLy8gbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcwogIHZhciByZXF1aXJlX3NjaGVkdWxlciA9IF9fY29tbW9uSlMoewogICAgIm5vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiKGV4cG9ydHMsIG1vZHVsZSkgewogICAgICAidXNlIHN0cmljdCI7CiAgICAgIGlmICh0cnVlKSB7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlX3NjaGVkdWxlcl9wcm9kdWN0aW9uX21pbigpOwogICAgICB9IGVsc2UgewogICAgICAgIG1vZHVsZS5leHBvcnRzID0gbnVsbDsKICAgICAgfQogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKICB2YXIgcmVxdWlyZV9yZWFjdF9kb21fcHJvZHVjdGlvbl9taW4gPSBfX2NvbW1vbkpTKHsKICAgICJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMiKGV4cG9ydHMpIHsKICAgICAgInVzZSBzdHJpY3QiOwogICAgICB2YXIgYWEgPSByZXF1aXJlX3JlYWN0KCk7CiAgICAgIHZhciBjYSA9IHJlcXVpcmVfc2NoZWR1bGVyKCk7CiAgICAgIGZ1bmN0aW9uIHAoYSkgewogICAgICAgIGZvciAodmFyIGIgPSAiaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9IiArIGEsIGMgPSAxOyBjIDwgYXJndW1lbnRzLmxlbmd0aDsgYysrKQogICAgICAgICAgYiArPSAiJmFyZ3NbXT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tjXSk7CiAgICAgICAgcmV0dXJuICJNaW5pZmllZCBSZWFjdCBlcnJvciAjIiArIGEgKyAiOyB2aXNpdCAiICsgYiArICIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiI7CiAgICAgIH0KICAgICAgdmFyIGRhID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgICAgdmFyIGVhID0ge307CiAgICAgIGZ1bmN0aW9uIGZhKGEsIGIpIHsKICAgICAgICBoYShhLCBiKTsKICAgICAgICBoYShhICsgIkNhcHR1cmUiLCBiKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBoYShhLCBiKSB7CiAgICAgICAgZWFbYV0gPSBiOwogICAgICAgIGZvciAoYSA9IDA7IGEgPCBiLmxlbmd0aDsgYSsrKQogICAgICAgICAgZGEuYWRkKGJbYV0pOwogICAgICB9CiAgICAgIHZhciBpYSA9ICEoInVuZGVmaW5lZCIgPT09IHR5cGVvZiB3aW5kb3cgfHwgInVuZGVmaW5lZCIgPT09IHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgfHwgInVuZGVmaW5lZCIgPT09IHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7CiAgICAgIHZhciBqYSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CiAgICAgIHZhciBrYSA9IC9eWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRdWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRcLS4wLTlcdTAwQjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MF0qJC87CiAgICAgIHZhciBsYSA9IHt9OwogICAgICB2YXIgbWEgPSB7fTsKICAgICAgZnVuY3Rpb24gb2EoYSkgewogICAgICAgIGlmIChqYS5jYWxsKG1hLCBhKSkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGlmIChqYS5jYWxsKGxhLCBhKSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoa2EudGVzdChhKSkKICAgICAgICAgIHJldHVybiBtYVthXSA9IHRydWU7CiAgICAgICAgbGFbYV0gPSB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBwYShhLCBiLCBjLCBkKSB7CiAgICAgICAgaWYgKG51bGwgIT09IGMgJiYgMCA9PT0gYy50eXBlKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHN3aXRjaCAodHlwZW9mIGIpIHsKICAgICAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICAgIGNhc2UgInN5bWJvbCI6CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgY2FzZSAiYm9vbGVhbiI6CiAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKG51bGwgIT09IGMpCiAgICAgICAgICAgICAgcmV0dXJuICFjLmFjY2VwdHNCb29sZWFuczsKICAgICAgICAgICAgYSA9IGEudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTsKICAgICAgICAgICAgcmV0dXJuICJkYXRhLSIgIT09IGEgJiYgImFyaWEtIiAhPT0gYTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcWEoYSwgYiwgYywgZCkgewogICAgICAgIGlmIChudWxsID09PSBiIHx8ICJ1bmRlZmluZWQiID09PSB0eXBlb2YgYiB8fCBwYShhLCBiLCBjLCBkKSkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGlmIChkKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChudWxsICE9PSBjKQogICAgICAgICAgc3dpdGNoIChjLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIHJldHVybiAhYjsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIHJldHVybiBmYWxzZSA9PT0gYjsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIHJldHVybiBpc05hTihiKTsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIHJldHVybiBpc05hTihiKSB8fCAxID4gYjsKICAgICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdihhLCBiLCBjLCBkLCBlLCBmLCBnKSB7CiAgICAgICAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSAyID09PSBiIHx8IDMgPT09IGIgfHwgNCA9PT0gYjsKICAgICAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBkOwogICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gZTsKICAgICAgICB0aGlzLm11c3RVc2VQcm9wZXJ0eSA9IGM7CiAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBhOwogICAgICAgIHRoaXMudHlwZSA9IGI7CiAgICAgICAgdGhpcy5zYW5pdGl6ZVVSTCA9IGY7CiAgICAgICAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IGc7CiAgICAgIH0KICAgICAgdmFyIHogPSB7fTsKICAgICAgImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB6W2FdID0gbmV3IHYoYSwgMCwgZmFsc2UsIGEsIG51bGwsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICBbWyJhY2NlcHRDaGFyc2V0IiwgImFjY2VwdC1jaGFyc2V0Il0sIFsiY2xhc3NOYW1lIiwgImNsYXNzIl0sIFsiaHRtbEZvciIsICJmb3IiXSwgWyJodHRwRXF1aXYiLCAiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiA9IGFbMF07CiAgICAgICAgeltiXSA9IG5ldyB2KGIsIDEsIGZhbHNlLCBhWzFdLCBudWxsLCBmYWxzZSwgZmFsc2UpOwogICAgICB9KTsKICAgICAgWyJjb250ZW50RWRpdGFibGUiLCAiZHJhZ2dhYmxlIiwgInNwZWxsQ2hlY2siLCAidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB6W2FdID0gbmV3IHYoYSwgMiwgZmFsc2UsIGEudG9Mb3dlckNhc2UoKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKICAgICAgfSk7CiAgICAgIFsiYXV0b1JldmVyc2UiLCAiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsICJmb2N1c2FibGUiLCAicHJlc2VydmVBbHBoYSJdLmZvckVhY2goZnVuY3Rpb24oYSkgewogICAgICAgIHpbYV0gPSBuZXcgdihhLCAyLCBmYWxzZSwgYSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKICAgICAgfSk7CiAgICAgICJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oYSkgewogICAgICAgIHpbYV0gPSBuZXcgdihhLCAzLCBmYWxzZSwgYS50b0xvd2VyQ2FzZSgpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwogICAgICB9KTsKICAgICAgWyJjaGVja2VkIiwgIm11bHRpcGxlIiwgIm11dGVkIiwgInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihhKSB7CiAgICAgICAgelthXSA9IG5ldyB2KGEsIDMsIHRydWUsIGEsIG51bGwsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICBbImNhcHR1cmUiLCAiZG93bmxvYWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB6W2FdID0gbmV3IHYoYSwgNCwgZmFsc2UsIGEsIG51bGwsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICBbImNvbHMiLCAicm93cyIsICJzaXplIiwgInNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB6W2FdID0gbmV3IHYoYSwgNiwgZmFsc2UsIGEsIG51bGwsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICBbInJvd1NwYW4iLCAic3RhcnQiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB6W2FdID0gbmV3IHYoYSwgNSwgZmFsc2UsIGEudG9Mb3dlckNhc2UoKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKICAgICAgfSk7CiAgICAgIHZhciByYSA9IC9bXC06XShbYS16XSkvZzsKICAgICAgZnVuY3Rpb24gc2EoYSkgewogICAgICAgIHJldHVybiBhWzFdLnRvVXBwZXJDYXNlKCk7CiAgICAgIH0KICAgICAgImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oYSkgewogICAgICAgIHZhciBiID0gYS5yZXBsYWNlKAogICAgICAgICAgcmEsCiAgICAgICAgICBzYQogICAgICAgICk7CiAgICAgICAgeltiXSA9IG5ldyB2KGIsIDEsIGZhbHNlLCBhLCBudWxsLCBmYWxzZSwgZmFsc2UpOwogICAgICB9KTsKICAgICAgInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiA9IGEucmVwbGFjZShyYSwgc2EpOwogICAgICAgIHpbYl0gPSBuZXcgdihiLCAxLCBmYWxzZSwgYSwgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCBmYWxzZSwgZmFsc2UpOwogICAgICB9KTsKICAgICAgWyJ4bWw6YmFzZSIsICJ4bWw6bGFuZyIsICJ4bWw6c3BhY2UiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiA9IGEucmVwbGFjZShyYSwgc2EpOwogICAgICAgIHpbYl0gPSBuZXcgdihiLCAxLCBmYWxzZSwgYSwgImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICBbInRhYkluZGV4IiwgImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihhKSB7CiAgICAgICAgelthXSA9IG5ldyB2KGEsIDEsIGZhbHNlLCBhLnRvTG93ZXJDYXNlKCksIG51bGwsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0pOwogICAgICB6LnhsaW5rSHJlZiA9IG5ldyB2KCJ4bGlua0hyZWYiLCAxLCBmYWxzZSwgInhsaW5rOmhyZWYiLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsIHRydWUsIGZhbHNlKTsKICAgICAgWyJzcmMiLCAiaHJlZiIsICJhY3Rpb24iLCAiZm9ybUFjdGlvbiJdLmZvckVhY2goZnVuY3Rpb24oYSkgewogICAgICAgIHpbYV0gPSBuZXcgdihhLCAxLCBmYWxzZSwgYS50b0xvd2VyQ2FzZSgpLCBudWxsLCB0cnVlLCB0cnVlKTsKICAgICAgfSk7CiAgICAgIGZ1bmN0aW9uIHRhKGEsIGIsIGMsIGQpIHsKICAgICAgICB2YXIgZSA9IHouaGFzT3duUHJvcGVydHkoYikgPyB6W2JdIDogbnVsbDsKICAgICAgICBpZiAobnVsbCAhPT0gZSA/IDAgIT09IGUudHlwZSA6IGQgfHwgISgyIDwgYi5sZW5ndGgpIHx8ICJvIiAhPT0gYlswXSAmJiAiTyIgIT09IGJbMF0gfHwgIm4iICE9PSBiWzFdICYmICJOIiAhPT0gYlsxXSkKICAgICAgICAgIHFhKGIsIGMsIGUsIGQpICYmIChjID0gbnVsbCksIGQgfHwgbnVsbCA9PT0gZSA/IG9hKGIpICYmIChudWxsID09PSBjID8gYS5yZW1vdmVBdHRyaWJ1dGUoYikgOiBhLnNldEF0dHJpYnV0ZShiLCAiIiArIGMpKSA6IGUubXVzdFVzZVByb3BlcnR5ID8gYVtlLnByb3BlcnR5TmFtZV0gPSBudWxsID09PSBjID8gMyA9PT0gZS50eXBlID8gZmFsc2UgOiAiIiA6IGMgOiAoYiA9IGUuYXR0cmlidXRlTmFtZSwgZCA9IGUuYXR0cmlidXRlTmFtZXNwYWNlLCBudWxsID09PSBjID8gYS5yZW1vdmVBdHRyaWJ1dGUoYikgOiAoZSA9IGUudHlwZSwgYyA9IDMgPT09IGUgfHwgNCA9PT0gZSAmJiB0cnVlID09PSBjID8gIiIgOiAiIiArIGMsIGQgPyBhLnNldEF0dHJpYnV0ZU5TKGQsIGIsIGMpIDogYS5zZXRBdHRyaWJ1dGUoYiwgYykpKTsKICAgICAgfQogICAgICB2YXIgdWEgPSBhYS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDsKICAgICAgdmFyIHZhID0gU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpOwogICAgICB2YXIgd2EgPSBTeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKTsKICAgICAgdmFyIHlhID0gU3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKTsKICAgICAgdmFyIHphID0gU3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKTsKICAgICAgdmFyIEFhID0gU3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKTsKICAgICAgdmFyIEJhID0gU3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKTsKICAgICAgdmFyIENhID0gU3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpOwogICAgICB2YXIgRGEgPSBTeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpOwogICAgICB2YXIgRWEgPSBTeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpOwogICAgICB2YXIgRmEgPSBTeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0Iik7CiAgICAgIHZhciBHYSA9IFN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKTsKICAgICAgdmFyIEhhID0gU3ltYm9sLmZvcigicmVhY3QubGF6eSIpOwogICAgICBTeW1ib2wuZm9yKCJyZWFjdC5zY29wZSIpOwogICAgICBTeW1ib2wuZm9yKCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlIik7CiAgICAgIHZhciBJYSA9IFN5bWJvbC5mb3IoInJlYWN0Lm9mZnNjcmVlbiIpOwogICAgICBTeW1ib2wuZm9yKCJyZWFjdC5sZWdhY3lfaGlkZGVuIik7CiAgICAgIFN5bWJvbC5mb3IoInJlYWN0LmNhY2hlIik7CiAgICAgIFN5bWJvbC5mb3IoInJlYWN0LnRyYWNpbmdfbWFya2VyIik7CiAgICAgIHZhciBKYSA9IFN5bWJvbC5pdGVyYXRvcjsKICAgICAgZnVuY3Rpb24gS2EoYSkgewogICAgICAgIGlmIChudWxsID09PSBhIHx8ICJvYmplY3QiICE9PSB0eXBlb2YgYSkKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGEgPSBKYSAmJiBhW0phXSB8fCBhWyJAQGl0ZXJhdG9yIl07CiAgICAgICAgcmV0dXJuICJmdW5jdGlvbiIgPT09IHR5cGVvZiBhID8gYSA6IG51bGw7CiAgICAgIH0KICAgICAgdmFyIEEgPSBPYmplY3QuYXNzaWduOwogICAgICB2YXIgTGE7CiAgICAgIGZ1bmN0aW9uIE1hKGEpIHsKICAgICAgICBpZiAodm9pZCAwID09PSBMYSkKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRocm93IEVycm9yKCk7CiAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgIHZhciBiID0gYy5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pOwogICAgICAgICAgICBMYSA9IGIgJiYgYlsxXSB8fCAiIjsKICAgICAgICAgIH0KICAgICAgICByZXR1cm4gIlxuIiArIExhICsgYTsKICAgICAgfQogICAgICB2YXIgTmEgPSBmYWxzZTsKICAgICAgZnVuY3Rpb24gT2EoYSwgYikgewogICAgICAgIGlmICghYSB8fCBOYSkKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICBOYSA9IHRydWU7CiAgICAgICAgdmFyIGMgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsKICAgICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgIGlmIChiID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTsKICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGIucHJvdG90eXBlLCAicHJvcHMiLCB7IHNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTsKICAgICAgICAgICAgfSB9KSwgIm9iamVjdCIgPT09IHR5cGVvZiBSZWZsZWN0ICYmIFJlZmxlY3QuY29uc3RydWN0KSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGIsIFtdKTsKICAgICAgICAgICAgICB9IGNhdGNoIChsKSB7CiAgICAgICAgICAgICAgICB2YXIgZCA9IGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGEsIFtdLCBiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgYi5jYWxsKCk7CiAgICAgICAgICAgICAgfSBjYXRjaCAobCkgewogICAgICAgICAgICAgICAgZCA9IGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGEuY2FsbChiLnByb3RvdHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHRocm93IEVycm9yKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGwpIHsKICAgICAgICAgICAgICBkID0gbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBhKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAobCkgewogICAgICAgICAgaWYgKGwgJiYgZCAmJiAic3RyaW5nIiA9PT0gdHlwZW9mIGwuc3RhY2spIHsKICAgICAgICAgICAgZm9yICh2YXIgZSA9IGwuc3RhY2suc3BsaXQoIlxuIiksIGYgPSBkLnN0YWNrLnNwbGl0KCJcbiIpLCBnID0gZS5sZW5ndGggLSAxLCBoID0gZi5sZW5ndGggLSAxOyAxIDw9IGcgJiYgMCA8PSBoICYmIGVbZ10gIT09IGZbaF07ICkKICAgICAgICAgICAgICBoLS07CiAgICAgICAgICAgIGZvciAoOyAxIDw9IGcgJiYgMCA8PSBoOyBnLS0sIGgtLSkKICAgICAgICAgICAgICBpZiAoZVtnXSAhPT0gZltoXSkgewogICAgICAgICAgICAgICAgaWYgKDEgIT09IGcgfHwgMSAhPT0gaCkgewogICAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgICAgIGlmIChnLS0sIGgtLSwgMCA+IGggfHwgZVtnXSAhPT0gZltoXSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSAiXG4iICsgZVtnXS5yZXBsYWNlKCIgYXQgbmV3ICIsICIgYXQgIik7CiAgICAgICAgICAgICAgICAgICAgICBhLmRpc3BsYXlOYW1lICYmIGsuaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikgJiYgKGsgPSBrLnJlcGxhY2UoIjxhbm9ueW1vdXM+IiwgYS5kaXNwbGF5TmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB3aGlsZSAoMSA8PSBnICYmIDAgPD0gaCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIE5hID0gZmFsc2UsIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gYzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChhID0gYSA/IGEuZGlzcGxheU5hbWUgfHwgYS5uYW1lIDogIiIpID8gTWEoYSkgOiAiIjsKICAgICAgfQogICAgICBmdW5jdGlvbiBQYShhKSB7CiAgICAgICAgc3dpdGNoIChhLnRhZykgewogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gTWEoYS50eXBlKTsKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHJldHVybiBNYSgiTGF6eSIpOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgcmV0dXJuIE1hKCJTdXNwZW5zZSIpOwogICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgcmV0dXJuIE1hKCJTdXNwZW5zZUxpc3QiKTsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgIHJldHVybiBhID0gT2EoYS50eXBlLCBmYWxzZSksIGE7CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICByZXR1cm4gYSA9IE9hKGEudHlwZS5yZW5kZXIsIGZhbHNlKSwgYTsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcmV0dXJuIGEgPSBPYShhLnR5cGUsIHRydWUpLCBhOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBRYShhKSB7CiAgICAgICAgaWYgKG51bGwgPT0gYSkKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgYSkKICAgICAgICAgIHJldHVybiBhLmRpc3BsYXlOYW1lIHx8IGEubmFtZSB8fCBudWxsOwogICAgICAgIGlmICgic3RyaW5nIiA9PT0gdHlwZW9mIGEpCiAgICAgICAgICByZXR1cm4gYTsKICAgICAgICBzd2l0Y2ggKGEpIHsKICAgICAgICAgIGNhc2UgeWE6CiAgICAgICAgICAgIHJldHVybiAiRnJhZ21lbnQiOwogICAgICAgICAgY2FzZSB3YToKICAgICAgICAgICAgcmV0dXJuICJQb3J0YWwiOwogICAgICAgICAgY2FzZSBBYToKICAgICAgICAgICAgcmV0dXJuICJQcm9maWxlciI7CiAgICAgICAgICBjYXNlIHphOgogICAgICAgICAgICByZXR1cm4gIlN0cmljdE1vZGUiOwogICAgICAgICAgY2FzZSBFYToKICAgICAgICAgICAgcmV0dXJuICJTdXNwZW5zZSI7CiAgICAgICAgICBjYXNlIEZhOgogICAgICAgICAgICByZXR1cm4gIlN1c3BlbnNlTGlzdCI7CiAgICAgICAgfQogICAgICAgIGlmICgib2JqZWN0IiA9PT0gdHlwZW9mIGEpCiAgICAgICAgICBzd2l0Y2ggKGEuJCR0eXBlb2YpIHsKICAgICAgICAgICAgY2FzZSBDYToKICAgICAgICAgICAgICByZXR1cm4gKGEuZGlzcGxheU5hbWUgfHwgIkNvbnRleHQiKSArICIuQ29uc3VtZXIiOwogICAgICAgICAgICBjYXNlIEJhOgogICAgICAgICAgICAgIHJldHVybiAoYS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCAiQ29udGV4dCIpICsgIi5Qcm92aWRlciI7CiAgICAgICAgICAgIGNhc2UgRGE6CiAgICAgICAgICAgICAgdmFyIGIgPSBhLnJlbmRlcjsKICAgICAgICAgICAgICBhID0gYS5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgICBhIHx8IChhID0gYi5kaXNwbGF5TmFtZSB8fCBiLm5hbWUgfHwgIiIsIGEgPSAiIiAhPT0gYSA/ICJGb3J3YXJkUmVmKCIgKyBhICsgIikiIDogIkZvcndhcmRSZWYiKTsKICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgY2FzZSBHYToKICAgICAgICAgICAgICByZXR1cm4gYiA9IGEuZGlzcGxheU5hbWUgfHwgbnVsbCwgbnVsbCAhPT0gYiA/IGIgOiBRYShhLnR5cGUpIHx8ICJNZW1vIjsKICAgICAgICAgICAgY2FzZSBIYToKICAgICAgICAgICAgICBiID0gYS5fcGF5bG9hZDsKICAgICAgICAgICAgICBhID0gYS5faW5pdDsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIFFhKGEoYikpOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGMpIHsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gUmEoYSkgewogICAgICAgIHZhciBiID0gYS50eXBlOwogICAgICAgIHN3aXRjaCAoYS50YWcpIHsKICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgIHJldHVybiAiQ2FjaGUiOwogICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICByZXR1cm4gKGIuZGlzcGxheU5hbWUgfHwgIkNvbnRleHQiKSArICIuQ29uc3VtZXIiOwogICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgcmV0dXJuIChiLl9jb250ZXh0LmRpc3BsYXlOYW1lIHx8ICJDb250ZXh0IikgKyAiLlByb3ZpZGVyIjsKICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgIHJldHVybiAiRGVoeWRyYXRlZEZyYWdtZW50IjsKICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgIHJldHVybiBhID0gYi5yZW5kZXIsIGEgPSBhLmRpc3BsYXlOYW1lIHx8IGEubmFtZSB8fCAiIiwgYi5kaXNwbGF5TmFtZSB8fCAoIiIgIT09IGEgPyAiRm9yd2FyZFJlZigiICsgYSArICIpIiA6ICJGb3J3YXJkUmVmIik7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIHJldHVybiAiRnJhZ21lbnQiOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuICJQb3J0YWwiOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICByZXR1cm4gIlJvb3QiOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICByZXR1cm4gIlRleHQiOwogICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgcmV0dXJuIFFhKGIpOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICByZXR1cm4gYiA9PT0gemEgPyAiU3RyaWN0TW9kZSIgOiAiTW9kZSI7CiAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICByZXR1cm4gIk9mZnNjcmVlbiI7CiAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICByZXR1cm4gIlByb2ZpbGVyIjsKICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgIHJldHVybiAiU2NvcGUiOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgcmV0dXJuICJTdXNwZW5zZSI7CiAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICByZXR1cm4gIlN1c3BlbnNlTGlzdCI7CiAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICByZXR1cm4gIlRyYWNpbmdNYXJrZXIiOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGIpCiAgICAgICAgICAgICAgcmV0dXJuIGIuZGlzcGxheU5hbWUgfHwgYi5uYW1lIHx8IG51bGw7CiAgICAgICAgICAgIGlmICgic3RyaW5nIiA9PT0gdHlwZW9mIGIpCiAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFNhKGEpIHsKICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhKSB7CiAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgY2FzZSAidW5kZWZpbmVkIjoKICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICBjYXNlICJvYmplY3QiOgogICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gVGEoYSkgewogICAgICAgIHZhciBiID0gYS50eXBlOwogICAgICAgIHJldHVybiAoYSA9IGEubm9kZU5hbWUpICYmICJpbnB1dCIgPT09IGEudG9Mb3dlckNhc2UoKSAmJiAoImNoZWNrYm94IiA9PT0gYiB8fCAicmFkaW8iID09PSBiKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBVYShhKSB7CiAgICAgICAgdmFyIGIgPSBUYShhKSA/ICJjaGVja2VkIiA6ICJ2YWx1ZSIsIGMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCBiKSwgZCA9ICIiICsgYVtiXTsKICAgICAgICBpZiAoIWEuaGFzT3duUHJvcGVydHkoYikgJiYgInVuZGVmaW5lZCIgIT09IHR5cGVvZiBjICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBjLmdldCAmJiAiZnVuY3Rpb24iID09PSB0eXBlb2YgYy5zZXQpIHsKICAgICAgICAgIHZhciBlID0gYy5nZXQsIGYgPSBjLnNldDsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIGUuY2FsbCh0aGlzKTsKICAgICAgICAgIH0sIHNldDogZnVuY3Rpb24oYTIpIHsKICAgICAgICAgICAgZCA9ICIiICsgYTI7CiAgICAgICAgICAgIGYuY2FsbCh0aGlzLCBhMik7CiAgICAgICAgICB9IH0pOwogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIGIsIHsgZW51bWVyYWJsZTogYy5lbnVtZXJhYmxlIH0pOwogICAgICAgICAgcmV0dXJuIHsgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgIH0sIHNldFZhbHVlOiBmdW5jdGlvbihhMikgewogICAgICAgICAgICBkID0gIiIgKyBhMjsKICAgICAgICAgIH0sIHN0b3BUcmFja2luZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGEuX3ZhbHVlVHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgIGRlbGV0ZSBhW2JdOwogICAgICAgICAgfSB9OwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBWYShhKSB7CiAgICAgICAgYS5fdmFsdWVUcmFja2VyIHx8IChhLl92YWx1ZVRyYWNrZXIgPSBVYShhKSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gV2EoYSkgewogICAgICAgIGlmICghYSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB2YXIgYiA9IGEuX3ZhbHVlVHJhY2tlcjsKICAgICAgICBpZiAoIWIpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB2YXIgYyA9IGIuZ2V0VmFsdWUoKTsKICAgICAgICB2YXIgZCA9ICIiOwogICAgICAgIGEgJiYgKGQgPSBUYShhKSA/IGEuY2hlY2tlZCA/ICJ0cnVlIiA6ICJmYWxzZSIgOiBhLnZhbHVlKTsKICAgICAgICBhID0gZDsKICAgICAgICByZXR1cm4gYSAhPT0gYyA/IChiLnNldFZhbHVlKGEpLCB0cnVlKSA6IGZhbHNlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFhhKGEpIHsKICAgICAgICBhID0gYSB8fCAoInVuZGVmaW5lZCIgIT09IHR5cGVvZiBkb2N1bWVudCA/IGRvY3VtZW50IDogdm9pZCAwKTsKICAgICAgICBpZiAoInVuZGVmaW5lZCIgPT09IHR5cGVvZiBhKQogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBhLmFjdGl2ZUVsZW1lbnQgfHwgYS5ib2R5OwogICAgICAgIH0gY2F0Y2ggKGIpIHsKICAgICAgICAgIHJldHVybiBhLmJvZHk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIFlhKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGIuY2hlY2tlZDsKICAgICAgICByZXR1cm4gQSh7fSwgYiwgeyBkZWZhdWx0Q2hlY2tlZDogdm9pZCAwLCBkZWZhdWx0VmFsdWU6IHZvaWQgMCwgdmFsdWU6IHZvaWQgMCwgY2hlY2tlZDogbnVsbCAhPSBjID8gYyA6IGEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCB9KTsKICAgICAgfQogICAgICBmdW5jdGlvbiBaYShhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBudWxsID09IGIuZGVmYXVsdFZhbHVlID8gIiIgOiBiLmRlZmF1bHRWYWx1ZSwgZCA9IG51bGwgIT0gYi5jaGVja2VkID8gYi5jaGVja2VkIDogYi5kZWZhdWx0Q2hlY2tlZDsKICAgICAgICBjID0gU2EobnVsbCAhPSBiLnZhbHVlID8gYi52YWx1ZSA6IGMpOwogICAgICAgIGEuX3dyYXBwZXJTdGF0ZSA9IHsgaW5pdGlhbENoZWNrZWQ6IGQsIGluaXRpYWxWYWx1ZTogYywgY29udHJvbGxlZDogImNoZWNrYm94IiA9PT0gYi50eXBlIHx8ICJyYWRpbyIgPT09IGIudHlwZSA/IG51bGwgIT0gYi5jaGVja2VkIDogbnVsbCAhPSBiLnZhbHVlIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYWIoYSwgYikgewogICAgICAgIGIgPSBiLmNoZWNrZWQ7CiAgICAgICAgbnVsbCAhPSBiICYmIHRhKGEsICJjaGVja2VkIiwgYiwgZmFsc2UpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGJiKGEsIGIpIHsKICAgICAgICBhYihhLCBiKTsKICAgICAgICB2YXIgYyA9IFNhKGIudmFsdWUpLCBkID0gYi50eXBlOwogICAgICAgIGlmIChudWxsICE9IGMpCiAgICAgICAgICBpZiAoIm51bWJlciIgPT09IGQpIHsKICAgICAgICAgICAgaWYgKDAgPT09IGMgJiYgIiIgPT09IGEudmFsdWUgfHwgYS52YWx1ZSAhPSBjKQogICAgICAgICAgICAgIGEudmFsdWUgPSAiIiArIGM7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgYS52YWx1ZSAhPT0gIiIgKyBjICYmIChhLnZhbHVlID0gIiIgKyBjKTsKICAgICAgICBlbHNlIGlmICgic3VibWl0IiA9PT0gZCB8fCAicmVzZXQiID09PSBkKSB7CiAgICAgICAgICBhLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYi5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKSA/IGNiKGEsIGIudHlwZSwgYykgOiBiLmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSAmJiBjYihhLCBiLnR5cGUsIFNhKGIuZGVmYXVsdFZhbHVlKSk7CiAgICAgICAgbnVsbCA9PSBiLmNoZWNrZWQgJiYgbnVsbCAhPSBiLmRlZmF1bHRDaGVja2VkICYmIChhLmRlZmF1bHRDaGVja2VkID0gISFiLmRlZmF1bHRDaGVja2VkKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBkYihhLCBiLCBjKSB7CiAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoInZhbHVlIikgfHwgYi5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpIHsKICAgICAgICAgIHZhciBkID0gYi50eXBlOwogICAgICAgICAgaWYgKCEoInN1Ym1pdCIgIT09IGQgJiYgInJlc2V0IiAhPT0gZCB8fCB2b2lkIDAgIT09IGIudmFsdWUgJiYgbnVsbCAhPT0gYi52YWx1ZSkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGIgPSAiIiArIGEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7CiAgICAgICAgICBjIHx8IGIgPT09IGEudmFsdWUgfHwgKGEudmFsdWUgPSBiKTsKICAgICAgICAgIGEuZGVmYXVsdFZhbHVlID0gYjsKICAgICAgICB9CiAgICAgICAgYyA9IGEubmFtZTsKICAgICAgICAiIiAhPT0gYyAmJiAoYS5uYW1lID0gIiIpOwogICAgICAgIGEuZGVmYXVsdENoZWNrZWQgPSAhIWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDsKICAgICAgICAiIiAhPT0gYyAmJiAoYS5uYW1lID0gYyk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gY2IoYSwgYiwgYykgewogICAgICAgIGlmICgibnVtYmVyIiAhPT0gYiB8fCBYYShhLm93bmVyRG9jdW1lbnQpICE9PSBhKQogICAgICAgICAgbnVsbCA9PSBjID8gYS5kZWZhdWx0VmFsdWUgPSAiIiArIGEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUgOiBhLmRlZmF1bHRWYWx1ZSAhPT0gIiIgKyBjICYmIChhLmRlZmF1bHRWYWx1ZSA9ICIiICsgYyk7CiAgICAgIH0KICAgICAgdmFyIGViID0gQXJyYXkuaXNBcnJheTsKICAgICAgZnVuY3Rpb24gZmIoYSwgYiwgYywgZCkgewogICAgICAgIGEgPSBhLm9wdGlvbnM7CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGIgPSB7fTsKICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgYy5sZW5ndGg7IGUrKykKICAgICAgICAgICAgYlsiJCIgKyBjW2VdXSA9IHRydWU7CiAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYS5sZW5ndGg7IGMrKykKICAgICAgICAgICAgZSA9IGIuaGFzT3duUHJvcGVydHkoIiQiICsgYVtjXS52YWx1ZSksIGFbY10uc2VsZWN0ZWQgIT09IGUgJiYgKGFbY10uc2VsZWN0ZWQgPSBlKSwgZSAmJiBkICYmIChhW2NdLmRlZmF1bHRTZWxlY3RlZCA9IHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjID0gIiIgKyBTYShjKTsKICAgICAgICAgIGIgPSBudWxsOwogICAgICAgICAgZm9yIChlID0gMDsgZSA8IGEubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgaWYgKGFbZV0udmFsdWUgPT09IGMpIHsKICAgICAgICAgICAgICBhW2VdLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBkICYmIChhW2VdLmRlZmF1bHRTZWxlY3RlZCA9IHRydWUpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBudWxsICE9PSBiIHx8IGFbZV0uZGlzYWJsZWQgfHwgKGIgPSBhW2VdKTsKICAgICAgICAgIH0KICAgICAgICAgIG51bGwgIT09IGIgJiYgKGIuc2VsZWN0ZWQgPSB0cnVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2IoYSwgYikgewogICAgICAgIGlmIChudWxsICE9IGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDkxKSk7CiAgICAgICAgcmV0dXJuIEEoe30sIGIsIHsgdmFsdWU6IHZvaWQgMCwgZGVmYXVsdFZhbHVlOiB2b2lkIDAsIGNoaWxkcmVuOiAiIiArIGEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaGIoYSwgYikgewogICAgICAgIHZhciBjID0gYi52YWx1ZTsKICAgICAgICBpZiAobnVsbCA9PSBjKSB7CiAgICAgICAgICBjID0gYi5jaGlsZHJlbjsKICAgICAgICAgIGIgPSBiLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgIGlmIChudWxsICE9IGMpIHsKICAgICAgICAgICAgaWYgKG51bGwgIT0gYikKICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDkyKSk7CiAgICAgICAgICAgIGlmIChlYihjKSkgewogICAgICAgICAgICAgIGlmICgxIDwgYy5sZW5ndGgpCiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDkzKSk7CiAgICAgICAgICAgICAgYyA9IGNbMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYiA9IGM7CiAgICAgICAgICB9CiAgICAgICAgICBudWxsID09IGIgJiYgKGIgPSAiIik7CiAgICAgICAgICBjID0gYjsKICAgICAgICB9CiAgICAgICAgYS5fd3JhcHBlclN0YXRlID0geyBpbml0aWFsVmFsdWU6IFNhKGMpIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaWIoYSwgYikgewogICAgICAgIHZhciBjID0gU2EoYi52YWx1ZSksIGQgPSBTYShiLmRlZmF1bHRWYWx1ZSk7CiAgICAgICAgbnVsbCAhPSBjICYmIChjID0gIiIgKyBjLCBjICE9PSBhLnZhbHVlICYmIChhLnZhbHVlID0gYyksIG51bGwgPT0gYi5kZWZhdWx0VmFsdWUgJiYgYS5kZWZhdWx0VmFsdWUgIT09IGMgJiYgKGEuZGVmYXVsdFZhbHVlID0gYykpOwogICAgICAgIG51bGwgIT0gZCAmJiAoYS5kZWZhdWx0VmFsdWUgPSAiIiArIGQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGpiKGEpIHsKICAgICAgICB2YXIgYiA9IGEudGV4dENvbnRlbnQ7CiAgICAgICAgYiA9PT0gYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSAmJiAiIiAhPT0gYiAmJiBudWxsICE9PSBiICYmIChhLnZhbHVlID0gYik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24ga2IoYSkgewogICAgICAgIHN3aXRjaCAoYSkgewogICAgICAgICAgY2FzZSAic3ZnIjoKICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgICAgICAgICBjYXNlICJtYXRoIjoKICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGxiKGEsIGIpIHsKICAgICAgICByZXR1cm4gbnVsbCA9PSBhIHx8ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiA9PT0gYSA/IGtiKGIpIDogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiA9PT0gYSAmJiAiZm9yZWlnbk9iamVjdCIgPT09IGIgPyAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgOiBhOwogICAgICB9CiAgICAgIHZhciBtYjsKICAgICAgdmFyIG5iID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiAidW5kZWZpbmVkIiAhPT0gdHlwZW9mIE1TQXBwICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uID8gZnVuY3Rpb24oYiwgYywgZCwgZSkgewogICAgICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBhKGIsIGMsIGQsIGUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSA6IGE7CiAgICAgIH0oZnVuY3Rpb24oYSwgYikgewogICAgICAgIGlmICgiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciICE9PSBhLm5hbWVzcGFjZVVSSSB8fCAiaW5uZXJIVE1MIiBpbiBhKQogICAgICAgICAgYS5pbm5lckhUTUwgPSBiOwogICAgICAgIGVsc2UgewogICAgICAgICAgbWIgPSBtYiB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgIG1iLmlubmVySFRNTCA9ICI8c3ZnPiIgKyBiLnZhbHVlT2YoKS50b1N0cmluZygpICsgIjwvc3ZnPiI7CiAgICAgICAgICBmb3IgKGIgPSBtYi5maXJzdENoaWxkOyBhLmZpcnN0Q2hpbGQ7ICkKICAgICAgICAgICAgYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwogICAgICAgICAgZm9yICg7IGIuZmlyc3RDaGlsZDsgKQogICAgICAgICAgICBhLmFwcGVuZENoaWxkKGIuZmlyc3RDaGlsZCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgZnVuY3Rpb24gb2IoYSwgYikgewogICAgICAgIGlmIChiKSB7CiAgICAgICAgICB2YXIgYyA9IGEuZmlyc3RDaGlsZDsKICAgICAgICAgIGlmIChjICYmIGMgPT09IGEubGFzdENoaWxkICYmIDMgPT09IGMubm9kZVR5cGUpIHsKICAgICAgICAgICAgYy5ub2RlVmFsdWUgPSBiOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGEudGV4dENvbnRlbnQgPSBiOwogICAgICB9CiAgICAgIHZhciBwYiA9IHsKICAgICAgICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSwKICAgICAgICBhc3BlY3RSYXRpbzogdHJ1ZSwKICAgICAgICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSwKICAgICAgICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLAogICAgICAgIGJvcmRlckltYWdlV2lkdGg6IHRydWUsCiAgICAgICAgYm94RmxleDogdHJ1ZSwKICAgICAgICBib3hGbGV4R3JvdXA6IHRydWUsCiAgICAgICAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLAogICAgICAgIGNvbHVtbkNvdW50OiB0cnVlLAogICAgICAgIGNvbHVtbnM6IHRydWUsCiAgICAgICAgZmxleDogdHJ1ZSwKICAgICAgICBmbGV4R3JvdzogdHJ1ZSwKICAgICAgICBmbGV4UG9zaXRpdmU6IHRydWUsCiAgICAgICAgZmxleFNocmluazogdHJ1ZSwKICAgICAgICBmbGV4TmVnYXRpdmU6IHRydWUsCiAgICAgICAgZmxleE9yZGVyOiB0cnVlLAogICAgICAgIGdyaWRBcmVhOiB0cnVlLAogICAgICAgIGdyaWRSb3c6IHRydWUsCiAgICAgICAgZ3JpZFJvd0VuZDogdHJ1ZSwKICAgICAgICBncmlkUm93U3BhbjogdHJ1ZSwKICAgICAgICBncmlkUm93U3RhcnQ6IHRydWUsCiAgICAgICAgZ3JpZENvbHVtbjogdHJ1ZSwKICAgICAgICBncmlkQ29sdW1uRW5kOiB0cnVlLAogICAgICAgIGdyaWRDb2x1bW5TcGFuOiB0cnVlLAogICAgICAgIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSwKICAgICAgICBmb250V2VpZ2h0OiB0cnVlLAogICAgICAgIGxpbmVDbGFtcDogdHJ1ZSwKICAgICAgICBsaW5lSGVpZ2h0OiB0cnVlLAogICAgICAgIG9wYWNpdHk6IHRydWUsCiAgICAgICAgb3JkZXI6IHRydWUsCiAgICAgICAgb3JwaGFuczogdHJ1ZSwKICAgICAgICB0YWJTaXplOiB0cnVlLAogICAgICAgIHdpZG93czogdHJ1ZSwKICAgICAgICB6SW5kZXg6IHRydWUsCiAgICAgICAgem9vbTogdHJ1ZSwKICAgICAgICBmaWxsT3BhY2l0eTogdHJ1ZSwKICAgICAgICBmbG9vZE9wYWNpdHk6IHRydWUsCiAgICAgICAgc3RvcE9wYWNpdHk6IHRydWUsCiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLAogICAgICAgIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsCiAgICAgICAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSwKICAgICAgICBzdHJva2VPcGFjaXR5OiB0cnVlLAogICAgICAgIHN0cm9rZVdpZHRoOiB0cnVlCiAgICAgIH07CiAgICAgIHZhciBxYiA9IFsiV2Via2l0IiwgIm1zIiwgIk1veiIsICJPIl07CiAgICAgIE9iamVjdC5rZXlzKHBiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICBxYi5mb3JFYWNoKGZ1bmN0aW9uKGIpIHsKICAgICAgICAgIGIgPSBiICsgYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGEuc3Vic3RyaW5nKDEpOwogICAgICAgICAgcGJbYl0gPSBwYlthXTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIGZ1bmN0aW9uIHJiKGEsIGIsIGMpIHsKICAgICAgICByZXR1cm4gbnVsbCA9PSBiIHx8ICJib29sZWFuIiA9PT0gdHlwZW9mIGIgfHwgIiIgPT09IGIgPyAiIiA6IGMgfHwgIm51bWJlciIgIT09IHR5cGVvZiBiIHx8IDAgPT09IGIgfHwgcGIuaGFzT3duUHJvcGVydHkoYSkgJiYgcGJbYV0gPyAoIiIgKyBiKS50cmltKCkgOiBiICsgInB4IjsKICAgICAgfQogICAgICBmdW5jdGlvbiBzYihhLCBiKSB7CiAgICAgICAgYSA9IGEuc3R5bGU7CiAgICAgICAgZm9yICh2YXIgYyBpbiBiKQogICAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoYykpIHsKICAgICAgICAgICAgdmFyIGQgPSAwID09PSBjLmluZGV4T2YoIi0tIiksIGUgPSByYihjLCBiW2NdLCBkKTsKICAgICAgICAgICAgImZsb2F0IiA9PT0gYyAmJiAoYyA9ICJjc3NGbG9hdCIpOwogICAgICAgICAgICBkID8gYS5zZXRQcm9wZXJ0eShjLCBlKSA6IGFbY10gPSBlOwogICAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB0YiA9IEEoeyBtZW51aXRlbTogdHJ1ZSB9LCB7IGFyZWE6IHRydWUsIGJhc2U6IHRydWUsIGJyOiB0cnVlLCBjb2w6IHRydWUsIGVtYmVkOiB0cnVlLCBocjogdHJ1ZSwgaW1nOiB0cnVlLCBpbnB1dDogdHJ1ZSwga2V5Z2VuOiB0cnVlLCBsaW5rOiB0cnVlLCBtZXRhOiB0cnVlLCBwYXJhbTogdHJ1ZSwgc291cmNlOiB0cnVlLCB0cmFjazogdHJ1ZSwgd2JyOiB0cnVlIH0pOwogICAgICBmdW5jdGlvbiB1YihhLCBiKSB7CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmICh0YlthXSAmJiAobnVsbCAhPSBiLmNoaWxkcmVuIHx8IG51bGwgIT0gYi5kYW5nZXJvdXNseVNldElubmVySFRNTCkpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoMTM3LCBhKSk7CiAgICAgICAgICBpZiAobnVsbCAhPSBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSB7CiAgICAgICAgICAgIGlmIChudWxsICE9IGIuY2hpbGRyZW4pCiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCg2MCkpOwogICAgICAgICAgICBpZiAoIm9iamVjdCIgIT09IHR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIHx8ICEoIl9faHRtbCIgaW4gYi5kYW5nZXJvdXNseVNldElubmVySFRNTCkpCiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCg2MSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG51bGwgIT0gYi5zdHlsZSAmJiAib2JqZWN0IiAhPT0gdHlwZW9mIGIuc3R5bGUpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoNjIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdmIoYSwgYikgewogICAgICAgIGlmICgtMSA9PT0gYS5pbmRleE9mKCItIikpCiAgICAgICAgICByZXR1cm4gInN0cmluZyIgPT09IHR5cGVvZiBiLmlzOwogICAgICAgIHN3aXRjaCAoYSkgewogICAgICAgICAgY2FzZSAiYW5ub3RhdGlvbi14bWwiOgogICAgICAgICAgY2FzZSAiY29sb3ItcHJvZmlsZSI6CiAgICAgICAgICBjYXNlICJmb250LWZhY2UiOgogICAgICAgICAgY2FzZSAiZm9udC1mYWNlLXNyYyI6CiAgICAgICAgICBjYXNlICJmb250LWZhY2UtdXJpIjoKICAgICAgICAgIGNhc2UgImZvbnQtZmFjZS1mb3JtYXQiOgogICAgICAgICAgY2FzZSAiZm9udC1mYWNlLW5hbWUiOgogICAgICAgICAgY2FzZSAibWlzc2luZy1nbHlwaCI6CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgd2IgPSBudWxsOwogICAgICBmdW5jdGlvbiB4YihhKSB7CiAgICAgICAgYSA9IGEudGFyZ2V0IHx8IGEuc3JjRWxlbWVudCB8fCB3aW5kb3c7CiAgICAgICAgYS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCAmJiAoYSA9IGEuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpOwogICAgICAgIHJldHVybiAzID09PSBhLm5vZGVUeXBlID8gYS5wYXJlbnROb2RlIDogYTsKICAgICAgfQogICAgICB2YXIgeWIgPSBudWxsOwogICAgICB2YXIgemIgPSBudWxsOwogICAgICB2YXIgQWIgPSBudWxsOwogICAgICBmdW5jdGlvbiBCYihhKSB7CiAgICAgICAgaWYgKGEgPSBDYihhKSkgewogICAgICAgICAgaWYgKCJmdW5jdGlvbiIgIT09IHR5cGVvZiB5YikKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgyODApKTsKICAgICAgICAgIHZhciBiID0gYS5zdGF0ZU5vZGU7CiAgICAgICAgICBiICYmIChiID0gRGIoYiksIHliKGEuc3RhdGVOb2RlLCBhLnR5cGUsIGIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gRWIoYSkgewogICAgICAgIHpiID8gQWIgPyBBYi5wdXNoKGEpIDogQWIgPSBbYV0gOiB6YiA9IGE7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gRmIoKSB7CiAgICAgICAgaWYgKHpiKSB7CiAgICAgICAgICB2YXIgYSA9IHpiLCBiID0gQWI7CiAgICAgICAgICBBYiA9IHpiID0gbnVsbDsKICAgICAgICAgIEJiKGEpOwogICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCBiLmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgIEJiKGJbYV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBHYihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEoYik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gSGIoKSB7CiAgICAgIH0KICAgICAgdmFyIEliID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIEpiKGEsIGIsIGMpIHsKICAgICAgICBpZiAoSWIpCiAgICAgICAgICByZXR1cm4gYShiLCBjKTsKICAgICAgICBJYiA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBHYihhLCBiLCBjKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgaWYgKEliID0gZmFsc2UsIG51bGwgIT09IHpiIHx8IG51bGwgIT09IEFiKQogICAgICAgICAgICBIYigpLCBGYigpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBLYihhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBhLnN0YXRlTm9kZTsKICAgICAgICBpZiAobnVsbCA9PT0gYykKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHZhciBkID0gRGIoYyk7CiAgICAgICAgaWYgKG51bGwgPT09IGQpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBjID0gZFtiXTsKICAgICAgICBhOgogICAgICAgICAgc3dpdGNoIChiKSB7CiAgICAgICAgICAgIGNhc2UgIm9uQ2xpY2siOgogICAgICAgICAgICBjYXNlICJvbkNsaWNrQ2FwdHVyZSI6CiAgICAgICAgICAgIGNhc2UgIm9uRG91YmxlQ2xpY2siOgogICAgICAgICAgICBjYXNlICJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6CiAgICAgICAgICAgIGNhc2UgIm9uTW91c2VEb3duIjoKICAgICAgICAgICAgY2FzZSAib25Nb3VzZURvd25DYXB0dXJlIjoKICAgICAgICAgICAgY2FzZSAib25Nb3VzZU1vdmUiOgogICAgICAgICAgICBjYXNlICJvbk1vdXNlTW92ZUNhcHR1cmUiOgogICAgICAgICAgICBjYXNlICJvbk1vdXNlVXAiOgogICAgICAgICAgICBjYXNlICJvbk1vdXNlVXBDYXB0dXJlIjoKICAgICAgICAgICAgY2FzZSAib25Nb3VzZUVudGVyIjoKICAgICAgICAgICAgICAoZCA9ICFkLmRpc2FibGVkKSB8fCAoYSA9IGEudHlwZSwgZCA9ICEoImJ1dHRvbiIgPT09IGEgfHwgImlucHV0IiA9PT0gYSB8fCAic2VsZWN0IiA9PT0gYSB8fCAidGV4dGFyZWEiID09PSBhKSk7CiAgICAgICAgICAgICAgYSA9ICFkOwogICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgYSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIGlmIChhKQogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgaWYgKGMgJiYgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGMpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDIzMSwgYiwgdHlwZW9mIGMpKTsKICAgICAgICByZXR1cm4gYzsKICAgICAgfQogICAgICB2YXIgTGIgPSBmYWxzZTsKICAgICAgaWYgKGlhKQogICAgICAgIHRyeSB7CiAgICAgICAgICBNYiA9IHt9OwogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1iLCAicGFzc2l2ZSIsIHsgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgTGIgPSB0cnVlOwogICAgICAgICAgfSB9KTsKICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IiwgTWIsIE1iKTsKICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IiwgTWIsIE1iKTsKICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICBMYiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgdmFyIE1iOwogICAgICBmdW5jdGlvbiBOYihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBrKSB7CiAgICAgICAgdmFyIGwgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpOwogICAgICAgIHRyeSB7CiAgICAgICAgICBiLmFwcGx5KGMsIGwpOwogICAgICAgIH0gY2F0Y2ggKG0pIHsKICAgICAgICAgIHRoaXMub25FcnJvcihtKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIE9iID0gZmFsc2U7CiAgICAgIHZhciBQYiA9IG51bGw7CiAgICAgIHZhciBRYiA9IGZhbHNlOwogICAgICB2YXIgUmIgPSBudWxsOwogICAgICB2YXIgU2IgPSB7IG9uRXJyb3I6IGZ1bmN0aW9uKGEpIHsKICAgICAgICBPYiA9IHRydWU7CiAgICAgICAgUGIgPSBhOwogICAgICB9IH07CiAgICAgIGZ1bmN0aW9uIFRiKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGspIHsKICAgICAgICBPYiA9IGZhbHNlOwogICAgICAgIFBiID0gbnVsbDsKICAgICAgICBOYi5hcHBseShTYiwgYXJndW1lbnRzKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBVYihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBrKSB7CiAgICAgICAgVGIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAoT2IpIHsKICAgICAgICAgIGlmIChPYikgewogICAgICAgICAgICB2YXIgbCA9IFBiOwogICAgICAgICAgICBPYiA9IGZhbHNlOwogICAgICAgICAgICBQYiA9IG51bGw7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxOTgpKTsKICAgICAgICAgIFFiIHx8IChRYiA9IHRydWUsIFJiID0gbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIFZiKGEpIHsKICAgICAgICB2YXIgYiA9IGEsIGMgPSBhOwogICAgICAgIGlmIChhLmFsdGVybmF0ZSkKICAgICAgICAgIGZvciAoOyBiLnJldHVybjsgKQogICAgICAgICAgICBiID0gYi5yZXR1cm47CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBhID0gYjsKICAgICAgICAgIGRvCiAgICAgICAgICAgIGIgPSBhLCAwICE9PSAoYi5mbGFncyAmIDQwOTgpICYmIChjID0gYi5yZXR1cm4pLCBhID0gYi5yZXR1cm47CiAgICAgICAgICB3aGlsZSAoYSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAzID09PSBiLnRhZyA/IGMgOiBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFdiKGEpIHsKICAgICAgICBpZiAoMTMgPT09IGEudGFnKSB7CiAgICAgICAgICB2YXIgYiA9IGEubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgIG51bGwgPT09IGIgJiYgKGEgPSBhLmFsdGVybmF0ZSwgbnVsbCAhPT0gYSAmJiAoYiA9IGEubWVtb2l6ZWRTdGF0ZSkpOwogICAgICAgICAgaWYgKG51bGwgIT09IGIpCiAgICAgICAgICAgIHJldHVybiBiLmRlaHlkcmF0ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFhiKGEpIHsKICAgICAgICBpZiAoVmIoYSkgIT09IGEpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDE4OCkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFliKGEpIHsKICAgICAgICB2YXIgYiA9IGEuYWx0ZXJuYXRlOwogICAgICAgIGlmICghYikgewogICAgICAgICAgYiA9IFZiKGEpOwogICAgICAgICAgaWYgKG51bGwgPT09IGIpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoMTg4KSk7CiAgICAgICAgICByZXR1cm4gYiAhPT0gYSA/IG51bGwgOiBhOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBjID0gYSwgZCA9IGI7IDsgKSB7CiAgICAgICAgICB2YXIgZSA9IGMucmV0dXJuOwogICAgICAgICAgaWYgKG51bGwgPT09IGUpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgdmFyIGYgPSBlLmFsdGVybmF0ZTsKICAgICAgICAgIGlmIChudWxsID09PSBmKSB7CiAgICAgICAgICAgIGQgPSBlLnJldHVybjsKICAgICAgICAgICAgaWYgKG51bGwgIT09IGQpIHsKICAgICAgICAgICAgICBjID0gZDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChlLmNoaWxkID09PSBmLmNoaWxkKSB7CiAgICAgICAgICAgIGZvciAoZiA9IGUuY2hpbGQ7IGY7ICkgewogICAgICAgICAgICAgIGlmIChmID09PSBjKQogICAgICAgICAgICAgICAgcmV0dXJuIFhiKGUpLCBhOwogICAgICAgICAgICAgIGlmIChmID09PSBkKQogICAgICAgICAgICAgICAgcmV0dXJuIFhiKGUpLCBiOwogICAgICAgICAgICAgIGYgPSBmLnNpYmxpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxODgpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjLnJldHVybiAhPT0gZC5yZXR1cm4pCiAgICAgICAgICAgIGMgPSBlLCBkID0gZjsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBnID0gZmFsc2UsIGggPSBlLmNoaWxkOyBoOyApIHsKICAgICAgICAgICAgICBpZiAoaCA9PT0gYykgewogICAgICAgICAgICAgICAgZyA9IHRydWU7CiAgICAgICAgICAgICAgICBjID0gZTsKICAgICAgICAgICAgICAgIGQgPSBmOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChoID09PSBkKSB7CiAgICAgICAgICAgICAgICBnID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGQgPSBlOwogICAgICAgICAgICAgICAgYyA9IGY7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaCA9IGguc2libGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWcpIHsKICAgICAgICAgICAgICBmb3IgKGggPSBmLmNoaWxkOyBoOyApIHsKICAgICAgICAgICAgICAgIGlmIChoID09PSBjKSB7CiAgICAgICAgICAgICAgICAgIGcgPSB0cnVlOwogICAgICAgICAgICAgICAgICBjID0gZjsKICAgICAgICAgICAgICAgICAgZCA9IGU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGggPT09IGQpIHsKICAgICAgICAgICAgICAgICAgZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGQgPSBmOwogICAgICAgICAgICAgICAgICBjID0gZTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoID0gaC5zaWJsaW5nOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoIWcpCiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDE4OSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYy5hbHRlcm5hdGUgIT09IGQpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoMTkwKSk7CiAgICAgICAgfQogICAgICAgIGlmICgzICE9PSBjLnRhZykKICAgICAgICAgIHRocm93IEVycm9yKHAoMTg4KSk7CiAgICAgICAgcmV0dXJuIGMuc3RhdGVOb2RlLmN1cnJlbnQgPT09IGMgPyBhIDogYjsKICAgICAgfQogICAgICBmdW5jdGlvbiBaYihhKSB7CiAgICAgICAgYSA9IFliKGEpOwogICAgICAgIHJldHVybiBudWxsICE9PSBhID8gJGIoYSkgOiBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uICRiKGEpIHsKICAgICAgICBpZiAoNSA9PT0gYS50YWcgfHwgNiA9PT0gYS50YWcpCiAgICAgICAgICByZXR1cm4gYTsKICAgICAgICBmb3IgKGEgPSBhLmNoaWxkOyBudWxsICE9PSBhOyApIHsKICAgICAgICAgIHZhciBiID0gJGIoYSk7CiAgICAgICAgICBpZiAobnVsbCAhPT0gYikKICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICBhID0gYS5zaWJsaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB2YXIgYWMgPSBjYS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrOwogICAgICB2YXIgYmMgPSBjYS51bnN0YWJsZV9jYW5jZWxDYWxsYmFjazsKICAgICAgdmFyIGNjID0gY2EudW5zdGFibGVfc2hvdWxkWWllbGQ7CiAgICAgIHZhciBkYyA9IGNhLnVuc3RhYmxlX3JlcXVlc3RQYWludDsKICAgICAgdmFyIEIgPSBjYS51bnN0YWJsZV9ub3c7CiAgICAgIHZhciBlYyA9IGNhLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsOwogICAgICB2YXIgZmMgPSBjYS51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTsKICAgICAgdmFyIGdjID0gY2EudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk7CiAgICAgIHZhciBoYyA9IGNhLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5OwogICAgICB2YXIgaWMgPSBjYS51bnN0YWJsZV9Mb3dQcmlvcml0eTsKICAgICAgdmFyIGpjID0gY2EudW5zdGFibGVfSWRsZVByaW9yaXR5OwogICAgICB2YXIga2MgPSBudWxsOwogICAgICB2YXIgbGMgPSBudWxsOwogICAgICBmdW5jdGlvbiBtYyhhKSB7CiAgICAgICAgaWYgKGxjICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBsYy5vbkNvbW1pdEZpYmVyUm9vdCkKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxjLm9uQ29tbWl0RmliZXJSb290KGtjLCBhLCB2b2lkIDAsIDEyOCA9PT0gKGEuY3VycmVudC5mbGFncyAmIDEyOCkpOwogICAgICAgICAgfSBjYXRjaCAoYikgewogICAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBvYyA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogbmM7CiAgICAgIHZhciBwYyA9IE1hdGgubG9nOwogICAgICB2YXIgcWMgPSBNYXRoLkxOMjsKICAgICAgZnVuY3Rpb24gbmMoYSkgewogICAgICAgIGEgPj4+PSAwOwogICAgICAgIHJldHVybiAwID09PSBhID8gMzIgOiAzMSAtIChwYyhhKSAvIHFjIHwgMCkgfCAwOwogICAgICB9CiAgICAgIHZhciByYyA9IDY0OwogICAgICB2YXIgc2MgPSA0MTk0MzA0OwogICAgICBmdW5jdGlvbiB0YyhhKSB7CiAgICAgICAgc3dpdGNoIChhICYgLWEpIHsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgcmV0dXJuIDg7CiAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICByZXR1cm4gMzI7CiAgICAgICAgICBjYXNlIDY0OgogICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICBjYXNlIDI1NjoKICAgICAgICAgIGNhc2UgNTEyOgogICAgICAgICAgY2FzZSAxMDI0OgogICAgICAgICAgY2FzZSAyMDQ4OgogICAgICAgICAgY2FzZSA0MDk2OgogICAgICAgICAgY2FzZSA4MTkyOgogICAgICAgICAgY2FzZSAxNjM4NDoKICAgICAgICAgIGNhc2UgMzI3Njg6CiAgICAgICAgICBjYXNlIDY1NTM2OgogICAgICAgICAgY2FzZSAxMzEwNzI6CiAgICAgICAgICBjYXNlIDI2MjE0NDoKICAgICAgICAgIGNhc2UgNTI0Mjg4OgogICAgICAgICAgY2FzZSAxMDQ4NTc2OgogICAgICAgICAgY2FzZSAyMDk3MTUyOgogICAgICAgICAgICByZXR1cm4gYSAmIDQxOTQyNDA7CiAgICAgICAgICBjYXNlIDQxOTQzMDQ6CiAgICAgICAgICBjYXNlIDgzODg2MDg6CiAgICAgICAgICBjYXNlIDE2Nzc3MjE2OgogICAgICAgICAgY2FzZSAzMzU1NDQzMjoKICAgICAgICAgIGNhc2UgNjcxMDg4NjQ6CiAgICAgICAgICAgIHJldHVybiBhICYgMTMwMDIzNDI0OwogICAgICAgICAgY2FzZSAxMzQyMTc3Mjg6CiAgICAgICAgICAgIHJldHVybiAxMzQyMTc3Mjg7CiAgICAgICAgICBjYXNlIDI2ODQzNTQ1NjoKICAgICAgICAgICAgcmV0dXJuIDI2ODQzNTQ1NjsKICAgICAgICAgIGNhc2UgNTM2ODcwOTEyOgogICAgICAgICAgICByZXR1cm4gNTM2ODcwOTEyOwogICAgICAgICAgY2FzZSAxMDczNzQxODI0OgogICAgICAgICAgICByZXR1cm4gMTA3Mzc0MTgyNDsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiB1YyhhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBhLnBlbmRpbmdMYW5lczsKICAgICAgICBpZiAoMCA9PT0gYykKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHZhciBkID0gMCwgZSA9IGEuc3VzcGVuZGVkTGFuZXMsIGYgPSBhLnBpbmdlZExhbmVzLCBnID0gYyAmIDI2ODQzNTQ1NTsKICAgICAgICBpZiAoMCAhPT0gZykgewogICAgICAgICAgdmFyIGggPSBnICYgfmU7CiAgICAgICAgICAwICE9PSBoID8gZCA9IHRjKGgpIDogKGYgJj0gZywgMCAhPT0gZiAmJiAoZCA9IHRjKGYpKSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBnID0gYyAmIH5lLCAwICE9PSBnID8gZCA9IHRjKGcpIDogMCAhPT0gZiAmJiAoZCA9IHRjKGYpKTsKICAgICAgICBpZiAoMCA9PT0gZCkKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmICgwICE9PSBiICYmIGIgIT09IGQgJiYgMCA9PT0gKGIgJiBlKSAmJiAoZSA9IGQgJiAtZCwgZiA9IGIgJiAtYiwgZSA+PSBmIHx8IDE2ID09PSBlICYmIDAgIT09IChmICYgNDE5NDI0MCkpKQogICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgMCAhPT0gKGQgJiA0KSAmJiAoZCB8PSBjICYgMTYpOwogICAgICAgIGIgPSBhLmVudGFuZ2xlZExhbmVzOwogICAgICAgIGlmICgwICE9PSBiKQogICAgICAgICAgZm9yIChhID0gYS5lbnRhbmdsZW1lbnRzLCBiICY9IGQ7IDAgPCBiOyApCiAgICAgICAgICAgIGMgPSAzMSAtIG9jKGIpLCBlID0gMSA8PCBjLCBkIHw9IGFbY10sIGIgJj0gfmU7CiAgICAgICAgcmV0dXJuIGQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdmMoYSwgYikgewogICAgICAgIHN3aXRjaCAoYSkgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICByZXR1cm4gYiArIDI1MDsKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgY2FzZSA2NDoKICAgICAgICAgIGNhc2UgMTI4OgogICAgICAgICAgY2FzZSAyNTY6CiAgICAgICAgICBjYXNlIDUxMjoKICAgICAgICAgIGNhc2UgMTAyNDoKICAgICAgICAgIGNhc2UgMjA0ODoKICAgICAgICAgIGNhc2UgNDA5NjoKICAgICAgICAgIGNhc2UgODE5MjoKICAgICAgICAgIGNhc2UgMTYzODQ6CiAgICAgICAgICBjYXNlIDMyNzY4OgogICAgICAgICAgY2FzZSA2NTUzNjoKICAgICAgICAgIGNhc2UgMTMxMDcyOgogICAgICAgICAgY2FzZSAyNjIxNDQ6CiAgICAgICAgICBjYXNlIDUyNDI4ODoKICAgICAgICAgIGNhc2UgMTA0ODU3NjoKICAgICAgICAgIGNhc2UgMjA5NzE1MjoKICAgICAgICAgICAgcmV0dXJuIGIgKyA1ZTM7CiAgICAgICAgICBjYXNlIDQxOTQzMDQ6CiAgICAgICAgICBjYXNlIDgzODg2MDg6CiAgICAgICAgICBjYXNlIDE2Nzc3MjE2OgogICAgICAgICAgY2FzZSAzMzU1NDQzMjoKICAgICAgICAgIGNhc2UgNjcxMDg4NjQ6CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIGNhc2UgMTM0MjE3NzI4OgogICAgICAgICAgY2FzZSAyNjg0MzU0NTY6CiAgICAgICAgICBjYXNlIDUzNjg3MDkxMjoKICAgICAgICAgIGNhc2UgMTA3Mzc0MTgyNDoKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiB3YyhhLCBiKSB7CiAgICAgICAgZm9yICh2YXIgYyA9IGEuc3VzcGVuZGVkTGFuZXMsIGQgPSBhLnBpbmdlZExhbmVzLCBlID0gYS5leHBpcmF0aW9uVGltZXMsIGYgPSBhLnBlbmRpbmdMYW5lczsgMCA8IGY7ICkgewogICAgICAgICAgdmFyIGcgPSAzMSAtIG9jKGYpLCBoID0gMSA8PCBnLCBrID0gZVtnXTsKICAgICAgICAgIGlmICgtMSA9PT0gaykgewogICAgICAgICAgICBpZiAoMCA9PT0gKGggJiBjKSB8fCAwICE9PSAoaCAmIGQpKQogICAgICAgICAgICAgIGVbZ10gPSB2YyhoLCBiKTsKICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICBrIDw9IGIgJiYgKGEuZXhwaXJlZExhbmVzIHw9IGgpOwogICAgICAgICAgZiAmPSB+aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24geGMoYSkgewogICAgICAgIGEgPSBhLnBlbmRpbmdMYW5lcyAmIC0xMDczNzQxODI1OwogICAgICAgIHJldHVybiAwICE9PSBhID8gYSA6IGEgJiAxMDczNzQxODI0ID8gMTA3Mzc0MTgyNCA6IDA7CiAgICAgIH0KICAgICAgZnVuY3Rpb24geWMoKSB7CiAgICAgICAgdmFyIGEgPSByYzsKICAgICAgICByYyA8PD0gMTsKICAgICAgICAwID09PSAocmMgJiA0MTk0MjQwKSAmJiAocmMgPSA2NCk7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gemMoYSkgewogICAgICAgIGZvciAodmFyIGIgPSBbXSwgYyA9IDA7IDMxID4gYzsgYysrKQogICAgICAgICAgYi5wdXNoKGEpOwogICAgICAgIHJldHVybiBiOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEFjKGEsIGIsIGMpIHsKICAgICAgICBhLnBlbmRpbmdMYW5lcyB8PSBiOwogICAgICAgIDUzNjg3MDkxMiAhPT0gYiAmJiAoYS5zdXNwZW5kZWRMYW5lcyA9IDAsIGEucGluZ2VkTGFuZXMgPSAwKTsKICAgICAgICBhID0gYS5ldmVudFRpbWVzOwogICAgICAgIGIgPSAzMSAtIG9jKGIpOwogICAgICAgIGFbYl0gPSBjOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEJjKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGEucGVuZGluZ0xhbmVzICYgfmI7CiAgICAgICAgYS5wZW5kaW5nTGFuZXMgPSBiOwogICAgICAgIGEuc3VzcGVuZGVkTGFuZXMgPSAwOwogICAgICAgIGEucGluZ2VkTGFuZXMgPSAwOwogICAgICAgIGEuZXhwaXJlZExhbmVzICY9IGI7CiAgICAgICAgYS5tdXRhYmxlUmVhZExhbmVzICY9IGI7CiAgICAgICAgYS5lbnRhbmdsZWRMYW5lcyAmPSBiOwogICAgICAgIGIgPSBhLmVudGFuZ2xlbWVudHM7CiAgICAgICAgdmFyIGQgPSBhLmV2ZW50VGltZXM7CiAgICAgICAgZm9yIChhID0gYS5leHBpcmF0aW9uVGltZXM7IDAgPCBjOyApIHsKICAgICAgICAgIHZhciBlID0gMzEgLSBvYyhjKSwgZiA9IDEgPDwgZTsKICAgICAgICAgIGJbZV0gPSAwOwogICAgICAgICAgZFtlXSA9IC0xOwogICAgICAgICAgYVtlXSA9IC0xOwogICAgICAgICAgYyAmPSB+ZjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gQ2MoYSwgYikgewogICAgICAgIHZhciBjID0gYS5lbnRhbmdsZWRMYW5lcyB8PSBiOwogICAgICAgIGZvciAoYSA9IGEuZW50YW5nbGVtZW50czsgYzsgKSB7CiAgICAgICAgICB2YXIgZCA9IDMxIC0gb2MoYyksIGUgPSAxIDw8IGQ7CiAgICAgICAgICBlICYgYiB8IGFbZF0gJiBiICYmIChhW2RdIHw9IGIpOwogICAgICAgICAgYyAmPSB+ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIEMgPSAwOwogICAgICBmdW5jdGlvbiBEYyhhKSB7CiAgICAgICAgYSAmPSAtYTsKICAgICAgICByZXR1cm4gMSA8IGEgPyA0IDwgYSA/IDAgIT09IChhICYgMjY4NDM1NDU1KSA/IDE2IDogNTM2ODcwOTEyIDogNCA6IDE7CiAgICAgIH0KICAgICAgdmFyIEVjOwogICAgICB2YXIgRmM7CiAgICAgIHZhciBHYzsKICAgICAgdmFyIEhjOwogICAgICB2YXIgSWM7CiAgICAgIHZhciBKYyA9IGZhbHNlOwogICAgICB2YXIgS2MgPSBbXTsKICAgICAgdmFyIExjID0gbnVsbDsKICAgICAgdmFyIE1jID0gbnVsbDsKICAgICAgdmFyIE5jID0gbnVsbDsKICAgICAgdmFyIE9jID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgdmFyIFBjID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgdmFyIFFjID0gW107CiAgICAgIHZhciBSYyA9ICJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0Ii5zcGxpdCgiICIpOwogICAgICBmdW5jdGlvbiBTYyhhLCBiKSB7CiAgICAgICAgc3dpdGNoIChhKSB7CiAgICAgICAgICBjYXNlICJmb2N1c2luIjoKICAgICAgICAgIGNhc2UgImZvY3Vzb3V0IjoKICAgICAgICAgICAgTGMgPSBudWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImRyYWdlbnRlciI6CiAgICAgICAgICBjYXNlICJkcmFnbGVhdmUiOgogICAgICAgICAgICBNYyA9IG51bGw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAibW91c2VvdmVyIjoKICAgICAgICAgIGNhc2UgIm1vdXNlb3V0IjoKICAgICAgICAgICAgTmMgPSBudWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInBvaW50ZXJvdmVyIjoKICAgICAgICAgIGNhc2UgInBvaW50ZXJvdXQiOgogICAgICAgICAgICBPYy5kZWxldGUoYi5wb2ludGVySWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImdvdHBvaW50ZXJjYXB0dXJlIjoKICAgICAgICAgIGNhc2UgImxvc3Rwb2ludGVyY2FwdHVyZSI6CiAgICAgICAgICAgIFBjLmRlbGV0ZShiLnBvaW50ZXJJZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIFRjKGEsIGIsIGMsIGQsIGUsIGYpIHsKICAgICAgICBpZiAobnVsbCA9PT0gYSB8fCBhLm5hdGl2ZUV2ZW50ICE9PSBmKQogICAgICAgICAgcmV0dXJuIGEgPSB7IGJsb2NrZWRPbjogYiwgZG9tRXZlbnROYW1lOiBjLCBldmVudFN5c3RlbUZsYWdzOiBkLCBuYXRpdmVFdmVudDogZiwgdGFyZ2V0Q29udGFpbmVyczogW2VdIH0sIG51bGwgIT09IGIgJiYgKGIgPSBDYihiKSwgbnVsbCAhPT0gYiAmJiBGYyhiKSksIGE7CiAgICAgICAgYS5ldmVudFN5c3RlbUZsYWdzIHw9IGQ7CiAgICAgICAgYiA9IGEudGFyZ2V0Q29udGFpbmVyczsKICAgICAgICBudWxsICE9PSBlICYmIC0xID09PSBiLmluZGV4T2YoZSkgJiYgYi5wdXNoKGUpOwogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFVjKGEsIGIsIGMsIGQsIGUpIHsKICAgICAgICBzd2l0Y2ggKGIpIHsKICAgICAgICAgIGNhc2UgImZvY3VzaW4iOgogICAgICAgICAgICByZXR1cm4gTGMgPSBUYyhMYywgYSwgYiwgYywgZCwgZSksIHRydWU7CiAgICAgICAgICBjYXNlICJkcmFnZW50ZXIiOgogICAgICAgICAgICByZXR1cm4gTWMgPSBUYyhNYywgYSwgYiwgYywgZCwgZSksIHRydWU7CiAgICAgICAgICBjYXNlICJtb3VzZW92ZXIiOgogICAgICAgICAgICByZXR1cm4gTmMgPSBUYyhOYywgYSwgYiwgYywgZCwgZSksIHRydWU7CiAgICAgICAgICBjYXNlICJwb2ludGVyb3ZlciI6CiAgICAgICAgICAgIHZhciBmID0gZS5wb2ludGVySWQ7CiAgICAgICAgICAgIE9jLnNldChmLCBUYyhPYy5nZXQoZikgfHwgbnVsbCwgYSwgYiwgYywgZCwgZSkpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGNhc2UgImdvdHBvaW50ZXJjYXB0dXJlIjoKICAgICAgICAgICAgcmV0dXJuIGYgPSBlLnBvaW50ZXJJZCwgUGMuc2V0KGYsIFRjKFBjLmdldChmKSB8fCBudWxsLCBhLCBiLCBjLCBkLCBlKSksIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBWYyhhKSB7CiAgICAgICAgdmFyIGIgPSBXYyhhLnRhcmdldCk7CiAgICAgICAgaWYgKG51bGwgIT09IGIpIHsKICAgICAgICAgIHZhciBjID0gVmIoYik7CiAgICAgICAgICBpZiAobnVsbCAhPT0gYykgewogICAgICAgICAgICBpZiAoYiA9IGMudGFnLCAxMyA9PT0gYikgewogICAgICAgICAgICAgIGlmIChiID0gV2IoYyksIG51bGwgIT09IGIpIHsKICAgICAgICAgICAgICAgIGEuYmxvY2tlZE9uID0gYjsKICAgICAgICAgICAgICAgIEljKGEucHJpb3JpdHksIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICBHYyhjKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICgzID09PSBiICYmIGMuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpIHsKICAgICAgICAgICAgICBhLmJsb2NrZWRPbiA9IDMgPT09IGMudGFnID8gYy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA6IG51bGw7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGEuYmxvY2tlZE9uID0gbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBYYyhhKSB7CiAgICAgICAgaWYgKG51bGwgIT09IGEuYmxvY2tlZE9uKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAodmFyIGIgPSBhLnRhcmdldENvbnRhaW5lcnM7IDAgPCBiLmxlbmd0aDsgKSB7CiAgICAgICAgICB2YXIgYyA9IFljKGEuZG9tRXZlbnROYW1lLCBhLmV2ZW50U3lzdGVtRmxhZ3MsIGJbMF0sIGEubmF0aXZlRXZlbnQpOwogICAgICAgICAgaWYgKG51bGwgPT09IGMpIHsKICAgICAgICAgICAgYyA9IGEubmF0aXZlRXZlbnQ7CiAgICAgICAgICAgIHZhciBkID0gbmV3IGMuY29uc3RydWN0b3IoYy50eXBlLCBjKTsKICAgICAgICAgICAgd2IgPSBkOwogICAgICAgICAgICBjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpOwogICAgICAgICAgICB3YiA9IG51bGw7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgcmV0dXJuIGIgPSBDYihjKSwgbnVsbCAhPT0gYiAmJiBGYyhiKSwgYS5ibG9ja2VkT24gPSBjLCBmYWxzZTsKICAgICAgICAgIGIuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gWmMoYSwgYiwgYykgewogICAgICAgIFhjKGEpICYmIGMuZGVsZXRlKGIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uICRjKCkgewogICAgICAgIEpjID0gZmFsc2U7CiAgICAgICAgbnVsbCAhPT0gTGMgJiYgWGMoTGMpICYmIChMYyA9IG51bGwpOwogICAgICAgIG51bGwgIT09IE1jICYmIFhjKE1jKSAmJiAoTWMgPSBudWxsKTsKICAgICAgICBudWxsICE9PSBOYyAmJiBYYyhOYykgJiYgKE5jID0gbnVsbCk7CiAgICAgICAgT2MuZm9yRWFjaChaYyk7CiAgICAgICAgUGMuZm9yRWFjaChaYyk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYWQoYSwgYikgewogICAgICAgIGEuYmxvY2tlZE9uID09PSBiICYmIChhLmJsb2NrZWRPbiA9IG51bGwsIEpjIHx8IChKYyA9IHRydWUsIGNhLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soY2EudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksICRjKSkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGJkKGEpIHsKICAgICAgICBmdW5jdGlvbiBiKGIyKSB7CiAgICAgICAgICByZXR1cm4gYWQoYjIsIGEpOwogICAgICAgIH0KICAgICAgICBpZiAoMCA8IEtjLmxlbmd0aCkgewogICAgICAgICAgYWQoS2NbMF0sIGEpOwogICAgICAgICAgZm9yICh2YXIgYyA9IDE7IGMgPCBLYy5sZW5ndGg7IGMrKykgewogICAgICAgICAgICB2YXIgZCA9IEtjW2NdOwogICAgICAgICAgICBkLmJsb2NrZWRPbiA9PT0gYSAmJiAoZC5ibG9ja2VkT24gPSBudWxsKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbnVsbCAhPT0gTGMgJiYgYWQoTGMsIGEpOwogICAgICAgIG51bGwgIT09IE1jICYmIGFkKE1jLCBhKTsKICAgICAgICBudWxsICE9PSBOYyAmJiBhZChOYywgYSk7CiAgICAgICAgT2MuZm9yRWFjaChiKTsKICAgICAgICBQYy5mb3JFYWNoKGIpOwogICAgICAgIGZvciAoYyA9IDA7IGMgPCBRYy5sZW5ndGg7IGMrKykKICAgICAgICAgIGQgPSBRY1tjXSwgZC5ibG9ja2VkT24gPT09IGEgJiYgKGQuYmxvY2tlZE9uID0gbnVsbCk7CiAgICAgICAgZm9yICg7IDAgPCBRYy5sZW5ndGggJiYgKGMgPSBRY1swXSwgbnVsbCA9PT0gYy5ibG9ja2VkT24pOyApCiAgICAgICAgICBWYyhjKSwgbnVsbCA9PT0gYy5ibG9ja2VkT24gJiYgUWMuc2hpZnQoKTsKICAgICAgfQogICAgICB2YXIgY2QgPSB1YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZzsKICAgICAgdmFyIGRkID0gdHJ1ZTsKICAgICAgZnVuY3Rpb24gZWQoYSwgYiwgYywgZCkgewogICAgICAgIHZhciBlID0gQywgZiA9IGNkLnRyYW5zaXRpb247CiAgICAgICAgY2QudHJhbnNpdGlvbiA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIEMgPSAxLCBmZChhLCBiLCBjLCBkKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgQyA9IGUsIGNkLnRyYW5zaXRpb24gPSBmOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBnZChhLCBiLCBjLCBkKSB7CiAgICAgICAgdmFyIGUgPSBDLCBmID0gY2QudHJhbnNpdGlvbjsKICAgICAgICBjZC50cmFuc2l0aW9uID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgQyA9IDQsIGZkKGEsIGIsIGMsIGQpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBDID0gZSwgY2QudHJhbnNpdGlvbiA9IGY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGZkKGEsIGIsIGMsIGQpIHsKICAgICAgICBpZiAoZGQpIHsKICAgICAgICAgIHZhciBlID0gWWMoYSwgYiwgYywgZCk7CiAgICAgICAgICBpZiAobnVsbCA9PT0gZSkKICAgICAgICAgICAgaGQoYSwgYiwgZCwgaWQsIGMpLCBTYyhhLCBkKTsKICAgICAgICAgIGVsc2UgaWYgKFVjKGUsIGEsIGIsIGMsIGQpKQogICAgICAgICAgICBkLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgZWxzZSBpZiAoU2MoYSwgZCksIGIgJiA0ICYmIC0xIDwgUmMuaW5kZXhPZihhKSkgewogICAgICAgICAgICBmb3IgKDsgbnVsbCAhPT0gZTsgKSB7CiAgICAgICAgICAgICAgdmFyIGYgPSBDYihlKTsKICAgICAgICAgICAgICBudWxsICE9PSBmICYmIEVjKGYpOwogICAgICAgICAgICAgIGYgPSBZYyhhLCBiLCBjLCBkKTsKICAgICAgICAgICAgICBudWxsID09PSBmICYmIGhkKGEsIGIsIGQsIGlkLCBjKTsKICAgICAgICAgICAgICBpZiAoZiA9PT0gZSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGUgPSBmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG51bGwgIT09IGUgJiYgZC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICBoZChhLCBiLCBkLCBudWxsLCBjKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGlkID0gbnVsbDsKICAgICAgZnVuY3Rpb24gWWMoYSwgYiwgYywgZCkgewogICAgICAgIGlkID0gbnVsbDsKICAgICAgICBhID0geGIoZCk7CiAgICAgICAgYSA9IFdjKGEpOwogICAgICAgIGlmIChudWxsICE9PSBhKQogICAgICAgICAgaWYgKGIgPSBWYihhKSwgbnVsbCA9PT0gYikKICAgICAgICAgICAgYSA9IG51bGw7CiAgICAgICAgICBlbHNlIGlmIChjID0gYi50YWcsIDEzID09PSBjKSB7CiAgICAgICAgICAgIGEgPSBXYihiKTsKICAgICAgICAgICAgaWYgKG51bGwgIT09IGEpCiAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgIGEgPSBudWxsOwogICAgICAgICAgfSBlbHNlIGlmICgzID09PSBjKSB7CiAgICAgICAgICAgIGlmIChiLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKQogICAgICAgICAgICAgIHJldHVybiAzID09PSBiLnRhZyA/IGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gOiBudWxsOwogICAgICAgICAgICBhID0gbnVsbDsKICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICBiICE9PSBhICYmIChhID0gbnVsbCk7CiAgICAgICAgaWQgPSBhOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGpkKGEpIHsKICAgICAgICBzd2l0Y2ggKGEpIHsKICAgICAgICAgIGNhc2UgImNhbmNlbCI6CiAgICAgICAgICBjYXNlICJjbGljayI6CiAgICAgICAgICBjYXNlICJjbG9zZSI6CiAgICAgICAgICBjYXNlICJjb250ZXh0bWVudSI6CiAgICAgICAgICBjYXNlICJjb3B5IjoKICAgICAgICAgIGNhc2UgImN1dCI6CiAgICAgICAgICBjYXNlICJhdXhjbGljayI6CiAgICAgICAgICBjYXNlICJkYmxjbGljayI6CiAgICAgICAgICBjYXNlICJkcmFnZW5kIjoKICAgICAgICAgIGNhc2UgImRyYWdzdGFydCI6CiAgICAgICAgICBjYXNlICJkcm9wIjoKICAgICAgICAgIGNhc2UgImZvY3VzaW4iOgogICAgICAgICAgY2FzZSAiZm9jdXNvdXQiOgogICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgY2FzZSAiaW52YWxpZCI6CiAgICAgICAgICBjYXNlICJrZXlkb3duIjoKICAgICAgICAgIGNhc2UgImtleXByZXNzIjoKICAgICAgICAgIGNhc2UgImtleXVwIjoKICAgICAgICAgIGNhc2UgIm1vdXNlZG93biI6CiAgICAgICAgICBjYXNlICJtb3VzZXVwIjoKICAgICAgICAgIGNhc2UgInBhc3RlIjoKICAgICAgICAgIGNhc2UgInBhdXNlIjoKICAgICAgICAgIGNhc2UgInBsYXkiOgogICAgICAgICAgY2FzZSAicG9pbnRlcmNhbmNlbCI6CiAgICAgICAgICBjYXNlICJwb2ludGVyZG93biI6CiAgICAgICAgICBjYXNlICJwb2ludGVydXAiOgogICAgICAgICAgY2FzZSAicmF0ZWNoYW5nZSI6CiAgICAgICAgICBjYXNlICJyZXNldCI6CiAgICAgICAgICBjYXNlICJyZXNpemUiOgogICAgICAgICAgY2FzZSAic2Vla2VkIjoKICAgICAgICAgIGNhc2UgInN1Ym1pdCI6CiAgICAgICAgICBjYXNlICJ0b3VjaGNhbmNlbCI6CiAgICAgICAgICBjYXNlICJ0b3VjaGVuZCI6CiAgICAgICAgICBjYXNlICJ0b3VjaHN0YXJ0IjoKICAgICAgICAgIGNhc2UgInZvbHVtZWNoYW5nZSI6CiAgICAgICAgICBjYXNlICJjaGFuZ2UiOgogICAgICAgICAgY2FzZSAic2VsZWN0aW9uY2hhbmdlIjoKICAgICAgICAgIGNhc2UgInRleHRJbnB1dCI6CiAgICAgICAgICBjYXNlICJjb21wb3NpdGlvbnN0YXJ0IjoKICAgICAgICAgIGNhc2UgImNvbXBvc2l0aW9uZW5kIjoKICAgICAgICAgIGNhc2UgImNvbXBvc2l0aW9udXBkYXRlIjoKICAgICAgICAgIGNhc2UgImJlZm9yZWJsdXIiOgogICAgICAgICAgY2FzZSAiYWZ0ZXJibHVyIjoKICAgICAgICAgIGNhc2UgImJlZm9yZWlucHV0IjoKICAgICAgICAgIGNhc2UgImJsdXIiOgogICAgICAgICAgY2FzZSAiZnVsbHNjcmVlbmNoYW5nZSI6CiAgICAgICAgICBjYXNlICJmb2N1cyI6CiAgICAgICAgICBjYXNlICJoYXNoY2hhbmdlIjoKICAgICAgICAgIGNhc2UgInBvcHN0YXRlIjoKICAgICAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgICBjYXNlICJzZWxlY3RzdGFydCI6CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgY2FzZSAiZHJhZyI6CiAgICAgICAgICBjYXNlICJkcmFnZW50ZXIiOgogICAgICAgICAgY2FzZSAiZHJhZ2V4aXQiOgogICAgICAgICAgY2FzZSAiZHJhZ2xlYXZlIjoKICAgICAgICAgIGNhc2UgImRyYWdvdmVyIjoKICAgICAgICAgIGNhc2UgIm1vdXNlbW92ZSI6CiAgICAgICAgICBjYXNlICJtb3VzZW91dCI6CiAgICAgICAgICBjYXNlICJtb3VzZW92ZXIiOgogICAgICAgICAgY2FzZSAicG9pbnRlcm1vdmUiOgogICAgICAgICAgY2FzZSAicG9pbnRlcm91dCI6CiAgICAgICAgICBjYXNlICJwb2ludGVyb3ZlciI6CiAgICAgICAgICBjYXNlICJzY3JvbGwiOgogICAgICAgICAgY2FzZSAidG9nZ2xlIjoKICAgICAgICAgIGNhc2UgInRvdWNobW92ZSI6CiAgICAgICAgICBjYXNlICJ3aGVlbCI6CiAgICAgICAgICBjYXNlICJtb3VzZWVudGVyIjoKICAgICAgICAgIGNhc2UgIm1vdXNlbGVhdmUiOgogICAgICAgICAgY2FzZSAicG9pbnRlcmVudGVyIjoKICAgICAgICAgIGNhc2UgInBvaW50ZXJsZWF2ZSI6CiAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgY2FzZSAibWVzc2FnZSI6CiAgICAgICAgICAgIHN3aXRjaCAoZWMoKSkgewogICAgICAgICAgICAgIGNhc2UgZmM6CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICBjYXNlIGdjOgogICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgY2FzZSBoYzoKICAgICAgICAgICAgICBjYXNlIGljOgogICAgICAgICAgICAgICAgcmV0dXJuIDE2OwogICAgICAgICAgICAgIGNhc2UgamM6CiAgICAgICAgICAgICAgICByZXR1cm4gNTM2ODcwOTEyOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAxNjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGtkID0gbnVsbDsKICAgICAgdmFyIGxkID0gbnVsbDsKICAgICAgdmFyIG1kID0gbnVsbDsKICAgICAgZnVuY3Rpb24gbmQoKSB7CiAgICAgICAgaWYgKG1kKQogICAgICAgICAgcmV0dXJuIG1kOwogICAgICAgIHZhciBhLCBiID0gbGQsIGMgPSBiLmxlbmd0aCwgZCwgZSA9ICJ2YWx1ZSIgaW4ga2QgPyBrZC52YWx1ZSA6IGtkLnRleHRDb250ZW50LCBmID0gZS5sZW5ndGg7CiAgICAgICAgZm9yIChhID0gMDsgYSA8IGMgJiYgYlthXSA9PT0gZVthXTsgYSsrKQogICAgICAgICAgOwogICAgICAgIHZhciBnID0gYyAtIGE7CiAgICAgICAgZm9yIChkID0gMTsgZCA8PSBnICYmIGJbYyAtIGRdID09PSBlW2YgLSBkXTsgZCsrKQogICAgICAgICAgOwogICAgICAgIHJldHVybiBtZCA9IGUuc2xpY2UoYSwgMSA8IGQgPyAxIC0gZCA6IHZvaWQgMCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb2QoYSkgewogICAgICAgIHZhciBiID0gYS5rZXlDb2RlOwogICAgICAgICJjaGFyQ29kZSIgaW4gYSA/IChhID0gYS5jaGFyQ29kZSwgMCA9PT0gYSAmJiAxMyA9PT0gYiAmJiAoYSA9IDEzKSkgOiBhID0gYjsKICAgICAgICAxMCA9PT0gYSAmJiAoYSA9IDEzKTsKICAgICAgICByZXR1cm4gMzIgPD0gYSB8fCAxMyA9PT0gYSA/IGEgOiAwOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBkKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHFkKCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmdW5jdGlvbiByZChhKSB7CiAgICAgICAgZnVuY3Rpb24gYihiMiwgZCwgZSwgZiwgZykgewogICAgICAgICAgdGhpcy5fcmVhY3ROYW1lID0gYjI7CiAgICAgICAgICB0aGlzLl90YXJnZXRJbnN0ID0gZTsKICAgICAgICAgIHRoaXMudHlwZSA9IGQ7CiAgICAgICAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gZjsKICAgICAgICAgIHRoaXMudGFyZ2V0ID0gZzsKICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7CiAgICAgICAgICBmb3IgKHZhciBjIGluIGEpCiAgICAgICAgICAgIGEuaGFzT3duUHJvcGVydHkoYykgJiYgKGIyID0gYVtjXSwgdGhpc1tjXSA9IGIyID8gYjIoZikgOiBmW2NdKTsKICAgICAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gKG51bGwgIT0gZi5kZWZhdWx0UHJldmVudGVkID8gZi5kZWZhdWx0UHJldmVudGVkIDogZmFsc2UgPT09IGYucmV0dXJuVmFsdWUpID8gcGQgOiBxZDsKICAgICAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBxZDsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBBKGIucHJvdG90eXBlLCB7IHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7CiAgICAgICAgICB2YXIgYTIgPSB0aGlzLm5hdGl2ZUV2ZW50OwogICAgICAgICAgYTIgJiYgKGEyLnByZXZlbnREZWZhdWx0ID8gYTIucHJldmVudERlZmF1bHQoKSA6ICJ1bmtub3duIiAhPT0gdHlwZW9mIGEyLnJldHVyblZhbHVlICYmIChhMi5yZXR1cm5WYWx1ZSA9IGZhbHNlKSwgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBwZCk7CiAgICAgICAgfSwgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBhMiA9IHRoaXMubmF0aXZlRXZlbnQ7CiAgICAgICAgICBhMiAmJiAoYTIuc3RvcFByb3BhZ2F0aW9uID8gYTIuc3RvcFByb3BhZ2F0aW9uKCkgOiAidW5rbm93biIgIT09IHR5cGVvZiBhMi5jYW5jZWxCdWJibGUgJiYgKGEyLmNhbmNlbEJ1YmJsZSA9IHRydWUpLCB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcGQpOwogICAgICAgIH0sIHBlcnNpc3Q6IGZ1bmN0aW9uKCkgewogICAgICAgIH0sIGlzUGVyc2lzdGVudDogcGQgfSk7CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgdmFyIHNkID0geyBldmVudFBoYXNlOiAwLCBidWJibGVzOiAwLCBjYW5jZWxhYmxlOiAwLCB0aW1lU3RhbXA6IGZ1bmN0aW9uKGEpIHsKICAgICAgICByZXR1cm4gYS50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKICAgICAgfSwgZGVmYXVsdFByZXZlbnRlZDogMCwgaXNUcnVzdGVkOiAwIH07CiAgICAgIHZhciB0ZCA9IHJkKHNkKTsKICAgICAgdmFyIHVkID0gQSh7fSwgc2QsIHsgdmlldzogMCwgZGV0YWlsOiAwIH0pOwogICAgICB2YXIgdmQgPSByZCh1ZCk7CiAgICAgIHZhciB3ZDsKICAgICAgdmFyIHhkOwogICAgICB2YXIgeWQ7CiAgICAgIHZhciBBZCA9IEEoe30sIHVkLCB7IHNjcmVlblg6IDAsIHNjcmVlblk6IDAsIGNsaWVudFg6IDAsIGNsaWVudFk6IDAsIHBhZ2VYOiAwLCBwYWdlWTogMCwgY3RybEtleTogMCwgc2hpZnRLZXk6IDAsIGFsdEtleTogMCwgbWV0YUtleTogMCwgZ2V0TW9kaWZpZXJTdGF0ZTogemQsIGJ1dHRvbjogMCwgYnV0dG9uczogMCwgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiB2b2lkIDAgPT09IGEucmVsYXRlZFRhcmdldCA/IGEuZnJvbUVsZW1lbnQgPT09IGEuc3JjRWxlbWVudCA/IGEudG9FbGVtZW50IDogYS5mcm9tRWxlbWVudCA6IGEucmVsYXRlZFRhcmdldDsKICAgICAgfSwgbW92ZW1lbnRYOiBmdW5jdGlvbihhKSB7CiAgICAgICAgaWYgKCJtb3ZlbWVudFgiIGluIGEpCiAgICAgICAgICByZXR1cm4gYS5tb3ZlbWVudFg7CiAgICAgICAgYSAhPT0geWQgJiYgKHlkICYmICJtb3VzZW1vdmUiID09PSBhLnR5cGUgPyAod2QgPSBhLnNjcmVlblggLSB5ZC5zY3JlZW5YLCB4ZCA9IGEuc2NyZWVuWSAtIHlkLnNjcmVlblkpIDogeGQgPSB3ZCA9IDAsIHlkID0gYSk7CiAgICAgICAgcmV0dXJuIHdkOwogICAgICB9LCBtb3ZlbWVudFk6IGZ1bmN0aW9uKGEpIHsKICAgICAgICByZXR1cm4gIm1vdmVtZW50WSIgaW4gYSA/IGEubW92ZW1lbnRZIDogeGQ7CiAgICAgIH0gfSk7CiAgICAgIHZhciBCZCA9IHJkKEFkKTsKICAgICAgdmFyIENkID0gQSh7fSwgQWQsIHsgZGF0YVRyYW5zZmVyOiAwIH0pOwogICAgICB2YXIgRGQgPSByZChDZCk7CiAgICAgIHZhciBFZCA9IEEoe30sIHVkLCB7IHJlbGF0ZWRUYXJnZXQ6IDAgfSk7CiAgICAgIHZhciBGZCA9IHJkKEVkKTsKICAgICAgdmFyIEdkID0gQSh7fSwgc2QsIHsgYW5pbWF0aW9uTmFtZTogMCwgZWxhcHNlZFRpbWU6IDAsIHBzZXVkb0VsZW1lbnQ6IDAgfSk7CiAgICAgIHZhciBIZCA9IHJkKEdkKTsKICAgICAgdmFyIElkID0gQSh7fSwgc2QsIHsgY2xpcGJvYXJkRGF0YTogZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiAiY2xpcGJvYXJkRGF0YSIgaW4gYSA/IGEuY2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhOwogICAgICB9IH0pOwogICAgICB2YXIgSmQgPSByZChJZCk7CiAgICAgIHZhciBLZCA9IEEoe30sIHNkLCB7IGRhdGE6IDAgfSk7CiAgICAgIHZhciBMZCA9IHJkKEtkKTsKICAgICAgdmFyIE1kID0gewogICAgICAgIEVzYzogIkVzY2FwZSIsCiAgICAgICAgU3BhY2ViYXI6ICIgIiwKICAgICAgICBMZWZ0OiAiQXJyb3dMZWZ0IiwKICAgICAgICBVcDogIkFycm93VXAiLAogICAgICAgIFJpZ2h0OiAiQXJyb3dSaWdodCIsCiAgICAgICAgRG93bjogIkFycm93RG93biIsCiAgICAgICAgRGVsOiAiRGVsZXRlIiwKICAgICAgICBXaW46ICJPUyIsCiAgICAgICAgTWVudTogIkNvbnRleHRNZW51IiwKICAgICAgICBBcHBzOiAiQ29udGV4dE1lbnUiLAogICAgICAgIFNjcm9sbDogIlNjcm9sbExvY2siLAogICAgICAgIE1velByaW50YWJsZUtleTogIlVuaWRlbnRpZmllZCIKICAgICAgfTsKICAgICAgdmFyIE5kID0gewogICAgICAgIDg6ICJCYWNrc3BhY2UiLAogICAgICAgIDk6ICJUYWIiLAogICAgICAgIDEyOiAiQ2xlYXIiLAogICAgICAgIDEzOiAiRW50ZXIiLAogICAgICAgIDE2OiAiU2hpZnQiLAogICAgICAgIDE3OiAiQ29udHJvbCIsCiAgICAgICAgMTg6ICJBbHQiLAogICAgICAgIDE5OiAiUGF1c2UiLAogICAgICAgIDIwOiAiQ2Fwc0xvY2siLAogICAgICAgIDI3OiAiRXNjYXBlIiwKICAgICAgICAzMjogIiAiLAogICAgICAgIDMzOiAiUGFnZVVwIiwKICAgICAgICAzNDogIlBhZ2VEb3duIiwKICAgICAgICAzNTogIkVuZCIsCiAgICAgICAgMzY6ICJIb21lIiwKICAgICAgICAzNzogIkFycm93TGVmdCIsCiAgICAgICAgMzg6ICJBcnJvd1VwIiwKICAgICAgICAzOTogIkFycm93UmlnaHQiLAogICAgICAgIDQwOiAiQXJyb3dEb3duIiwKICAgICAgICA0NTogIkluc2VydCIsCiAgICAgICAgNDY6ICJEZWxldGUiLAogICAgICAgIDExMjogIkYxIiwKICAgICAgICAxMTM6ICJGMiIsCiAgICAgICAgMTE0OiAiRjMiLAogICAgICAgIDExNTogIkY0IiwKICAgICAgICAxMTY6ICJGNSIsCiAgICAgICAgMTE3OiAiRjYiLAogICAgICAgIDExODogIkY3IiwKICAgICAgICAxMTk6ICJGOCIsCiAgICAgICAgMTIwOiAiRjkiLAogICAgICAgIDEyMTogIkYxMCIsCiAgICAgICAgMTIyOiAiRjExIiwKICAgICAgICAxMjM6ICJGMTIiLAogICAgICAgIDE0NDogIk51bUxvY2siLAogICAgICAgIDE0NTogIlNjcm9sbExvY2siLAogICAgICAgIDIyNDogIk1ldGEiCiAgICAgIH07CiAgICAgIHZhciBPZCA9IHsgQWx0OiAiYWx0S2V5IiwgQ29udHJvbDogImN0cmxLZXkiLCBNZXRhOiAibWV0YUtleSIsIFNoaWZ0OiAic2hpZnRLZXkiIH07CiAgICAgIGZ1bmN0aW9uIFBkKGEpIHsKICAgICAgICB2YXIgYiA9IHRoaXMubmF0aXZlRXZlbnQ7CiAgICAgICAgcmV0dXJuIGIuZ2V0TW9kaWZpZXJTdGF0ZSA/IGIuZ2V0TW9kaWZpZXJTdGF0ZShhKSA6IChhID0gT2RbYV0pID8gISFiW2FdIDogZmFsc2U7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gemQoKSB7CiAgICAgICAgcmV0dXJuIFBkOwogICAgICB9CiAgICAgIHZhciBRZCA9IEEoe30sIHVkLCB7IGtleTogZnVuY3Rpb24oYSkgewogICAgICAgIGlmIChhLmtleSkgewogICAgICAgICAgdmFyIGIgPSBNZFthLmtleV0gfHwgYS5rZXk7CiAgICAgICAgICBpZiAoIlVuaWRlbnRpZmllZCIgIT09IGIpCiAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gImtleXByZXNzIiA9PT0gYS50eXBlID8gKGEgPSBvZChhKSwgMTMgPT09IGEgPyAiRW50ZXIiIDogU3RyaW5nLmZyb21DaGFyQ29kZShhKSkgOiAia2V5ZG93biIgPT09IGEudHlwZSB8fCAia2V5dXAiID09PSBhLnR5cGUgPyBOZFthLmtleUNvZGVdIHx8ICJVbmlkZW50aWZpZWQiIDogIiI7CiAgICAgIH0sIGNvZGU6IDAsIGxvY2F0aW9uOiAwLCBjdHJsS2V5OiAwLCBzaGlmdEtleTogMCwgYWx0S2V5OiAwLCBtZXRhS2V5OiAwLCByZXBlYXQ6IDAsIGxvY2FsZTogMCwgZ2V0TW9kaWZpZXJTdGF0ZTogemQsIGNoYXJDb2RlOiBmdW5jdGlvbihhKSB7CiAgICAgICAgcmV0dXJuICJrZXlwcmVzcyIgPT09IGEudHlwZSA/IG9kKGEpIDogMDsKICAgICAgfSwga2V5Q29kZTogZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiAia2V5ZG93biIgPT09IGEudHlwZSB8fCAia2V5dXAiID09PSBhLnR5cGUgPyBhLmtleUNvZGUgOiAwOwogICAgICB9LCB3aGljaDogZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiAia2V5cHJlc3MiID09PSBhLnR5cGUgPyBvZChhKSA6ICJrZXlkb3duIiA9PT0gYS50eXBlIHx8ICJrZXl1cCIgPT09IGEudHlwZSA/IGEua2V5Q29kZSA6IDA7CiAgICAgIH0gfSk7CiAgICAgIHZhciBSZCA9IHJkKFFkKTsKICAgICAgdmFyIFNkID0gQSh7fSwgQWQsIHsgcG9pbnRlcklkOiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLCBwcmVzc3VyZTogMCwgdGFuZ2VudGlhbFByZXNzdXJlOiAwLCB0aWx0WDogMCwgdGlsdFk6IDAsIHR3aXN0OiAwLCBwb2ludGVyVHlwZTogMCwgaXNQcmltYXJ5OiAwIH0pOwogICAgICB2YXIgVGQgPSByZChTZCk7CiAgICAgIHZhciBVZCA9IEEoe30sIHVkLCB7IHRvdWNoZXM6IDAsIHRhcmdldFRvdWNoZXM6IDAsIGNoYW5nZWRUb3VjaGVzOiAwLCBhbHRLZXk6IDAsIG1ldGFLZXk6IDAsIGN0cmxLZXk6IDAsIHNoaWZ0S2V5OiAwLCBnZXRNb2RpZmllclN0YXRlOiB6ZCB9KTsKICAgICAgdmFyIFZkID0gcmQoVWQpOwogICAgICB2YXIgV2QgPSBBKHt9LCBzZCwgeyBwcm9wZXJ0eU5hbWU6IDAsIGVsYXBzZWRUaW1lOiAwLCBwc2V1ZG9FbGVtZW50OiAwIH0pOwogICAgICB2YXIgWGQgPSByZChXZCk7CiAgICAgIHZhciBZZCA9IEEoe30sIEFkLCB7CiAgICAgICAgZGVsdGFYOiBmdW5jdGlvbihhKSB7CiAgICAgICAgICByZXR1cm4gImRlbHRhWCIgaW4gYSA/IGEuZGVsdGFYIDogIndoZWVsRGVsdGFYIiBpbiBhID8gLWEud2hlZWxEZWx0YVggOiAwOwogICAgICAgIH0sCiAgICAgICAgZGVsdGFZOiBmdW5jdGlvbihhKSB7CiAgICAgICAgICByZXR1cm4gImRlbHRhWSIgaW4gYSA/IGEuZGVsdGFZIDogIndoZWVsRGVsdGFZIiBpbiBhID8gLWEud2hlZWxEZWx0YVkgOiAid2hlZWxEZWx0YSIgaW4gYSA/IC1hLndoZWVsRGVsdGEgOiAwOwogICAgICAgIH0sCiAgICAgICAgZGVsdGFaOiAwLAogICAgICAgIGRlbHRhTW9kZTogMAogICAgICB9KTsKICAgICAgdmFyIFpkID0gcmQoWWQpOwogICAgICB2YXIgJGQgPSBbOSwgMTMsIDI3LCAzMl07CiAgICAgIHZhciBhZSA9IGlhICYmICJDb21wb3NpdGlvbkV2ZW50IiBpbiB3aW5kb3c7CiAgICAgIHZhciBiZSA9IG51bGw7CiAgICAgIGlhICYmICJkb2N1bWVudE1vZGUiIGluIGRvY3VtZW50ICYmIChiZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSk7CiAgICAgIHZhciBjZSA9IGlhICYmICJUZXh0RXZlbnQiIGluIHdpbmRvdyAmJiAhYmU7CiAgICAgIHZhciBkZSA9IGlhICYmICghYWUgfHwgYmUgJiYgOCA8IGJlICYmIDExID49IGJlKTsKICAgICAgdmFyIGVlID0gU3RyaW5nLmZyb21DaGFyQ29kZSgzMik7CiAgICAgIHZhciBmZSA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBnZShhLCBiKSB7CiAgICAgICAgc3dpdGNoIChhKSB7CiAgICAgICAgICBjYXNlICJrZXl1cCI6CiAgICAgICAgICAgIHJldHVybiAtMSAhPT0gJGQuaW5kZXhPZihiLmtleUNvZGUpOwogICAgICAgICAgY2FzZSAia2V5ZG93biI6CiAgICAgICAgICAgIHJldHVybiAyMjkgIT09IGIua2V5Q29kZTsKICAgICAgICAgIGNhc2UgImtleXByZXNzIjoKICAgICAgICAgIGNhc2UgIm1vdXNlZG93biI6CiAgICAgICAgICBjYXNlICJmb2N1c291dCI6CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBoZShhKSB7CiAgICAgICAgYSA9IGEuZGV0YWlsOwogICAgICAgIHJldHVybiAib2JqZWN0IiA9PT0gdHlwZW9mIGEgJiYgImRhdGEiIGluIGEgPyBhLmRhdGEgOiBudWxsOwogICAgICB9CiAgICAgIHZhciBpZSA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBqZShhLCBiKSB7CiAgICAgICAgc3dpdGNoIChhKSB7CiAgICAgICAgICBjYXNlICJjb21wb3NpdGlvbmVuZCI6CiAgICAgICAgICAgIHJldHVybiBoZShiKTsKICAgICAgICAgIGNhc2UgImtleXByZXNzIjoKICAgICAgICAgICAgaWYgKDMyICE9PSBiLndoaWNoKQogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICBmZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiBlZTsKICAgICAgICAgIGNhc2UgInRleHRJbnB1dCI6CiAgICAgICAgICAgIHJldHVybiBhID0gYi5kYXRhLCBhID09PSBlZSAmJiBmZSA/IG51bGwgOiBhOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGtlKGEsIGIpIHsKICAgICAgICBpZiAoaWUpCiAgICAgICAgICByZXR1cm4gImNvbXBvc2l0aW9uZW5kIiA9PT0gYSB8fCAhYWUgJiYgZ2UoYSwgYikgPyAoYSA9IG5kKCksIG1kID0gbGQgPSBrZCA9IG51bGwsIGllID0gZmFsc2UsIGEpIDogbnVsbDsKICAgICAgICBzd2l0Y2ggKGEpIHsKICAgICAgICAgIGNhc2UgInBhc3RlIjoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICBjYXNlICJrZXlwcmVzcyI6CiAgICAgICAgICAgIGlmICghKGIuY3RybEtleSB8fCBiLmFsdEtleSB8fCBiLm1ldGFLZXkpIHx8IGIuY3RybEtleSAmJiBiLmFsdEtleSkgewogICAgICAgICAgICAgIGlmIChiLmNoYXIgJiYgMSA8IGIuY2hhci5sZW5ndGgpCiAgICAgICAgICAgICAgICByZXR1cm4gYi5jaGFyOwogICAgICAgICAgICAgIGlmIChiLndoaWNoKQogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYi53aGljaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICBjYXNlICJjb21wb3NpdGlvbmVuZCI6CiAgICAgICAgICAgIHJldHVybiBkZSAmJiAia28iICE9PSBiLmxvY2FsZSA/IG51bGwgOiBiLmRhdGE7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGxlID0geyBjb2xvcjogdHJ1ZSwgZGF0ZTogdHJ1ZSwgZGF0ZXRpbWU6IHRydWUsICJkYXRldGltZS1sb2NhbCI6IHRydWUsIGVtYWlsOiB0cnVlLCBtb250aDogdHJ1ZSwgbnVtYmVyOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgcmFuZ2U6IHRydWUsIHNlYXJjaDogdHJ1ZSwgdGVsOiB0cnVlLCB0ZXh0OiB0cnVlLCB0aW1lOiB0cnVlLCB1cmw6IHRydWUsIHdlZWs6IHRydWUgfTsKICAgICAgZnVuY3Rpb24gbWUoYSkgewogICAgICAgIHZhciBiID0gYSAmJiBhLm5vZGVOYW1lICYmIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICByZXR1cm4gImlucHV0IiA9PT0gYiA/ICEhbGVbYS50eXBlXSA6ICJ0ZXh0YXJlYSIgPT09IGIgPyB0cnVlIDogZmFsc2U7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbmUoYSwgYiwgYywgZCkgewogICAgICAgIEViKGQpOwogICAgICAgIGIgPSBvZShiLCAib25DaGFuZ2UiKTsKICAgICAgICAwIDwgYi5sZW5ndGggJiYgKGMgPSBuZXcgdGQoIm9uQ2hhbmdlIiwgImNoYW5nZSIsIG51bGwsIGMsIGQpLCBhLnB1c2goeyBldmVudDogYywgbGlzdGVuZXJzOiBiIH0pKTsKICAgICAgfQogICAgICB2YXIgcGUgPSBudWxsOwogICAgICB2YXIgcWUgPSBudWxsOwogICAgICBmdW5jdGlvbiByZShhKSB7CiAgICAgICAgc2UoYSwgMCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdGUoYSkgewogICAgICAgIHZhciBiID0gdWUoYSk7CiAgICAgICAgaWYgKFdhKGIpKQogICAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdmUoYSwgYikgewogICAgICAgIGlmICgiY2hhbmdlIiA9PT0gYSkKICAgICAgICAgIHJldHVybiBiOwogICAgICB9CiAgICAgIHZhciB3ZSA9IGZhbHNlOwogICAgICBpZiAoaWEpIHsKICAgICAgICBpZiAoaWEpIHsKICAgICAgICAgIHllID0gIm9uaW5wdXQiIGluIGRvY3VtZW50OwogICAgICAgICAgaWYgKCF5ZSkgewogICAgICAgICAgICB6ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICB6ZS5zZXRBdHRyaWJ1dGUoIm9uaW5wdXQiLCAicmV0dXJuOyIpOwogICAgICAgICAgICB5ZSA9ICJmdW5jdGlvbiIgPT09IHR5cGVvZiB6ZS5vbmlucHV0OwogICAgICAgICAgfQogICAgICAgICAgeGUgPSB5ZTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHhlID0gZmFsc2U7CiAgICAgICAgd2UgPSB4ZSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCA5IDwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTsKICAgICAgfQogICAgICB2YXIgeGU7CiAgICAgIHZhciB5ZTsKICAgICAgdmFyIHplOwogICAgICBmdW5jdGlvbiBBZSgpIHsKICAgICAgICBwZSAmJiAocGUuZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLCBCZSksIHFlID0gcGUgPSBudWxsKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBCZShhKSB7CiAgICAgICAgaWYgKCJ2YWx1ZSIgPT09IGEucHJvcGVydHlOYW1lICYmIHRlKHFlKSkgewogICAgICAgICAgdmFyIGIgPSBbXTsKICAgICAgICAgIG5lKGIsIHFlLCBhLCB4YihhKSk7CiAgICAgICAgICBKYihyZSwgYik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIENlKGEsIGIsIGMpIHsKICAgICAgICAiZm9jdXNpbiIgPT09IGEgPyAoQWUoKSwgcGUgPSBiLCBxZSA9IGMsIHBlLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIiwgQmUpKSA6ICJmb2N1c291dCIgPT09IGEgJiYgQWUoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBEZShhKSB7CiAgICAgICAgaWYgKCJzZWxlY3Rpb25jaGFuZ2UiID09PSBhIHx8ICJrZXl1cCIgPT09IGEgfHwgImtleWRvd24iID09PSBhKQogICAgICAgICAgcmV0dXJuIHRlKHFlKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBFZShhLCBiKSB7CiAgICAgICAgaWYgKCJjbGljayIgPT09IGEpCiAgICAgICAgICByZXR1cm4gdGUoYik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gRmUoYSwgYikgewogICAgICAgIGlmICgiaW5wdXQiID09PSBhIHx8ICJjaGFuZ2UiID09PSBhKQogICAgICAgICAgcmV0dXJuIHRlKGIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEdlKGEsIGIpIHsKICAgICAgICByZXR1cm4gYSA9PT0gYiAmJiAoMCAhPT0gYSB8fCAxIC8gYSA9PT0gMSAvIGIpIHx8IGEgIT09IGEgJiYgYiAhPT0gYjsKICAgICAgfQogICAgICB2YXIgSGUgPSAiZnVuY3Rpb24iID09PSB0eXBlb2YgT2JqZWN0LmlzID8gT2JqZWN0LmlzIDogR2U7CiAgICAgIGZ1bmN0aW9uIEllKGEsIGIpIHsKICAgICAgICBpZiAoSGUoYSwgYikpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoIm9iamVjdCIgIT09IHR5cGVvZiBhIHx8IG51bGwgPT09IGEgfHwgIm9iamVjdCIgIT09IHR5cGVvZiBiIHx8IG51bGwgPT09IGIpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIGMgPSBPYmplY3Qua2V5cyhhKSwgZCA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIGlmIChjLmxlbmd0aCAhPT0gZC5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yIChkID0gMDsgZCA8IGMubGVuZ3RoOyBkKyspIHsKICAgICAgICAgIHZhciBlID0gY1tkXTsKICAgICAgICAgIGlmICghamEuY2FsbChiLCBlKSB8fCAhSGUoYVtlXSwgYltlXSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gSmUoYSkgewogICAgICAgIGZvciAoOyBhICYmIGEuZmlyc3RDaGlsZDsgKQogICAgICAgICAgYSA9IGEuZmlyc3RDaGlsZDsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBLZShhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBKZShhKTsKICAgICAgICBhID0gMDsKICAgICAgICBmb3IgKHZhciBkOyBjOyApIHsKICAgICAgICAgIGlmICgzID09PSBjLm5vZGVUeXBlKSB7CiAgICAgICAgICAgIGQgPSBhICsgYy50ZXh0Q29udGVudC5sZW5ndGg7CiAgICAgICAgICAgIGlmIChhIDw9IGIgJiYgZCA+PSBiKQogICAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IGMsIG9mZnNldDogYiAtIGEgfTsKICAgICAgICAgICAgYSA9IGQ7CiAgICAgICAgICB9CiAgICAgICAgICBhOiB7CiAgICAgICAgICAgIGZvciAoOyBjOyApIHsKICAgICAgICAgICAgICBpZiAoYy5uZXh0U2libGluZykgewogICAgICAgICAgICAgICAgYyA9IGMubmV4dFNpYmxpbmc7CiAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjID0gYy5wYXJlbnROb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGMgPSB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgICBjID0gSmUoYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIExlKGEsIGIpIHsKICAgICAgICByZXR1cm4gYSAmJiBiID8gYSA9PT0gYiA/IHRydWUgOiBhICYmIDMgPT09IGEubm9kZVR5cGUgPyBmYWxzZSA6IGIgJiYgMyA9PT0gYi5ub2RlVHlwZSA/IExlKGEsIGIucGFyZW50Tm9kZSkgOiAiY29udGFpbnMiIGluIGEgPyBhLmNvbnRhaW5zKGIpIDogYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiAxNikgOiBmYWxzZSA6IGZhbHNlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIE1lKCkgewogICAgICAgIGZvciAodmFyIGEgPSB3aW5kb3csIGIgPSBYYSgpOyBiIGluc3RhbmNlb2YgYS5IVE1MSUZyYW1lRWxlbWVudDsgKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgYyA9ICJzdHJpbmciID09PSB0eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgIGMgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjKQogICAgICAgICAgICBhID0gYi5jb250ZW50V2luZG93OwogICAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGIgPSBYYShhLmRvY3VtZW50KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gTmUoYSkgewogICAgICAgIHZhciBiID0gYSAmJiBhLm5vZGVOYW1lICYmIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICByZXR1cm4gYiAmJiAoImlucHV0IiA9PT0gYiAmJiAoInRleHQiID09PSBhLnR5cGUgfHwgInNlYXJjaCIgPT09IGEudHlwZSB8fCAidGVsIiA9PT0gYS50eXBlIHx8ICJ1cmwiID09PSBhLnR5cGUgfHwgInBhc3N3b3JkIiA9PT0gYS50eXBlKSB8fCAidGV4dGFyZWEiID09PSBiIHx8ICJ0cnVlIiA9PT0gYS5jb250ZW50RWRpdGFibGUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIE9lKGEpIHsKICAgICAgICB2YXIgYiA9IE1lKCksIGMgPSBhLmZvY3VzZWRFbGVtLCBkID0gYS5zZWxlY3Rpb25SYW5nZTsKICAgICAgICBpZiAoYiAhPT0gYyAmJiBjICYmIGMub3duZXJEb2N1bWVudCAmJiBMZShjLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBjKSkgewogICAgICAgICAgaWYgKG51bGwgIT09IGQgJiYgTmUoYykpIHsKICAgICAgICAgICAgaWYgKGIgPSBkLnN0YXJ0LCBhID0gZC5lbmQsIHZvaWQgMCA9PT0gYSAmJiAoYSA9IGIpLCAic2VsZWN0aW9uU3RhcnQiIGluIGMpCiAgICAgICAgICAgICAgYy5zZWxlY3Rpb25TdGFydCA9IGIsIGMuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oYSwgYy52YWx1ZS5sZW5ndGgpOwogICAgICAgICAgICBlbHNlIGlmIChhID0gKGIgPSBjLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpICYmIGIuZGVmYXVsdFZpZXcgfHwgd2luZG93LCBhLmdldFNlbGVjdGlvbikgewogICAgICAgICAgICAgIGEgPSBhLmdldFNlbGVjdGlvbigpOwogICAgICAgICAgICAgIHZhciBlID0gYy50ZXh0Q29udGVudC5sZW5ndGgsIGYgPSBNYXRoLm1pbihkLnN0YXJ0LCBlKTsKICAgICAgICAgICAgICBkID0gdm9pZCAwID09PSBkLmVuZCA/IGYgOiBNYXRoLm1pbihkLmVuZCwgZSk7CiAgICAgICAgICAgICAgIWEuZXh0ZW5kICYmIGYgPiBkICYmIChlID0gZCwgZCA9IGYsIGYgPSBlKTsKICAgICAgICAgICAgICBlID0gS2UoYywgZik7CiAgICAgICAgICAgICAgdmFyIGcgPSBLZSgKICAgICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgICBkCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBlICYmIGcgJiYgKDEgIT09IGEucmFuZ2VDb3VudCB8fCBhLmFuY2hvck5vZGUgIT09IGUubm9kZSB8fCBhLmFuY2hvck9mZnNldCAhPT0gZS5vZmZzZXQgfHwgYS5mb2N1c05vZGUgIT09IGcubm9kZSB8fCBhLmZvY3VzT2Zmc2V0ICE9PSBnLm9mZnNldCkgJiYgKGIgPSBiLmNyZWF0ZVJhbmdlKCksIGIuc2V0U3RhcnQoZS5ub2RlLCBlLm9mZnNldCksIGEucmVtb3ZlQWxsUmFuZ2VzKCksIGYgPiBkID8gKGEuYWRkUmFuZ2UoYiksIGEuZXh0ZW5kKGcubm9kZSwgZy5vZmZzZXQpKSA6IChiLnNldEVuZChnLm5vZGUsIGcub2Zmc2V0KSwgYS5hZGRSYW5nZShiKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBiID0gW107CiAgICAgICAgICBmb3IgKGEgPSBjOyBhID0gYS5wYXJlbnROb2RlOyApCiAgICAgICAgICAgIDEgPT09IGEubm9kZVR5cGUgJiYgYi5wdXNoKHsgZWxlbWVudDogYSwgbGVmdDogYS5zY3JvbGxMZWZ0LCB0b3A6IGEuc2Nyb2xsVG9wIH0pOwogICAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGMuZm9jdXMgJiYgYy5mb2N1cygpOwogICAgICAgICAgZm9yIChjID0gMDsgYyA8IGIubGVuZ3RoOyBjKyspCiAgICAgICAgICAgIGEgPSBiW2NdLCBhLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGEubGVmdCwgYS5lbGVtZW50LnNjcm9sbFRvcCA9IGEudG9wOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgUGUgPSBpYSAmJiAiZG9jdW1lbnRNb2RlIiBpbiBkb2N1bWVudCAmJiAxMSA+PSBkb2N1bWVudC5kb2N1bWVudE1vZGU7CiAgICAgIHZhciBRZSA9IG51bGw7CiAgICAgIHZhciBSZSA9IG51bGw7CiAgICAgIHZhciBTZSA9IG51bGw7CiAgICAgIHZhciBUZSA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBVZShhLCBiLCBjKSB7CiAgICAgICAgdmFyIGQgPSBjLndpbmRvdyA9PT0gYyA/IGMuZG9jdW1lbnQgOiA5ID09PSBjLm5vZGVUeXBlID8gYyA6IGMub3duZXJEb2N1bWVudDsKICAgICAgICBUZSB8fCBudWxsID09IFFlIHx8IFFlICE9PSBYYShkKSB8fCAoZCA9IFFlLCAic2VsZWN0aW9uU3RhcnQiIGluIGQgJiYgTmUoZCkgPyBkID0geyBzdGFydDogZC5zZWxlY3Rpb25TdGFydCwgZW5kOiBkLnNlbGVjdGlvbkVuZCB9IDogKGQgPSAoZC5vd25lckRvY3VtZW50ICYmIGQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cpLmdldFNlbGVjdGlvbigpLCBkID0geyBhbmNob3JOb2RlOiBkLmFuY2hvck5vZGUsIGFuY2hvck9mZnNldDogZC5hbmNob3JPZmZzZXQsIGZvY3VzTm9kZTogZC5mb2N1c05vZGUsIGZvY3VzT2Zmc2V0OiBkLmZvY3VzT2Zmc2V0IH0pLCBTZSAmJiBJZShTZSwgZCkgfHwgKFNlID0gZCwgZCA9IG9lKFJlLCAib25TZWxlY3QiKSwgMCA8IGQubGVuZ3RoICYmIChiID0gbmV3IHRkKCJvblNlbGVjdCIsICJzZWxlY3QiLCBudWxsLCBiLCBjKSwgYS5wdXNoKHsgZXZlbnQ6IGIsIGxpc3RlbmVyczogZCB9KSwgYi50YXJnZXQgPSBRZSkpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBWZShhLCBiKSB7CiAgICAgICAgdmFyIGMgPSB7fTsKICAgICAgICBjW2EudG9Mb3dlckNhc2UoKV0gPSBiLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgY1siV2Via2l0IiArIGFdID0gIndlYmtpdCIgKyBiOwogICAgICAgIGNbIk1veiIgKyBhXSA9ICJtb3oiICsgYjsKICAgICAgICByZXR1cm4gYzsKICAgICAgfQogICAgICB2YXIgV2UgPSB7IGFuaW1hdGlvbmVuZDogVmUoIkFuaW1hdGlvbiIsICJBbmltYXRpb25FbmQiKSwgYW5pbWF0aW9uaXRlcmF0aW9uOiBWZSgiQW5pbWF0aW9uIiwgIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLCBhbmltYXRpb25zdGFydDogVmUoIkFuaW1hdGlvbiIsICJBbmltYXRpb25TdGFydCIpLCB0cmFuc2l0aW9uZW5kOiBWZSgiVHJhbnNpdGlvbiIsICJUcmFuc2l0aW9uRW5kIikgfTsKICAgICAgdmFyIFhlID0ge307CiAgICAgIHZhciBZZSA9IHt9OwogICAgICBpYSAmJiAoWWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSwgIkFuaW1hdGlvbkV2ZW50IiBpbiB3aW5kb3cgfHwgKGRlbGV0ZSBXZS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLCBkZWxldGUgV2UuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbiwgZGVsZXRlIFdlLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksICJUcmFuc2l0aW9uRXZlbnQiIGluIHdpbmRvdyB8fCBkZWxldGUgV2UudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTsKICAgICAgZnVuY3Rpb24gWmUoYSkgewogICAgICAgIGlmIChYZVthXSkKICAgICAgICAgIHJldHVybiBYZVthXTsKICAgICAgICBpZiAoIVdlW2FdKQogICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgdmFyIGIgPSBXZVthXSwgYzsKICAgICAgICBmb3IgKGMgaW4gYikKICAgICAgICAgIGlmIChiLmhhc093blByb3BlcnR5KGMpICYmIGMgaW4gWWUpCiAgICAgICAgICAgIHJldHVybiBYZVthXSA9IGJbY107CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0KICAgICAgdmFyICRlID0gWmUoImFuaW1hdGlvbmVuZCIpOwogICAgICB2YXIgYWYgPSBaZSgiYW5pbWF0aW9uaXRlcmF0aW9uIik7CiAgICAgIHZhciBiZiA9IFplKCJhbmltYXRpb25zdGFydCIpOwogICAgICB2YXIgY2YgPSBaZSgidHJhbnNpdGlvbmVuZCIpOwogICAgICB2YXIgZGYgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB2YXIgZWYgPSAiYWJvcnQgYXV4Q2xpY2sgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWwiLnNwbGl0KCIgIik7CiAgICAgIGZ1bmN0aW9uIGZmKGEsIGIpIHsKICAgICAgICBkZi5zZXQoYSwgYik7CiAgICAgICAgZmEoYiwgW2FdKTsKICAgICAgfQogICAgICBmb3IgKGdmID0gMDsgZ2YgPCBlZi5sZW5ndGg7IGdmKyspIHsKICAgICAgICBoZiA9IGVmW2dmXSwgamYgPSBoZi50b0xvd2VyQ2FzZSgpLCBrZiA9IGhmWzBdLnRvVXBwZXJDYXNlKCkgKyBoZi5zbGljZSgxKTsKICAgICAgICBmZihqZiwgIm9uIiArIGtmKTsKICAgICAgfQogICAgICB2YXIgaGY7CiAgICAgIHZhciBqZjsKICAgICAgdmFyIGtmOwogICAgICB2YXIgZ2Y7CiAgICAgIGZmKCRlLCAib25BbmltYXRpb25FbmQiKTsKICAgICAgZmYoYWYsICJvbkFuaW1hdGlvbkl0ZXJhdGlvbiIpOwogICAgICBmZihiZiwgIm9uQW5pbWF0aW9uU3RhcnQiKTsKICAgICAgZmYoImRibGNsaWNrIiwgIm9uRG91YmxlQ2xpY2siKTsKICAgICAgZmYoImZvY3VzaW4iLCAib25Gb2N1cyIpOwogICAgICBmZigiZm9jdXNvdXQiLCAib25CbHVyIik7CiAgICAgIGZmKGNmLCAib25UcmFuc2l0aW9uRW5kIik7CiAgICAgIGhhKCJvbk1vdXNlRW50ZXIiLCBbIm1vdXNlb3V0IiwgIm1vdXNlb3ZlciJdKTsKICAgICAgaGEoIm9uTW91c2VMZWF2ZSIsIFsibW91c2VvdXQiLCAibW91c2VvdmVyIl0pOwogICAgICBoYSgib25Qb2ludGVyRW50ZXIiLCBbInBvaW50ZXJvdXQiLCAicG9pbnRlcm92ZXIiXSk7CiAgICAgIGhhKCJvblBvaW50ZXJMZWF2ZSIsIFsicG9pbnRlcm91dCIsICJwb2ludGVyb3ZlciJdKTsKICAgICAgZmEoIm9uQ2hhbmdlIiwgImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTsKICAgICAgZmEoIm9uU2VsZWN0IiwgImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7CiAgICAgIGZhKCJvbkJlZm9yZUlucHV0IiwgWyJjb21wb3NpdGlvbmVuZCIsICJrZXlwcmVzcyIsICJ0ZXh0SW5wdXQiLCAicGFzdGUiXSk7CiAgICAgIGZhKCJvbkNvbXBvc2l0aW9uRW5kIiwgImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTsKICAgICAgZmEoIm9uQ29tcG9zaXRpb25TdGFydCIsICJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTsKICAgICAgZmEoIm9uQ29tcG9zaXRpb25VcGRhdGUiLCAiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpOwogICAgICB2YXIgbGYgPSAiYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdXNwZW5kIHRpbWV1cGRhdGUgdm9sdW1lY2hhbmdlIHdhaXRpbmciLnNwbGl0KCIgIik7CiAgICAgIHZhciBtZiA9IG5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQobGYpKTsKICAgICAgZnVuY3Rpb24gbmYoYSwgYiwgYykgewogICAgICAgIHZhciBkID0gYS50eXBlIHx8ICJ1bmtub3duLWV2ZW50IjsKICAgICAgICBhLmN1cnJlbnRUYXJnZXQgPSBjOwogICAgICAgIFViKGQsIGIsIHZvaWQgMCwgYSk7CiAgICAgICAgYS5jdXJyZW50VGFyZ2V0ID0gbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBzZShhLCBiKSB7CiAgICAgICAgYiA9IDAgIT09IChiICYgNCk7CiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhLmxlbmd0aDsgYysrKSB7CiAgICAgICAgICB2YXIgZCA9IGFbY10sIGUgPSBkLmV2ZW50OwogICAgICAgICAgZCA9IGQubGlzdGVuZXJzOwogICAgICAgICAgYTogewogICAgICAgICAgICB2YXIgZiA9IHZvaWQgMDsKICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IGQubGVuZ3RoIC0gMTsgMCA8PSBnOyBnLS0pIHsKICAgICAgICAgICAgICAgIHZhciBoID0gZFtnXSwgayA9IGguaW5zdGFuY2UsIGwgPSBoLmN1cnJlbnRUYXJnZXQ7CiAgICAgICAgICAgICAgICBoID0gaC5saXN0ZW5lcjsKICAgICAgICAgICAgICAgIGlmIChrICE9PSBmICYmIGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkKICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgIG5mKGUsIGgsIGwpOwogICAgICAgICAgICAgICAgZiA9IGs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IGQubGVuZ3RoOyBnKyspIHsKICAgICAgICAgICAgICAgIGggPSBkW2ddOwogICAgICAgICAgICAgICAgayA9IGguaW5zdGFuY2U7CiAgICAgICAgICAgICAgICBsID0gaC5jdXJyZW50VGFyZ2V0OwogICAgICAgICAgICAgICAgaCA9IGgubGlzdGVuZXI7CiAgICAgICAgICAgICAgICBpZiAoayAhPT0gZiAmJiBlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpCiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICBuZihlLCBoLCBsKTsKICAgICAgICAgICAgICAgIGYgPSBrOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKFFiKQogICAgICAgICAgdGhyb3cgYSA9IFJiLCBRYiA9IGZhbHNlLCBSYiA9IG51bGwsIGE7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gRChhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBiW29mXTsKICAgICAgICB2b2lkIDAgPT09IGMgJiYgKGMgPSBiW29mXSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpOwogICAgICAgIHZhciBkID0gYSArICJfX2J1YmJsZSI7CiAgICAgICAgYy5oYXMoZCkgfHwgKHBmKGIsIGEsIDIsIGZhbHNlKSwgYy5hZGQoZCkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHFmKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IDA7CiAgICAgICAgYiAmJiAoZCB8PSA0KTsKICAgICAgICBwZihjLCBhLCBkLCBiKTsKICAgICAgfQogICAgICB2YXIgcmYgPSAiX3JlYWN0TGlzdGVuaW5nIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpOwogICAgICBmdW5jdGlvbiBzZihhKSB7CiAgICAgICAgaWYgKCFhW3JmXSkgewogICAgICAgICAgYVtyZl0gPSB0cnVlOwogICAgICAgICAgZGEuZm9yRWFjaChmdW5jdGlvbihiMikgewogICAgICAgICAgICAic2VsZWN0aW9uY2hhbmdlIiAhPT0gYjIgJiYgKG1mLmhhcyhiMikgfHwgcWYoYjIsIGZhbHNlLCBhKSwgcWYoYjIsIHRydWUsIGEpKTsKICAgICAgICAgIH0pOwogICAgICAgICAgdmFyIGIgPSA5ID09PSBhLm5vZGVUeXBlID8gYSA6IGEub3duZXJEb2N1bWVudDsKICAgICAgICAgIG51bGwgPT09IGIgfHwgYltyZl0gfHwgKGJbcmZdID0gdHJ1ZSwgcWYoInNlbGVjdGlvbmNoYW5nZSIsIGZhbHNlLCBiKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBmKGEsIGIsIGMsIGQpIHsKICAgICAgICBzd2l0Y2ggKGpkKGIpKSB7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHZhciBlID0gZWQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBlID0gZ2Q7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZSA9IGZkOwogICAgICAgIH0KICAgICAgICBjID0gZS5iaW5kKG51bGwsIGIsIGMsIGEpOwogICAgICAgIGUgPSB2b2lkIDA7CiAgICAgICAgIUxiIHx8ICJ0b3VjaHN0YXJ0IiAhPT0gYiAmJiAidG91Y2htb3ZlIiAhPT0gYiAmJiAid2hlZWwiICE9PSBiIHx8IChlID0gdHJ1ZSk7CiAgICAgICAgZCA/IHZvaWQgMCAhPT0gZSA/IGEuYWRkRXZlbnRMaXN0ZW5lcihiLCBjLCB7IGNhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGUgfSkgOiBhLmFkZEV2ZW50TGlzdGVuZXIoYiwgYywgdHJ1ZSkgOiB2b2lkIDAgIT09IGUgPyBhLmFkZEV2ZW50TGlzdGVuZXIoYiwgYywgeyBwYXNzaXZlOiBlIH0pIDogYS5hZGRFdmVudExpc3RlbmVyKGIsIGMsIGZhbHNlKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBoZChhLCBiLCBjLCBkLCBlKSB7CiAgICAgICAgdmFyIGYgPSBkOwogICAgICAgIGlmICgwID09PSAoYiAmIDEpICYmIDAgPT09IChiICYgMikgJiYgbnVsbCAhPT0gZCkKICAgICAgICAgIGE6CiAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgIGlmIChudWxsID09PSBkKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIHZhciBnID0gZC50YWc7CiAgICAgICAgICAgICAgaWYgKDMgPT09IGcgfHwgNCA9PT0gZykgewogICAgICAgICAgICAgICAgdmFyIGggPSBkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOwogICAgICAgICAgICAgICAgaWYgKGggPT09IGUgfHwgOCA9PT0gaC5ub2RlVHlwZSAmJiBoLnBhcmVudE5vZGUgPT09IGUpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYgKDQgPT09IGcpCiAgICAgICAgICAgICAgICAgIGZvciAoZyA9IGQucmV0dXJuOyBudWxsICE9PSBnOyApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgayA9IGcudGFnOwogICAgICAgICAgICAgICAgICAgIGlmICgzID09PSBrIHx8IDQgPT09IGspIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChrID0gZy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbywgayA9PT0gZSB8fCA4ID09PSBrLm5vZGVUeXBlICYmIGsucGFyZW50Tm9kZSA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnID0gZy5yZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoOyBudWxsICE9PSBoOyApIHsKICAgICAgICAgICAgICAgICAgZyA9IFdjKGgpOwogICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZykKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIGsgPSBnLnRhZzsKICAgICAgICAgICAgICAgICAgaWYgKDUgPT09IGsgfHwgNiA9PT0gaykgewogICAgICAgICAgICAgICAgICAgIGQgPSBmID0gZzsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBhOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGggPSBoLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGQgPSBkLnJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIEpiKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGQyID0gZiwgZTIgPSB4YihjKSwgZzIgPSBbXTsKICAgICAgICAgIGE6IHsKICAgICAgICAgICAgdmFyIGgyID0gZGYuZ2V0KGEpOwogICAgICAgICAgICBpZiAodm9pZCAwICE9PSBoMikgewogICAgICAgICAgICAgIHZhciBrMiA9IHRkLCBuID0gYTsKICAgICAgICAgICAgICBzd2l0Y2ggKGEpIHsKICAgICAgICAgICAgICAgIGNhc2UgImtleXByZXNzIjoKICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IG9kKGMpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICBjYXNlICJrZXlkb3duIjoKICAgICAgICAgICAgICAgIGNhc2UgImtleXVwIjoKICAgICAgICAgICAgICAgICAgazIgPSBSZDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJmb2N1c2luIjoKICAgICAgICAgICAgICAgICAgbiA9ICJmb2N1cyI7CiAgICAgICAgICAgICAgICAgIGsyID0gRmQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiZm9jdXNvdXQiOgogICAgICAgICAgICAgICAgICBuID0gImJsdXIiOwogICAgICAgICAgICAgICAgICBrMiA9IEZkOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImJlZm9yZWJsdXIiOgogICAgICAgICAgICAgICAgY2FzZSAiYWZ0ZXJibHVyIjoKICAgICAgICAgICAgICAgICAgazIgPSBGZDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJjbGljayI6CiAgICAgICAgICAgICAgICAgIGlmICgyID09PSBjLmJ1dHRvbikKICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgY2FzZSAiYXV4Y2xpY2siOgogICAgICAgICAgICAgICAgY2FzZSAiZGJsY2xpY2siOgogICAgICAgICAgICAgICAgY2FzZSAibW91c2Vkb3duIjoKICAgICAgICAgICAgICAgIGNhc2UgIm1vdXNlbW92ZSI6CiAgICAgICAgICAgICAgICBjYXNlICJtb3VzZXVwIjoKICAgICAgICAgICAgICAgIGNhc2UgIm1vdXNlb3V0IjoKICAgICAgICAgICAgICAgIGNhc2UgIm1vdXNlb3ZlciI6CiAgICAgICAgICAgICAgICBjYXNlICJjb250ZXh0bWVudSI6CiAgICAgICAgICAgICAgICAgIGsyID0gQmQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiZHJhZyI6CiAgICAgICAgICAgICAgICBjYXNlICJkcmFnZW5kIjoKICAgICAgICAgICAgICAgIGNhc2UgImRyYWdlbnRlciI6CiAgICAgICAgICAgICAgICBjYXNlICJkcmFnZXhpdCI6CiAgICAgICAgICAgICAgICBjYXNlICJkcmFnbGVhdmUiOgogICAgICAgICAgICAgICAgY2FzZSAiZHJhZ292ZXIiOgogICAgICAgICAgICAgICAgY2FzZSAiZHJhZ3N0YXJ0IjoKICAgICAgICAgICAgICAgIGNhc2UgImRyb3AiOgogICAgICAgICAgICAgICAgICBrMiA9IERkOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInRvdWNoY2FuY2VsIjoKICAgICAgICAgICAgICAgIGNhc2UgInRvdWNoZW5kIjoKICAgICAgICAgICAgICAgIGNhc2UgInRvdWNobW92ZSI6CiAgICAgICAgICAgICAgICBjYXNlICJ0b3VjaHN0YXJ0IjoKICAgICAgICAgICAgICAgICAgazIgPSBWZDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICRlOgogICAgICAgICAgICAgICAgY2FzZSBhZjoKICAgICAgICAgICAgICAgIGNhc2UgYmY6CiAgICAgICAgICAgICAgICAgIGsyID0gSGQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBjZjoKICAgICAgICAgICAgICAgICAgazIgPSBYZDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJzY3JvbGwiOgogICAgICAgICAgICAgICAgICBrMiA9IHZkOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIndoZWVsIjoKICAgICAgICAgICAgICAgICAgazIgPSBaZDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJjb3B5IjoKICAgICAgICAgICAgICAgIGNhc2UgImN1dCI6CiAgICAgICAgICAgICAgICBjYXNlICJwYXN0ZSI6CiAgICAgICAgICAgICAgICAgIGsyID0gSmQ7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiZ290cG9pbnRlcmNhcHR1cmUiOgogICAgICAgICAgICAgICAgY2FzZSAibG9zdHBvaW50ZXJjYXB0dXJlIjoKICAgICAgICAgICAgICAgIGNhc2UgInBvaW50ZXJjYW5jZWwiOgogICAgICAgICAgICAgICAgY2FzZSAicG9pbnRlcmRvd24iOgogICAgICAgICAgICAgICAgY2FzZSAicG9pbnRlcm1vdmUiOgogICAgICAgICAgICAgICAgY2FzZSAicG9pbnRlcm91dCI6CiAgICAgICAgICAgICAgICBjYXNlICJwb2ludGVyb3ZlciI6CiAgICAgICAgICAgICAgICBjYXNlICJwb2ludGVydXAiOgogICAgICAgICAgICAgICAgICBrMiA9IFRkOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgdCA9IDAgIT09IChiICYgNCksIEogPSAhdCAmJiAic2Nyb2xsIiA9PT0gYSwgeCA9IHQgPyBudWxsICE9PSBoMiA/IGgyICsgIkNhcHR1cmUiIDogbnVsbCA6IGgyOwogICAgICAgICAgICAgIHQgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciB3ID0gZDIsIHU7IG51bGwgIT09IHc7ICkgewogICAgICAgICAgICAgICAgdSA9IHc7CiAgICAgICAgICAgICAgICB2YXIgRiA9IHUuc3RhdGVOb2RlOwogICAgICAgICAgICAgICAgNSA9PT0gdS50YWcgJiYgbnVsbCAhPT0gRiAmJiAodSA9IEYsIG51bGwgIT09IHggJiYgKEYgPSBLYih3LCB4KSwgbnVsbCAhPSBGICYmIHQucHVzaCh0Zih3LCBGLCB1KSkpKTsKICAgICAgICAgICAgICAgIGlmIChKKQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIHcgPSB3LnJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgMCA8IHQubGVuZ3RoICYmIChoMiA9IG5ldyBrMihoMiwgbiwgbnVsbCwgYywgZTIpLCBnMi5wdXNoKHsgZXZlbnQ6IGgyLCBsaXN0ZW5lcnM6IHQgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoMCA9PT0gKGIgJiA3KSkgewogICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgaDIgPSAibW91c2VvdmVyIiA9PT0gYSB8fCAicG9pbnRlcm92ZXIiID09PSBhOwogICAgICAgICAgICAgIGsyID0gIm1vdXNlb3V0IiA9PT0gYSB8fCAicG9pbnRlcm91dCIgPT09IGE7CiAgICAgICAgICAgICAgaWYgKGgyICYmIGMgIT09IHdiICYmIChuID0gYy5yZWxhdGVkVGFyZ2V0IHx8IGMuZnJvbUVsZW1lbnQpICYmIChXYyhuKSB8fCBuW3VmXSkpCiAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgIGlmIChrMiB8fCBoMikgewogICAgICAgICAgICAgICAgaDIgPSBlMi53aW5kb3cgPT09IGUyID8gZTIgOiAoaDIgPSBlMi5vd25lckRvY3VtZW50KSA/IGgyLmRlZmF1bHRWaWV3IHx8IGgyLnBhcmVudFdpbmRvdyA6IHdpbmRvdzsKICAgICAgICAgICAgICAgIGlmIChrMikgewogICAgICAgICAgICAgICAgICBpZiAobiA9IGMucmVsYXRlZFRhcmdldCB8fCBjLnRvRWxlbWVudCwgazIgPSBkMiwgbiA9IG4gPyBXYyhuKSA6IG51bGwsIG51bGwgIT09IG4gJiYgKEogPSBWYihuKSwgbiAhPT0gSiB8fCA1ICE9PSBuLnRhZyAmJiA2ICE9PSBuLnRhZykpCiAgICAgICAgICAgICAgICAgICAgbiA9IG51bGw7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgazIgPSBudWxsLCBuID0gZDI7CiAgICAgICAgICAgICAgICBpZiAoazIgIT09IG4pIHsKICAgICAgICAgICAgICAgICAgdCA9IEJkOwogICAgICAgICAgICAgICAgICBGID0gIm9uTW91c2VMZWF2ZSI7CiAgICAgICAgICAgICAgICAgIHggPSAib25Nb3VzZUVudGVyIjsKICAgICAgICAgICAgICAgICAgdyA9ICJtb3VzZSI7CiAgICAgICAgICAgICAgICAgIGlmICgicG9pbnRlcm91dCIgPT09IGEgfHwgInBvaW50ZXJvdmVyIiA9PT0gYSkKICAgICAgICAgICAgICAgICAgICB0ID0gVGQsIEYgPSAib25Qb2ludGVyTGVhdmUiLCB4ID0gIm9uUG9pbnRlckVudGVyIiwgdyA9ICJwb2ludGVyIjsKICAgICAgICAgICAgICAgICAgSiA9IG51bGwgPT0gazIgPyBoMiA6IHVlKGsyKTsKICAgICAgICAgICAgICAgICAgdSA9IG51bGwgPT0gbiA/IGgyIDogdWUobik7CiAgICAgICAgICAgICAgICAgIGgyID0gbmV3IHQoRiwgdyArICJsZWF2ZSIsIGsyLCBjLCBlMik7CiAgICAgICAgICAgICAgICAgIGgyLnRhcmdldCA9IEo7CiAgICAgICAgICAgICAgICAgIGgyLnJlbGF0ZWRUYXJnZXQgPSB1OwogICAgICAgICAgICAgICAgICBGID0gbnVsbDsKICAgICAgICAgICAgICAgICAgV2MoZTIpID09PSBkMiAmJiAodCA9IG5ldyB0KHgsIHcgKyAiZW50ZXIiLCBuLCBjLCBlMiksIHQudGFyZ2V0ID0gdSwgdC5yZWxhdGVkVGFyZ2V0ID0gSiwgRiA9IHQpOwogICAgICAgICAgICAgICAgICBKID0gRjsKICAgICAgICAgICAgICAgICAgaWYgKGsyICYmIG4pCiAgICAgICAgICAgICAgICAgICAgYjogewogICAgICAgICAgICAgICAgICAgICAgdCA9IGsyOwogICAgICAgICAgICAgICAgICAgICAgeCA9IG47CiAgICAgICAgICAgICAgICAgICAgICB3ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIGZvciAodSA9IHQ7IHU7IHUgPSB2Zih1KSkKICAgICAgICAgICAgICAgICAgICAgICAgdysrOwogICAgICAgICAgICAgICAgICAgICAgdSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKEYgPSB4OyBGOyBGID0gdmYoRikpCiAgICAgICAgICAgICAgICAgICAgICAgIHUrKzsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyAwIDwgdyAtIHU7ICkKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHZmKHQpLCB3LS07CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgMCA8IHUgLSB3OyApCiAgICAgICAgICAgICAgICAgICAgICAgIHggPSB2Zih4KSwgdS0tOwogICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHctLTsgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09PSB4IHx8IG51bGwgIT09IHggJiYgdCA9PT0geC5hbHRlcm5hdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHZmKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB4ID0gdmYoeCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gazIgJiYgd2YoZzIsIGgyLCBrMiwgdCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICBudWxsICE9PSBuICYmIG51bGwgIT09IEogJiYgd2YoZzIsIEosIG4sIHQsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgaDIgPSBkMiA/IHVlKGQyKSA6IHdpbmRvdzsKICAgICAgICAgICAgICBrMiA9IGgyLm5vZGVOYW1lICYmIGgyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgaWYgKCJzZWxlY3QiID09PSBrMiB8fCAiaW5wdXQiID09PSBrMiAmJiAiZmlsZSIgPT09IGgyLnR5cGUpCiAgICAgICAgICAgICAgICB2YXIgbmEgPSB2ZTsKICAgICAgICAgICAgICBlbHNlIGlmIChtZShoMikpCiAgICAgICAgICAgICAgICBpZiAod2UpCiAgICAgICAgICAgICAgICAgIG5hID0gRmU7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgbmEgPSBEZTsKICAgICAgICAgICAgICAgICAgdmFyIHhhID0gQ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgKGsyID0gaDIubm9kZU5hbWUpICYmICJpbnB1dCIgPT09IGsyLnRvTG93ZXJDYXNlKCkgJiYgKCJjaGVja2JveCIgPT09IGgyLnR5cGUgfHwgInJhZGlvIiA9PT0gaDIudHlwZSkgJiYgKG5hID0gRWUpOwogICAgICAgICAgICAgIGlmIChuYSAmJiAobmEgPSBuYShhLCBkMikpKSB7CiAgICAgICAgICAgICAgICBuZShnMiwgbmEsIGMsIGUyKTsKICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHhhICYmIHhhKGEsIGgyLCBkMik7CiAgICAgICAgICAgICAgImZvY3Vzb3V0IiA9PT0gYSAmJiAoeGEgPSBoMi5fd3JhcHBlclN0YXRlKSAmJiB4YS5jb250cm9sbGVkICYmICJudW1iZXIiID09PSBoMi50eXBlICYmIGNiKGgyLCAibnVtYmVyIiwgaDIudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhhID0gZDIgPyB1ZShkMikgOiB3aW5kb3c7CiAgICAgICAgICAgIHN3aXRjaCAoYSkgewogICAgICAgICAgICAgIGNhc2UgImZvY3VzaW4iOgogICAgICAgICAgICAgICAgaWYgKG1lKHhhKSB8fCAidHJ1ZSIgPT09IHhhLmNvbnRlbnRFZGl0YWJsZSkKICAgICAgICAgICAgICAgICAgUWUgPSB4YSwgUmUgPSBkMiwgU2UgPSBudWxsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAiZm9jdXNvdXQiOgogICAgICAgICAgICAgICAgU2UgPSBSZSA9IFFlID0gbnVsbDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgIm1vdXNlZG93biI6CiAgICAgICAgICAgICAgICBUZSA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJjb250ZXh0bWVudSI6CiAgICAgICAgICAgICAgY2FzZSAibW91c2V1cCI6CiAgICAgICAgICAgICAgY2FzZSAiZHJhZ2VuZCI6CiAgICAgICAgICAgICAgICBUZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgVWUoZzIsIGMsIGUyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgInNlbGVjdGlvbmNoYW5nZSI6CiAgICAgICAgICAgICAgICBpZiAoUGUpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImtleWRvd24iOgogICAgICAgICAgICAgIGNhc2UgImtleXVwIjoKICAgICAgICAgICAgICAgIFVlKGcyLCBjLCBlMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyICRhOwogICAgICAgICAgICBpZiAoYWUpCiAgICAgICAgICAgICAgYjogewogICAgICAgICAgICAgICAgc3dpdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgImNvbXBvc2l0aW9uc3RhcnQiOgogICAgICAgICAgICAgICAgICAgIHZhciBiYSA9ICJvbkNvbXBvc2l0aW9uU3RhcnQiOwogICAgICAgICAgICAgICAgICAgIGJyZWFrIGI7CiAgICAgICAgICAgICAgICAgIGNhc2UgImNvbXBvc2l0aW9uZW5kIjoKICAgICAgICAgICAgICAgICAgICBiYSA9ICJvbkNvbXBvc2l0aW9uRW5kIjsKICAgICAgICAgICAgICAgICAgICBicmVhayBiOwogICAgICAgICAgICAgICAgICBjYXNlICJjb21wb3NpdGlvbnVwZGF0ZSI6CiAgICAgICAgICAgICAgICAgICAgYmEgPSAib25Db21wb3NpdGlvblVwZGF0ZSI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJhID0gdm9pZCAwOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGllID8gZ2UoYSwgYykgJiYgKGJhID0gIm9uQ29tcG9zaXRpb25FbmQiKSA6ICJrZXlkb3duIiA9PT0gYSAmJiAyMjkgPT09IGMua2V5Q29kZSAmJiAoYmEgPSAib25Db21wb3NpdGlvblN0YXJ0Iik7CiAgICAgICAgICAgIGJhICYmIChkZSAmJiAia28iICE9PSBjLmxvY2FsZSAmJiAoaWUgfHwgIm9uQ29tcG9zaXRpb25TdGFydCIgIT09IGJhID8gIm9uQ29tcG9zaXRpb25FbmQiID09PSBiYSAmJiBpZSAmJiAoJGEgPSBuZCgpKSA6IChrZCA9IGUyLCBsZCA9ICJ2YWx1ZSIgaW4ga2QgPyBrZC52YWx1ZSA6IGtkLnRleHRDb250ZW50LCBpZSA9IHRydWUpKSwgeGEgPSBvZShkMiwgYmEpLCAwIDwgeGEubGVuZ3RoICYmIChiYSA9IG5ldyBMZChiYSwgYSwgbnVsbCwgYywgZTIpLCBnMi5wdXNoKHsgZXZlbnQ6IGJhLCBsaXN0ZW5lcnM6IHhhIH0pLCAkYSA/IGJhLmRhdGEgPSAkYSA6ICgkYSA9IGhlKGMpLCBudWxsICE9PSAkYSAmJiAoYmEuZGF0YSA9ICRhKSkpKTsKICAgICAgICAgICAgaWYgKCRhID0gY2UgPyBqZShhLCBjKSA6IGtlKGEsIGMpKQogICAgICAgICAgICAgIGQyID0gb2UoZDIsICJvbkJlZm9yZUlucHV0IiksIDAgPCBkMi5sZW5ndGggJiYgKGUyID0gbmV3IExkKCJvbkJlZm9yZUlucHV0IiwgImJlZm9yZWlucHV0IiwgbnVsbCwgYywgZTIpLCBnMi5wdXNoKHsgZXZlbnQ6IGUyLCBsaXN0ZW5lcnM6IGQyIH0pLCBlMi5kYXRhID0gJGEpOwogICAgICAgICAgfQogICAgICAgICAgc2UoZzIsIGIpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHRmKGEsIGIsIGMpIHsKICAgICAgICByZXR1cm4geyBpbnN0YW5jZTogYSwgbGlzdGVuZXI6IGIsIGN1cnJlbnRUYXJnZXQ6IGMgfTsKICAgICAgfQogICAgICBmdW5jdGlvbiBvZShhLCBiKSB7CiAgICAgICAgZm9yICh2YXIgYyA9IGIgKyAiQ2FwdHVyZSIsIGQgPSBbXTsgbnVsbCAhPT0gYTsgKSB7CiAgICAgICAgICB2YXIgZSA9IGEsIGYgPSBlLnN0YXRlTm9kZTsKICAgICAgICAgIDUgPT09IGUudGFnICYmIG51bGwgIT09IGYgJiYgKGUgPSBmLCBmID0gS2IoYSwgYyksIG51bGwgIT0gZiAmJiBkLnVuc2hpZnQodGYoYSwgZiwgZSkpLCBmID0gS2IoYSwgYiksIG51bGwgIT0gZiAmJiBkLnB1c2godGYoYSwgZiwgZSkpKTsKICAgICAgICAgIGEgPSBhLnJldHVybjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdmYoYSkgewogICAgICAgIGlmIChudWxsID09PSBhKQogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgZG8KICAgICAgICAgIGEgPSBhLnJldHVybjsKICAgICAgICB3aGlsZSAoYSAmJiA1ICE9PSBhLnRhZyk7CiAgICAgICAgcmV0dXJuIGEgPyBhIDogbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiB3ZihhLCBiLCBjLCBkLCBlKSB7CiAgICAgICAgZm9yICh2YXIgZiA9IGIuX3JlYWN0TmFtZSwgZyA9IFtdOyBudWxsICE9PSBjICYmIGMgIT09IGQ7ICkgewogICAgICAgICAgdmFyIGggPSBjLCBrID0gaC5hbHRlcm5hdGUsIGwgPSBoLnN0YXRlTm9kZTsKICAgICAgICAgIGlmIChudWxsICE9PSBrICYmIGsgPT09IGQpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgNSA9PT0gaC50YWcgJiYgbnVsbCAhPT0gbCAmJiAoaCA9IGwsIGUgPyAoayA9IEtiKGMsIGYpLCBudWxsICE9IGsgJiYgZy51bnNoaWZ0KHRmKGMsIGssIGgpKSkgOiBlIHx8IChrID0gS2IoYywgZiksIG51bGwgIT0gayAmJiBnLnB1c2godGYoYywgaywgaCkpKSk7CiAgICAgICAgICBjID0gYy5yZXR1cm47CiAgICAgICAgfQogICAgICAgIDAgIT09IGcubGVuZ3RoICYmIGEucHVzaCh7IGV2ZW50OiBiLCBsaXN0ZW5lcnM6IGcgfSk7CiAgICAgIH0KICAgICAgdmFyIHhmID0gL1xyXG4/L2c7CiAgICAgIHZhciB5ZiA9IC9cdTAwMDB8XHVGRkZEL2c7CiAgICAgIGZ1bmN0aW9uIHpmKGEpIHsKICAgICAgICByZXR1cm4gKCJzdHJpbmciID09PSB0eXBlb2YgYSA/IGEgOiAiIiArIGEpLnJlcGxhY2UoeGYsICJcbiIpLnJlcGxhY2UoeWYsICIiKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBBZihhLCBiLCBjKSB7CiAgICAgICAgYiA9IHpmKGIpOwogICAgICAgIGlmICh6ZihhKSAhPT0gYiAmJiBjKQogICAgICAgICAgdGhyb3cgRXJyb3IocCg0MjUpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBCZigpIHsKICAgICAgfQogICAgICB2YXIgQ2YgPSBudWxsOwogICAgICB2YXIgRGYgPSBudWxsOwogICAgICBmdW5jdGlvbiBFZihhLCBiKSB7CiAgICAgICAgcmV0dXJuICJ0ZXh0YXJlYSIgPT09IGEgfHwgIm5vc2NyaXB0IiA9PT0gYSB8fCAic3RyaW5nIiA9PT0gdHlwZW9mIGIuY2hpbGRyZW4gfHwgIm51bWJlciIgPT09IHR5cGVvZiBiLmNoaWxkcmVuIHx8ICJvYmplY3QiID09PSB0eXBlb2YgYi5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJiBudWxsICE9PSBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIG51bGwgIT0gYi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7CiAgICAgIH0KICAgICAgdmFyIEZmID0gImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHNldFRpbWVvdXQgPyBzZXRUaW1lb3V0IDogdm9pZCAwOwogICAgICB2YXIgR2YgPSAiZnVuY3Rpb24iID09PSB0eXBlb2YgY2xlYXJUaW1lb3V0ID8gY2xlYXJUaW1lb3V0IDogdm9pZCAwOwogICAgICB2YXIgSGYgPSAiZnVuY3Rpb24iID09PSB0eXBlb2YgUHJvbWlzZSA/IFByb21pc2UgOiB2b2lkIDA7CiAgICAgIHZhciBKZiA9ICJmdW5jdGlvbiIgPT09IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA/IHF1ZXVlTWljcm90YXNrIDogInVuZGVmaW5lZCIgIT09IHR5cGVvZiBIZiA/IGZ1bmN0aW9uKGEpIHsKICAgICAgICByZXR1cm4gSGYucmVzb2x2ZShudWxsKS50aGVuKGEpLmNhdGNoKElmKTsKICAgICAgfSA6IEZmOwogICAgICBmdW5jdGlvbiBJZihhKSB7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgIHRocm93IGE7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gS2YoYSwgYikgewogICAgICAgIHZhciBjID0gYiwgZCA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgdmFyIGUgPSBjLm5leHRTaWJsaW5nOwogICAgICAgICAgYS5yZW1vdmVDaGlsZChjKTsKICAgICAgICAgIGlmIChlICYmIDggPT09IGUubm9kZVR5cGUpCiAgICAgICAgICAgIGlmIChjID0gZS5kYXRhLCAiLyQiID09PSBjKSB7CiAgICAgICAgICAgICAgaWYgKDAgPT09IGQpIHsKICAgICAgICAgICAgICAgIGEucmVtb3ZlQ2hpbGQoZSk7CiAgICAgICAgICAgICAgICBiZChiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZC0tOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAiJCIgIT09IGMgJiYgIiQ/IiAhPT0gYyAmJiAiJCEiICE9PSBjIHx8IGQrKzsKICAgICAgICAgIGMgPSBlOwogICAgICAgIH0gd2hpbGUgKGMpOwogICAgICAgIGJkKGIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIExmKGEpIHsKICAgICAgICBmb3IgKDsgbnVsbCAhPSBhOyBhID0gYS5uZXh0U2libGluZykgewogICAgICAgICAgdmFyIGIgPSBhLm5vZGVUeXBlOwogICAgICAgICAgaWYgKDEgPT09IGIgfHwgMyA9PT0gYikKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBpZiAoOCA9PT0gYikgewogICAgICAgICAgICBiID0gYS5kYXRhOwogICAgICAgICAgICBpZiAoIiQiID09PSBiIHx8ICIkISIgPT09IGIgfHwgIiQ/IiA9PT0gYikKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKCIvJCIgPT09IGIpCiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIE1mKGEpIHsKICAgICAgICBhID0gYS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgZm9yICh2YXIgYiA9IDA7IGE7ICkgewogICAgICAgICAgaWYgKDggPT09IGEubm9kZVR5cGUpIHsKICAgICAgICAgICAgdmFyIGMgPSBhLmRhdGE7CiAgICAgICAgICAgIGlmICgiJCIgPT09IGMgfHwgIiQhIiA9PT0gYyB8fCAiJD8iID09PSBjKSB7CiAgICAgICAgICAgICAgaWYgKDAgPT09IGIpCiAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICBiLS07CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICIvJCIgPT09IGMgJiYgYisrOwogICAgICAgICAgfQogICAgICAgICAgYSA9IGEucHJldmlvdXNTaWJsaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB2YXIgTmYgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTsKICAgICAgdmFyIE9mID0gIl9fcmVhY3RGaWJlciQiICsgTmY7CiAgICAgIHZhciBQZiA9ICJfX3JlYWN0UHJvcHMkIiArIE5mOwogICAgICB2YXIgdWYgPSAiX19yZWFjdENvbnRhaW5lciQiICsgTmY7CiAgICAgIHZhciBvZiA9ICJfX3JlYWN0RXZlbnRzJCIgKyBOZjsKICAgICAgdmFyIFFmID0gIl9fcmVhY3RMaXN0ZW5lcnMkIiArIE5mOwogICAgICB2YXIgUmYgPSAiX19yZWFjdEhhbmRsZXMkIiArIE5mOwogICAgICBmdW5jdGlvbiBXYyhhKSB7CiAgICAgICAgdmFyIGIgPSBhW09mXTsKICAgICAgICBpZiAoYikKICAgICAgICAgIHJldHVybiBiOwogICAgICAgIGZvciAodmFyIGMgPSBhLnBhcmVudE5vZGU7IGM7ICkgewogICAgICAgICAgaWYgKGIgPSBjW3VmXSB8fCBjW09mXSkgewogICAgICAgICAgICBjID0gYi5hbHRlcm5hdGU7CiAgICAgICAgICAgIGlmIChudWxsICE9PSBiLmNoaWxkIHx8IG51bGwgIT09IGMgJiYgbnVsbCAhPT0gYy5jaGlsZCkKICAgICAgICAgICAgICBmb3IgKGEgPSBNZihhKTsgbnVsbCAhPT0gYTsgKSB7CiAgICAgICAgICAgICAgICBpZiAoYyA9IGFbT2ZdKQogICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIGEgPSBNZihhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgfQogICAgICAgICAgYSA9IGM7CiAgICAgICAgICBjID0gYS5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBDYihhKSB7CiAgICAgICAgYSA9IGFbT2ZdIHx8IGFbdWZdOwogICAgICAgIHJldHVybiAhYSB8fCA1ICE9PSBhLnRhZyAmJiA2ICE9PSBhLnRhZyAmJiAxMyAhPT0gYS50YWcgJiYgMyAhPT0gYS50YWcgPyBudWxsIDogYTsKICAgICAgfQogICAgICBmdW5jdGlvbiB1ZShhKSB7CiAgICAgICAgaWYgKDUgPT09IGEudGFnIHx8IDYgPT09IGEudGFnKQogICAgICAgICAgcmV0dXJuIGEuc3RhdGVOb2RlOwogICAgICAgIHRocm93IEVycm9yKHAoMzMpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBEYihhKSB7CiAgICAgICAgcmV0dXJuIGFbUGZdIHx8IG51bGw7CiAgICAgIH0KICAgICAgdmFyIFNmID0gW107CiAgICAgIHZhciBUZiA9IC0xOwogICAgICBmdW5jdGlvbiBVZihhKSB7CiAgICAgICAgcmV0dXJuIHsgY3VycmVudDogYSB9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEUoYSkgewogICAgICAgIDAgPiBUZiB8fCAoYS5jdXJyZW50ID0gU2ZbVGZdLCBTZltUZl0gPSBudWxsLCBUZi0tKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBHKGEsIGIpIHsKICAgICAgICBUZisrOwogICAgICAgIFNmW1RmXSA9IGEuY3VycmVudDsKICAgICAgICBhLmN1cnJlbnQgPSBiOwogICAgICB9CiAgICAgIHZhciBWZiA9IHt9OwogICAgICB2YXIgSCA9IFVmKFZmKTsKICAgICAgdmFyIFdmID0gVWYoZmFsc2UpOwogICAgICB2YXIgWGYgPSBWZjsKICAgICAgZnVuY3Rpb24gWWYoYSwgYikgewogICAgICAgIHZhciBjID0gYS50eXBlLmNvbnRleHRUeXBlczsKICAgICAgICBpZiAoIWMpCiAgICAgICAgICByZXR1cm4gVmY7CiAgICAgICAgdmFyIGQgPSBhLnN0YXRlTm9kZTsKICAgICAgICBpZiAoZCAmJiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IGIpCiAgICAgICAgICByZXR1cm4gZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDsKICAgICAgICB2YXIgZSA9IHt9LCBmOwogICAgICAgIGZvciAoZiBpbiBjKQogICAgICAgICAgZVtmXSA9IGJbZl07CiAgICAgICAgZCAmJiAoYSA9IGEuc3RhdGVOb2RlLCBhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPSBiLCBhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gZSk7CiAgICAgICAgcmV0dXJuIGU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gWmYoYSkgewogICAgICAgIGEgPSBhLmNoaWxkQ29udGV4dFR5cGVzOwogICAgICAgIHJldHVybiBudWxsICE9PSBhICYmIHZvaWQgMCAhPT0gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiAkZigpIHsKICAgICAgICBFKFdmKTsKICAgICAgICBFKEgpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGFnKGEsIGIsIGMpIHsKICAgICAgICBpZiAoSC5jdXJyZW50ICE9PSBWZikKICAgICAgICAgIHRocm93IEVycm9yKHAoMTY4KSk7CiAgICAgICAgRyhILCBiKTsKICAgICAgICBHKFdmLCBjKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBiZyhhLCBiLCBjKSB7CiAgICAgICAgdmFyIGQgPSBhLnN0YXRlTm9kZTsKICAgICAgICBiID0gYi5jaGlsZENvbnRleHRUeXBlczsKICAgICAgICBpZiAoImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KQogICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgZCA9IGQuZ2V0Q2hpbGRDb250ZXh0KCk7CiAgICAgICAgZm9yICh2YXIgZSBpbiBkKQogICAgICAgICAgaWYgKCEoZSBpbiBiKSkKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxMDgsIFJhKGEpIHx8ICJVbmtub3duIiwgZSkpOwogICAgICAgIHJldHVybiBBKHt9LCBjLCBkKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBjZyhhKSB7CiAgICAgICAgYSA9IChhID0gYS5zdGF0ZU5vZGUpICYmIGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgfHwgVmY7CiAgICAgICAgWGYgPSBILmN1cnJlbnQ7CiAgICAgICAgRyhILCBhKTsKICAgICAgICBHKFdmLCBXZi5jdXJyZW50KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBkZyhhLCBiLCBjKSB7CiAgICAgICAgdmFyIGQgPSBhLnN0YXRlTm9kZTsKICAgICAgICBpZiAoIWQpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDE2OSkpOwogICAgICAgIGMgPyAoYSA9IGJnKGEsIGIsIFhmKSwgZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGEsIEUoV2YpLCBFKEgpLCBHKEgsIGEpKSA6IEUoV2YpOwogICAgICAgIEcoV2YsIGMpOwogICAgICB9CiAgICAgIHZhciBlZyA9IG51bGw7CiAgICAgIHZhciBmZyA9IGZhbHNlOwogICAgICB2YXIgZ2cgPSBmYWxzZTsKICAgICAgZnVuY3Rpb24gaGcoYSkgewogICAgICAgIG51bGwgPT09IGVnID8gZWcgPSBbYV0gOiBlZy5wdXNoKGEpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGlnKGEpIHsKICAgICAgICBmZyA9IHRydWU7CiAgICAgICAgaGcoYSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gamcoKSB7CiAgICAgICAgaWYgKCFnZyAmJiBudWxsICE9PSBlZykgewogICAgICAgICAgZ2cgPSB0cnVlOwogICAgICAgICAgdmFyIGEgPSAwLCBiID0gQzsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciBjID0gZWc7CiAgICAgICAgICAgIGZvciAoQyA9IDE7IGEgPCBjLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgdmFyIGQgPSBjW2FdOwogICAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICBkID0gZCh0cnVlKTsKICAgICAgICAgICAgICB3aGlsZSAobnVsbCAhPT0gZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWcgPSBudWxsOwogICAgICAgICAgICBmZyA9IGZhbHNlOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB0aHJvdyBudWxsICE9PSBlZyAmJiAoZWcgPSBlZy5zbGljZShhICsgMSkpLCBhYyhmYywgamcpLCBlOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgQyA9IGIsIGdnID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHZhciBrZyA9IFtdOwogICAgICB2YXIgbGcgPSAwOwogICAgICB2YXIgbWcgPSBudWxsOwogICAgICB2YXIgbmcgPSAwOwogICAgICB2YXIgb2cgPSBbXTsKICAgICAgdmFyIHBnID0gMDsKICAgICAgdmFyIHFnID0gbnVsbDsKICAgICAgdmFyIHJnID0gMTsKICAgICAgdmFyIHNnID0gIiI7CiAgICAgIGZ1bmN0aW9uIHRnKGEsIGIpIHsKICAgICAgICBrZ1tsZysrXSA9IG5nOwogICAgICAgIGtnW2xnKytdID0gbWc7CiAgICAgICAgbWcgPSBhOwogICAgICAgIG5nID0gYjsKICAgICAgfQogICAgICBmdW5jdGlvbiB1ZyhhLCBiLCBjKSB7CiAgICAgICAgb2dbcGcrK10gPSByZzsKICAgICAgICBvZ1twZysrXSA9IHNnOwogICAgICAgIG9nW3BnKytdID0gcWc7CiAgICAgICAgcWcgPSBhOwogICAgICAgIHZhciBkID0gcmc7CiAgICAgICAgYSA9IHNnOwogICAgICAgIHZhciBlID0gMzIgLSBvYyhkKSAtIDE7CiAgICAgICAgZCAmPSB+KDEgPDwgZSk7CiAgICAgICAgYyArPSAxOwogICAgICAgIHZhciBmID0gMzIgLSBvYyhiKSArIGU7CiAgICAgICAgaWYgKDMwIDwgZikgewogICAgICAgICAgdmFyIGcgPSBlIC0gZSAlIDU7CiAgICAgICAgICBmID0gKGQgJiAoMSA8PCBnKSAtIDEpLnRvU3RyaW5nKDMyKTsKICAgICAgICAgIGQgPj49IGc7CiAgICAgICAgICBlIC09IGc7CiAgICAgICAgICByZyA9IDEgPDwgMzIgLSBvYyhiKSArIGUgfCBjIDw8IGUgfCBkOwogICAgICAgICAgc2cgPSBmICsgYTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHJnID0gMSA8PCBmIHwgYyA8PCBlIHwgZCwgc2cgPSBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHZnKGEpIHsKICAgICAgICBudWxsICE9PSBhLnJldHVybiAmJiAodGcoYSwgMSksIHVnKGEsIDEsIDApKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB3ZyhhKSB7CiAgICAgICAgZm9yICg7IGEgPT09IG1nOyApCiAgICAgICAgICBtZyA9IGtnWy0tbGddLCBrZ1tsZ10gPSBudWxsLCBuZyA9IGtnWy0tbGddLCBrZ1tsZ10gPSBudWxsOwogICAgICAgIGZvciAoOyBhID09PSBxZzsgKQogICAgICAgICAgcWcgPSBvZ1stLXBnXSwgb2dbcGddID0gbnVsbCwgc2cgPSBvZ1stLXBnXSwgb2dbcGddID0gbnVsbCwgcmcgPSBvZ1stLXBnXSwgb2dbcGddID0gbnVsbDsKICAgICAgfQogICAgICB2YXIgeGcgPSBudWxsOwogICAgICB2YXIgeWcgPSBudWxsOwogICAgICB2YXIgSSA9IGZhbHNlOwogICAgICB2YXIgemcgPSBudWxsOwogICAgICBmdW5jdGlvbiBBZyhhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBCZyg1LCBudWxsLCBudWxsLCAwKTsKICAgICAgICBjLmVsZW1lbnRUeXBlID0gIkRFTEVURUQiOwogICAgICAgIGMuc3RhdGVOb2RlID0gYjsKICAgICAgICBjLnJldHVybiA9IGE7CiAgICAgICAgYiA9IGEuZGVsZXRpb25zOwogICAgICAgIG51bGwgPT09IGIgPyAoYS5kZWxldGlvbnMgPSBbY10sIGEuZmxhZ3MgfD0gMTYpIDogYi5wdXNoKGMpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIENnKGEsIGIpIHsKICAgICAgICBzd2l0Y2ggKGEudGFnKSB7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHZhciBjID0gYS50eXBlOwogICAgICAgICAgICBiID0gMSAhPT0gYi5ub2RlVHlwZSB8fCBjLnRvTG93ZXJDYXNlKCkgIT09IGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA/IG51bGwgOiBiOwogICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gYiA/IChhLnN0YXRlTm9kZSA9IGIsIHhnID0gYSwgeWcgPSBMZihiLmZpcnN0Q2hpbGQpLCB0cnVlKSA6IGZhbHNlOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICByZXR1cm4gYiA9ICIiID09PSBhLnBlbmRpbmdQcm9wcyB8fCAzICE9PSBiLm5vZGVUeXBlID8gbnVsbCA6IGIsIG51bGwgIT09IGIgPyAoYS5zdGF0ZU5vZGUgPSBiLCB4ZyA9IGEsIHlnID0gbnVsbCwgdHJ1ZSkgOiBmYWxzZTsKICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgIHJldHVybiBiID0gOCAhPT0gYi5ub2RlVHlwZSA/IG51bGwgOiBiLCBudWxsICE9PSBiID8gKGMgPSBudWxsICE9PSBxZyA/IHsgaWQ6IHJnLCBvdmVyZmxvdzogc2cgfSA6IG51bGwsIGEubWVtb2l6ZWRTdGF0ZSA9IHsgZGVoeWRyYXRlZDogYiwgdHJlZUNvbnRleHQ6IGMsIHJldHJ5TGFuZTogMTA3Mzc0MTgyNCB9LCBjID0gQmcoMTgsIG51bGwsIG51bGwsIDApLCBjLnN0YXRlTm9kZSA9IGIsIGMucmV0dXJuID0gYSwgYS5jaGlsZCA9IGMsIHhnID0gYSwgeWcgPSBudWxsLCB0cnVlKSA6IGZhbHNlOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBEZyhhKSB7CiAgICAgICAgcmV0dXJuIDAgIT09IChhLm1vZGUgJiAxKSAmJiAwID09PSAoYS5mbGFncyAmIDEyOCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gRWcoYSkgewogICAgICAgIGlmIChJKSB7CiAgICAgICAgICB2YXIgYiA9IHlnOwogICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgdmFyIGMgPSBiOwogICAgICAgICAgICBpZiAoIUNnKGEsIGIpKSB7CiAgICAgICAgICAgICAgaWYgKERnKGEpKQogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCg0MTgpKTsKICAgICAgICAgICAgICBiID0gTGYoYy5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgdmFyIGQgPSB4ZzsKICAgICAgICAgICAgICBiICYmIENnKGEsIGIpID8gQWcoZCwgYykgOiAoYS5mbGFncyA9IGEuZmxhZ3MgJiAtNDA5NyB8IDIsIEkgPSBmYWxzZSwgeGcgPSBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKERnKGEpKQogICAgICAgICAgICAgIHRocm93IEVycm9yKHAoNDE4KSk7CiAgICAgICAgICAgIGEuZmxhZ3MgPSBhLmZsYWdzICYgLTQwOTcgfCAyOwogICAgICAgICAgICBJID0gZmFsc2U7CiAgICAgICAgICAgIHhnID0gYTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gRmcoYSkgewogICAgICAgIGZvciAoYSA9IGEucmV0dXJuOyBudWxsICE9PSBhICYmIDUgIT09IGEudGFnICYmIDMgIT09IGEudGFnICYmIDEzICE9PSBhLnRhZzsgKQogICAgICAgICAgYSA9IGEucmV0dXJuOwogICAgICAgIHhnID0gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBHZyhhKSB7CiAgICAgICAgaWYgKGEgIT09IHhnKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICghSSkKICAgICAgICAgIHJldHVybiBGZyhhKSwgSSA9IHRydWUsIGZhbHNlOwogICAgICAgIHZhciBiOwogICAgICAgIChiID0gMyAhPT0gYS50YWcpICYmICEoYiA9IDUgIT09IGEudGFnKSAmJiAoYiA9IGEudHlwZSwgYiA9ICJoZWFkIiAhPT0gYiAmJiAiYm9keSIgIT09IGIgJiYgIUVmKGEudHlwZSwgYS5tZW1vaXplZFByb3BzKSk7CiAgICAgICAgaWYgKGIgJiYgKGIgPSB5ZykpIHsKICAgICAgICAgIGlmIChEZyhhKSkKICAgICAgICAgICAgdGhyb3cgSGcoKSwgRXJyb3IocCg0MTgpKTsKICAgICAgICAgIGZvciAoOyBiOyApCiAgICAgICAgICAgIEFnKGEsIGIpLCBiID0gTGYoYi5uZXh0U2libGluZyk7CiAgICAgICAgfQogICAgICAgIEZnKGEpOwogICAgICAgIGlmICgxMyA9PT0gYS50YWcpIHsKICAgICAgICAgIGEgPSBhLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICBhID0gbnVsbCAhPT0gYSA/IGEuZGVoeWRyYXRlZCA6IG51bGw7CiAgICAgICAgICBpZiAoIWEpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzE3KSk7CiAgICAgICAgICBhOiB7CiAgICAgICAgICAgIGEgPSBhLm5leHRTaWJsaW5nOwogICAgICAgICAgICBmb3IgKGIgPSAwOyBhOyApIHsKICAgICAgICAgICAgICBpZiAoOCA9PT0gYS5ub2RlVHlwZSkgewogICAgICAgICAgICAgICAgdmFyIGMgPSBhLmRhdGE7CiAgICAgICAgICAgICAgICBpZiAoIi8kIiA9PT0gYykgewogICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gYikgewogICAgICAgICAgICAgICAgICAgIHlnID0gTGYoYS5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBiLS07CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgIiQiICE9PSBjICYmICIkISIgIT09IGMgJiYgIiQ/IiAhPT0gYyB8fCBiKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGEgPSBhLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHlnID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICAgIHlnID0geGcgPyBMZihhLnN0YXRlTm9kZS5uZXh0U2libGluZykgOiBudWxsOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEhnKCkgewogICAgICAgIGZvciAodmFyIGEgPSB5ZzsgYTsgKQogICAgICAgICAgYSA9IExmKGEubmV4dFNpYmxpbmcpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIElnKCkgewogICAgICAgIHlnID0geGcgPSBudWxsOwogICAgICAgIEkgPSBmYWxzZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBKZyhhKSB7CiAgICAgICAgbnVsbCA9PT0gemcgPyB6ZyA9IFthXSA6IHpnLnB1c2goYSk7CiAgICAgIH0KICAgICAgdmFyIEtnID0gdWEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7CiAgICAgIGZ1bmN0aW9uIExnKGEsIGIsIGMpIHsKICAgICAgICBhID0gYy5yZWY7CiAgICAgICAgaWYgKG51bGwgIT09IGEgJiYgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGEgJiYgIm9iamVjdCIgIT09IHR5cGVvZiBhKSB7CiAgICAgICAgICBpZiAoYy5fb3duZXIpIHsKICAgICAgICAgICAgYyA9IGMuX293bmVyOwogICAgICAgICAgICBpZiAoYykgewogICAgICAgICAgICAgIGlmICgxICE9PSBjLnRhZykKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzA5KSk7CiAgICAgICAgICAgICAgdmFyIGQgPSBjLnN0YXRlTm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWQpCiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNDcsIGEpKTsKICAgICAgICAgICAgdmFyIGUgPSBkLCBmID0gIiIgKyBhOwogICAgICAgICAgICBpZiAobnVsbCAhPT0gYiAmJiBudWxsICE9PSBiLnJlZiAmJiAiZnVuY3Rpb24iID09PSB0eXBlb2YgYi5yZWYgJiYgYi5yZWYuX3N0cmluZ1JlZiA9PT0gZikKICAgICAgICAgICAgICByZXR1cm4gYi5yZWY7CiAgICAgICAgICAgIGIgPSBmdW5jdGlvbihhMikgewogICAgICAgICAgICAgIHZhciBiMiA9IGUucmVmczsKICAgICAgICAgICAgICBudWxsID09PSBhMiA/IGRlbGV0ZSBiMltmXSA6IGIyW2ZdID0gYTI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGIuX3N0cmluZ1JlZiA9IGY7CiAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCJzdHJpbmciICE9PSB0eXBlb2YgYSkKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgyODQpKTsKICAgICAgICAgIGlmICghYy5fb3duZXIpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoMjkwLCBhKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIE1nKGEsIGIpIHsKICAgICAgICBhID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGIpOwogICAgICAgIHRocm93IEVycm9yKHAoMzEsICJbb2JqZWN0IE9iamVjdF0iID09PSBhID8gIm9iamVjdCB3aXRoIGtleXMgeyIgKyBPYmplY3Qua2V5cyhiKS5qb2luKCIsICIpICsgIn0iIDogYSkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIE5nKGEpIHsKICAgICAgICB2YXIgYiA9IGEuX2luaXQ7CiAgICAgICAgcmV0dXJuIGIoYS5fcGF5bG9hZCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gT2coYSkgewogICAgICAgIGZ1bmN0aW9uIGIoYjIsIGMyKSB7CiAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICB2YXIgZDIgPSBiMi5kZWxldGlvbnM7CiAgICAgICAgICAgIG51bGwgPT09IGQyID8gKGIyLmRlbGV0aW9ucyA9IFtjMl0sIGIyLmZsYWdzIHw9IDE2KSA6IGQyLnB1c2goYzIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjKGMyLCBkMikgewogICAgICAgICAgaWYgKCFhKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIGZvciAoOyBudWxsICE9PSBkMjsgKQogICAgICAgICAgICBiKGMyLCBkMiksIGQyID0gZDIuc2libGluZzsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBkKGEyLCBiMikgewogICAgICAgICAgZm9yIChhMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7IG51bGwgIT09IGIyOyApCiAgICAgICAgICAgIG51bGwgIT09IGIyLmtleSA/IGEyLnNldChiMi5rZXksIGIyKSA6IGEyLnNldChiMi5pbmRleCwgYjIpLCBiMiA9IGIyLnNpYmxpbmc7CiAgICAgICAgICByZXR1cm4gYTI7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGUoYTIsIGIyKSB7CiAgICAgICAgICBhMiA9IFBnKGEyLCBiMik7CiAgICAgICAgICBhMi5pbmRleCA9IDA7CiAgICAgICAgICBhMi5zaWJsaW5nID0gbnVsbDsKICAgICAgICAgIHJldHVybiBhMjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZihiMiwgYzIsIGQyKSB7CiAgICAgICAgICBiMi5pbmRleCA9IGQyOwogICAgICAgICAgaWYgKCFhKQogICAgICAgICAgICByZXR1cm4gYjIuZmxhZ3MgfD0gMTA0ODU3NiwgYzI7CiAgICAgICAgICBkMiA9IGIyLmFsdGVybmF0ZTsKICAgICAgICAgIGlmIChudWxsICE9PSBkMikKICAgICAgICAgICAgcmV0dXJuIGQyID0gZDIuaW5kZXgsIGQyIDwgYzIgPyAoYjIuZmxhZ3MgfD0gMiwgYzIpIDogZDI7CiAgICAgICAgICBiMi5mbGFncyB8PSAyOwogICAgICAgICAgcmV0dXJuIGMyOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnKGIyKSB7CiAgICAgICAgICBhICYmIG51bGwgPT09IGIyLmFsdGVybmF0ZSAmJiAoYjIuZmxhZ3MgfD0gMik7CiAgICAgICAgICByZXR1cm4gYjI7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGgoYTIsIGIyLCBjMiwgZDIpIHsKICAgICAgICAgIGlmIChudWxsID09PSBiMiB8fCA2ICE9PSBiMi50YWcpCiAgICAgICAgICAgIHJldHVybiBiMiA9IFFnKGMyLCBhMi5tb2RlLCBkMiksIGIyLnJldHVybiA9IGEyLCBiMjsKICAgICAgICAgIGIyID0gZShiMiwgYzIpOwogICAgICAgICAgYjIucmV0dXJuID0gYTI7CiAgICAgICAgICByZXR1cm4gYjI7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGsoYTIsIGIyLCBjMiwgZDIpIHsKICAgICAgICAgIHZhciBmMiA9IGMyLnR5cGU7CiAgICAgICAgICBpZiAoZjIgPT09IHlhKQogICAgICAgICAgICByZXR1cm4gbShhMiwgYjIsIGMyLnByb3BzLmNoaWxkcmVuLCBkMiwgYzIua2V5KTsKICAgICAgICAgIGlmIChudWxsICE9PSBiMiAmJiAoYjIuZWxlbWVudFR5cGUgPT09IGYyIHx8ICJvYmplY3QiID09PSB0eXBlb2YgZjIgJiYgbnVsbCAhPT0gZjIgJiYgZjIuJCR0eXBlb2YgPT09IEhhICYmIE5nKGYyKSA9PT0gYjIudHlwZSkpCiAgICAgICAgICAgIHJldHVybiBkMiA9IGUoYjIsIGMyLnByb3BzKSwgZDIucmVmID0gTGcoYTIsIGIyLCBjMiksIGQyLnJldHVybiA9IGEyLCBkMjsKICAgICAgICAgIGQyID0gUmcoYzIudHlwZSwgYzIua2V5LCBjMi5wcm9wcywgbnVsbCwgYTIubW9kZSwgZDIpOwogICAgICAgICAgZDIucmVmID0gTGcoYTIsIGIyLCBjMik7CiAgICAgICAgICBkMi5yZXR1cm4gPSBhMjsKICAgICAgICAgIHJldHVybiBkMjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbChhMiwgYjIsIGMyLCBkMikgewogICAgICAgICAgaWYgKG51bGwgPT09IGIyIHx8IDQgIT09IGIyLnRhZyB8fCBiMi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyAhPT0gYzIuY29udGFpbmVySW5mbyB8fCBiMi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IGMyLmltcGxlbWVudGF0aW9uKQogICAgICAgICAgICByZXR1cm4gYjIgPSBTZyhjMiwgYTIubW9kZSwgZDIpLCBiMi5yZXR1cm4gPSBhMiwgYjI7CiAgICAgICAgICBiMiA9IGUoYjIsIGMyLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgICAgIGIyLnJldHVybiA9IGEyOwogICAgICAgICAgcmV0dXJuIGIyOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBtKGEyLCBiMiwgYzIsIGQyLCBmMikgewogICAgICAgICAgaWYgKG51bGwgPT09IGIyIHx8IDcgIT09IGIyLnRhZykKICAgICAgICAgICAgcmV0dXJuIGIyID0gVGcoYzIsIGEyLm1vZGUsIGQyLCBmMiksIGIyLnJldHVybiA9IGEyLCBiMjsKICAgICAgICAgIGIyID0gZShiMiwgYzIpOwogICAgICAgICAgYjIucmV0dXJuID0gYTI7CiAgICAgICAgICByZXR1cm4gYjI7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHEoYTIsIGIyLCBjMikgewogICAgICAgICAgaWYgKCJzdHJpbmciID09PSB0eXBlb2YgYjIgJiYgIiIgIT09IGIyIHx8ICJudW1iZXIiID09PSB0eXBlb2YgYjIpCiAgICAgICAgICAgIHJldHVybiBiMiA9IFFnKCIiICsgYjIsIGEyLm1vZGUsIGMyKSwgYjIucmV0dXJuID0gYTIsIGIyOwogICAgICAgICAgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgYjIgJiYgbnVsbCAhPT0gYjIpIHsKICAgICAgICAgICAgc3dpdGNoIChiMi4kJHR5cGVvZikgewogICAgICAgICAgICAgIGNhc2UgdmE6CiAgICAgICAgICAgICAgICByZXR1cm4gYzIgPSBSZyhiMi50eXBlLCBiMi5rZXksIGIyLnByb3BzLCBudWxsLCBhMi5tb2RlLCBjMiksIGMyLnJlZiA9IExnKGEyLCBudWxsLCBiMiksIGMyLnJldHVybiA9IGEyLCBjMjsKICAgICAgICAgICAgICBjYXNlIHdhOgogICAgICAgICAgICAgICAgcmV0dXJuIGIyID0gU2coYjIsIGEyLm1vZGUsIGMyKSwgYjIucmV0dXJuID0gYTIsIGIyOwogICAgICAgICAgICAgIGNhc2UgSGE6CiAgICAgICAgICAgICAgICB2YXIgZDIgPSBiMi5faW5pdDsKICAgICAgICAgICAgICAgIHJldHVybiBxKGEyLCBkMihiMi5fcGF5bG9hZCksIGMyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZWIoYjIpIHx8IEthKGIyKSkKICAgICAgICAgICAgICByZXR1cm4gYjIgPSBUZyhiMiwgYTIubW9kZSwgYzIsIG51bGwpLCBiMi5yZXR1cm4gPSBhMiwgYjI7CiAgICAgICAgICAgIE1nKGEyLCBiMik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcihhMiwgYjIsIGMyLCBkMikgewogICAgICAgICAgdmFyIGUyID0gbnVsbCAhPT0gYjIgPyBiMi5rZXkgOiBudWxsOwogICAgICAgICAgaWYgKCJzdHJpbmciID09PSB0eXBlb2YgYzIgJiYgIiIgIT09IGMyIHx8ICJudW1iZXIiID09PSB0eXBlb2YgYzIpCiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlMiA/IG51bGwgOiBoKGEyLCBiMiwgIiIgKyBjMiwgZDIpOwogICAgICAgICAgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgYzIgJiYgbnVsbCAhPT0gYzIpIHsKICAgICAgICAgICAgc3dpdGNoIChjMi4kJHR5cGVvZikgewogICAgICAgICAgICAgIGNhc2UgdmE6CiAgICAgICAgICAgICAgICByZXR1cm4gYzIua2V5ID09PSBlMiA/IGsoYTIsIGIyLCBjMiwgZDIpIDogbnVsbDsKICAgICAgICAgICAgICBjYXNlIHdhOgogICAgICAgICAgICAgICAgcmV0dXJuIGMyLmtleSA9PT0gZTIgPyBsKGEyLCBiMiwgYzIsIGQyKSA6IG51bGw7CiAgICAgICAgICAgICAgY2FzZSBIYToKICAgICAgICAgICAgICAgIHJldHVybiBlMiA9IGMyLl9pbml0LCByKAogICAgICAgICAgICAgICAgICBhMiwKICAgICAgICAgICAgICAgICAgYjIsCiAgICAgICAgICAgICAgICAgIGUyKGMyLl9wYXlsb2FkKSwKICAgICAgICAgICAgICAgICAgZDIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGViKGMyKSB8fCBLYShjMikpCiAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUyID8gbnVsbCA6IG0oYTIsIGIyLCBjMiwgZDIsIG51bGwpOwogICAgICAgICAgICBNZyhhMiwgYzIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHkoYTIsIGIyLCBjMiwgZDIsIGUyKSB7CiAgICAgICAgICBpZiAoInN0cmluZyIgPT09IHR5cGVvZiBkMiAmJiAiIiAhPT0gZDIgfHwgIm51bWJlciIgPT09IHR5cGVvZiBkMikKICAgICAgICAgICAgcmV0dXJuIGEyID0gYTIuZ2V0KGMyKSB8fCBudWxsLCBoKGIyLCBhMiwgIiIgKyBkMiwgZTIpOwogICAgICAgICAgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgZDIgJiYgbnVsbCAhPT0gZDIpIHsKICAgICAgICAgICAgc3dpdGNoIChkMi4kJHR5cGVvZikgewogICAgICAgICAgICAgIGNhc2UgdmE6CiAgICAgICAgICAgICAgICByZXR1cm4gYTIgPSBhMi5nZXQobnVsbCA9PT0gZDIua2V5ID8gYzIgOiBkMi5rZXkpIHx8IG51bGwsIGsoYjIsIGEyLCBkMiwgZTIpOwogICAgICAgICAgICAgIGNhc2Ugd2E6CiAgICAgICAgICAgICAgICByZXR1cm4gYTIgPSBhMi5nZXQobnVsbCA9PT0gZDIua2V5ID8gYzIgOiBkMi5rZXkpIHx8IG51bGwsIGwoYjIsIGEyLCBkMiwgZTIpOwogICAgICAgICAgICAgIGNhc2UgSGE6CiAgICAgICAgICAgICAgICB2YXIgZjIgPSBkMi5faW5pdDsKICAgICAgICAgICAgICAgIHJldHVybiB5KGEyLCBiMiwgYzIsIGYyKGQyLl9wYXlsb2FkKSwgZTIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlYihkMikgfHwgS2EoZDIpKQogICAgICAgICAgICAgIHJldHVybiBhMiA9IGEyLmdldChjMikgfHwgbnVsbCwgbShiMiwgYTIsIGQyLCBlMiwgbnVsbCk7CiAgICAgICAgICAgIE1nKGIyLCBkMik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbihlMiwgZzIsIGgyLCBrMikgewogICAgICAgICAgZm9yICh2YXIgbDIgPSBudWxsLCBtMiA9IG51bGwsIHUgPSBnMiwgdyA9IGcyID0gMCwgeCA9IG51bGw7IG51bGwgIT09IHUgJiYgdyA8IGgyLmxlbmd0aDsgdysrKSB7CiAgICAgICAgICAgIHUuaW5kZXggPiB3ID8gKHggPSB1LCB1ID0gbnVsbCkgOiB4ID0gdS5zaWJsaW5nOwogICAgICAgICAgICB2YXIgbjIgPSByKGUyLCB1LCBoMlt3XSwgazIpOwogICAgICAgICAgICBpZiAobnVsbCA9PT0gbjIpIHsKICAgICAgICAgICAgICBudWxsID09PSB1ICYmICh1ID0geCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYSAmJiB1ICYmIG51bGwgPT09IG4yLmFsdGVybmF0ZSAmJiBiKGUyLCB1KTsKICAgICAgICAgICAgZzIgPSBmKG4yLCBnMiwgdyk7CiAgICAgICAgICAgIG51bGwgPT09IG0yID8gbDIgPSBuMiA6IG0yLnNpYmxpbmcgPSBuMjsKICAgICAgICAgICAgbTIgPSBuMjsKICAgICAgICAgICAgdSA9IHg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodyA9PT0gaDIubGVuZ3RoKQogICAgICAgICAgICByZXR1cm4gYyhlMiwgdSksIEkgJiYgdGcoZTIsIHcpLCBsMjsKICAgICAgICAgIGlmIChudWxsID09PSB1KSB7CiAgICAgICAgICAgIGZvciAoOyB3IDwgaDIubGVuZ3RoOyB3KyspCiAgICAgICAgICAgICAgdSA9IHEoZTIsIGgyW3ddLCBrMiksIG51bGwgIT09IHUgJiYgKGcyID0gZih1LCBnMiwgdyksIG51bGwgPT09IG0yID8gbDIgPSB1IDogbTIuc2libGluZyA9IHUsIG0yID0gdSk7CiAgICAgICAgICAgIEkgJiYgdGcoZTIsIHcpOwogICAgICAgICAgICByZXR1cm4gbDI7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHUgPSBkKGUyLCB1KTsgdyA8IGgyLmxlbmd0aDsgdysrKQogICAgICAgICAgICB4ID0geSh1LCBlMiwgdywgaDJbd10sIGsyKSwgbnVsbCAhPT0geCAmJiAoYSAmJiBudWxsICE9PSB4LmFsdGVybmF0ZSAmJiB1LmRlbGV0ZShudWxsID09PSB4LmtleSA/IHcgOiB4LmtleSksIGcyID0gZih4LCBnMiwgdyksIG51bGwgPT09IG0yID8gbDIgPSB4IDogbTIuc2libGluZyA9IHgsIG0yID0geCk7CiAgICAgICAgICBhICYmIHUuZm9yRWFjaChmdW5jdGlvbihhMikgewogICAgICAgICAgICByZXR1cm4gYihlMiwgYTIpOwogICAgICAgICAgfSk7CiAgICAgICAgICBJICYmIHRnKGUyLCB3KTsKICAgICAgICAgIHJldHVybiBsMjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdChlMiwgZzIsIGgyLCBrMikgewogICAgICAgICAgdmFyIGwyID0gS2EoaDIpOwogICAgICAgICAgaWYgKCJmdW5jdGlvbiIgIT09IHR5cGVvZiBsMikKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNTApKTsKICAgICAgICAgIGgyID0gbDIuY2FsbChoMik7CiAgICAgICAgICBpZiAobnVsbCA9PSBoMikKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNTEpKTsKICAgICAgICAgIGZvciAodmFyIHUgPSBsMiA9IG51bGwsIG0yID0gZzIsIHcgPSBnMiA9IDAsIHggPSBudWxsLCBuMiA9IGgyLm5leHQoKTsgbnVsbCAhPT0gbTIgJiYgIW4yLmRvbmU7IHcrKywgbjIgPSBoMi5uZXh0KCkpIHsKICAgICAgICAgICAgbTIuaW5kZXggPiB3ID8gKHggPSBtMiwgbTIgPSBudWxsKSA6IHggPSBtMi5zaWJsaW5nOwogICAgICAgICAgICB2YXIgdDIgPSByKGUyLCBtMiwgbjIudmFsdWUsIGsyKTsKICAgICAgICAgICAgaWYgKG51bGwgPT09IHQyKSB7CiAgICAgICAgICAgICAgbnVsbCA9PT0gbTIgJiYgKG0yID0geCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYSAmJiBtMiAmJiBudWxsID09PSB0Mi5hbHRlcm5hdGUgJiYgYihlMiwgbTIpOwogICAgICAgICAgICBnMiA9IGYodDIsIGcyLCB3KTsKICAgICAgICAgICAgbnVsbCA9PT0gdSA/IGwyID0gdDIgOiB1LnNpYmxpbmcgPSB0MjsKICAgICAgICAgICAgdSA9IHQyOwogICAgICAgICAgICBtMiA9IHg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobjIuZG9uZSkKICAgICAgICAgICAgcmV0dXJuIGMoCiAgICAgICAgICAgICAgZTIsCiAgICAgICAgICAgICAgbTIKICAgICAgICAgICAgKSwgSSAmJiB0ZyhlMiwgdyksIGwyOwogICAgICAgICAgaWYgKG51bGwgPT09IG0yKSB7CiAgICAgICAgICAgIGZvciAoOyAhbjIuZG9uZTsgdysrLCBuMiA9IGgyLm5leHQoKSkKICAgICAgICAgICAgICBuMiA9IHEoZTIsIG4yLnZhbHVlLCBrMiksIG51bGwgIT09IG4yICYmIChnMiA9IGYobjIsIGcyLCB3KSwgbnVsbCA9PT0gdSA/IGwyID0gbjIgOiB1LnNpYmxpbmcgPSBuMiwgdSA9IG4yKTsKICAgICAgICAgICAgSSAmJiB0ZyhlMiwgdyk7CiAgICAgICAgICAgIHJldHVybiBsMjsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobTIgPSBkKGUyLCBtMik7ICFuMi5kb25lOyB3KyssIG4yID0gaDIubmV4dCgpKQogICAgICAgICAgICBuMiA9IHkobTIsIGUyLCB3LCBuMi52YWx1ZSwgazIpLCBudWxsICE9PSBuMiAmJiAoYSAmJiBudWxsICE9PSBuMi5hbHRlcm5hdGUgJiYgbTIuZGVsZXRlKG51bGwgPT09IG4yLmtleSA/IHcgOiBuMi5rZXkpLCBnMiA9IGYobjIsIGcyLCB3KSwgbnVsbCA9PT0gdSA/IGwyID0gbjIgOiB1LnNpYmxpbmcgPSBuMiwgdSA9IG4yKTsKICAgICAgICAgIGEgJiYgbTIuZm9yRWFjaChmdW5jdGlvbihhMikgewogICAgICAgICAgICByZXR1cm4gYihlMiwgYTIpOwogICAgICAgICAgfSk7CiAgICAgICAgICBJICYmIHRnKGUyLCB3KTsKICAgICAgICAgIHJldHVybiBsMjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gSihhMiwgZDIsIGYyLCBoMikgewogICAgICAgICAgIm9iamVjdCIgPT09IHR5cGVvZiBmMiAmJiBudWxsICE9PSBmMiAmJiBmMi50eXBlID09PSB5YSAmJiBudWxsID09PSBmMi5rZXkgJiYgKGYyID0gZjIucHJvcHMuY2hpbGRyZW4pOwogICAgICAgICAgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgZjIgJiYgbnVsbCAhPT0gZjIpIHsKICAgICAgICAgICAgc3dpdGNoIChmMi4kJHR5cGVvZikgewogICAgICAgICAgICAgIGNhc2UgdmE6CiAgICAgICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsyID0gZjIua2V5LCBsMiA9IGQyOyBudWxsICE9PSBsMjsgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGwyLmtleSA9PT0gazIpIHsKICAgICAgICAgICAgICAgICAgICAgIGsyID0gZjIudHlwZTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChrMiA9PT0geWEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDcgPT09IGwyLnRhZykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGMoYTIsIGwyLnNpYmxpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gZShsMiwgZjIucHJvcHMuY2hpbGRyZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGQyLnJldHVybiA9IGEyOwogICAgICAgICAgICAgICAgICAgICAgICAgIGEyID0gZDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsMi5lbGVtZW50VHlwZSA9PT0gazIgfHwgIm9iamVjdCIgPT09IHR5cGVvZiBrMiAmJiBudWxsICE9PSBrMiAmJiBrMi4kJHR5cGVvZiA9PT0gSGEgJiYgTmcoazIpID09PSBsMi50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMoYTIsIGwyLnNpYmxpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGUobDIsIGYyLnByb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZDIucmVmID0gTGcoYTIsIGwyLCBmMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGQyLnJldHVybiA9IGEyOwogICAgICAgICAgICAgICAgICAgICAgICBhMiA9IGQyOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgYyhhMiwgbDIpOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICBiKGEyLCBsMik7CiAgICAgICAgICAgICAgICAgICAgbDIgPSBsMi5zaWJsaW5nOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGYyLnR5cGUgPT09IHlhID8gKGQyID0gVGcoZjIucHJvcHMuY2hpbGRyZW4sIGEyLm1vZGUsIGgyLCBmMi5rZXkpLCBkMi5yZXR1cm4gPSBhMiwgYTIgPSBkMikgOiAoaDIgPSBSZyhmMi50eXBlLCBmMi5rZXksIGYyLnByb3BzLCBudWxsLCBhMi5tb2RlLCBoMiksIGgyLnJlZiA9IExnKGEyLCBkMiwgZjIpLCBoMi5yZXR1cm4gPSBhMiwgYTIgPSBoMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZyhhMik7CiAgICAgICAgICAgICAgY2FzZSB3YToKICAgICAgICAgICAgICAgIGE6IHsKICAgICAgICAgICAgICAgICAgZm9yIChsMiA9IGYyLmtleTsgbnVsbCAhPT0gZDI7ICkgewogICAgICAgICAgICAgICAgICAgIGlmIChkMi5rZXkgPT09IGwyKQogICAgICAgICAgICAgICAgICAgICAgaWYgKDQgPT09IGQyLnRhZyAmJiBkMi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gZjIuY29udGFpbmVySW5mbyAmJiBkMi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gPT09IGYyLmltcGxlbWVudGF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMoYTIsIGQyLnNpYmxpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGUoZDIsIGYyLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgZDIucmV0dXJuID0gYTI7CiAgICAgICAgICAgICAgICAgICAgICAgIGEyID0gZDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjKGEyLCBkMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgIGIoYTIsIGQyKTsKICAgICAgICAgICAgICAgICAgICBkMiA9IGQyLnNpYmxpbmc7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZDIgPSBTZyhmMiwgYTIubW9kZSwgaDIpOwogICAgICAgICAgICAgICAgICBkMi5yZXR1cm4gPSBhMjsKICAgICAgICAgICAgICAgICAgYTIgPSBkMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnKGEyKTsKICAgICAgICAgICAgICBjYXNlIEhhOgogICAgICAgICAgICAgICAgcmV0dXJuIGwyID0gZjIuX2luaXQsIEooYTIsIGQyLCBsMihmMi5fcGF5bG9hZCksIGgyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZWIoZjIpKQogICAgICAgICAgICAgIHJldHVybiBuKGEyLCBkMiwgZjIsIGgyKTsKICAgICAgICAgICAgaWYgKEthKGYyKSkKICAgICAgICAgICAgICByZXR1cm4gdChhMiwgZDIsIGYyLCBoMik7CiAgICAgICAgICAgIE1nKGEyLCBmMik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gInN0cmluZyIgPT09IHR5cGVvZiBmMiAmJiAiIiAhPT0gZjIgfHwgIm51bWJlciIgPT09IHR5cGVvZiBmMiA/IChmMiA9ICIiICsgZjIsIG51bGwgIT09IGQyICYmIDYgPT09IGQyLnRhZyA/IChjKGEyLCBkMi5zaWJsaW5nKSwgZDIgPSBlKGQyLCBmMiksIGQyLnJldHVybiA9IGEyLCBhMiA9IGQyKSA6IChjKGEyLCBkMiksIGQyID0gUWcoZjIsIGEyLm1vZGUsIGgyKSwgZDIucmV0dXJuID0gYTIsIGEyID0gZDIpLCBnKGEyKSkgOiBjKGEyLCBkMik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBKOwogICAgICB9CiAgICAgIHZhciBVZyA9IE9nKHRydWUpOwogICAgICB2YXIgVmcgPSBPZyhmYWxzZSk7CiAgICAgIHZhciBXZyA9IFVmKG51bGwpOwogICAgICB2YXIgWGcgPSBudWxsOwogICAgICB2YXIgWWcgPSBudWxsOwogICAgICB2YXIgWmcgPSBudWxsOwogICAgICBmdW5jdGlvbiAkZygpIHsKICAgICAgICBaZyA9IFlnID0gWGcgPSBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGFoKGEpIHsKICAgICAgICB2YXIgYiA9IFdnLmN1cnJlbnQ7CiAgICAgICAgRShXZyk7CiAgICAgICAgYS5fY3VycmVudFZhbHVlID0gYjsKICAgICAgfQogICAgICBmdW5jdGlvbiBiaChhLCBiLCBjKSB7CiAgICAgICAgZm9yICg7IG51bGwgIT09IGE7ICkgewogICAgICAgICAgdmFyIGQgPSBhLmFsdGVybmF0ZTsKICAgICAgICAgIChhLmNoaWxkTGFuZXMgJiBiKSAhPT0gYiA/IChhLmNoaWxkTGFuZXMgfD0gYiwgbnVsbCAhPT0gZCAmJiAoZC5jaGlsZExhbmVzIHw9IGIpKSA6IG51bGwgIT09IGQgJiYgKGQuY2hpbGRMYW5lcyAmIGIpICE9PSBiICYmIChkLmNoaWxkTGFuZXMgfD0gYik7CiAgICAgICAgICBpZiAoYSA9PT0gYykKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBhID0gYS5yZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGNoKGEsIGIpIHsKICAgICAgICBYZyA9IGE7CiAgICAgICAgWmcgPSBZZyA9IG51bGw7CiAgICAgICAgYSA9IGEuZGVwZW5kZW5jaWVzOwogICAgICAgIG51bGwgIT09IGEgJiYgbnVsbCAhPT0gYS5maXJzdENvbnRleHQgJiYgKDAgIT09IChhLmxhbmVzICYgYikgJiYgKGRoID0gdHJ1ZSksIGEuZmlyc3RDb250ZXh0ID0gbnVsbCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZWgoYSkgewogICAgICAgIHZhciBiID0gYS5fY3VycmVudFZhbHVlOwogICAgICAgIGlmIChaZyAhPT0gYSkKICAgICAgICAgIGlmIChhID0geyBjb250ZXh0OiBhLCBtZW1vaXplZFZhbHVlOiBiLCBuZXh0OiBudWxsIH0sIG51bGwgPT09IFlnKSB7CiAgICAgICAgICAgIGlmIChudWxsID09PSBYZykKICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDMwOCkpOwogICAgICAgICAgICBZZyA9IGE7CiAgICAgICAgICAgIFhnLmRlcGVuZGVuY2llcyA9IHsgbGFuZXM6IDAsIGZpcnN0Q29udGV4dDogYSB9OwogICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIFlnID0gWWcubmV4dCA9IGE7CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgdmFyIGZoID0gbnVsbDsKICAgICAgZnVuY3Rpb24gZ2goYSkgewogICAgICAgIG51bGwgPT09IGZoID8gZmggPSBbYV0gOiBmaC5wdXNoKGEpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGhoKGEsIGIsIGMsIGQpIHsKICAgICAgICB2YXIgZSA9IGIuaW50ZXJsZWF2ZWQ7CiAgICAgICAgbnVsbCA9PT0gZSA/IChjLm5leHQgPSBjLCBnaChiKSkgOiAoYy5uZXh0ID0gZS5uZXh0LCBlLm5leHQgPSBjKTsKICAgICAgICBiLmludGVybGVhdmVkID0gYzsKICAgICAgICByZXR1cm4gaWgoYSwgZCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaWgoYSwgYikgewogICAgICAgIGEubGFuZXMgfD0gYjsKICAgICAgICB2YXIgYyA9IGEuYWx0ZXJuYXRlOwogICAgICAgIG51bGwgIT09IGMgJiYgKGMubGFuZXMgfD0gYik7CiAgICAgICAgYyA9IGE7CiAgICAgICAgZm9yIChhID0gYS5yZXR1cm47IG51bGwgIT09IGE7ICkKICAgICAgICAgIGEuY2hpbGRMYW5lcyB8PSBiLCBjID0gYS5hbHRlcm5hdGUsIG51bGwgIT09IGMgJiYgKGMuY2hpbGRMYW5lcyB8PSBiKSwgYyA9IGEsIGEgPSBhLnJldHVybjsKICAgICAgICByZXR1cm4gMyA9PT0gYy50YWcgPyBjLnN0YXRlTm9kZSA6IG51bGw7CiAgICAgIH0KICAgICAgdmFyIGpoID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIGtoKGEpIHsKICAgICAgICBhLnVwZGF0ZVF1ZXVlID0geyBiYXNlU3RhdGU6IGEubWVtb2l6ZWRTdGF0ZSwgZmlyc3RCYXNlVXBkYXRlOiBudWxsLCBsYXN0QmFzZVVwZGF0ZTogbnVsbCwgc2hhcmVkOiB7IHBlbmRpbmc6IG51bGwsIGludGVybGVhdmVkOiBudWxsLCBsYW5lczogMCB9LCBlZmZlY3RzOiBudWxsIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGgoYSwgYikgewogICAgICAgIGEgPSBhLnVwZGF0ZVF1ZXVlOwogICAgICAgIGIudXBkYXRlUXVldWUgPT09IGEgJiYgKGIudXBkYXRlUXVldWUgPSB7IGJhc2VTdGF0ZTogYS5iYXNlU3RhdGUsIGZpcnN0QmFzZVVwZGF0ZTogYS5maXJzdEJhc2VVcGRhdGUsIGxhc3RCYXNlVXBkYXRlOiBhLmxhc3RCYXNlVXBkYXRlLCBzaGFyZWQ6IGEuc2hhcmVkLCBlZmZlY3RzOiBhLmVmZmVjdHMgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbWgoYSwgYikgewogICAgICAgIHJldHVybiB7IGV2ZW50VGltZTogYSwgbGFuZTogYiwgdGFnOiAwLCBwYXlsb2FkOiBudWxsLCBjYWxsYmFjazogbnVsbCwgbmV4dDogbnVsbCB9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG5oKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IGEudXBkYXRlUXVldWU7CiAgICAgICAgaWYgKG51bGwgPT09IGQpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBkID0gZC5zaGFyZWQ7CiAgICAgICAgaWYgKDAgIT09IChLICYgMikpIHsKICAgICAgICAgIHZhciBlID0gZC5wZW5kaW5nOwogICAgICAgICAgbnVsbCA9PT0gZSA/IGIubmV4dCA9IGIgOiAoYi5uZXh0ID0gZS5uZXh0LCBlLm5leHQgPSBiKTsKICAgICAgICAgIGQucGVuZGluZyA9IGI7CiAgICAgICAgICByZXR1cm4gaWgoYSwgYyk7CiAgICAgICAgfQogICAgICAgIGUgPSBkLmludGVybGVhdmVkOwogICAgICAgIG51bGwgPT09IGUgPyAoYi5uZXh0ID0gYiwgZ2goZCkpIDogKGIubmV4dCA9IGUubmV4dCwgZS5uZXh0ID0gYik7CiAgICAgICAgZC5pbnRlcmxlYXZlZCA9IGI7CiAgICAgICAgcmV0dXJuIGloKGEsIGMpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG9oKGEsIGIsIGMpIHsKICAgICAgICBiID0gYi51cGRhdGVRdWV1ZTsKICAgICAgICBpZiAobnVsbCAhPT0gYiAmJiAoYiA9IGIuc2hhcmVkLCAwICE9PSAoYyAmIDQxOTQyNDApKSkgewogICAgICAgICAgdmFyIGQgPSBiLmxhbmVzOwogICAgICAgICAgZCAmPSBhLnBlbmRpbmdMYW5lczsKICAgICAgICAgIGMgfD0gZDsKICAgICAgICAgIGIubGFuZXMgPSBjOwogICAgICAgICAgQ2MoYSwgYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBoKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGEudXBkYXRlUXVldWUsIGQgPSBhLmFsdGVybmF0ZTsKICAgICAgICBpZiAobnVsbCAhPT0gZCAmJiAoZCA9IGQudXBkYXRlUXVldWUsIGMgPT09IGQpKSB7CiAgICAgICAgICB2YXIgZSA9IG51bGwsIGYgPSBudWxsOwogICAgICAgICAgYyA9IGMuZmlyc3RCYXNlVXBkYXRlOwogICAgICAgICAgaWYgKG51bGwgIT09IGMpIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIHZhciBnID0geyBldmVudFRpbWU6IGMuZXZlbnRUaW1lLCBsYW5lOiBjLmxhbmUsIHRhZzogYy50YWcsIHBheWxvYWQ6IGMucGF5bG9hZCwgY2FsbGJhY2s6IGMuY2FsbGJhY2ssIG5leHQ6IG51bGwgfTsKICAgICAgICAgICAgICBudWxsID09PSBmID8gZSA9IGYgPSBnIDogZiA9IGYubmV4dCA9IGc7CiAgICAgICAgICAgICAgYyA9IGMubmV4dDsKICAgICAgICAgICAgfSB3aGlsZSAobnVsbCAhPT0gYyk7CiAgICAgICAgICAgIG51bGwgPT09IGYgPyBlID0gZiA9IGIgOiBmID0gZi5uZXh0ID0gYjsKICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICBlID0gZiA9IGI7CiAgICAgICAgICBjID0geyBiYXNlU3RhdGU6IGQuYmFzZVN0YXRlLCBmaXJzdEJhc2VVcGRhdGU6IGUsIGxhc3RCYXNlVXBkYXRlOiBmLCBzaGFyZWQ6IGQuc2hhcmVkLCBlZmZlY3RzOiBkLmVmZmVjdHMgfTsKICAgICAgICAgIGEudXBkYXRlUXVldWUgPSBjOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhID0gYy5sYXN0QmFzZVVwZGF0ZTsKICAgICAgICBudWxsID09PSBhID8gYy5maXJzdEJhc2VVcGRhdGUgPSBiIDogYS5uZXh0ID0gYjsKICAgICAgICBjLmxhc3RCYXNlVXBkYXRlID0gYjsKICAgICAgfQogICAgICBmdW5jdGlvbiBxaChhLCBiLCBjLCBkKSB7CiAgICAgICAgdmFyIGUgPSBhLnVwZGF0ZVF1ZXVlOwogICAgICAgIGpoID0gZmFsc2U7CiAgICAgICAgdmFyIGYgPSBlLmZpcnN0QmFzZVVwZGF0ZSwgZyA9IGUubGFzdEJhc2VVcGRhdGUsIGggPSBlLnNoYXJlZC5wZW5kaW5nOwogICAgICAgIGlmIChudWxsICE9PSBoKSB7CiAgICAgICAgICBlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHZhciBrID0gaCwgbCA9IGsubmV4dDsKICAgICAgICAgIGsubmV4dCA9IG51bGw7CiAgICAgICAgICBudWxsID09PSBnID8gZiA9IGwgOiBnLm5leHQgPSBsOwogICAgICAgICAgZyA9IGs7CiAgICAgICAgICB2YXIgbSA9IGEuYWx0ZXJuYXRlOwogICAgICAgICAgbnVsbCAhPT0gbSAmJiAobSA9IG0udXBkYXRlUXVldWUsIGggPSBtLmxhc3RCYXNlVXBkYXRlLCBoICE9PSBnICYmIChudWxsID09PSBoID8gbS5maXJzdEJhc2VVcGRhdGUgPSBsIDogaC5uZXh0ID0gbCwgbS5sYXN0QmFzZVVwZGF0ZSA9IGspKTsKICAgICAgICB9CiAgICAgICAgaWYgKG51bGwgIT09IGYpIHsKICAgICAgICAgIHZhciBxID0gZS5iYXNlU3RhdGU7CiAgICAgICAgICBnID0gMDsKICAgICAgICAgIG0gPSBsID0gayA9IG51bGw7CiAgICAgICAgICBoID0gZjsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgdmFyIHIgPSBoLmxhbmUsIHkgPSBoLmV2ZW50VGltZTsKICAgICAgICAgICAgaWYgKChkICYgcikgPT09IHIpIHsKICAgICAgICAgICAgICBudWxsICE9PSBtICYmIChtID0gbS5uZXh0ID0gewogICAgICAgICAgICAgICAgZXZlbnRUaW1lOiB5LAogICAgICAgICAgICAgICAgbGFuZTogMCwKICAgICAgICAgICAgICAgIHRhZzogaC50YWcsCiAgICAgICAgICAgICAgICBwYXlsb2FkOiBoLnBheWxvYWQsCiAgICAgICAgICAgICAgICBjYWxsYmFjazogaC5jYWxsYmFjaywKICAgICAgICAgICAgICAgIG5leHQ6IG51bGwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IGEsIHQgPSBoOwogICAgICAgICAgICAgICAgciA9IGI7CiAgICAgICAgICAgICAgICB5ID0gYzsKICAgICAgICAgICAgICAgIHN3aXRjaCAodC50YWcpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIG4gPSB0LnBheWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICBxID0gbi5jYWxsKHksIHEsIHIpOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcSA9IG47CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIG4uZmxhZ3MgPSBuLmZsYWdzICYgLTY1NTM3IHwgMTI4OwogICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgbiA9IHQucGF5bG9hZDsKICAgICAgICAgICAgICAgICAgICByID0gImZ1bmN0aW9uIiA9PT0gdHlwZW9mIG4gPyBuLmNhbGwoeSwgcSwgcikgOiBuOwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSByIHx8IHZvaWQgMCA9PT0gcikKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgICAgcSA9IEEoe30sIHEsIHIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBqaCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG51bGwgIT09IGguY2FsbGJhY2sgJiYgMCAhPT0gaC5sYW5lICYmIChhLmZsYWdzIHw9IDY0LCByID0gZS5lZmZlY3RzLCBudWxsID09PSByID8gZS5lZmZlY3RzID0gW2hdIDogci5wdXNoKGgpKTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgeSA9IHsgZXZlbnRUaW1lOiB5LCBsYW5lOiByLCB0YWc6IGgudGFnLCBwYXlsb2FkOiBoLnBheWxvYWQsIGNhbGxiYWNrOiBoLmNhbGxiYWNrLCBuZXh0OiBudWxsIH0sIG51bGwgPT09IG0gPyAobCA9IG0gPSB5LCBrID0gcSkgOiBtID0gbS5uZXh0ID0geSwgZyB8PSByOwogICAgICAgICAgICBoID0gaC5uZXh0OwogICAgICAgICAgICBpZiAobnVsbCA9PT0gaCkKICAgICAgICAgICAgICBpZiAoaCA9IGUuc2hhcmVkLnBlbmRpbmcsIG51bGwgPT09IGgpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByID0gaCwgaCA9IHIubmV4dCwgci5uZXh0ID0gbnVsbCwgZS5sYXN0QmFzZVVwZGF0ZSA9IHIsIGUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOwogICAgICAgICAgfSB3aGlsZSAoMSk7CiAgICAgICAgICBudWxsID09PSBtICYmIChrID0gcSk7CiAgICAgICAgICBlLmJhc2VTdGF0ZSA9IGs7CiAgICAgICAgICBlLmZpcnN0QmFzZVVwZGF0ZSA9IGw7CiAgICAgICAgICBlLmxhc3RCYXNlVXBkYXRlID0gbTsKICAgICAgICAgIGIgPSBlLnNoYXJlZC5pbnRlcmxlYXZlZDsKICAgICAgICAgIGlmIChudWxsICE9PSBiKSB7CiAgICAgICAgICAgIGUgPSBiOwogICAgICAgICAgICBkbwogICAgICAgICAgICAgIGcgfD0gZS5sYW5lLCBlID0gZS5uZXh0OwogICAgICAgICAgICB3aGlsZSAoZSAhPT0gYik7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgbnVsbCA9PT0gZiAmJiAoZS5zaGFyZWQubGFuZXMgPSAwKTsKICAgICAgICAgIHJoIHw9IGc7CiAgICAgICAgICBhLmxhbmVzID0gZzsKICAgICAgICAgIGEubWVtb2l6ZWRTdGF0ZSA9IHE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHNoKGEsIGIsIGMpIHsKICAgICAgICBhID0gYi5lZmZlY3RzOwogICAgICAgIGIuZWZmZWN0cyA9IG51bGw7CiAgICAgICAgaWYgKG51bGwgIT09IGEpCiAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgYS5sZW5ndGg7IGIrKykgewogICAgICAgICAgICB2YXIgZCA9IGFbYl0sIGUgPSBkLmNhbGxiYWNrOwogICAgICAgICAgICBpZiAobnVsbCAhPT0gZSkgewogICAgICAgICAgICAgIGQuY2FsbGJhY2sgPSBudWxsOwogICAgICAgICAgICAgIGQgPSBjOwogICAgICAgICAgICAgIGlmICgiZnVuY3Rpb24iICE9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMTkxLCBlKSk7CiAgICAgICAgICAgICAgZS5jYWxsKGQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHRoID0ge307CiAgICAgIHZhciB1aCA9IFVmKHRoKTsKICAgICAgdmFyIHZoID0gVWYodGgpOwogICAgICB2YXIgd2ggPSBVZih0aCk7CiAgICAgIGZ1bmN0aW9uIHhoKGEpIHsKICAgICAgICBpZiAoYSA9PT0gdGgpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDE3NCkpOwogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHloKGEsIGIpIHsKICAgICAgICBHKHdoLCBiKTsKICAgICAgICBHKHZoLCBhKTsKICAgICAgICBHKHVoLCB0aCk7CiAgICAgICAgYSA9IGIubm9kZVR5cGU7CiAgICAgICAgc3dpdGNoIChhKSB7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICBiID0gKGIgPSBiLmRvY3VtZW50RWxlbWVudCkgPyBiLm5hbWVzcGFjZVVSSSA6IGxiKG51bGwsICIiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBhID0gOCA9PT0gYSA/IGIucGFyZW50Tm9kZSA6IGIsIGIgPSBhLm5hbWVzcGFjZVVSSSB8fCBudWxsLCBhID0gYS50YWdOYW1lLCBiID0gbGIoYiwgYSk7CiAgICAgICAgfQogICAgICAgIEUodWgpOwogICAgICAgIEcodWgsIGIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHpoKCkgewogICAgICAgIEUodWgpOwogICAgICAgIEUodmgpOwogICAgICAgIEUod2gpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEFoKGEpIHsKICAgICAgICB4aCh3aC5jdXJyZW50KTsKICAgICAgICB2YXIgYiA9IHhoKHVoLmN1cnJlbnQpOwogICAgICAgIHZhciBjID0gbGIoYiwgYS50eXBlKTsKICAgICAgICBiICE9PSBjICYmIChHKHZoLCBhKSwgRyh1aCwgYykpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEJoKGEpIHsKICAgICAgICB2aC5jdXJyZW50ID09PSBhICYmIChFKHVoKSwgRSh2aCkpOwogICAgICB9CiAgICAgIHZhciBMID0gVWYoMCk7CiAgICAgIGZ1bmN0aW9uIENoKGEpIHsKICAgICAgICBmb3IgKHZhciBiID0gYTsgbnVsbCAhPT0gYjsgKSB7CiAgICAgICAgICBpZiAoMTMgPT09IGIudGFnKSB7CiAgICAgICAgICAgIHZhciBjID0gYi5tZW1vaXplZFN0YXRlOwogICAgICAgICAgICBpZiAobnVsbCAhPT0gYyAmJiAoYyA9IGMuZGVoeWRyYXRlZCwgbnVsbCA9PT0gYyB8fCAiJD8iID09PSBjLmRhdGEgfHwgIiQhIiA9PT0gYy5kYXRhKSkKICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgIH0gZWxzZSBpZiAoMTkgPT09IGIudGFnICYmIHZvaWQgMCAhPT0gYi5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyKSB7CiAgICAgICAgICAgIGlmICgwICE9PSAoYi5mbGFncyAmIDEyOCkpCiAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICB9IGVsc2UgaWYgKG51bGwgIT09IGIuY2hpbGQpIHsKICAgICAgICAgICAgYi5jaGlsZC5yZXR1cm4gPSBiOwogICAgICAgICAgICBiID0gYi5jaGlsZDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYiA9PT0gYSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBmb3IgKDsgbnVsbCA9PT0gYi5zaWJsaW5nOyApIHsKICAgICAgICAgICAgaWYgKG51bGwgPT09IGIucmV0dXJuIHx8IGIucmV0dXJuID09PSBhKQogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICBiID0gYi5yZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBiLnNpYmxpbmcucmV0dXJuID0gYi5yZXR1cm47CiAgICAgICAgICBiID0gYi5zaWJsaW5nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB2YXIgRGggPSBbXTsKICAgICAgZnVuY3Rpb24gRWgoKSB7CiAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBEaC5sZW5ndGg7IGErKykKICAgICAgICAgIERoW2FdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDsKICAgICAgICBEaC5sZW5ndGggPSAwOwogICAgICB9CiAgICAgIHZhciBGaCA9IHVhLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7CiAgICAgIHZhciBHaCA9IHVhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOwogICAgICB2YXIgSGggPSAwOwogICAgICB2YXIgTSA9IG51bGw7CiAgICAgIHZhciBOID0gbnVsbDsKICAgICAgdmFyIE8gPSBudWxsOwogICAgICB2YXIgSWggPSBmYWxzZTsKICAgICAgdmFyIEpoID0gZmFsc2U7CiAgICAgIHZhciBLaCA9IDA7CiAgICAgIHZhciBMaCA9IDA7CiAgICAgIGZ1bmN0aW9uIFAoKSB7CiAgICAgICAgdGhyb3cgRXJyb3IocCgzMjEpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBNaChhLCBiKSB7CiAgICAgICAgaWYgKG51bGwgPT09IGIpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBiLmxlbmd0aCAmJiBjIDwgYS5sZW5ndGg7IGMrKykKICAgICAgICAgIGlmICghSGUoYVtjXSwgYltjXSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBOaChhLCBiLCBjLCBkLCBlLCBmKSB7CiAgICAgICAgSGggPSBmOwogICAgICAgIE0gPSBiOwogICAgICAgIGIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7CiAgICAgICAgYi51cGRhdGVRdWV1ZSA9IG51bGw7CiAgICAgICAgYi5sYW5lcyA9IDA7CiAgICAgICAgRmguY3VycmVudCA9IG51bGwgPT09IGEgfHwgbnVsbCA9PT0gYS5tZW1vaXplZFN0YXRlID8gT2ggOiBQaDsKICAgICAgICBhID0gYyhkLCBlKTsKICAgICAgICBpZiAoSmgpIHsKICAgICAgICAgIGYgPSAwOwogICAgICAgICAgZG8gewogICAgICAgICAgICBKaCA9IGZhbHNlOwogICAgICAgICAgICBLaCA9IDA7CiAgICAgICAgICAgIGlmICgyNSA8PSBmKQogICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzAxKSk7CiAgICAgICAgICAgIGYgKz0gMTsKICAgICAgICAgICAgTyA9IE4gPSBudWxsOwogICAgICAgICAgICBiLnVwZGF0ZVF1ZXVlID0gbnVsbDsKICAgICAgICAgICAgRmguY3VycmVudCA9IFFoOwogICAgICAgICAgICBhID0gYyhkLCBlKTsKICAgICAgICAgIH0gd2hpbGUgKEpoKTsKICAgICAgICB9CiAgICAgICAgRmguY3VycmVudCA9IFJoOwogICAgICAgIGIgPSBudWxsICE9PSBOICYmIG51bGwgIT09IE4ubmV4dDsKICAgICAgICBIaCA9IDA7CiAgICAgICAgTyA9IE4gPSBNID0gbnVsbDsKICAgICAgICBJaCA9IGZhbHNlOwogICAgICAgIGlmIChiKQogICAgICAgICAgdGhyb3cgRXJyb3IocCgzMDApKTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBTaCgpIHsKICAgICAgICB2YXIgYSA9IDAgIT09IEtoOwogICAgICAgIEtoID0gMDsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBUaCgpIHsKICAgICAgICB2YXIgYSA9IHsgbWVtb2l6ZWRTdGF0ZTogbnVsbCwgYmFzZVN0YXRlOiBudWxsLCBiYXNlUXVldWU6IG51bGwsIHF1ZXVlOiBudWxsLCBuZXh0OiBudWxsIH07CiAgICAgICAgbnVsbCA9PT0gTyA/IE0ubWVtb2l6ZWRTdGF0ZSA9IE8gPSBhIDogTyA9IE8ubmV4dCA9IGE7CiAgICAgICAgcmV0dXJuIE87CiAgICAgIH0KICAgICAgZnVuY3Rpb24gVWgoKSB7CiAgICAgICAgaWYgKG51bGwgPT09IE4pIHsKICAgICAgICAgIHZhciBhID0gTS5hbHRlcm5hdGU7CiAgICAgICAgICBhID0gbnVsbCAhPT0gYSA/IGEubWVtb2l6ZWRTdGF0ZSA6IG51bGw7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBhID0gTi5uZXh0OwogICAgICAgIHZhciBiID0gbnVsbCA9PT0gTyA/IE0ubWVtb2l6ZWRTdGF0ZSA6IE8ubmV4dDsKICAgICAgICBpZiAobnVsbCAhPT0gYikKICAgICAgICAgIE8gPSBiLCBOID0gYTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChudWxsID09PSBhKQogICAgICAgICAgICB0aHJvdyBFcnJvcihwKDMxMCkpOwogICAgICAgICAgTiA9IGE7CiAgICAgICAgICBhID0geyBtZW1vaXplZFN0YXRlOiBOLm1lbW9pemVkU3RhdGUsIGJhc2VTdGF0ZTogTi5iYXNlU3RhdGUsIGJhc2VRdWV1ZTogTi5iYXNlUXVldWUsIHF1ZXVlOiBOLnF1ZXVlLCBuZXh0OiBudWxsIH07CiAgICAgICAgICBudWxsID09PSBPID8gTS5tZW1vaXplZFN0YXRlID0gTyA9IGEgOiBPID0gTy5uZXh0ID0gYTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE87CiAgICAgIH0KICAgICAgZnVuY3Rpb24gVmgoYSwgYikgewogICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09PSB0eXBlb2YgYiA/IGIoYSkgOiBiOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFdoKGEpIHsKICAgICAgICB2YXIgYiA9IFVoKCksIGMgPSBiLnF1ZXVlOwogICAgICAgIGlmIChudWxsID09PSBjKQogICAgICAgICAgdGhyb3cgRXJyb3IocCgzMTEpKTsKICAgICAgICBjLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSBhOwogICAgICAgIHZhciBkID0gTiwgZSA9IGQuYmFzZVF1ZXVlLCBmID0gYy5wZW5kaW5nOwogICAgICAgIGlmIChudWxsICE9PSBmKSB7CiAgICAgICAgICBpZiAobnVsbCAhPT0gZSkgewogICAgICAgICAgICB2YXIgZyA9IGUubmV4dDsKICAgICAgICAgICAgZS5uZXh0ID0gZi5uZXh0OwogICAgICAgICAgICBmLm5leHQgPSBnOwogICAgICAgICAgfQogICAgICAgICAgZC5iYXNlUXVldWUgPSBlID0gZjsKICAgICAgICAgIGMucGVuZGluZyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChudWxsICE9PSBlKSB7CiAgICAgICAgICBmID0gZS5uZXh0OwogICAgICAgICAgZCA9IGQuYmFzZVN0YXRlOwogICAgICAgICAgdmFyIGggPSBnID0gbnVsbCwgayA9IG51bGwsIGwgPSBmOwogICAgICAgICAgZG8gewogICAgICAgICAgICB2YXIgbSA9IGwubGFuZTsKICAgICAgICAgICAgaWYgKChIaCAmIG0pID09PSBtKQogICAgICAgICAgICAgIG51bGwgIT09IGsgJiYgKGsgPSBrLm5leHQgPSB7IGxhbmU6IDAsIGFjdGlvbjogbC5hY3Rpb24sIGhhc0VhZ2VyU3RhdGU6IGwuaGFzRWFnZXJTdGF0ZSwgZWFnZXJTdGF0ZTogbC5lYWdlclN0YXRlLCBuZXh0OiBudWxsIH0pLCBkID0gbC5oYXNFYWdlclN0YXRlID8gbC5lYWdlclN0YXRlIDogYShkLCBsLmFjdGlvbik7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgbGFuZTogbSwKICAgICAgICAgICAgICAgIGFjdGlvbjogbC5hY3Rpb24sCiAgICAgICAgICAgICAgICBoYXNFYWdlclN0YXRlOiBsLmhhc0VhZ2VyU3RhdGUsCiAgICAgICAgICAgICAgICBlYWdlclN0YXRlOiBsLmVhZ2VyU3RhdGUsCiAgICAgICAgICAgICAgICBuZXh0OiBudWxsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBudWxsID09PSBrID8gKGggPSBrID0gcSwgZyA9IGQpIDogayA9IGsubmV4dCA9IHE7CiAgICAgICAgICAgICAgTS5sYW5lcyB8PSBtOwogICAgICAgICAgICAgIHJoIHw9IG07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbCA9IGwubmV4dDsKICAgICAgICAgIH0gd2hpbGUgKG51bGwgIT09IGwgJiYgbCAhPT0gZik7CiAgICAgICAgICBudWxsID09PSBrID8gZyA9IGQgOiBrLm5leHQgPSBoOwogICAgICAgICAgSGUoZCwgYi5tZW1vaXplZFN0YXRlKSB8fCAoZGggPSB0cnVlKTsKICAgICAgICAgIGIubWVtb2l6ZWRTdGF0ZSA9IGQ7CiAgICAgICAgICBiLmJhc2VTdGF0ZSA9IGc7CiAgICAgICAgICBiLmJhc2VRdWV1ZSA9IGs7CiAgICAgICAgICBjLmxhc3RSZW5kZXJlZFN0YXRlID0gZDsKICAgICAgICB9CiAgICAgICAgYSA9IGMuaW50ZXJsZWF2ZWQ7CiAgICAgICAgaWYgKG51bGwgIT09IGEpIHsKICAgICAgICAgIGUgPSBhOwogICAgICAgICAgZG8KICAgICAgICAgICAgZiA9IGUubGFuZSwgTS5sYW5lcyB8PSBmLCByaCB8PSBmLCBlID0gZS5uZXh0OwogICAgICAgICAgd2hpbGUgKGUgIT09IGEpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgbnVsbCA9PT0gZSAmJiAoYy5sYW5lcyA9IDApOwogICAgICAgIHJldHVybiBbYi5tZW1vaXplZFN0YXRlLCBjLmRpc3BhdGNoXTsKICAgICAgfQogICAgICBmdW5jdGlvbiBYaChhKSB7CiAgICAgICAgdmFyIGIgPSBVaCgpLCBjID0gYi5xdWV1ZTsKICAgICAgICBpZiAobnVsbCA9PT0gYykKICAgICAgICAgIHRocm93IEVycm9yKHAoMzExKSk7CiAgICAgICAgYy5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gYTsKICAgICAgICB2YXIgZCA9IGMuZGlzcGF0Y2gsIGUgPSBjLnBlbmRpbmcsIGYgPSBiLm1lbW9pemVkU3RhdGU7CiAgICAgICAgaWYgKG51bGwgIT09IGUpIHsKICAgICAgICAgIGMucGVuZGluZyA9IG51bGw7CiAgICAgICAgICB2YXIgZyA9IGUgPSBlLm5leHQ7CiAgICAgICAgICBkbwogICAgICAgICAgICBmID0gYShmLCBnLmFjdGlvbiksIGcgPSBnLm5leHQ7CiAgICAgICAgICB3aGlsZSAoZyAhPT0gZSk7CiAgICAgICAgICBIZShmLCBiLm1lbW9pemVkU3RhdGUpIHx8IChkaCA9IHRydWUpOwogICAgICAgICAgYi5tZW1vaXplZFN0YXRlID0gZjsKICAgICAgICAgIG51bGwgPT09IGIuYmFzZVF1ZXVlICYmIChiLmJhc2VTdGF0ZSA9IGYpOwogICAgICAgICAgYy5sYXN0UmVuZGVyZWRTdGF0ZSA9IGY7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbZiwgZF07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gWWgoKSB7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gWmgoYSwgYikgewogICAgICAgIHZhciBjID0gTSwgZCA9IFVoKCksIGUgPSBiKCksIGYgPSAhSGUoZC5tZW1vaXplZFN0YXRlLCBlKTsKICAgICAgICBmICYmIChkLm1lbW9pemVkU3RhdGUgPSBlLCBkaCA9IHRydWUpOwogICAgICAgIGQgPSBkLnF1ZXVlOwogICAgICAgICRoKGFpLmJpbmQobnVsbCwgYywgZCwgYSksIFthXSk7CiAgICAgICAgaWYgKGQuZ2V0U25hcHNob3QgIT09IGIgfHwgZiB8fCBudWxsICE9PSBPICYmIE8ubWVtb2l6ZWRTdGF0ZS50YWcgJiAxKSB7CiAgICAgICAgICBjLmZsYWdzIHw9IDIwNDg7CiAgICAgICAgICBiaSg5LCBjaS5iaW5kKG51bGwsIGMsIGQsIGUsIGIpLCB2b2lkIDAsIG51bGwpOwogICAgICAgICAgaWYgKG51bGwgPT09IFEpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzQ5KSk7CiAgICAgICAgICAwICE9PSAoSGggJiAzMCkgfHwgZGkoYywgYiwgZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRpKGEsIGIsIGMpIHsKICAgICAgICBhLmZsYWdzIHw9IDE2Mzg0OwogICAgICAgIGEgPSB7IGdldFNuYXBzaG90OiBiLCB2YWx1ZTogYyB9OwogICAgICAgIGIgPSBNLnVwZGF0ZVF1ZXVlOwogICAgICAgIG51bGwgPT09IGIgPyAoYiA9IHsgbGFzdEVmZmVjdDogbnVsbCwgc3RvcmVzOiBudWxsIH0sIE0udXBkYXRlUXVldWUgPSBiLCBiLnN0b3JlcyA9IFthXSkgOiAoYyA9IGIuc3RvcmVzLCBudWxsID09PSBjID8gYi5zdG9yZXMgPSBbYV0gOiBjLnB1c2goYSkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGNpKGEsIGIsIGMsIGQpIHsKICAgICAgICBiLnZhbHVlID0gYzsKICAgICAgICBiLmdldFNuYXBzaG90ID0gZDsKICAgICAgICBlaShiKSAmJiBmaShhKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBhaShhLCBiLCBjKSB7CiAgICAgICAgcmV0dXJuIGMoZnVuY3Rpb24oKSB7CiAgICAgICAgICBlaShiKSAmJiBmaShhKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBmdW5jdGlvbiBlaShhKSB7CiAgICAgICAgdmFyIGIgPSBhLmdldFNuYXBzaG90OwogICAgICAgIGEgPSBhLnZhbHVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICB2YXIgYyA9IGIoKTsKICAgICAgICAgIHJldHVybiAhSGUoYSwgYyk7CiAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGZpKGEpIHsKICAgICAgICB2YXIgYiA9IGloKGEsIDEpOwogICAgICAgIG51bGwgIT09IGIgJiYgZ2koYiwgYSwgMSwgLTEpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGhpKGEpIHsKICAgICAgICB2YXIgYiA9IFRoKCk7CiAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGEgJiYgKGEgPSBhKCkpOwogICAgICAgIGIubWVtb2l6ZWRTdGF0ZSA9IGIuYmFzZVN0YXRlID0gYTsKICAgICAgICBhID0geyBwZW5kaW5nOiBudWxsLCBpbnRlcmxlYXZlZDogbnVsbCwgbGFuZXM6IDAsIGRpc3BhdGNoOiBudWxsLCBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBWaCwgbGFzdFJlbmRlcmVkU3RhdGU6IGEgfTsKICAgICAgICBiLnF1ZXVlID0gYTsKICAgICAgICBhID0gYS5kaXNwYXRjaCA9IGlpLmJpbmQobnVsbCwgTSwgYSk7CiAgICAgICAgcmV0dXJuIFtiLm1lbW9pemVkU3RhdGUsIGFdOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGJpKGEsIGIsIGMsIGQpIHsKICAgICAgICBhID0geyB0YWc6IGEsIGNyZWF0ZTogYiwgZGVzdHJveTogYywgZGVwczogZCwgbmV4dDogbnVsbCB9OwogICAgICAgIGIgPSBNLnVwZGF0ZVF1ZXVlOwogICAgICAgIG51bGwgPT09IGIgPyAoYiA9IHsgbGFzdEVmZmVjdDogbnVsbCwgc3RvcmVzOiBudWxsIH0sIE0udXBkYXRlUXVldWUgPSBiLCBiLmxhc3RFZmZlY3QgPSBhLm5leHQgPSBhKSA6IChjID0gYi5sYXN0RWZmZWN0LCBudWxsID09PSBjID8gYi5sYXN0RWZmZWN0ID0gYS5uZXh0ID0gYSA6IChkID0gYy5uZXh0LCBjLm5leHQgPSBhLCBhLm5leHQgPSBkLCBiLmxhc3RFZmZlY3QgPSBhKSk7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gamkoKSB7CiAgICAgICAgcmV0dXJuIFVoKCkubWVtb2l6ZWRTdGF0ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBraShhLCBiLCBjLCBkKSB7CiAgICAgICAgdmFyIGUgPSBUaCgpOwogICAgICAgIE0uZmxhZ3MgfD0gYTsKICAgICAgICBlLm1lbW9pemVkU3RhdGUgPSBiaSgxIHwgYiwgYywgdm9pZCAwLCB2b2lkIDAgPT09IGQgPyBudWxsIDogZCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbGkoYSwgYiwgYywgZCkgewogICAgICAgIHZhciBlID0gVWgoKTsKICAgICAgICBkID0gdm9pZCAwID09PSBkID8gbnVsbCA6IGQ7CiAgICAgICAgdmFyIGYgPSB2b2lkIDA7CiAgICAgICAgaWYgKG51bGwgIT09IE4pIHsKICAgICAgICAgIHZhciBnID0gTi5tZW1vaXplZFN0YXRlOwogICAgICAgICAgZiA9IGcuZGVzdHJveTsKICAgICAgICAgIGlmIChudWxsICE9PSBkICYmIE1oKGQsIGcuZGVwcykpIHsKICAgICAgICAgICAgZS5tZW1vaXplZFN0YXRlID0gYmkoYiwgYywgZiwgZCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgTS5mbGFncyB8PSBhOwogICAgICAgIGUubWVtb2l6ZWRTdGF0ZSA9IGJpKDEgfCBiLCBjLCBmLCBkKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBtaShhLCBiKSB7CiAgICAgICAgcmV0dXJuIGtpKDgzOTA2NTYsIDgsIGEsIGIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uICRoKGEsIGIpIHsKICAgICAgICByZXR1cm4gbGkoMjA0OCwgOCwgYSwgYik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbmkoYSwgYikgewogICAgICAgIHJldHVybiBsaSg0LCAyLCBhLCBiKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBvaShhLCBiKSB7CiAgICAgICAgcmV0dXJuIGxpKDQsIDQsIGEsIGIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBpKGEsIGIpIHsKICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGIpCiAgICAgICAgICByZXR1cm4gYSA9IGEoKSwgYihhKSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGIobnVsbCk7CiAgICAgICAgICB9OwogICAgICAgIGlmIChudWxsICE9PSBiICYmIHZvaWQgMCAhPT0gYikKICAgICAgICAgIHJldHVybiBhID0gYSgpLCBiLmN1cnJlbnQgPSBhLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYi5jdXJyZW50ID0gbnVsbDsKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcWkoYSwgYiwgYykgewogICAgICAgIGMgPSBudWxsICE9PSBjICYmIHZvaWQgMCAhPT0gYyA/IGMuY29uY2F0KFthXSkgOiBudWxsOwogICAgICAgIHJldHVybiBsaSg0LCA0LCBwaS5iaW5kKG51bGwsIGIsIGEpLCBjKTsKICAgICAgfQogICAgICBmdW5jdGlvbiByaSgpIHsKICAgICAgfQogICAgICBmdW5jdGlvbiBzaShhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBVaCgpOwogICAgICAgIGIgPSB2b2lkIDAgPT09IGIgPyBudWxsIDogYjsKICAgICAgICB2YXIgZCA9IGMubWVtb2l6ZWRTdGF0ZTsKICAgICAgICBpZiAobnVsbCAhPT0gZCAmJiBudWxsICE9PSBiICYmIE1oKGIsIGRbMV0pKQogICAgICAgICAgcmV0dXJuIGRbMF07CiAgICAgICAgYy5tZW1vaXplZFN0YXRlID0gW2EsIGJdOwogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHRpKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IFVoKCk7CiAgICAgICAgYiA9IHZvaWQgMCA9PT0gYiA/IG51bGwgOiBiOwogICAgICAgIHZhciBkID0gYy5tZW1vaXplZFN0YXRlOwogICAgICAgIGlmIChudWxsICE9PSBkICYmIG51bGwgIT09IGIgJiYgTWgoYiwgZFsxXSkpCiAgICAgICAgICByZXR1cm4gZFswXTsKICAgICAgICBhID0gYSgpOwogICAgICAgIGMubWVtb2l6ZWRTdGF0ZSA9IFthLCBiXTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiB1aShhLCBiLCBjKSB7CiAgICAgICAgaWYgKDAgPT09IChIaCAmIDIxKSkKICAgICAgICAgIHJldHVybiBhLmJhc2VTdGF0ZSAmJiAoYS5iYXNlU3RhdGUgPSBmYWxzZSwgZGggPSB0cnVlKSwgYS5tZW1vaXplZFN0YXRlID0gYzsKICAgICAgICBIZShjLCBiKSB8fCAoYyA9IHljKCksIE0ubGFuZXMgfD0gYywgcmggfD0gYywgYS5iYXNlU3RhdGUgPSB0cnVlKTsKICAgICAgICByZXR1cm4gYjsKICAgICAgfQogICAgICBmdW5jdGlvbiB2aShhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBDOwogICAgICAgIEMgPSAwICE9PSBjICYmIDQgPiBjID8gYyA6IDQ7CiAgICAgICAgYSh0cnVlKTsKICAgICAgICB2YXIgZCA9IEdoLnRyYW5zaXRpb247CiAgICAgICAgR2gudHJhbnNpdGlvbiA9IHt9OwogICAgICAgIHRyeSB7CiAgICAgICAgICBhKGZhbHNlKSwgYigpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBDID0gYywgR2gudHJhbnNpdGlvbiA9IGQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHdpKCkgewogICAgICAgIHJldHVybiBVaCgpLm1lbW9pemVkU3RhdGU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24geGkoYSwgYiwgYykgewogICAgICAgIHZhciBkID0geWkoYSk7CiAgICAgICAgYyA9IHsgbGFuZTogZCwgYWN0aW9uOiBjLCBoYXNFYWdlclN0YXRlOiBmYWxzZSwgZWFnZXJTdGF0ZTogbnVsbCwgbmV4dDogbnVsbCB9OwogICAgICAgIGlmICh6aShhKSkKICAgICAgICAgIEFpKGIsIGMpOwogICAgICAgIGVsc2UgaWYgKGMgPSBoaChhLCBiLCBjLCBkKSwgbnVsbCAhPT0gYykgewogICAgICAgICAgdmFyIGUgPSBSKCk7CiAgICAgICAgICBnaShjLCBhLCBkLCBlKTsKICAgICAgICAgIEJpKGMsIGIsIGQpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBpaShhLCBiLCBjKSB7CiAgICAgICAgdmFyIGQgPSB5aShhKSwgZSA9IHsgbGFuZTogZCwgYWN0aW9uOiBjLCBoYXNFYWdlclN0YXRlOiBmYWxzZSwgZWFnZXJTdGF0ZTogbnVsbCwgbmV4dDogbnVsbCB9OwogICAgICAgIGlmICh6aShhKSkKICAgICAgICAgIEFpKGIsIGUpOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGYgPSBhLmFsdGVybmF0ZTsKICAgICAgICAgIGlmICgwID09PSBhLmxhbmVzICYmIChudWxsID09PSBmIHx8IDAgPT09IGYubGFuZXMpICYmIChmID0gYi5sYXN0UmVuZGVyZWRSZWR1Y2VyLCBudWxsICE9PSBmKSkKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICB2YXIgZyA9IGIubGFzdFJlbmRlcmVkU3RhdGUsIGggPSBmKGcsIGMpOwogICAgICAgICAgICAgIGUuaGFzRWFnZXJTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgZS5lYWdlclN0YXRlID0gaDsKICAgICAgICAgICAgICBpZiAoSGUoaCwgZykpIHsKICAgICAgICAgICAgICAgIHZhciBrID0gYi5pbnRlcmxlYXZlZDsKICAgICAgICAgICAgICAgIG51bGwgPT09IGsgPyAoZS5uZXh0ID0gZSwgZ2goYikpIDogKGUubmV4dCA9IGsubmV4dCwgay5uZXh0ID0gZSk7CiAgICAgICAgICAgICAgICBiLmludGVybGVhdmVkID0gZTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGwpIHsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgfQogICAgICAgICAgYyA9IGhoKGEsIGIsIGUsIGQpOwogICAgICAgICAgbnVsbCAhPT0gYyAmJiAoZSA9IFIoKSwgZ2koYywgYSwgZCwgZSksIEJpKGMsIGIsIGQpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gemkoYSkgewogICAgICAgIHZhciBiID0gYS5hbHRlcm5hdGU7CiAgICAgICAgcmV0dXJuIGEgPT09IE0gfHwgbnVsbCAhPT0gYiAmJiBiID09PSBNOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEFpKGEsIGIpIHsKICAgICAgICBKaCA9IEloID0gdHJ1ZTsKICAgICAgICB2YXIgYyA9IGEucGVuZGluZzsKICAgICAgICBudWxsID09PSBjID8gYi5uZXh0ID0gYiA6IChiLm5leHQgPSBjLm5leHQsIGMubmV4dCA9IGIpOwogICAgICAgIGEucGVuZGluZyA9IGI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gQmkoYSwgYiwgYykgewogICAgICAgIGlmICgwICE9PSAoYyAmIDQxOTQyNDApKSB7CiAgICAgICAgICB2YXIgZCA9IGIubGFuZXM7CiAgICAgICAgICBkICY9IGEucGVuZGluZ0xhbmVzOwogICAgICAgICAgYyB8PSBkOwogICAgICAgICAgYi5sYW5lcyA9IGM7CiAgICAgICAgICBDYyhhLCBjKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIFJoID0geyByZWFkQ29udGV4dDogZWgsIHVzZUNhbGxiYWNrOiBQLCB1c2VDb250ZXh0OiBQLCB1c2VFZmZlY3Q6IFAsIHVzZUltcGVyYXRpdmVIYW5kbGU6IFAsIHVzZUluc2VydGlvbkVmZmVjdDogUCwgdXNlTGF5b3V0RWZmZWN0OiBQLCB1c2VNZW1vOiBQLCB1c2VSZWR1Y2VyOiBQLCB1c2VSZWY6IFAsIHVzZVN0YXRlOiBQLCB1c2VEZWJ1Z1ZhbHVlOiBQLCB1c2VEZWZlcnJlZFZhbHVlOiBQLCB1c2VUcmFuc2l0aW9uOiBQLCB1c2VNdXRhYmxlU291cmNlOiBQLCB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogUCwgdXNlSWQ6IFAsIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZmFsc2UgfTsKICAgICAgdmFyIE9oID0geyByZWFkQ29udGV4dDogZWgsIHVzZUNhbGxiYWNrOiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgVGgoKS5tZW1vaXplZFN0YXRlID0gW2EsIHZvaWQgMCA9PT0gYiA/IG51bGwgOiBiXTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfSwgdXNlQ29udGV4dDogZWgsIHVzZUVmZmVjdDogbWksIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgICAgICBjID0gbnVsbCAhPT0gYyAmJiB2b2lkIDAgIT09IGMgPyBjLmNvbmNhdChbYV0pIDogbnVsbDsKICAgICAgICByZXR1cm4ga2koCiAgICAgICAgICA0MTk0MzA4LAogICAgICAgICAgNCwKICAgICAgICAgIHBpLmJpbmQobnVsbCwgYiwgYSksCiAgICAgICAgICBjCiAgICAgICAgKTsKICAgICAgfSwgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGtpKDQxOTQzMDgsIDQsIGEsIGIpOwogICAgICB9LCB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4ga2koNCwgMiwgYSwgYik7CiAgICAgIH0sIHVzZU1lbW86IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IFRoKCk7CiAgICAgICAgYiA9IHZvaWQgMCA9PT0gYiA/IG51bGwgOiBiOwogICAgICAgIGEgPSBhKCk7CiAgICAgICAgYy5tZW1vaXplZFN0YXRlID0gW2EsIGJdOwogICAgICAgIHJldHVybiBhOwogICAgICB9LCB1c2VSZWR1Y2VyOiBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICAgICAgdmFyIGQgPSBUaCgpOwogICAgICAgIGIgPSB2b2lkIDAgIT09IGMgPyBjKGIpIDogYjsKICAgICAgICBkLm1lbW9pemVkU3RhdGUgPSBkLmJhc2VTdGF0ZSA9IGI7CiAgICAgICAgYSA9IHsgcGVuZGluZzogbnVsbCwgaW50ZXJsZWF2ZWQ6IG51bGwsIGxhbmVzOiAwLCBkaXNwYXRjaDogbnVsbCwgbGFzdFJlbmRlcmVkUmVkdWNlcjogYSwgbGFzdFJlbmRlcmVkU3RhdGU6IGIgfTsKICAgICAgICBkLnF1ZXVlID0gYTsKICAgICAgICBhID0gYS5kaXNwYXRjaCA9IHhpLmJpbmQobnVsbCwgTSwgYSk7CiAgICAgICAgcmV0dXJuIFtkLm1lbW9pemVkU3RhdGUsIGFdOwogICAgICB9LCB1c2VSZWY6IGZ1bmN0aW9uKGEpIHsKICAgICAgICB2YXIgYiA9IFRoKCk7CiAgICAgICAgYSA9IHsgY3VycmVudDogYSB9OwogICAgICAgIHJldHVybiBiLm1lbW9pemVkU3RhdGUgPSBhOwogICAgICB9LCB1c2VTdGF0ZTogaGksIHVzZURlYnVnVmFsdWU6IHJpLCB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbihhKSB7CiAgICAgICAgcmV0dXJuIFRoKCkubWVtb2l6ZWRTdGF0ZSA9IGE7CiAgICAgIH0sIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gaGkoZmFsc2UpLCBiID0gYVswXTsKICAgICAgICBhID0gdmkuYmluZChudWxsLCBhWzFdKTsKICAgICAgICBUaCgpLm1lbW9pemVkU3RhdGUgPSBhOwogICAgICAgIHJldHVybiBbYiwgYV07CiAgICAgIH0sIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uKCkgewogICAgICB9LCB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24oYSwgYiwgYykgewogICAgICAgIHZhciBkID0gTSwgZSA9IFRoKCk7CiAgICAgICAgaWYgKEkpIHsKICAgICAgICAgIGlmICh2b2lkIDAgPT09IGMpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoNDA3KSk7CiAgICAgICAgICBjID0gYygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjID0gYigpOwogICAgICAgICAgaWYgKG51bGwgPT09IFEpCiAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzQ5KSk7CiAgICAgICAgICAwICE9PSAoSGggJiAzMCkgfHwgZGkoZCwgYiwgYyk7CiAgICAgICAgfQogICAgICAgIGUubWVtb2l6ZWRTdGF0ZSA9IGM7CiAgICAgICAgdmFyIGYgPSB7IHZhbHVlOiBjLCBnZXRTbmFwc2hvdDogYiB9OwogICAgICAgIGUucXVldWUgPSBmOwogICAgICAgIG1pKGFpLmJpbmQoCiAgICAgICAgICBudWxsLAogICAgICAgICAgZCwKICAgICAgICAgIGYsCiAgICAgICAgICBhCiAgICAgICAgKSwgW2FdKTsKICAgICAgICBkLmZsYWdzIHw9IDIwNDg7CiAgICAgICAgYmkoOSwgY2kuYmluZChudWxsLCBkLCBmLCBjLCBiKSwgdm9pZCAwLCBudWxsKTsKICAgICAgICByZXR1cm4gYzsKICAgICAgfSwgdXNlSWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gVGgoKSwgYiA9IFEuaWRlbnRpZmllclByZWZpeDsKICAgICAgICBpZiAoSSkgewogICAgICAgICAgdmFyIGMgPSBzZzsKICAgICAgICAgIHZhciBkID0gcmc7CiAgICAgICAgICBjID0gKGQgJiB+KDEgPDwgMzIgLSBvYyhkKSAtIDEpKS50b1N0cmluZygzMikgKyBjOwogICAgICAgICAgYiA9ICI6IiArIGIgKyAiUiIgKyBjOwogICAgICAgICAgYyA9IEtoKys7CiAgICAgICAgICAwIDwgYyAmJiAoYiArPSAiSCIgKyBjLnRvU3RyaW5nKDMyKSk7CiAgICAgICAgICBiICs9ICI6IjsKICAgICAgICB9IGVsc2UKICAgICAgICAgIGMgPSBMaCsrLCBiID0gIjoiICsgYiArICJyIiArIGMudG9TdHJpbmcoMzIpICsgIjoiOwogICAgICAgIHJldHVybiBhLm1lbW9pemVkU3RhdGUgPSBiOwogICAgICB9LCB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGZhbHNlIH07CiAgICAgIHZhciBQaCA9IHsKICAgICAgICByZWFkQ29udGV4dDogZWgsCiAgICAgICAgdXNlQ2FsbGJhY2s6IHNpLAogICAgICAgIHVzZUNvbnRleHQ6IGVoLAogICAgICAgIHVzZUVmZmVjdDogJGgsCiAgICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogcWksCiAgICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBuaSwKICAgICAgICB1c2VMYXlvdXRFZmZlY3Q6IG9pLAogICAgICAgIHVzZU1lbW86IHRpLAogICAgICAgIHVzZVJlZHVjZXI6IFdoLAogICAgICAgIHVzZVJlZjogamksCiAgICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIFdoKFZoKTsKICAgICAgICB9LAogICAgICAgIHVzZURlYnVnVmFsdWU6IHJpLAogICAgICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uKGEpIHsKICAgICAgICAgIHZhciBiID0gVWgoKTsKICAgICAgICAgIHJldHVybiB1aShiLCBOLm1lbW9pemVkU3RhdGUsIGEpOwogICAgICAgIH0sCiAgICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgYSA9IFdoKFZoKVswXSwgYiA9IFVoKCkubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgIHJldHVybiBbYSwgYl07CiAgICAgICAgfSwKICAgICAgICB1c2VNdXRhYmxlU291cmNlOiBZaCwKICAgICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogWmgsCiAgICAgICAgdXNlSWQ6IHdpLAogICAgICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZmFsc2UKICAgICAgfTsKICAgICAgdmFyIFFoID0geyByZWFkQ29udGV4dDogZWgsIHVzZUNhbGxiYWNrOiBzaSwgdXNlQ29udGV4dDogZWgsIHVzZUVmZmVjdDogJGgsIHVzZUltcGVyYXRpdmVIYW5kbGU6IHFpLCB1c2VJbnNlcnRpb25FZmZlY3Q6IG5pLCB1c2VMYXlvdXRFZmZlY3Q6IG9pLCB1c2VNZW1vOiB0aSwgdXNlUmVkdWNlcjogWGgsIHVzZVJlZjogamksIHVzZVN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWGgoVmgpOwogICAgICB9LCB1c2VEZWJ1Z1ZhbHVlOiByaSwgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24oYSkgewogICAgICAgIHZhciBiID0gVWgoKTsKICAgICAgICByZXR1cm4gbnVsbCA9PT0gTiA/IGIubWVtb2l6ZWRTdGF0ZSA9IGEgOiB1aShiLCBOLm1lbW9pemVkU3RhdGUsIGEpOwogICAgICB9LCB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IFhoKFZoKVswXSwgYiA9IFVoKCkubWVtb2l6ZWRTdGF0ZTsKICAgICAgICByZXR1cm4gW2EsIGJdOwogICAgICB9LCB1c2VNdXRhYmxlU291cmNlOiBZaCwgdXNlU3luY0V4dGVybmFsU3RvcmU6IFpoLCB1c2VJZDogd2ksIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZmFsc2UgfTsKICAgICAgZnVuY3Rpb24gQ2koYSwgYikgewogICAgICAgIGlmIChhICYmIGEuZGVmYXVsdFByb3BzKSB7CiAgICAgICAgICBiID0gQSh7fSwgYik7CiAgICAgICAgICBhID0gYS5kZWZhdWx0UHJvcHM7CiAgICAgICAgICBmb3IgKHZhciBjIGluIGEpCiAgICAgICAgICAgIHZvaWQgMCA9PT0gYltjXSAmJiAoYltjXSA9IGFbY10pOwogICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBiOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIERpKGEsIGIsIGMsIGQpIHsKICAgICAgICBiID0gYS5tZW1vaXplZFN0YXRlOwogICAgICAgIGMgPSBjKGQsIGIpOwogICAgICAgIGMgPSBudWxsID09PSBjIHx8IHZvaWQgMCA9PT0gYyA/IGIgOiBBKHt9LCBiLCBjKTsKICAgICAgICBhLm1lbW9pemVkU3RhdGUgPSBjOwogICAgICAgIDAgPT09IGEubGFuZXMgJiYgKGEudXBkYXRlUXVldWUuYmFzZVN0YXRlID0gYyk7CiAgICAgIH0KICAgICAgdmFyIEVpID0geyBpc01vdW50ZWQ6IGZ1bmN0aW9uKGEpIHsKICAgICAgICByZXR1cm4gKGEgPSBhLl9yZWFjdEludGVybmFscykgPyBWYihhKSA9PT0gYSA6IGZhbHNlOwogICAgICB9LCBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgICAgICBhID0gYS5fcmVhY3RJbnRlcm5hbHM7CiAgICAgICAgdmFyIGQgPSBSKCksIGUgPSB5aShhKSwgZiA9IG1oKGQsIGUpOwogICAgICAgIGYucGF5bG9hZCA9IGI7CiAgICAgICAgdm9pZCAwICE9PSBjICYmIG51bGwgIT09IGMgJiYgKGYuY2FsbGJhY2sgPSBjKTsKICAgICAgICBiID0gbmgoYSwgZiwgZSk7CiAgICAgICAgbnVsbCAhPT0gYiAmJiAoZ2koYiwgYSwgZSwgZCksIG9oKGIsIGEsIGUpKTsKICAgICAgfSwgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24oYSwgYiwgYykgewogICAgICAgIGEgPSBhLl9yZWFjdEludGVybmFsczsKICAgICAgICB2YXIgZCA9IFIoKSwgZSA9IHlpKGEpLCBmID0gbWgoZCwgZSk7CiAgICAgICAgZi50YWcgPSAxOwogICAgICAgIGYucGF5bG9hZCA9IGI7CiAgICAgICAgdm9pZCAwICE9PSBjICYmIG51bGwgIT09IGMgJiYgKGYuY2FsbGJhY2sgPSBjKTsKICAgICAgICBiID0gbmgoYSwgZiwgZSk7CiAgICAgICAgbnVsbCAhPT0gYiAmJiAoZ2koYiwgYSwgZSwgZCksIG9oKGIsIGEsIGUpKTsKICAgICAgfSwgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgYSA9IGEuX3JlYWN0SW50ZXJuYWxzOwogICAgICAgIHZhciBjID0gUigpLCBkID0geWkoYSksIGUgPSBtaChjLCBkKTsKICAgICAgICBlLnRhZyA9IDI7CiAgICAgICAgdm9pZCAwICE9PSBiICYmIG51bGwgIT09IGIgJiYgKGUuY2FsbGJhY2sgPSBiKTsKICAgICAgICBiID0gbmgoYSwgZSwgZCk7CiAgICAgICAgbnVsbCAhPT0gYiAmJiAoZ2koYiwgYSwgZCwgYyksIG9oKGIsIGEsIGQpKTsKICAgICAgfSB9OwogICAgICBmdW5jdGlvbiBGaShhLCBiLCBjLCBkLCBlLCBmLCBnKSB7CiAgICAgICAgYSA9IGEuc3RhdGVOb2RlOwogICAgICAgIHJldHVybiAiZnVuY3Rpb24iID09PSB0eXBlb2YgYS5zaG91bGRDb21wb25lbnRVcGRhdGUgPyBhLnNob3VsZENvbXBvbmVudFVwZGF0ZShkLCBmLCBnKSA6IGIucHJvdG90eXBlICYmIGIucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID8gIUllKGMsIGQpIHx8ICFJZShlLCBmKSA6IHRydWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gR2koYSwgYiwgYykgewogICAgICAgIHZhciBkID0gZmFsc2UsIGUgPSBWZjsKICAgICAgICB2YXIgZiA9IGIuY29udGV4dFR5cGU7CiAgICAgICAgIm9iamVjdCIgPT09IHR5cGVvZiBmICYmIG51bGwgIT09IGYgPyBmID0gZWgoZikgOiAoZSA9IFpmKGIpID8gWGYgOiBILmN1cnJlbnQsIGQgPSBiLmNvbnRleHRUeXBlcywgZiA9IChkID0gbnVsbCAhPT0gZCAmJiB2b2lkIDAgIT09IGQpID8gWWYoYSwgZSkgOiBWZik7CiAgICAgICAgYiA9IG5ldyBiKGMsIGYpOwogICAgICAgIGEubWVtb2l6ZWRTdGF0ZSA9IG51bGwgIT09IGIuc3RhdGUgJiYgdm9pZCAwICE9PSBiLnN0YXRlID8gYi5zdGF0ZSA6IG51bGw7CiAgICAgICAgYi51cGRhdGVyID0gRWk7CiAgICAgICAgYS5zdGF0ZU5vZGUgPSBiOwogICAgICAgIGIuX3JlYWN0SW50ZXJuYWxzID0gYTsKICAgICAgICBkICYmIChhID0gYS5zdGF0ZU5vZGUsIGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IGUsIGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQgPSBmKTsKICAgICAgICByZXR1cm4gYjsKICAgICAgfQogICAgICBmdW5jdGlvbiBIaShhLCBiLCBjLCBkKSB7CiAgICAgICAgYSA9IGIuc3RhdGU7CiAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJiBiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYywgZCk7CiAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGIuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgJiYgYi5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLCBkKTsKICAgICAgICBiLnN0YXRlICE9PSBhICYmIEVpLmVucXVldWVSZXBsYWNlU3RhdGUoYiwgYi5zdGF0ZSwgbnVsbCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gSWkoYSwgYiwgYywgZCkgewogICAgICAgIHZhciBlID0gYS5zdGF0ZU5vZGU7CiAgICAgICAgZS5wcm9wcyA9IGM7CiAgICAgICAgZS5zdGF0ZSA9IGEubWVtb2l6ZWRTdGF0ZTsKICAgICAgICBlLnJlZnMgPSB7fTsKICAgICAgICBraChhKTsKICAgICAgICB2YXIgZiA9IGIuY29udGV4dFR5cGU7CiAgICAgICAgIm9iamVjdCIgPT09IHR5cGVvZiBmICYmIG51bGwgIT09IGYgPyBlLmNvbnRleHQgPSBlaChmKSA6IChmID0gWmYoYikgPyBYZiA6IEguY3VycmVudCwgZS5jb250ZXh0ID0gWWYoYSwgZikpOwogICAgICAgIGUuc3RhdGUgPSBhLm1lbW9pemVkU3RhdGU7CiAgICAgICAgZiA9IGIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOwogICAgICAgICJmdW5jdGlvbiIgPT09IHR5cGVvZiBmICYmIChEaShhLCBiLCBmLCBjKSwgZS5zdGF0ZSA9IGEubWVtb2l6ZWRTdGF0ZSk7CiAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIHx8ICJmdW5jdGlvbiIgPT09IHR5cGVvZiBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIHx8ICJmdW5jdGlvbiIgIT09IHR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiYgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGUuY29tcG9uZW50V2lsbE1vdW50IHx8IChiID0gZS5zdGF0ZSwgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGUuY29tcG9uZW50V2lsbE1vdW50ICYmIGUuY29tcG9uZW50V2lsbE1vdW50KCksICJmdW5jdGlvbiIgPT09IHR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiYgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksIGIgIT09IGUuc3RhdGUgJiYgRWkuZW5xdWV1ZVJlcGxhY2VTdGF0ZShlLCBlLnN0YXRlLCBudWxsKSwgcWgoYSwgYywgZSwgZCksIGUuc3RhdGUgPSBhLm1lbW9pemVkU3RhdGUpOwogICAgICAgICJmdW5jdGlvbiIgPT09IHR5cGVvZiBlLmNvbXBvbmVudERpZE1vdW50ICYmIChhLmZsYWdzIHw9IDQxOTQzMDgpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEppKGEsIGIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIGMgPSAiIiwgZCA9IGI7CiAgICAgICAgICBkbwogICAgICAgICAgICBjICs9IFBhKGQpLCBkID0gZC5yZXR1cm47CiAgICAgICAgICB3aGlsZSAoZCk7CiAgICAgICAgICB2YXIgZSA9IGM7CiAgICAgICAgfSBjYXRjaCAoZikgewogICAgICAgICAgZSA9ICJcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICIgKyBmLm1lc3NhZ2UgKyAiXG4iICsgZi5zdGFjazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGEsIHNvdXJjZTogYiwgc3RhY2s6IGUsIGRpZ2VzdDogbnVsbCB9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEtpKGEsIGIsIGMpIHsKICAgICAgICByZXR1cm4geyB2YWx1ZTogYSwgc291cmNlOiBudWxsLCBzdGFjazogbnVsbCAhPSBjID8gYyA6IG51bGwsIGRpZ2VzdDogbnVsbCAhPSBiID8gYiA6IG51bGwgfTsKICAgICAgfQogICAgICBmdW5jdGlvbiBMaShhLCBiKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYi52YWx1ZSk7CiAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhyb3cgYzsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgTWkgPSAiZnVuY3Rpb24iID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXA7CiAgICAgIGZ1bmN0aW9uIE5pKGEsIGIsIGMpIHsKICAgICAgICBjID0gbWgoLTEsIGMpOwogICAgICAgIGMudGFnID0gMzsKICAgICAgICBjLnBheWxvYWQgPSB7IGVsZW1lbnQ6IG51bGwgfTsKICAgICAgICB2YXIgZCA9IGIudmFsdWU7CiAgICAgICAgYy5jYWxsYmFjayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgT2kgfHwgKE9pID0gdHJ1ZSwgUGkgPSBkKTsKICAgICAgICAgIExpKGEsIGIpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gUWkoYSwgYiwgYykgewogICAgICAgIGMgPSBtaCgtMSwgYyk7CiAgICAgICAgYy50YWcgPSAzOwogICAgICAgIHZhciBkID0gYS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjsKICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGQpIHsKICAgICAgICAgIHZhciBlID0gYi52YWx1ZTsKICAgICAgICAgIGMucGF5bG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZChlKTsKICAgICAgICAgIH07CiAgICAgICAgICBjLmNhbGxiYWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIExpKGEsIGIpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgdmFyIGYgPSBhLnN0YXRlTm9kZTsKICAgICAgICBudWxsICE9PSBmICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBmLmNvbXBvbmVudERpZENhdGNoICYmIChjLmNhbGxiYWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBMaShhLCBiKTsKICAgICAgICAgICJmdW5jdGlvbiIgIT09IHR5cGVvZiBkICYmIChudWxsID09PSBSaSA/IFJpID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW3RoaXNdKSA6IFJpLmFkZCh0aGlzKSk7CiAgICAgICAgICB2YXIgYzIgPSBiLnN0YWNrOwogICAgICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLCB7IGNvbXBvbmVudFN0YWNrOiBudWxsICE9PSBjMiA/IGMyIDogIiIgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gU2koYSwgYiwgYykgewogICAgICAgIHZhciBkID0gYS5waW5nQ2FjaGU7CiAgICAgICAgaWYgKG51bGwgPT09IGQpIHsKICAgICAgICAgIGQgPSBhLnBpbmdDYWNoZSA9IG5ldyBNaSgpOwogICAgICAgICAgdmFyIGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgICAgZC5zZXQoYiwgZSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBlID0gZC5nZXQoYiksIHZvaWQgMCA9PT0gZSAmJiAoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIGQuc2V0KGIsIGUpKTsKICAgICAgICBlLmhhcyhjKSB8fCAoZS5hZGQoYyksIGEgPSBUaS5iaW5kKG51bGwsIGEsIGIsIGMpLCBiLnRoZW4oYSwgYSkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFVpKGEpIHsKICAgICAgICBkbyB7CiAgICAgICAgICB2YXIgYjsKICAgICAgICAgIGlmIChiID0gMTMgPT09IGEudGFnKQogICAgICAgICAgICBiID0gYS5tZW1vaXplZFN0YXRlLCBiID0gbnVsbCAhPT0gYiA/IG51bGwgIT09IGIuZGVoeWRyYXRlZCA/IHRydWUgOiBmYWxzZSA6IHRydWU7CiAgICAgICAgICBpZiAoYikKICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICBhID0gYS5yZXR1cm47CiAgICAgICAgfSB3aGlsZSAobnVsbCAhPT0gYSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gVmkoYSwgYiwgYywgZCwgZSkgewogICAgICAgIGlmICgwID09PSAoYS5tb2RlICYgMSkpCiAgICAgICAgICByZXR1cm4gYSA9PT0gYiA/IGEuZmxhZ3MgfD0gNjU1MzYgOiAoYS5mbGFncyB8PSAxMjgsIGMuZmxhZ3MgfD0gMTMxMDcyLCBjLmZsYWdzICY9IC01MjgwNSwgMSA9PT0gYy50YWcgJiYgKG51bGwgPT09IGMuYWx0ZXJuYXRlID8gYy50YWcgPSAxNyA6IChiID0gbWgoLTEsIDEpLCBiLnRhZyA9IDIsIG5oKGMsIGIsIDEpKSksIGMubGFuZXMgfD0gMSksIGE7CiAgICAgICAgYS5mbGFncyB8PSA2NTUzNjsKICAgICAgICBhLmxhbmVzID0gZTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICB2YXIgV2kgPSB1YS5SZWFjdEN1cnJlbnRPd25lcjsKICAgICAgdmFyIGRoID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIFhpKGEsIGIsIGMsIGQpIHsKICAgICAgICBiLmNoaWxkID0gbnVsbCA9PT0gYSA/IFZnKGIsIG51bGwsIGMsIGQpIDogVWcoYiwgYS5jaGlsZCwgYywgZCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gWWkoYSwgYiwgYywgZCwgZSkgewogICAgICAgIGMgPSBjLnJlbmRlcjsKICAgICAgICB2YXIgZiA9IGIucmVmOwogICAgICAgIGNoKGIsIGUpOwogICAgICAgIGQgPSBOaChhLCBiLCBjLCBkLCBmLCBlKTsKICAgICAgICBjID0gU2goKTsKICAgICAgICBpZiAobnVsbCAhPT0gYSAmJiAhZGgpCiAgICAgICAgICByZXR1cm4gYi51cGRhdGVRdWV1ZSA9IGEudXBkYXRlUXVldWUsIGIuZmxhZ3MgJj0gLTIwNTMsIGEubGFuZXMgJj0gfmUsIFppKGEsIGIsIGUpOwogICAgICAgIEkgJiYgYyAmJiB2ZyhiKTsKICAgICAgICBiLmZsYWdzIHw9IDE7CiAgICAgICAgWGkoYSwgYiwgZCwgZSk7CiAgICAgICAgcmV0dXJuIGIuY2hpbGQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gJGkoYSwgYiwgYywgZCwgZSkgewogICAgICAgIGlmIChudWxsID09PSBhKSB7CiAgICAgICAgICB2YXIgZiA9IGMudHlwZTsKICAgICAgICAgIGlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgZiAmJiAhYWooZikgJiYgdm9pZCAwID09PSBmLmRlZmF1bHRQcm9wcyAmJiBudWxsID09PSBjLmNvbXBhcmUgJiYgdm9pZCAwID09PSBjLmRlZmF1bHRQcm9wcykKICAgICAgICAgICAgcmV0dXJuIGIudGFnID0gMTUsIGIudHlwZSA9IGYsIGJqKGEsIGIsIGYsIGQsIGUpOwogICAgICAgICAgYSA9IFJnKGMudHlwZSwgbnVsbCwgZCwgYiwgYi5tb2RlLCBlKTsKICAgICAgICAgIGEucmVmID0gYi5yZWY7CiAgICAgICAgICBhLnJldHVybiA9IGI7CiAgICAgICAgICByZXR1cm4gYi5jaGlsZCA9IGE7CiAgICAgICAgfQogICAgICAgIGYgPSBhLmNoaWxkOwogICAgICAgIGlmICgwID09PSAoYS5sYW5lcyAmIGUpKSB7CiAgICAgICAgICB2YXIgZyA9IGYubWVtb2l6ZWRQcm9wczsKICAgICAgICAgIGMgPSBjLmNvbXBhcmU7CiAgICAgICAgICBjID0gbnVsbCAhPT0gYyA/IGMgOiBJZTsKICAgICAgICAgIGlmIChjKGcsIGQpICYmIGEucmVmID09PSBiLnJlZikKICAgICAgICAgICAgcmV0dXJuIFppKGEsIGIsIGUpOwogICAgICAgIH0KICAgICAgICBiLmZsYWdzIHw9IDE7CiAgICAgICAgYSA9IFBnKGYsIGQpOwogICAgICAgIGEucmVmID0gYi5yZWY7CiAgICAgICAgYS5yZXR1cm4gPSBiOwogICAgICAgIHJldHVybiBiLmNoaWxkID0gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBiaihhLCBiLCBjLCBkLCBlKSB7CiAgICAgICAgaWYgKG51bGwgIT09IGEpIHsKICAgICAgICAgIHZhciBmID0gYS5tZW1vaXplZFByb3BzOwogICAgICAgICAgaWYgKEllKGYsIGQpICYmIGEucmVmID09PSBiLnJlZikKICAgICAgICAgICAgaWYgKGRoID0gZmFsc2UsIGIucGVuZGluZ1Byb3BzID0gZCA9IGYsIDAgIT09IChhLmxhbmVzICYgZSkpCiAgICAgICAgICAgICAgMCAhPT0gKGEuZmxhZ3MgJiAxMzEwNzIpICYmIChkaCA9IHRydWUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgcmV0dXJuIGIubGFuZXMgPSBhLmxhbmVzLCBaaShhLCBiLCBlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNqKGEsIGIsIGMsIGQsIGUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRqKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IGIucGVuZGluZ1Byb3BzLCBlID0gZC5jaGlsZHJlbiwgZiA9IG51bGwgIT09IGEgPyBhLm1lbW9pemVkU3RhdGUgOiBudWxsOwogICAgICAgIGlmICgiaGlkZGVuIiA9PT0gZC5tb2RlKQogICAgICAgICAgaWYgKDAgPT09IChiLm1vZGUgJiAxKSkKICAgICAgICAgICAgYi5tZW1vaXplZFN0YXRlID0geyBiYXNlTGFuZXM6IDAsIGNhY2hlUG9vbDogbnVsbCwgdHJhbnNpdGlvbnM6IG51bGwgfSwgRyhlaiwgZmopLCBmaiB8PSBjOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgwID09PSAoYyAmIDEwNzM3NDE4MjQpKQogICAgICAgICAgICAgIHJldHVybiBhID0gbnVsbCAhPT0gZiA/IGYuYmFzZUxhbmVzIHwgYyA6IGMsIGIubGFuZXMgPSBiLmNoaWxkTGFuZXMgPSAxMDczNzQxODI0LCBiLm1lbW9pemVkU3RhdGUgPSB7IGJhc2VMYW5lczogYSwgY2FjaGVQb29sOiBudWxsLCB0cmFuc2l0aW9uczogbnVsbCB9LCBiLnVwZGF0ZVF1ZXVlID0gbnVsbCwgRyhlaiwgZmopLCBmaiB8PSBhLCBudWxsOwogICAgICAgICAgICBiLm1lbW9pemVkU3RhdGUgPSB7IGJhc2VMYW5lczogMCwgY2FjaGVQb29sOiBudWxsLCB0cmFuc2l0aW9uczogbnVsbCB9OwogICAgICAgICAgICBkID0gbnVsbCAhPT0gZiA/IGYuYmFzZUxhbmVzIDogYzsKICAgICAgICAgICAgRyhlaiwgZmopOwogICAgICAgICAgICBmaiB8PSBkOwogICAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIG51bGwgIT09IGYgPyAoZCA9IGYuYmFzZUxhbmVzIHwgYywgYi5tZW1vaXplZFN0YXRlID0gbnVsbCkgOiBkID0gYywgRyhlaiwgZmopLCBmaiB8PSBkOwogICAgICAgIFhpKGEsIGIsIGUsIGMpOwogICAgICAgIHJldHVybiBiLmNoaWxkOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdqKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGIucmVmOwogICAgICAgIGlmIChudWxsID09PSBhICYmIG51bGwgIT09IGMgfHwgbnVsbCAhPT0gYSAmJiBhLnJlZiAhPT0gYykKICAgICAgICAgIGIuZmxhZ3MgfD0gNTEyLCBiLmZsYWdzIHw9IDIwOTcxNTI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gY2ooYSwgYiwgYywgZCwgZSkgewogICAgICAgIHZhciBmID0gWmYoYykgPyBYZiA6IEguY3VycmVudDsKICAgICAgICBmID0gWWYoYiwgZik7CiAgICAgICAgY2goYiwgZSk7CiAgICAgICAgYyA9IE5oKGEsIGIsIGMsIGQsIGYsIGUpOwogICAgICAgIGQgPSBTaCgpOwogICAgICAgIGlmIChudWxsICE9PSBhICYmICFkaCkKICAgICAgICAgIHJldHVybiBiLnVwZGF0ZVF1ZXVlID0gYS51cGRhdGVRdWV1ZSwgYi5mbGFncyAmPSAtMjA1MywgYS5sYW5lcyAmPSB+ZSwgWmkoYSwgYiwgZSk7CiAgICAgICAgSSAmJiBkICYmIHZnKGIpOwogICAgICAgIGIuZmxhZ3MgfD0gMTsKICAgICAgICBYaShhLCBiLCBjLCBlKTsKICAgICAgICByZXR1cm4gYi5jaGlsZDsKICAgICAgfQogICAgICBmdW5jdGlvbiBoaihhLCBiLCBjLCBkLCBlKSB7CiAgICAgICAgaWYgKFpmKGMpKSB7CiAgICAgICAgICB2YXIgZiA9IHRydWU7CiAgICAgICAgICBjZyhiKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIGYgPSBmYWxzZTsKICAgICAgICBjaChiLCBlKTsKICAgICAgICBpZiAobnVsbCA9PT0gYi5zdGF0ZU5vZGUpCiAgICAgICAgICBpaihhLCBiKSwgR2koYiwgYywgZCksIElpKGIsIGMsIGQsIGUpLCBkID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChudWxsID09PSBhKSB7CiAgICAgICAgICB2YXIgZyA9IGIuc3RhdGVOb2RlLCBoID0gYi5tZW1vaXplZFByb3BzOwogICAgICAgICAgZy5wcm9wcyA9IGg7CiAgICAgICAgICB2YXIgayA9IGcuY29udGV4dCwgbCA9IGMuY29udGV4dFR5cGU7CiAgICAgICAgICAib2JqZWN0IiA9PT0gdHlwZW9mIGwgJiYgbnVsbCAhPT0gbCA/IGwgPSBlaChsKSA6IChsID0gWmYoYykgPyBYZiA6IEguY3VycmVudCwgbCA9IFlmKGIsIGwpKTsKICAgICAgICAgIHZhciBtID0gYy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHEgPSAiZnVuY3Rpb24iID09PSB0eXBlb2YgbSB8fCAiZnVuY3Rpb24iID09PSB0eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZTsKICAgICAgICAgIHEgfHwgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgJiYgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB8fCAoaCAhPT0gZCB8fCBrICE9PSBsKSAmJiBIaShiLCBnLCBkLCBsKTsKICAgICAgICAgIGpoID0gZmFsc2U7CiAgICAgICAgICB2YXIgciA9IGIubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgIGcuc3RhdGUgPSByOwogICAgICAgICAgcWgoYiwgZCwgZywgZSk7CiAgICAgICAgICBrID0gYi5tZW1vaXplZFN0YXRlOwogICAgICAgICAgaCAhPT0gZCB8fCByICE9PSBrIHx8IFdmLmN1cnJlbnQgfHwgamggPyAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIG0gJiYgKERpKGIsIGMsIG0sIGQpLCBrID0gYi5tZW1vaXplZFN0YXRlKSwgKGggPSBqaCB8fCBGaShiLCBjLCBoLCBkLCByLCBrLCBsKSkgPyAocSB8fCAiZnVuY3Rpb24iICE9PSB0eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ICYmICJmdW5jdGlvbiIgIT09IHR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCB8fCAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGcuY29tcG9uZW50V2lsbE1vdW50ICYmIGcuY29tcG9uZW50V2lsbE1vdW50KCksICJmdW5jdGlvbiIgPT09IHR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiYgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLCAiZnVuY3Rpb24iID09PSB0eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCAmJiAoYi5mbGFncyB8PSA0MTk0MzA4KSkgOiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQgJiYgKGIuZmxhZ3MgfD0gNDE5NDMwOCksIGIubWVtb2l6ZWRQcm9wcyA9IGQsIGIubWVtb2l6ZWRTdGF0ZSA9IGspLCBnLnByb3BzID0gZCwgZy5zdGF0ZSA9IGssIGcuY29udGV4dCA9IGwsIGQgPSBoKSA6ICgiZnVuY3Rpb24iID09PSB0eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCAmJiAoYi5mbGFncyB8PSA0MTk0MzA4KSwgZCA9IGZhbHNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZyA9IGIuc3RhdGVOb2RlOwogICAgICAgICAgbGgoYSwgYik7CiAgICAgICAgICBoID0gYi5tZW1vaXplZFByb3BzOwogICAgICAgICAgbCA9IGIudHlwZSA9PT0gYi5lbGVtZW50VHlwZSA/IGggOiBDaShiLnR5cGUsIGgpOwogICAgICAgICAgZy5wcm9wcyA9IGw7CiAgICAgICAgICBxID0gYi5wZW5kaW5nUHJvcHM7CiAgICAgICAgICByID0gZy5jb250ZXh0OwogICAgICAgICAgayA9IGMuY29udGV4dFR5cGU7CiAgICAgICAgICAib2JqZWN0IiA9PT0gdHlwZW9mIGsgJiYgbnVsbCAhPT0gayA/IGsgPSBlaChrKSA6IChrID0gWmYoYykgPyBYZiA6IEguY3VycmVudCwgayA9IFlmKGIsIGspKTsKICAgICAgICAgIHZhciB5ID0gYy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7CiAgICAgICAgICAobSA9ICJmdW5jdGlvbiIgPT09IHR5cGVvZiB5IHx8ICJmdW5jdGlvbiIgPT09IHR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKSB8fCAiZnVuY3Rpb24iICE9PSB0eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJiAiZnVuY3Rpb24iICE9PSB0eXBlb2YgZy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIHx8IChoICE9PSBxIHx8IHIgIT09IGspICYmIEhpKGIsIGcsIGQsIGspOwogICAgICAgICAgamggPSBmYWxzZTsKICAgICAgICAgIHIgPSBiLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICBnLnN0YXRlID0gcjsKICAgICAgICAgIHFoKGIsIGQsIGcsIGUpOwogICAgICAgICAgdmFyIG4gPSBiLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICBoICE9PSBxIHx8IHIgIT09IG4gfHwgV2YuY3VycmVudCB8fCBqaCA/ICgiZnVuY3Rpb24iID09PSB0eXBlb2YgeSAmJiAoRGkoYiwgYywgeSwgZCksIG4gPSBiLm1lbW9pemVkU3RhdGUpLCAobCA9IGpoIHx8IEZpKGIsIGMsIGwsIGQsIHIsIG4sIGspIHx8IGZhbHNlKSA/IChtIHx8ICJmdW5jdGlvbiIgIT09IHR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlICYmICJmdW5jdGlvbiIgIT09IHR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUgfHwgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUgJiYgZy5jb21wb25lbnRXaWxsVXBkYXRlKGQsIG4sIGspLCAiZnVuY3Rpb24iID09PSB0eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJiBnLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKGQsIG4sIGspKSwgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlICYmIChiLmZsYWdzIHw9IDQpLCAiZnVuY3Rpb24iID09PSB0eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAmJiAoYi5mbGFncyB8PSAxMDI0KSkgOiAoImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlIHx8IGggPT09IGEubWVtb2l6ZWRQcm9wcyAmJiByID09PSBhLm1lbW9pemVkU3RhdGUgfHwgKGIuZmxhZ3MgfD0gNCksICJmdW5jdGlvbiIgIT09IHR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIHx8IGggPT09IGEubWVtb2l6ZWRQcm9wcyAmJiByID09PSBhLm1lbW9pemVkU3RhdGUgfHwgKGIuZmxhZ3MgfD0gMTAyNCksIGIubWVtb2l6ZWRQcm9wcyA9IGQsIGIubWVtb2l6ZWRTdGF0ZSA9IG4pLCBnLnByb3BzID0gZCwgZy5zdGF0ZSA9IG4sIGcuY29udGV4dCA9IGssIGQgPSBsKSA6ICgiZnVuY3Rpb24iICE9PSB0eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGUgfHwgaCA9PT0gYS5tZW1vaXplZFByb3BzICYmIHIgPT09IGEubWVtb2l6ZWRTdGF0ZSB8fCAoYi5mbGFncyB8PSA0KSwgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgfHwgaCA9PT0gYS5tZW1vaXplZFByb3BzICYmIHIgPT09IGEubWVtb2l6ZWRTdGF0ZSB8fCAoYi5mbGFncyB8PSAxMDI0KSwgZCA9IGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGpqKGEsIGIsIGMsIGQsIGYsIGUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGpqKGEsIGIsIGMsIGQsIGUsIGYpIHsKICAgICAgICBnaihhLCBiKTsKICAgICAgICB2YXIgZyA9IDAgIT09IChiLmZsYWdzICYgMTI4KTsKICAgICAgICBpZiAoIWQgJiYgIWcpCiAgICAgICAgICByZXR1cm4gZSAmJiBkZyhiLCBjLCBmYWxzZSksIFppKGEsIGIsIGYpOwogICAgICAgIGQgPSBiLnN0YXRlTm9kZTsKICAgICAgICBXaS5jdXJyZW50ID0gYjsKICAgICAgICB2YXIgaCA9IGcgJiYgImZ1bmN0aW9uIiAhPT0gdHlwZW9mIGMuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID8gbnVsbCA6IGQucmVuZGVyKCk7CiAgICAgICAgYi5mbGFncyB8PSAxOwogICAgICAgIG51bGwgIT09IGEgJiYgZyA/IChiLmNoaWxkID0gVWcoYiwgYS5jaGlsZCwgbnVsbCwgZiksIGIuY2hpbGQgPSBVZyhiLCBudWxsLCBoLCBmKSkgOiBYaShhLCBiLCBoLCBmKTsKICAgICAgICBiLm1lbW9pemVkU3RhdGUgPSBkLnN0YXRlOwogICAgICAgIGUgJiYgZGcoYiwgYywgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIGIuY2hpbGQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24ga2ooYSkgewogICAgICAgIHZhciBiID0gYS5zdGF0ZU5vZGU7CiAgICAgICAgYi5wZW5kaW5nQ29udGV4dCA/IGFnKGEsIGIucGVuZGluZ0NvbnRleHQsIGIucGVuZGluZ0NvbnRleHQgIT09IGIuY29udGV4dCkgOiBiLmNvbnRleHQgJiYgYWcoYSwgYi5jb250ZXh0LCBmYWxzZSk7CiAgICAgICAgeWgoYSwgYi5jb250YWluZXJJbmZvKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBsaihhLCBiLCBjLCBkLCBlKSB7CiAgICAgICAgSWcoKTsKICAgICAgICBKZyhlKTsKICAgICAgICBiLmZsYWdzIHw9IDI1NjsKICAgICAgICBYaShhLCBiLCBjLCBkKTsKICAgICAgICByZXR1cm4gYi5jaGlsZDsKICAgICAgfQogICAgICB2YXIgbWogPSB7IGRlaHlkcmF0ZWQ6IG51bGwsIHRyZWVDb250ZXh0OiBudWxsLCByZXRyeUxhbmU6IDAgfTsKICAgICAgZnVuY3Rpb24gbmooYSkgewogICAgICAgIHJldHVybiB7IGJhc2VMYW5lczogYSwgY2FjaGVQb29sOiBudWxsLCB0cmFuc2l0aW9uczogbnVsbCB9OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG9qKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IGIucGVuZGluZ1Byb3BzLCBlID0gTC5jdXJyZW50LCBmID0gZmFsc2UsIGcgPSAwICE9PSAoYi5mbGFncyAmIDEyOCksIGg7CiAgICAgICAgKGggPSBnKSB8fCAoaCA9IG51bGwgIT09IGEgJiYgbnVsbCA9PT0gYS5tZW1vaXplZFN0YXRlID8gZmFsc2UgOiAwICE9PSAoZSAmIDIpKTsKICAgICAgICBpZiAoaCkKICAgICAgICAgIGYgPSB0cnVlLCBiLmZsYWdzICY9IC0xMjk7CiAgICAgICAgZWxzZSBpZiAobnVsbCA9PT0gYSB8fCBudWxsICE9PSBhLm1lbW9pemVkU3RhdGUpCiAgICAgICAgICBlIHw9IDE7CiAgICAgICAgRyhMLCBlICYgMSk7CiAgICAgICAgaWYgKG51bGwgPT09IGEpIHsKICAgICAgICAgIEVnKGIpOwogICAgICAgICAgYSA9IGIubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgIGlmIChudWxsICE9PSBhICYmIChhID0gYS5kZWh5ZHJhdGVkLCBudWxsICE9PSBhKSkKICAgICAgICAgICAgcmV0dXJuIDAgPT09IChiLm1vZGUgJiAxKSA/IGIubGFuZXMgPSAxIDogIiQhIiA9PT0gYS5kYXRhID8gYi5sYW5lcyA9IDggOiBiLmxhbmVzID0gMTA3Mzc0MTgyNCwgbnVsbDsKICAgICAgICAgIGcgPSBkLmNoaWxkcmVuOwogICAgICAgICAgYSA9IGQuZmFsbGJhY2s7CiAgICAgICAgICByZXR1cm4gZiA/IChkID0gYi5tb2RlLCBmID0gYi5jaGlsZCwgZyA9IHsgbW9kZTogImhpZGRlbiIsIGNoaWxkcmVuOiBnIH0sIDAgPT09IChkICYgMSkgJiYgbnVsbCAhPT0gZiA/IChmLmNoaWxkTGFuZXMgPSAwLCBmLnBlbmRpbmdQcm9wcyA9IGcpIDogZiA9IHBqKGcsIGQsIDAsIG51bGwpLCBhID0gVGcoYSwgZCwgYywgbnVsbCksIGYucmV0dXJuID0gYiwgYS5yZXR1cm4gPSBiLCBmLnNpYmxpbmcgPSBhLCBiLmNoaWxkID0gZiwgYi5jaGlsZC5tZW1vaXplZFN0YXRlID0gbmooYyksIGIubWVtb2l6ZWRTdGF0ZSA9IG1qLCBhKSA6IHFqKGIsIGcpOwogICAgICAgIH0KICAgICAgICBlID0gYS5tZW1vaXplZFN0YXRlOwogICAgICAgIGlmIChudWxsICE9PSBlICYmIChoID0gZS5kZWh5ZHJhdGVkLCBudWxsICE9PSBoKSkKICAgICAgICAgIHJldHVybiByaihhLCBiLCBnLCBkLCBoLCBlLCBjKTsKICAgICAgICBpZiAoZikgewogICAgICAgICAgZiA9IGQuZmFsbGJhY2s7CiAgICAgICAgICBnID0gYi5tb2RlOwogICAgICAgICAgZSA9IGEuY2hpbGQ7CiAgICAgICAgICBoID0gZS5zaWJsaW5nOwogICAgICAgICAgdmFyIGsgPSB7IG1vZGU6ICJoaWRkZW4iLCBjaGlsZHJlbjogZC5jaGlsZHJlbiB9OwogICAgICAgICAgMCA9PT0gKGcgJiAxKSAmJiBiLmNoaWxkICE9PSBlID8gKGQgPSBiLmNoaWxkLCBkLmNoaWxkTGFuZXMgPSAwLCBkLnBlbmRpbmdQcm9wcyA9IGssIGIuZGVsZXRpb25zID0gbnVsbCkgOiAoZCA9IFBnKGUsIGspLCBkLnN1YnRyZWVGbGFncyA9IGUuc3VidHJlZUZsYWdzICYgMTQ2ODAwNjQpOwogICAgICAgICAgbnVsbCAhPT0gaCA/IGYgPSBQZyhoLCBmKSA6IChmID0gVGcoZiwgZywgYywgbnVsbCksIGYuZmxhZ3MgfD0gMik7CiAgICAgICAgICBmLnJldHVybiA9IGI7CiAgICAgICAgICBkLnJldHVybiA9IGI7CiAgICAgICAgICBkLnNpYmxpbmcgPSBmOwogICAgICAgICAgYi5jaGlsZCA9IGQ7CiAgICAgICAgICBkID0gZjsKICAgICAgICAgIGYgPSBiLmNoaWxkOwogICAgICAgICAgZyA9IGEuY2hpbGQubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgIGcgPSBudWxsID09PSBnID8gbmooYykgOiB7IGJhc2VMYW5lczogZy5iYXNlTGFuZXMgfCBjLCBjYWNoZVBvb2w6IG51bGwsIHRyYW5zaXRpb25zOiBnLnRyYW5zaXRpb25zIH07CiAgICAgICAgICBmLm1lbW9pemVkU3RhdGUgPSBnOwogICAgICAgICAgZi5jaGlsZExhbmVzID0gYS5jaGlsZExhbmVzICYgfmM7CiAgICAgICAgICBiLm1lbW9pemVkU3RhdGUgPSBtajsKICAgICAgICAgIHJldHVybiBkOwogICAgICAgIH0KICAgICAgICBmID0gYS5jaGlsZDsKICAgICAgICBhID0gZi5zaWJsaW5nOwogICAgICAgIGQgPSBQZyhmLCB7IG1vZGU6ICJ2aXNpYmxlIiwgY2hpbGRyZW46IGQuY2hpbGRyZW4gfSk7CiAgICAgICAgMCA9PT0gKGIubW9kZSAmIDEpICYmIChkLmxhbmVzID0gYyk7CiAgICAgICAgZC5yZXR1cm4gPSBiOwogICAgICAgIGQuc2libGluZyA9IG51bGw7CiAgICAgICAgbnVsbCAhPT0gYSAmJiAoYyA9IGIuZGVsZXRpb25zLCBudWxsID09PSBjID8gKGIuZGVsZXRpb25zID0gW2FdLCBiLmZsYWdzIHw9IDE2KSA6IGMucHVzaChhKSk7CiAgICAgICAgYi5jaGlsZCA9IGQ7CiAgICAgICAgYi5tZW1vaXplZFN0YXRlID0gbnVsbDsKICAgICAgICByZXR1cm4gZDsKICAgICAgfQogICAgICBmdW5jdGlvbiBxaihhLCBiKSB7CiAgICAgICAgYiA9IHBqKHsgbW9kZTogInZpc2libGUiLCBjaGlsZHJlbjogYiB9LCBhLm1vZGUsIDAsIG51bGwpOwogICAgICAgIGIucmV0dXJuID0gYTsKICAgICAgICByZXR1cm4gYS5jaGlsZCA9IGI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc2ooYSwgYiwgYywgZCkgewogICAgICAgIG51bGwgIT09IGQgJiYgSmcoZCk7CiAgICAgICAgVWcoYiwgYS5jaGlsZCwgbnVsbCwgYyk7CiAgICAgICAgYSA9IHFqKGIsIGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuKTsKICAgICAgICBhLmZsYWdzIHw9IDI7CiAgICAgICAgYi5tZW1vaXplZFN0YXRlID0gbnVsbDsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiByaihhLCBiLCBjLCBkLCBlLCBmLCBnKSB7CiAgICAgICAgaWYgKGMpIHsKICAgICAgICAgIGlmIChiLmZsYWdzICYgMjU2KQogICAgICAgICAgICByZXR1cm4gYi5mbGFncyAmPSAtMjU3LCBkID0gS2koRXJyb3IocCg0MjIpKSksIHNqKGEsIGIsIGcsIGQpOwogICAgICAgICAgaWYgKG51bGwgIT09IGIubWVtb2l6ZWRTdGF0ZSkKICAgICAgICAgICAgcmV0dXJuIGIuY2hpbGQgPSBhLmNoaWxkLCBiLmZsYWdzIHw9IDEyOCwgbnVsbDsKICAgICAgICAgIGYgPSBkLmZhbGxiYWNrOwogICAgICAgICAgZSA9IGIubW9kZTsKICAgICAgICAgIGQgPSBwaih7IG1vZGU6ICJ2aXNpYmxlIiwgY2hpbGRyZW46IGQuY2hpbGRyZW4gfSwgZSwgMCwgbnVsbCk7CiAgICAgICAgICBmID0gVGcoZiwgZSwgZywgbnVsbCk7CiAgICAgICAgICBmLmZsYWdzIHw9IDI7CiAgICAgICAgICBkLnJldHVybiA9IGI7CiAgICAgICAgICBmLnJldHVybiA9IGI7CiAgICAgICAgICBkLnNpYmxpbmcgPSBmOwogICAgICAgICAgYi5jaGlsZCA9IGQ7CiAgICAgICAgICAwICE9PSAoYi5tb2RlICYgMSkgJiYgVWcoYiwgYS5jaGlsZCwgbnVsbCwgZyk7CiAgICAgICAgICBiLmNoaWxkLm1lbW9pemVkU3RhdGUgPSBuaihnKTsKICAgICAgICAgIGIubWVtb2l6ZWRTdGF0ZSA9IG1qOwogICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgfQogICAgICAgIGlmICgwID09PSAoYi5tb2RlICYgMSkpCiAgICAgICAgICByZXR1cm4gc2ooYSwgYiwgZywgbnVsbCk7CiAgICAgICAgaWYgKCIkISIgPT09IGUuZGF0YSkgewogICAgICAgICAgZCA9IGUubmV4dFNpYmxpbmcgJiYgZS5uZXh0U2libGluZy5kYXRhc2V0OwogICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgIHZhciBoID0gZC5kZ3N0OwogICAgICAgICAgZCA9IGg7CiAgICAgICAgICBmID0gRXJyb3IocCg0MTkpKTsKICAgICAgICAgIGQgPSBLaShmLCBkLCB2b2lkIDApOwogICAgICAgICAgcmV0dXJuIHNqKGEsIGIsIGcsIGQpOwogICAgICAgIH0KICAgICAgICBoID0gMCAhPT0gKGcgJiBhLmNoaWxkTGFuZXMpOwogICAgICAgIGlmIChkaCB8fCBoKSB7CiAgICAgICAgICBkID0gUTsKICAgICAgICAgIGlmIChudWxsICE9PSBkKSB7CiAgICAgICAgICAgIHN3aXRjaCAoZyAmIC1nKSB7CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgZSA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgZSA9IDg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDY0OgogICAgICAgICAgICAgIGNhc2UgMTI4OgogICAgICAgICAgICAgIGNhc2UgMjU2OgogICAgICAgICAgICAgIGNhc2UgNTEyOgogICAgICAgICAgICAgIGNhc2UgMTAyNDoKICAgICAgICAgICAgICBjYXNlIDIwNDg6CiAgICAgICAgICAgICAgY2FzZSA0MDk2OgogICAgICAgICAgICAgIGNhc2UgODE5MjoKICAgICAgICAgICAgICBjYXNlIDE2Mzg0OgogICAgICAgICAgICAgIGNhc2UgMzI3Njg6CiAgICAgICAgICAgICAgY2FzZSA2NTUzNjoKICAgICAgICAgICAgICBjYXNlIDEzMTA3MjoKICAgICAgICAgICAgICBjYXNlIDI2MjE0NDoKICAgICAgICAgICAgICBjYXNlIDUyNDI4ODoKICAgICAgICAgICAgICBjYXNlIDEwNDg1NzY6CiAgICAgICAgICAgICAgY2FzZSAyMDk3MTUyOgogICAgICAgICAgICAgIGNhc2UgNDE5NDMwNDoKICAgICAgICAgICAgICBjYXNlIDgzODg2MDg6CiAgICAgICAgICAgICAgY2FzZSAxNjc3NzIxNjoKICAgICAgICAgICAgICBjYXNlIDMzNTU0NDMyOgogICAgICAgICAgICAgIGNhc2UgNjcxMDg4NjQ6CiAgICAgICAgICAgICAgICBlID0gMzI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDUzNjg3MDkxMjoKICAgICAgICAgICAgICAgIGUgPSAyNjg0MzU0NTY7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZSA9IDAgIT09IChlICYgKGQuc3VzcGVuZGVkTGFuZXMgfCBnKSkgPyAwIDogZTsKICAgICAgICAgICAgMCAhPT0gZSAmJiBlICE9PSBmLnJldHJ5TGFuZSAmJiAoZi5yZXRyeUxhbmUgPSBlLCBpaChhLCBlKSwgZ2koZCwgYSwgZSwgLTEpKTsKICAgICAgICAgIH0KICAgICAgICAgIHRqKCk7CiAgICAgICAgICBkID0gS2koRXJyb3IocCg0MjEpKSk7CiAgICAgICAgICByZXR1cm4gc2ooYSwgYiwgZywgZCk7CiAgICAgICAgfQogICAgICAgIGlmICgiJD8iID09PSBlLmRhdGEpCiAgICAgICAgICByZXR1cm4gYi5mbGFncyB8PSAxMjgsIGIuY2hpbGQgPSBhLmNoaWxkLCBiID0gdWouYmluZChudWxsLCBhKSwgZS5fcmVhY3RSZXRyeSA9IGIsIG51bGw7CiAgICAgICAgYSA9IGYudHJlZUNvbnRleHQ7CiAgICAgICAgeWcgPSBMZihlLm5leHRTaWJsaW5nKTsKICAgICAgICB4ZyA9IGI7CiAgICAgICAgSSA9IHRydWU7CiAgICAgICAgemcgPSBudWxsOwogICAgICAgIG51bGwgIT09IGEgJiYgKG9nW3BnKytdID0gcmcsIG9nW3BnKytdID0gc2csIG9nW3BnKytdID0gcWcsIHJnID0gYS5pZCwgc2cgPSBhLm92ZXJmbG93LCBxZyA9IGIpOwogICAgICAgIGIgPSBxaihiLCBkLmNoaWxkcmVuKTsKICAgICAgICBiLmZsYWdzIHw9IDQwOTY7CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdmooYSwgYiwgYykgewogICAgICAgIGEubGFuZXMgfD0gYjsKICAgICAgICB2YXIgZCA9IGEuYWx0ZXJuYXRlOwogICAgICAgIG51bGwgIT09IGQgJiYgKGQubGFuZXMgfD0gYik7CiAgICAgICAgYmgoYS5yZXR1cm4sIGIsIGMpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHdqKGEsIGIsIGMsIGQsIGUpIHsKICAgICAgICB2YXIgZiA9IGEubWVtb2l6ZWRTdGF0ZTsKICAgICAgICBudWxsID09PSBmID8gYS5tZW1vaXplZFN0YXRlID0geyBpc0JhY2t3YXJkczogYiwgcmVuZGVyaW5nOiBudWxsLCByZW5kZXJpbmdTdGFydFRpbWU6IDAsIGxhc3Q6IGQsIHRhaWw6IGMsIHRhaWxNb2RlOiBlIH0gOiAoZi5pc0JhY2t3YXJkcyA9IGIsIGYucmVuZGVyaW5nID0gbnVsbCwgZi5yZW5kZXJpbmdTdGFydFRpbWUgPSAwLCBmLmxhc3QgPSBkLCBmLnRhaWwgPSBjLCBmLnRhaWxNb2RlID0gZSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24geGooYSwgYiwgYykgewogICAgICAgIHZhciBkID0gYi5wZW5kaW5nUHJvcHMsIGUgPSBkLnJldmVhbE9yZGVyLCBmID0gZC50YWlsOwogICAgICAgIFhpKGEsIGIsIGQuY2hpbGRyZW4sIGMpOwogICAgICAgIGQgPSBMLmN1cnJlbnQ7CiAgICAgICAgaWYgKDAgIT09IChkICYgMikpCiAgICAgICAgICBkID0gZCAmIDEgfCAyLCBiLmZsYWdzIHw9IDEyODsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChudWxsICE9PSBhICYmIDAgIT09IChhLmZsYWdzICYgMTI4KSkKICAgICAgICAgICAgYToKICAgICAgICAgICAgICBmb3IgKGEgPSBiLmNoaWxkOyBudWxsICE9PSBhOyApIHsKICAgICAgICAgICAgICAgIGlmICgxMyA9PT0gYS50YWcpCiAgICAgICAgICAgICAgICAgIG51bGwgIT09IGEubWVtb2l6ZWRTdGF0ZSAmJiB2aihhLCBjLCBiKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKDE5ID09PSBhLnRhZykKICAgICAgICAgICAgICAgICAgdmooYSwgYywgYik7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChudWxsICE9PSBhLmNoaWxkKSB7CiAgICAgICAgICAgICAgICAgIGEuY2hpbGQucmV0dXJuID0gYTsKICAgICAgICAgICAgICAgICAgYSA9IGEuY2hpbGQ7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpCiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICBmb3IgKDsgbnVsbCA9PT0gYS5zaWJsaW5nOyApIHsKICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGEucmV0dXJuIHx8IGEucmV0dXJuID09PSBiKQogICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgIGEgPSBhLnJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEuc2libGluZy5yZXR1cm4gPSBhLnJldHVybjsKICAgICAgICAgICAgICAgIGEgPSBhLnNpYmxpbmc7CiAgICAgICAgICAgICAgfQogICAgICAgICAgZCAmPSAxOwogICAgICAgIH0KICAgICAgICBHKEwsIGQpOwogICAgICAgIGlmICgwID09PSAoYi5tb2RlICYgMSkpCiAgICAgICAgICBiLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgICAgIGVsc2UKICAgICAgICAgIHN3aXRjaCAoZSkgewogICAgICAgICAgICBjYXNlICJmb3J3YXJkcyI6CiAgICAgICAgICAgICAgYyA9IGIuY2hpbGQ7CiAgICAgICAgICAgICAgZm9yIChlID0gbnVsbDsgbnVsbCAhPT0gYzsgKQogICAgICAgICAgICAgICAgYSA9IGMuYWx0ZXJuYXRlLCBudWxsICE9PSBhICYmIG51bGwgPT09IENoKGEpICYmIChlID0gYyksIGMgPSBjLnNpYmxpbmc7CiAgICAgICAgICAgICAgYyA9IGU7CiAgICAgICAgICAgICAgbnVsbCA9PT0gYyA/IChlID0gYi5jaGlsZCwgYi5jaGlsZCA9IG51bGwpIDogKGUgPSBjLnNpYmxpbmcsIGMuc2libGluZyA9IG51bGwpOwogICAgICAgICAgICAgIHdqKGIsIGZhbHNlLCBlLCBjLCBmKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiYmFja3dhcmRzIjoKICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgICBlID0gYi5jaGlsZDsKICAgICAgICAgICAgICBmb3IgKGIuY2hpbGQgPSBudWxsOyBudWxsICE9PSBlOyApIHsKICAgICAgICAgICAgICAgIGEgPSBlLmFsdGVybmF0ZTsKICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBhICYmIG51bGwgPT09IENoKGEpKSB7CiAgICAgICAgICAgICAgICAgIGIuY2hpbGQgPSBlOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEgPSBlLnNpYmxpbmc7CiAgICAgICAgICAgICAgICBlLnNpYmxpbmcgPSBjOwogICAgICAgICAgICAgICAgYyA9IGU7CiAgICAgICAgICAgICAgICBlID0gYTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd2ooYiwgdHJ1ZSwgYywgbnVsbCwgZik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRvZ2V0aGVyIjoKICAgICAgICAgICAgICB3aihiLCBmYWxzZSwgbnVsbCwgbnVsbCwgdm9pZCAwKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBiLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIHJldHVybiBiLmNoaWxkOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGlqKGEsIGIpIHsKICAgICAgICAwID09PSAoYi5tb2RlICYgMSkgJiYgbnVsbCAhPT0gYSAmJiAoYS5hbHRlcm5hdGUgPSBudWxsLCBiLmFsdGVybmF0ZSA9IG51bGwsIGIuZmxhZ3MgfD0gMik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gWmkoYSwgYiwgYykgewogICAgICAgIG51bGwgIT09IGEgJiYgKGIuZGVwZW5kZW5jaWVzID0gYS5kZXBlbmRlbmNpZXMpOwogICAgICAgIHJoIHw9IGIubGFuZXM7CiAgICAgICAgaWYgKDAgPT09IChjICYgYi5jaGlsZExhbmVzKSkKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGlmIChudWxsICE9PSBhICYmIGIuY2hpbGQgIT09IGEuY2hpbGQpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDE1MykpOwogICAgICAgIGlmIChudWxsICE9PSBiLmNoaWxkKSB7CiAgICAgICAgICBhID0gYi5jaGlsZDsKICAgICAgICAgIGMgPSBQZyhhLCBhLnBlbmRpbmdQcm9wcyk7CiAgICAgICAgICBiLmNoaWxkID0gYzsKICAgICAgICAgIGZvciAoYy5yZXR1cm4gPSBiOyBudWxsICE9PSBhLnNpYmxpbmc7ICkKICAgICAgICAgICAgYSA9IGEuc2libGluZywgYyA9IGMuc2libGluZyA9IFBnKGEsIGEucGVuZGluZ1Byb3BzKSwgYy5yZXR1cm4gPSBiOwogICAgICAgICAgYy5zaWJsaW5nID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGIuY2hpbGQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24geWooYSwgYiwgYykgewogICAgICAgIHN3aXRjaCAoYi50YWcpIHsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAga2ooYik7CiAgICAgICAgICAgIElnKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBBaChiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIFpmKGIudHlwZSkgJiYgY2coYik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICB5aChiLCBiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICB2YXIgZCA9IGIudHlwZS5fY29udGV4dCwgZSA9IGIubWVtb2l6ZWRQcm9wcy52YWx1ZTsKICAgICAgICAgICAgRyhXZywgZC5fY3VycmVudFZhbHVlKTsKICAgICAgICAgICAgZC5fY3VycmVudFZhbHVlID0gZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBkID0gYi5tZW1vaXplZFN0YXRlOwogICAgICAgICAgICBpZiAobnVsbCAhPT0gZCkgewogICAgICAgICAgICAgIGlmIChudWxsICE9PSBkLmRlaHlkcmF0ZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gRyhMLCBMLmN1cnJlbnQgJiAxKSwgYi5mbGFncyB8PSAxMjgsIG51bGw7CiAgICAgICAgICAgICAgaWYgKDAgIT09IChjICYgYi5jaGlsZC5jaGlsZExhbmVzKSkKICAgICAgICAgICAgICAgIHJldHVybiBvaihhLCBiLCBjKTsKICAgICAgICAgICAgICBHKEwsIEwuY3VycmVudCAmIDEpOwogICAgICAgICAgICAgIGEgPSBaaShhLCBiLCBjKTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gYSA/IGEuc2libGluZyA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgRyhMLCBMLmN1cnJlbnQgJiAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICBkID0gMCAhPT0gKGMgJiBiLmNoaWxkTGFuZXMpOwogICAgICAgICAgICBpZiAoMCAhPT0gKGEuZmxhZ3MgJiAxMjgpKSB7CiAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICByZXR1cm4geGooYSwgYiwgYyk7CiAgICAgICAgICAgICAgYi5mbGFncyB8PSAxMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZSA9IGIubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgICAgbnVsbCAhPT0gZSAmJiAoZS5yZW5kZXJpbmcgPSBudWxsLCBlLnRhaWwgPSBudWxsLCBlLmxhc3RFZmZlY3QgPSBudWxsKTsKICAgICAgICAgICAgRyhMLCBMLmN1cnJlbnQpOwogICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgIHJldHVybiBiLmxhbmVzID0gMCwgZGooYSwgYiwgYyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBaaShhLCBiLCBjKTsKICAgICAgfQogICAgICB2YXIgemo7CiAgICAgIHZhciBBajsKICAgICAgdmFyIEJqOwogICAgICB2YXIgQ2o7CiAgICAgIHpqID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgIGZvciAodmFyIGMgPSBiLmNoaWxkOyBudWxsICE9PSBjOyApIHsKICAgICAgICAgIGlmICg1ID09PSBjLnRhZyB8fCA2ID09PSBjLnRhZykKICAgICAgICAgICAgYS5hcHBlbmRDaGlsZChjLnN0YXRlTm9kZSk7CiAgICAgICAgICBlbHNlIGlmICg0ICE9PSBjLnRhZyAmJiBudWxsICE9PSBjLmNoaWxkKSB7CiAgICAgICAgICAgIGMuY2hpbGQucmV0dXJuID0gYzsKICAgICAgICAgICAgYyA9IGMuY2hpbGQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGMgPT09IGIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZm9yICg7IG51bGwgPT09IGMuc2libGluZzsgKSB7CiAgICAgICAgICAgIGlmIChudWxsID09PSBjLnJldHVybiB8fCBjLnJldHVybiA9PT0gYikKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGMgPSBjLnJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGMuc2libGluZy5yZXR1cm4gPSBjLnJldHVybjsKICAgICAgICAgIGMgPSBjLnNpYmxpbmc7CiAgICAgICAgfQogICAgICB9OwogICAgICBBaiA9IGZ1bmN0aW9uKCkgewogICAgICB9OwogICAgICBCaiA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHsKICAgICAgICB2YXIgZSA9IGEubWVtb2l6ZWRQcm9wczsKICAgICAgICBpZiAoZSAhPT0gZCkgewogICAgICAgICAgYSA9IGIuc3RhdGVOb2RlOwogICAgICAgICAgeGgodWguY3VycmVudCk7CiAgICAgICAgICB2YXIgZiA9IG51bGw7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgICAgIGUgPSBZYShhLCBlKTsKICAgICAgICAgICAgICBkID0gWWEoYSwgZCk7CiAgICAgICAgICAgICAgZiA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJzZWxlY3QiOgogICAgICAgICAgICAgIGUgPSBBKHt9LCBlLCB7IHZhbHVlOiB2b2lkIDAgfSk7CiAgICAgICAgICAgICAgZCA9IEEoe30sIGQsIHsgdmFsdWU6IHZvaWQgMCB9KTsKICAgICAgICAgICAgICBmID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInRleHRhcmVhIjoKICAgICAgICAgICAgICBlID0gZ2IoYSwgZSk7CiAgICAgICAgICAgICAgZCA9IGdiKGEsIGQpOwogICAgICAgICAgICAgIGYgPSBbXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAiZnVuY3Rpb24iICE9PSB0eXBlb2YgZS5vbkNsaWNrICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBkLm9uQ2xpY2sgJiYgKGEub25jbGljayA9IEJmKTsKICAgICAgICAgIH0KICAgICAgICAgIHViKGMsIGQpOwogICAgICAgICAgdmFyIGc7CiAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgIGZvciAobCBpbiBlKQogICAgICAgICAgICBpZiAoIWQuaGFzT3duUHJvcGVydHkobCkgJiYgZS5oYXNPd25Qcm9wZXJ0eShsKSAmJiBudWxsICE9IGVbbF0pCiAgICAgICAgICAgICAgaWYgKCJzdHlsZSIgPT09IGwpIHsKICAgICAgICAgICAgICAgIHZhciBoID0gZVtsXTsKICAgICAgICAgICAgICAgIGZvciAoZyBpbiBoKQogICAgICAgICAgICAgICAgICBoLmhhc093blByb3BlcnR5KGcpICYmIChjIHx8IChjID0ge30pLCBjW2ddID0gIiIpOwogICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiAhPT0gbCAmJiAiY2hpbGRyZW4iICE9PSBsICYmICJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciICE9PSBsICYmICJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciICE9PSBsICYmICJhdXRvRm9jdXMiICE9PSBsICYmIChlYS5oYXNPd25Qcm9wZXJ0eShsKSA/IGYgfHwgKGYgPSBbXSkgOiAoZiA9IGYgfHwgW10pLnB1c2gobCwgbnVsbCkpOwogICAgICAgICAgZm9yIChsIGluIGQpIHsKICAgICAgICAgICAgdmFyIGsgPSBkW2xdOwogICAgICAgICAgICBoID0gbnVsbCAhPSBlID8gZVtsXSA6IHZvaWQgMDsKICAgICAgICAgICAgaWYgKGQuaGFzT3duUHJvcGVydHkobCkgJiYgayAhPT0gaCAmJiAobnVsbCAhPSBrIHx8IG51bGwgIT0gaCkpCiAgICAgICAgICAgICAgaWYgKCJzdHlsZSIgPT09IGwpCiAgICAgICAgICAgICAgICBpZiAoaCkgewogICAgICAgICAgICAgICAgICBmb3IgKGcgaW4gaCkKICAgICAgICAgICAgICAgICAgICAhaC5oYXNPd25Qcm9wZXJ0eShnKSB8fCBrICYmIGsuaGFzT3duUHJvcGVydHkoZykgfHwgKGMgfHwgKGMgPSB7fSksIGNbZ10gPSAiIik7CiAgICAgICAgICAgICAgICAgIGZvciAoZyBpbiBrKQogICAgICAgICAgICAgICAgICAgIGsuaGFzT3duUHJvcGVydHkoZykgJiYgaFtnXSAhPT0ga1tnXSAmJiAoYyB8fCAoYyA9IHt9KSwgY1tnXSA9IGtbZ10pOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIGMgfHwgKGYgfHwgKGYgPSBbXSksIGYucHVzaCgKICAgICAgICAgICAgICAgICAgICBsLAogICAgICAgICAgICAgICAgICAgIGMKICAgICAgICAgICAgICAgICAgKSksIGMgPSBrOwogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICJkYW5nZXJvdXNseVNldElubmVySFRNTCIgPT09IGwgPyAoayA9IGsgPyBrLl9faHRtbCA6IHZvaWQgMCwgaCA9IGggPyBoLl9faHRtbCA6IHZvaWQgMCwgbnVsbCAhPSBrICYmIGggIT09IGsgJiYgKGYgPSBmIHx8IFtdKS5wdXNoKGwsIGspKSA6ICJjaGlsZHJlbiIgPT09IGwgPyAic3RyaW5nIiAhPT0gdHlwZW9mIGsgJiYgIm51bWJlciIgIT09IHR5cGVvZiBrIHx8IChmID0gZiB8fCBbXSkucHVzaChsLCAiIiArIGspIDogInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIgIT09IGwgJiYgInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyIgIT09IGwgJiYgKGVhLmhhc093blByb3BlcnR5KGwpID8gKG51bGwgIT0gayAmJiAib25TY3JvbGwiID09PSBsICYmIEQoInNjcm9sbCIsIGEpLCBmIHx8IGggPT09IGsgfHwgKGYgPSBbXSkpIDogKGYgPSBmIHx8IFtdKS5wdXNoKGwsIGspKTsKICAgICAgICAgIH0KICAgICAgICAgIGMgJiYgKGYgPSBmIHx8IFtdKS5wdXNoKCJzdHlsZSIsIGMpOwogICAgICAgICAgdmFyIGwgPSBmOwogICAgICAgICAgaWYgKGIudXBkYXRlUXVldWUgPSBsKQogICAgICAgICAgICBiLmZsYWdzIHw9IDQ7CiAgICAgICAgfQogICAgICB9OwogICAgICBDaiA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHsKICAgICAgICBjICE9PSBkICYmIChiLmZsYWdzIHw9IDQpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBEaihhLCBiKSB7CiAgICAgICAgaWYgKCFJKQogICAgICAgICAgc3dpdGNoIChhLnRhaWxNb2RlKSB7CiAgICAgICAgICAgIGNhc2UgImhpZGRlbiI6CiAgICAgICAgICAgICAgYiA9IGEudGFpbDsKICAgICAgICAgICAgICBmb3IgKHZhciBjID0gbnVsbDsgbnVsbCAhPT0gYjsgKQogICAgICAgICAgICAgICAgbnVsbCAhPT0gYi5hbHRlcm5hdGUgJiYgKGMgPSBiKSwgYiA9IGIuc2libGluZzsKICAgICAgICAgICAgICBudWxsID09PSBjID8gYS50YWlsID0gbnVsbCA6IGMuc2libGluZyA9IG51bGw7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImNvbGxhcHNlZCI6CiAgICAgICAgICAgICAgYyA9IGEudGFpbDsKICAgICAgICAgICAgICBmb3IgKHZhciBkID0gbnVsbDsgbnVsbCAhPT0gYzsgKQogICAgICAgICAgICAgICAgbnVsbCAhPT0gYy5hbHRlcm5hdGUgJiYgKGQgPSBjKSwgYyA9IGMuc2libGluZzsKICAgICAgICAgICAgICBudWxsID09PSBkID8gYiB8fCBudWxsID09PSBhLnRhaWwgPyBhLnRhaWwgPSBudWxsIDogYS50YWlsLnNpYmxpbmcgPSBudWxsIDogZC5zaWJsaW5nID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBTKGEpIHsKICAgICAgICB2YXIgYiA9IG51bGwgIT09IGEuYWx0ZXJuYXRlICYmIGEuYWx0ZXJuYXRlLmNoaWxkID09PSBhLmNoaWxkLCBjID0gMCwgZCA9IDA7CiAgICAgICAgaWYgKGIpCiAgICAgICAgICBmb3IgKHZhciBlID0gYS5jaGlsZDsgbnVsbCAhPT0gZTsgKQogICAgICAgICAgICBjIHw9IGUubGFuZXMgfCBlLmNoaWxkTGFuZXMsIGQgfD0gZS5zdWJ0cmVlRmxhZ3MgJiAxNDY4MDA2NCwgZCB8PSBlLmZsYWdzICYgMTQ2ODAwNjQsIGUucmV0dXJuID0gYSwgZSA9IGUuc2libGluZzsKICAgICAgICBlbHNlCiAgICAgICAgICBmb3IgKGUgPSBhLmNoaWxkOyBudWxsICE9PSBlOyApCiAgICAgICAgICAgIGMgfD0gZS5sYW5lcyB8IGUuY2hpbGRMYW5lcywgZCB8PSBlLnN1YnRyZWVGbGFncywgZCB8PSBlLmZsYWdzLCBlLnJldHVybiA9IGEsIGUgPSBlLnNpYmxpbmc7CiAgICAgICAgYS5zdWJ0cmVlRmxhZ3MgfD0gZDsKICAgICAgICBhLmNoaWxkTGFuZXMgPSBjOwogICAgICAgIHJldHVybiBiOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEVqKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IGIucGVuZGluZ1Byb3BzOwogICAgICAgIHdnKGIpOwogICAgICAgIHN3aXRjaCAoYi50YWcpIHsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICByZXR1cm4gUyhiKSwgbnVsbDsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcmV0dXJuIFpmKGIudHlwZSkgJiYgJGYoKSwgUyhiKSwgbnVsbDsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgZCA9IGIuc3RhdGVOb2RlOwogICAgICAgICAgICB6aCgpOwogICAgICAgICAgICBFKFdmKTsKICAgICAgICAgICAgRShIKTsKICAgICAgICAgICAgRWgoKTsKICAgICAgICAgICAgZC5wZW5kaW5nQ29udGV4dCAmJiAoZC5jb250ZXh0ID0gZC5wZW5kaW5nQ29udGV4dCwgZC5wZW5kaW5nQ29udGV4dCA9IG51bGwpOwogICAgICAgICAgICBpZiAobnVsbCA9PT0gYSB8fCBudWxsID09PSBhLmNoaWxkKQogICAgICAgICAgICAgIEdnKGIpID8gYi5mbGFncyB8PSA0IDogbnVsbCA9PT0gYSB8fCBhLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkICYmIDAgPT09IChiLmZsYWdzICYgMjU2KSB8fCAoYi5mbGFncyB8PSAxMDI0LCBudWxsICE9PSB6ZyAmJiAoRmooemcpLCB6ZyA9IG51bGwpKTsKICAgICAgICAgICAgQWooYSwgYik7CiAgICAgICAgICAgIFMoYik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBCaChiKTsKICAgICAgICAgICAgdmFyIGUgPSB4aCh3aC5jdXJyZW50KTsKICAgICAgICAgICAgYyA9IGIudHlwZTsKICAgICAgICAgICAgaWYgKG51bGwgIT09IGEgJiYgbnVsbCAhPSBiLnN0YXRlTm9kZSkKICAgICAgICAgICAgICBCaihhLCBiLCBjLCBkLCBlKSwgYS5yZWYgIT09IGIucmVmICYmIChiLmZsYWdzIHw9IDUxMiwgYi5mbGFncyB8PSAyMDk3MTUyKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgaWYgKCFkKSB7CiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gYi5zdGF0ZU5vZGUpCiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMTY2KSk7CiAgICAgICAgICAgICAgICBTKGIpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGEgPSB4aCh1aC5jdXJyZW50KTsKICAgICAgICAgICAgICBpZiAoR2coYikpIHsKICAgICAgICAgICAgICAgIGQgPSBiLnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgIGMgPSBiLnR5cGU7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGIubWVtb2l6ZWRQcm9wczsKICAgICAgICAgICAgICAgIGRbT2ZdID0gYjsKICAgICAgICAgICAgICAgIGRbUGZdID0gZjsKICAgICAgICAgICAgICAgIGEgPSAwICE9PSAoYi5tb2RlICYgMSk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAiZGlhbG9nIjoKICAgICAgICAgICAgICAgICAgICBEKCJjYW5jZWwiLCBkKTsKICAgICAgICAgICAgICAgICAgICBEKCJjbG9zZSIsIGQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlICJpZnJhbWUiOgogICAgICAgICAgICAgICAgICBjYXNlICJvYmplY3QiOgogICAgICAgICAgICAgICAgICBjYXNlICJlbWJlZCI6CiAgICAgICAgICAgICAgICAgICAgRCgibG9hZCIsIGQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlICJ2aWRlbyI6CiAgICAgICAgICAgICAgICAgIGNhc2UgImF1ZGlvIjoKICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgbGYubGVuZ3RoOyBlKyspCiAgICAgICAgICAgICAgICAgICAgICBEKGxmW2VdLCBkKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSAic291cmNlIjoKICAgICAgICAgICAgICAgICAgICBEKCJlcnJvciIsIGQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlICJpbWciOgogICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZSI6CiAgICAgICAgICAgICAgICAgIGNhc2UgImxpbmsiOgogICAgICAgICAgICAgICAgICAgIEQoCiAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgZAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgRCgibG9hZCIsIGQpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlICJkZXRhaWxzIjoKICAgICAgICAgICAgICAgICAgICBEKCJ0b2dnbGUiLCBkKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgICAgICAgICAgIFphKGQsIGYpOwogICAgICAgICAgICAgICAgICAgIEQoImludmFsaWQiLCBkKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSAic2VsZWN0IjoKICAgICAgICAgICAgICAgICAgICBkLl93cmFwcGVyU3RhdGUgPSB7IHdhc011bHRpcGxlOiAhIWYubXVsdGlwbGUgfTsKICAgICAgICAgICAgICAgICAgICBEKCJpbnZhbGlkIiwgZCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgInRleHRhcmVhIjoKICAgICAgICAgICAgICAgICAgICBoYihkLCBmKSwgRCgiaW52YWxpZCIsIGQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdWIoYywgZik7CiAgICAgICAgICAgICAgICBlID0gbnVsbDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGcgaW4gZikKICAgICAgICAgICAgICAgICAgaWYgKGYuaGFzT3duUHJvcGVydHkoZykpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGZbZ107CiAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuIiA9PT0gZyA/ICJzdHJpbmciID09PSB0eXBlb2YgaCA/IGQudGV4dENvbnRlbnQgIT09IGggJiYgKHRydWUgIT09IGYuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nICYmIEFmKGQudGV4dENvbnRlbnQsIGgsIGEpLCBlID0gWyJjaGlsZHJlbiIsIGhdKSA6ICJudW1iZXIiID09PSB0eXBlb2YgaCAmJiBkLnRleHRDb250ZW50ICE9PSAiIiArIGggJiYgKHRydWUgIT09IGYuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nICYmIEFmKAogICAgICAgICAgICAgICAgICAgICAgZC50ZXh0Q29udGVudCwKICAgICAgICAgICAgICAgICAgICAgIGgsCiAgICAgICAgICAgICAgICAgICAgICBhCiAgICAgICAgICAgICAgICAgICAgKSwgZSA9IFsiY2hpbGRyZW4iLCAiIiArIGhdKSA6IGVhLmhhc093blByb3BlcnR5KGcpICYmIG51bGwgIT0gaCAmJiAib25TY3JvbGwiID09PSBnICYmIEQoInNjcm9sbCIsIGQpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgICAgICAgICAgIFZhKGQpOwogICAgICAgICAgICAgICAgICAgIGRiKGQsIGYsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlICJ0ZXh0YXJlYSI6CiAgICAgICAgICAgICAgICAgICAgVmEoZCk7CiAgICAgICAgICAgICAgICAgICAgamIoZCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgICAgICAgICAgIGNhc2UgIm9wdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGYub25DbGljayAmJiAoZC5vbmNsaWNrID0gQmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZCA9IGU7CiAgICAgICAgICAgICAgICBiLnVwZGF0ZVF1ZXVlID0gZDsKICAgICAgICAgICAgICAgIG51bGwgIT09IGQgJiYgKGIuZmxhZ3MgfD0gNCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGcgPSA5ID09PSBlLm5vZGVUeXBlID8gZSA6IGUub3duZXJEb2N1bWVudDsKICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiA9PT0gYSAmJiAoYSA9IGtiKGMpKTsKICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiA9PT0gYSA/ICJzY3JpcHQiID09PSBjID8gKGEgPSBnLmNyZWF0ZUVsZW1lbnQoImRpdiIpLCBhLmlubmVySFRNTCA9ICI8c2NyaXB0PjxcL3NjcmlwdD4iLCBhID0gYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpKSA6ICJzdHJpbmciID09PSB0eXBlb2YgZC5pcyA/IGEgPSBnLmNyZWF0ZUVsZW1lbnQoYywgeyBpczogZC5pcyB9KSA6IChhID0gZy5jcmVhdGVFbGVtZW50KGMpLCAic2VsZWN0IiA9PT0gYyAmJiAoZyA9IGEsIGQubXVsdGlwbGUgPyBnLm11bHRpcGxlID0gdHJ1ZSA6IGQuc2l6ZSAmJiAoZy5zaXplID0gZC5zaXplKSkpIDogYSA9IGcuY3JlYXRlRWxlbWVudE5TKGEsIGMpOwogICAgICAgICAgICAgICAgYVtPZl0gPSBiOwogICAgICAgICAgICAgICAgYVtQZl0gPSBkOwogICAgICAgICAgICAgICAgemooYSwgYiwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGIuc3RhdGVOb2RlID0gYTsKICAgICAgICAgICAgICAgIGE6IHsKICAgICAgICAgICAgICAgICAgZyA9IHZiKGMsIGQpOwogICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJkaWFsb2ciOgogICAgICAgICAgICAgICAgICAgICAgRCgiY2FuY2VsIiwgYSk7CiAgICAgICAgICAgICAgICAgICAgICBEKCJjbG9zZSIsIGEpOwogICAgICAgICAgICAgICAgICAgICAgZSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJpZnJhbWUiOgogICAgICAgICAgICAgICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW1iZWQiOgogICAgICAgICAgICAgICAgICAgICAgRCgibG9hZCIsIGEpOwogICAgICAgICAgICAgICAgICAgICAgZSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ2aWRlbyI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiYXVkaW8iOgogICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gMDsgZSA8IGxmLmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICBEKGxmW2VdLCBhKTsKICAgICAgICAgICAgICAgICAgICAgIGUgPSBkOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAic291cmNlIjoKICAgICAgICAgICAgICAgICAgICAgIEQoImVycm9yIiwgYSk7CiAgICAgICAgICAgICAgICAgICAgICBlID0gZDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgImltZyI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaW1hZ2UiOgogICAgICAgICAgICAgICAgICAgIGNhc2UgImxpbmsiOgogICAgICAgICAgICAgICAgICAgICAgRCgKICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgYQogICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgIEQoImxvYWQiLCBhKTsKICAgICAgICAgICAgICAgICAgICAgIGUgPSBkOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGV0YWlscyI6CiAgICAgICAgICAgICAgICAgICAgICBEKCJ0b2dnbGUiLCBhKTsKICAgICAgICAgICAgICAgICAgICAgIGUgPSBkOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgICAgICAgICAgICAgWmEoYSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICBlID0gWWEoYSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICBEKCJpbnZhbGlkIiwgYSk7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJvcHRpb24iOgogICAgICAgICAgICAgICAgICAgICAgZSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJzZWxlY3QiOgogICAgICAgICAgICAgICAgICAgICAgYS5fd3JhcHBlclN0YXRlID0geyB3YXNNdWx0aXBsZTogISFkLm11bHRpcGxlIH07CiAgICAgICAgICAgICAgICAgICAgICBlID0gQSh7fSwgZCwgeyB2YWx1ZTogdm9pZCAwIH0pOwogICAgICAgICAgICAgICAgICAgICAgRCgiaW52YWxpZCIsIGEpOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAidGV4dGFyZWEiOgogICAgICAgICAgICAgICAgICAgICAgaGIoYSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICBlID0gZ2IoYSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICBEKCJpbnZhbGlkIiwgYSk7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgZSA9IGQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdWIoYywgZSk7CiAgICAgICAgICAgICAgICAgIGggPSBlOwogICAgICAgICAgICAgICAgICBmb3IgKGYgaW4gaCkKICAgICAgICAgICAgICAgICAgICBpZiAoaC5oYXNPd25Qcm9wZXJ0eShmKSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBoW2ZdOwogICAgICAgICAgICAgICAgICAgICAgInN0eWxlIiA9PT0gZiA/IHNiKGEsIGspIDogImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiA9PT0gZiA/IChrID0gayA/IGsuX19odG1sIDogdm9pZCAwLCBudWxsICE9IGsgJiYgbmIoYSwgaykpIDogImNoaWxkcmVuIiA9PT0gZiA/ICJzdHJpbmciID09PSB0eXBlb2YgayA/ICgidGV4dGFyZWEiICE9PSBjIHx8ICIiICE9PSBrKSAmJiBvYihhLCBrKSA6ICJudW1iZXIiID09PSB0eXBlb2YgayAmJiBvYihhLCAiIiArIGspIDogInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIgIT09IGYgJiYgInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyIgIT09IGYgJiYgImF1dG9Gb2N1cyIgIT09IGYgJiYgKGVhLmhhc093blByb3BlcnR5KGYpID8gbnVsbCAhPSBrICYmICJvblNjcm9sbCIgPT09IGYgJiYgRCgic2Nyb2xsIiwgYSkgOiBudWxsICE9IGsgJiYgdGEoYSwgZiwgaywgZykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgICAgICAgICAgICAgVmEoYSk7CiAgICAgICAgICAgICAgICAgICAgICBkYihhLCBkLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ0ZXh0YXJlYSI6CiAgICAgICAgICAgICAgICAgICAgICBWYShhKTsKICAgICAgICAgICAgICAgICAgICAgIGpiKGEpOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAib3B0aW9uIjoKICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gZC52YWx1ZSAmJiBhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCAiIiArIFNhKGQudmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgICAgICAgICAgICAgICBhLm11bHRpcGxlID0gISFkLm11bHRpcGxlOwogICAgICAgICAgICAgICAgICAgICAgZiA9IGQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IGYgPyBmYihhLCAhIWQubXVsdGlwbGUsIGYsIGZhbHNlKSA6IG51bGwgIT0gZC5kZWZhdWx0VmFsdWUgJiYgZmIoCiAgICAgICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgICAgICEhZC5tdWx0aXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZC5kZWZhdWx0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGUub25DbGljayAmJiAoYS5vbmNsaWNrID0gQmYpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgIGNhc2UgImJ1dHRvbiI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgICAgICAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAidGV4dGFyZWEiOgogICAgICAgICAgICAgICAgICAgICAgZCA9ICEhZC5hdXRvRm9jdXM7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgIGNhc2UgImltZyI6CiAgICAgICAgICAgICAgICAgICAgICBkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgIGQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZCAmJiAoYi5mbGFncyB8PSA0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbnVsbCAhPT0gYi5yZWYgJiYgKGIuZmxhZ3MgfD0gNTEyLCBiLmZsYWdzIHw9IDIwOTcxNTIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFMoYik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICBpZiAoYSAmJiBudWxsICE9IGIuc3RhdGVOb2RlKQogICAgICAgICAgICAgIENqKGEsIGIsIGEubWVtb2l6ZWRQcm9wcywgZCk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIGlmICgic3RyaW5nIiAhPT0gdHlwZW9mIGQgJiYgbnVsbCA9PT0gYi5zdGF0ZU5vZGUpCiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDE2NikpOwogICAgICAgICAgICAgIGMgPSB4aCh3aC5jdXJyZW50KTsKICAgICAgICAgICAgICB4aCh1aC5jdXJyZW50KTsKICAgICAgICAgICAgICBpZiAoR2coYikpIHsKICAgICAgICAgICAgICAgIGQgPSBiLnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgIGMgPSBiLm1lbW9pemVkUHJvcHM7CiAgICAgICAgICAgICAgICBkW09mXSA9IGI7CiAgICAgICAgICAgICAgICBpZiAoZiA9IGQubm9kZVZhbHVlICE9PSBjKSB7CiAgICAgICAgICAgICAgICAgIGlmIChhID0geGcsIG51bGwgIT09IGEpCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhLnRhZykgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICBBZihkLm5vZGVWYWx1ZSwgYywgMCAhPT0gKGEubW9kZSAmIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIT09IGEubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgJiYgQWYoZC5ub2RlVmFsdWUsIGMsIDAgIT09IChhLm1vZGUgJiAxKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZiAmJiAoYi5mbGFncyB8PSA0KTsKICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIGQgPSAoOSA9PT0gYy5ub2RlVHlwZSA/IGMgOiBjLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKGQpLCBkW09mXSA9IGIsIGIuc3RhdGVOb2RlID0gZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBTKGIpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgIEUoTCk7CiAgICAgICAgICAgIGQgPSBiLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICAgIGlmIChudWxsID09PSBhIHx8IG51bGwgIT09IGEubWVtb2l6ZWRTdGF0ZSAmJiBudWxsICE9PSBhLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCkgewogICAgICAgICAgICAgIGlmIChJICYmIG51bGwgIT09IHlnICYmIDAgIT09IChiLm1vZGUgJiAxKSAmJiAwID09PSAoYi5mbGFncyAmIDEyOCkpCiAgICAgICAgICAgICAgICBIZygpLCBJZygpLCBiLmZsYWdzIHw9IDk4NTYwLCBmID0gZmFsc2U7CiAgICAgICAgICAgICAgZWxzZSBpZiAoZiA9IEdnKGIpLCBudWxsICE9PSBkICYmIG51bGwgIT09IGQuZGVoeWRyYXRlZCkgewogICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGEpIHsKICAgICAgICAgICAgICAgICAgaWYgKCFmKQogICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzE4KSk7CiAgICAgICAgICAgICAgICAgIGYgPSBiLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICAgICAgICAgIGYgPSBudWxsICE9PSBmID8gZi5kZWh5ZHJhdGVkIDogbnVsbDsKICAgICAgICAgICAgICAgICAgaWYgKCFmKQogICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzE3KSk7CiAgICAgICAgICAgICAgICAgIGZbT2ZdID0gYjsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICBJZygpLCAwID09PSAoYi5mbGFncyAmIDEyOCkgJiYgKGIubWVtb2l6ZWRTdGF0ZSA9IG51bGwpLCBiLmZsYWdzIHw9IDQ7CiAgICAgICAgICAgICAgICBTKGIpOwogICAgICAgICAgICAgICAgZiA9IGZhbHNlOwogICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgbnVsbCAhPT0gemcgJiYgKEZqKHpnKSwgemcgPSBudWxsKSwgZiA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKCFmKQogICAgICAgICAgICAgICAgcmV0dXJuIGIuZmxhZ3MgJiA2NTUzNiA/IGIgOiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgwICE9PSAoYi5mbGFncyAmIDEyOCkpCiAgICAgICAgICAgICAgcmV0dXJuIGIubGFuZXMgPSBjLCBiOwogICAgICAgICAgICBkID0gbnVsbCAhPT0gZDsKICAgICAgICAgICAgZCAhPT0gKG51bGwgIT09IGEgJiYgbnVsbCAhPT0gYS5tZW1vaXplZFN0YXRlKSAmJiBkICYmIChiLmNoaWxkLmZsYWdzIHw9IDgxOTIsIDAgIT09IChiLm1vZGUgJiAxKSAmJiAobnVsbCA9PT0gYSB8fCAwICE9PSAoTC5jdXJyZW50ICYgMSkgPyAwID09PSBUICYmIChUID0gMykgOiB0aigpKSk7CiAgICAgICAgICAgIG51bGwgIT09IGIudXBkYXRlUXVldWUgJiYgKGIuZmxhZ3MgfD0gNCk7CiAgICAgICAgICAgIFMoYik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICByZXR1cm4gemgoKSwgQWooYSwgYiksIG51bGwgPT09IGEgJiYgc2YoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksIFMoYiksIG51bGw7CiAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICByZXR1cm4gYWgoYi50eXBlLl9jb250ZXh0KSwgUyhiKSwgbnVsbDsKICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgIHJldHVybiBaZihiLnR5cGUpICYmICRmKCksIFMoYiksIG51bGw7CiAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICBFKEwpOwogICAgICAgICAgICBmID0gYi5tZW1vaXplZFN0YXRlOwogICAgICAgICAgICBpZiAobnVsbCA9PT0gZikKICAgICAgICAgICAgICByZXR1cm4gUyhiKSwgbnVsbDsKICAgICAgICAgICAgZCA9IDAgIT09IChiLmZsYWdzICYgMTI4KTsKICAgICAgICAgICAgZyA9IGYucmVuZGVyaW5nOwogICAgICAgICAgICBpZiAobnVsbCA9PT0gZykKICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgIERqKGYsIGZhbHNlKTsKICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgwICE9PSBUIHx8IG51bGwgIT09IGEgJiYgMCAhPT0gKGEuZmxhZ3MgJiAxMjgpKQogICAgICAgICAgICAgICAgICBmb3IgKGEgPSBiLmNoaWxkOyBudWxsICE9PSBhOyApIHsKICAgICAgICAgICAgICAgICAgICBnID0gQ2goYSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGcpIHsKICAgICAgICAgICAgICAgICAgICAgIGIuZmxhZ3MgfD0gMTI4OwogICAgICAgICAgICAgICAgICAgICAgRGooZiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgZCA9IGcudXBkYXRlUXVldWU7CiAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBkICYmIChiLnVwZGF0ZVF1ZXVlID0gZCwgYi5mbGFncyB8PSA0KTsKICAgICAgICAgICAgICAgICAgICAgIGIuc3VidHJlZUZsYWdzID0gMDsKICAgICAgICAgICAgICAgICAgICAgIGQgPSBjOwogICAgICAgICAgICAgICAgICAgICAgZm9yIChjID0gYi5jaGlsZDsgbnVsbCAhPT0gYzsgKQogICAgICAgICAgICAgICAgICAgICAgICBmID0gYywgYSA9IGQsIGYuZmxhZ3MgJj0gMTQ2ODAwNjYsIGcgPSBmLmFsdGVybmF0ZSwgbnVsbCA9PT0gZyA/IChmLmNoaWxkTGFuZXMgPSAwLCBmLmxhbmVzID0gYSwgZi5jaGlsZCA9IG51bGwsIGYuc3VidHJlZUZsYWdzID0gMCwgZi5tZW1vaXplZFByb3BzID0gbnVsbCwgZi5tZW1vaXplZFN0YXRlID0gbnVsbCwgZi51cGRhdGVRdWV1ZSA9IG51bGwsIGYuZGVwZW5kZW5jaWVzID0gbnVsbCwgZi5zdGF0ZU5vZGUgPSBudWxsKSA6IChmLmNoaWxkTGFuZXMgPSBnLmNoaWxkTGFuZXMsIGYubGFuZXMgPSBnLmxhbmVzLCBmLmNoaWxkID0gZy5jaGlsZCwgZi5zdWJ0cmVlRmxhZ3MgPSAwLCBmLmRlbGV0aW9ucyA9IG51bGwsIGYubWVtb2l6ZWRQcm9wcyA9IGcubWVtb2l6ZWRQcm9wcywgZi5tZW1vaXplZFN0YXRlID0gZy5tZW1vaXplZFN0YXRlLCBmLnVwZGF0ZVF1ZXVlID0gZy51cGRhdGVRdWV1ZSwgZi50eXBlID0gZy50eXBlLCBhID0gZy5kZXBlbmRlbmNpZXMsIGYuZGVwZW5kZW5jaWVzID0gbnVsbCA9PT0gYSA/IG51bGwgOiB7IGxhbmVzOiBhLmxhbmVzLCBmaXJzdENvbnRleHQ6IGEuZmlyc3RDb250ZXh0IH0pLCBjID0gYy5zaWJsaW5nOwogICAgICAgICAgICAgICAgICAgICAgRyhMLCBMLmN1cnJlbnQgJiAxIHwgMik7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5jaGlsZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYSA9IGEuc2libGluZzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbnVsbCAhPT0gZi50YWlsICYmIEIoKSA+IEdqICYmIChiLmZsYWdzIHw9IDEyOCwgZCA9IHRydWUsIERqKGYsIGZhbHNlKSwgYi5sYW5lcyA9IDQxOTQzMDQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgaWYgKCFkKQogICAgICAgICAgICAgICAgaWYgKGEgPSBDaChnKSwgbnVsbCAhPT0gYSkgewogICAgICAgICAgICAgICAgICBpZiAoYi5mbGFncyB8PSAxMjgsIGQgPSB0cnVlLCBjID0gYS51cGRhdGVRdWV1ZSwgbnVsbCAhPT0gYyAmJiAoYi51cGRhdGVRdWV1ZSA9IGMsIGIuZmxhZ3MgfD0gNCksIERqKGYsIHRydWUpLCBudWxsID09PSBmLnRhaWwgJiYgImhpZGRlbiIgPT09IGYudGFpbE1vZGUgJiYgIWcuYWx0ZXJuYXRlICYmICFJKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGIpLCBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIDIgKiBCKCkgLSBmLnJlbmRlcmluZ1N0YXJ0VGltZSA+IEdqICYmIDEwNzM3NDE4MjQgIT09IGMgJiYgKGIuZmxhZ3MgfD0gMTI4LCBkID0gdHJ1ZSwgRGooZiwgZmFsc2UpLCBiLmxhbmVzID0gNDE5NDMwNCk7CiAgICAgICAgICAgICAgZi5pc0JhY2t3YXJkcyA/IChnLnNpYmxpbmcgPSBiLmNoaWxkLCBiLmNoaWxkID0gZykgOiAoYyA9IGYubGFzdCwgbnVsbCAhPT0gYyA/IGMuc2libGluZyA9IGcgOiBiLmNoaWxkID0gZywgZi5sYXN0ID0gZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG51bGwgIT09IGYudGFpbCkKICAgICAgICAgICAgICByZXR1cm4gYiA9IGYudGFpbCwgZi5yZW5kZXJpbmcgPSBiLCBmLnRhaWwgPSBiLnNpYmxpbmcsIGYucmVuZGVyaW5nU3RhcnRUaW1lID0gQigpLCBiLnNpYmxpbmcgPSBudWxsLCBjID0gTC5jdXJyZW50LCBHKEwsIGQgPyBjICYgMSB8IDIgOiBjICYgMSksIGI7CiAgICAgICAgICAgIFMoYik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgIHJldHVybiBIaigpLCBkID0gbnVsbCAhPT0gYi5tZW1vaXplZFN0YXRlLCBudWxsICE9PSBhICYmIG51bGwgIT09IGEubWVtb2l6ZWRTdGF0ZSAhPT0gZCAmJiAoYi5mbGFncyB8PSA4MTkyKSwgZCAmJiAwICE9PSAoYi5tb2RlICYgMSkgPyAwICE9PSAoZmogJiAxMDczNzQxODI0KSAmJiAoUyhiKSwgYi5zdWJ0cmVlRmxhZ3MgJiA2ICYmIChiLmZsYWdzIHw9IDgxOTIpKSA6IFMoYiksIG51bGw7CiAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB0aHJvdyBFcnJvcihwKDE1NiwgYi50YWcpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBJaihhLCBiKSB7CiAgICAgICAgd2coYik7CiAgICAgICAgc3dpdGNoIChiLnRhZykgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gWmYoYi50eXBlKSAmJiAkZigpLCBhID0gYi5mbGFncywgYSAmIDY1NTM2ID8gKGIuZmxhZ3MgPSBhICYgLTY1NTM3IHwgMTI4LCBiKSA6IG51bGw7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHJldHVybiB6aCgpLCBFKFdmKSwgRShIKSwgRWgoKSwgYSA9IGIuZmxhZ3MsIDAgIT09IChhICYgNjU1MzYpICYmIDAgPT09IChhICYgMTI4KSA/IChiLmZsYWdzID0gYSAmIC02NTUzNyB8IDEyOCwgYikgOiBudWxsOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gQmgoYiksIG51bGw7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBFKEwpOwogICAgICAgICAgICBhID0gYi5tZW1vaXplZFN0YXRlOwogICAgICAgICAgICBpZiAobnVsbCAhPT0gYSAmJiBudWxsICE9PSBhLmRlaHlkcmF0ZWQpIHsKICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gYi5hbHRlcm5hdGUpCiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDM0MCkpOwogICAgICAgICAgICAgIElnKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYSA9IGIuZmxhZ3M7CiAgICAgICAgICAgIHJldHVybiBhICYgNjU1MzYgPyAoYi5mbGFncyA9IGEgJiAtNjU1MzcgfCAxMjgsIGIpIDogbnVsbDsKICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgIHJldHVybiBFKEwpLCBudWxsOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICByZXR1cm4gemgoKSwgbnVsbDsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIHJldHVybiBhaChiLnR5cGUuX2NvbnRleHQpLCBudWxsOwogICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgIHJldHVybiBIaigpLCBudWxsOwogICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIEpqID0gZmFsc2U7CiAgICAgIHZhciBVID0gZmFsc2U7CiAgICAgIHZhciBLaiA9ICJmdW5jdGlvbiIgPT09IHR5cGVvZiBXZWFrU2V0ID8gV2Vha1NldCA6IFNldDsKICAgICAgdmFyIFYgPSBudWxsOwogICAgICBmdW5jdGlvbiBMaihhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBhLnJlZjsKICAgICAgICBpZiAobnVsbCAhPT0gYykKICAgICAgICAgIGlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgYykKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBjKG51bGwpOwogICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgVyhhLCBiLCBkKTsKICAgICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICBjLmN1cnJlbnQgPSBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIE1qKGEsIGIsIGMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYygpOwogICAgICAgIH0gY2F0Y2ggKGQpIHsKICAgICAgICAgIFcoYSwgYiwgZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBOaiA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBPaihhLCBiKSB7CiAgICAgICAgQ2YgPSBkZDsKICAgICAgICBhID0gTWUoKTsKICAgICAgICBpZiAoTmUoYSkpIHsKICAgICAgICAgIGlmICgic2VsZWN0aW9uU3RhcnQiIGluIGEpCiAgICAgICAgICAgIHZhciBjID0geyBzdGFydDogYS5zZWxlY3Rpb25TdGFydCwgZW5kOiBhLnNlbGVjdGlvbkVuZCB9OwogICAgICAgICAgZWxzZQogICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgYyA9IChjID0gYS5vd25lckRvY3VtZW50KSAmJiBjLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsKICAgICAgICAgICAgICB2YXIgZCA9IGMuZ2V0U2VsZWN0aW9uICYmIGMuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgaWYgKGQgJiYgMCAhPT0gZC5yYW5nZUNvdW50KSB7CiAgICAgICAgICAgICAgICBjID0gZC5hbmNob3JOb2RlOwogICAgICAgICAgICAgICAgdmFyIGUgPSBkLmFuY2hvck9mZnNldCwgZiA9IGQuZm9jdXNOb2RlOwogICAgICAgICAgICAgICAgZCA9IGQuZm9jdXNPZmZzZXQ7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBjLm5vZGVUeXBlLCBmLm5vZGVUeXBlOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoRikgewogICAgICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBnID0gMCwgaCA9IC0xLCBrID0gLTEsIGwgPSAwLCBtID0gMCwgcSA9IGEsIHIgPSBudWxsOwogICAgICAgICAgICAgICAgYjoKICAgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeTsgOyApIHsKICAgICAgICAgICAgICAgICAgICAgIHEgIT09IGMgfHwgMCAhPT0gZSAmJiAzICE9PSBxLm5vZGVUeXBlIHx8IChoID0gZyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgcSAhPT0gZiB8fCAwICE9PSBkICYmIDMgIT09IHEubm9kZVR5cGUgfHwgKGsgPSBnICsgZCk7CiAgICAgICAgICAgICAgICAgICAgICAzID09PSBxLm5vZGVUeXBlICYmIChnICs9IHEubm9kZVZhbHVlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gKHkgPSBxLmZpcnN0Q2hpbGQpKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIHIgPSBxOwogICAgICAgICAgICAgICAgICAgICAgcSA9IHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAoOyA7ICkgewogICAgICAgICAgICAgICAgICAgICAgaWYgKHEgPT09IGEpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGI7CiAgICAgICAgICAgICAgICAgICAgICByID09PSBjICYmICsrbCA9PT0gZSAmJiAoaCA9IGcpOwogICAgICAgICAgICAgICAgICAgICAgciA9PT0gZiAmJiArK20gPT09IGQgJiYgKGsgPSBnKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSAoeSA9IHEubmV4dFNpYmxpbmcpKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIHEgPSByOwogICAgICAgICAgICAgICAgICAgICAgciA9IHEucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcSA9IHk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGMgPSAtMSA9PT0gaCB8fCAtMSA9PT0gayA/IG51bGwgOiB7IHN0YXJ0OiBoLCBlbmQ6IGsgfTsKICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICBjID0gYyB8fCB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIGMgPSBudWxsOwogICAgICAgIERmID0geyBmb2N1c2VkRWxlbTogYSwgc2VsZWN0aW9uUmFuZ2U6IGMgfTsKICAgICAgICBkZCA9IGZhbHNlOwogICAgICAgIGZvciAoViA9IGI7IG51bGwgIT09IFY7ICkKICAgICAgICAgIGlmIChiID0gViwgYSA9IGIuY2hpbGQsIDAgIT09IChiLnN1YnRyZWVGbGFncyAmIDEwMjgpICYmIG51bGwgIT09IGEpCiAgICAgICAgICAgIGEucmV0dXJuID0gYiwgViA9IGE7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGZvciAoOyBudWxsICE9PSBWOyApIHsKICAgICAgICAgICAgICBiID0gVjsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIG4gPSBiLmFsdGVybmF0ZTsKICAgICAgICAgICAgICAgIGlmICgwICE9PSAoYi5mbGFncyAmIDEwMjQpKQogICAgICAgICAgICAgICAgICBzd2l0Y2ggKGIudGFnKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbi5tZW1vaXplZFByb3BzLCBKID0gbi5tZW1vaXplZFN0YXRlLCB4ID0gYi5zdGF0ZU5vZGUsIHcgPSB4LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGIuZWxlbWVudFR5cGUgPT09IGIudHlwZSA/IHQgOiBDaShiLnR5cGUsIHQpLCBKKTsKICAgICAgICAgICAgICAgICAgICAgICAgeC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHc7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87CiAgICAgICAgICAgICAgICAgICAgICAxID09PSB1Lm5vZGVUeXBlID8gdS50ZXh0Q29udGVudCA9ICIiIDogOSA9PT0gdS5ub2RlVHlwZSAmJiB1LmRvY3VtZW50RWxlbWVudCAmJiB1LnJlbW92ZUNoaWxkKHUuZG9jdW1lbnRFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNjMpKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gY2F0Y2ggKEYpIHsKICAgICAgICAgICAgICAgIFcoYiwgYi5yZXR1cm4sIEYpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhID0gYi5zaWJsaW5nOwogICAgICAgICAgICAgIGlmIChudWxsICE9PSBhKSB7CiAgICAgICAgICAgICAgICBhLnJldHVybiA9IGIucmV0dXJuOwogICAgICAgICAgICAgICAgViA9IGE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgViA9IGIucmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgbiA9IE5qOwogICAgICAgIE5qID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gUGooYSwgYiwgYykgewogICAgICAgIHZhciBkID0gYi51cGRhdGVRdWV1ZTsKICAgICAgICBkID0gbnVsbCAhPT0gZCA/IGQubGFzdEVmZmVjdCA6IG51bGw7CiAgICAgICAgaWYgKG51bGwgIT09IGQpIHsKICAgICAgICAgIHZhciBlID0gZCA9IGQubmV4dDsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKChlLnRhZyAmIGEpID09PSBhKSB7CiAgICAgICAgICAgICAgdmFyIGYgPSBlLmRlc3Ryb3k7CiAgICAgICAgICAgICAgZS5kZXN0cm95ID0gdm9pZCAwOwogICAgICAgICAgICAgIHZvaWQgMCAhPT0gZiAmJiBNaihiLCBjLCBmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlID0gZS5uZXh0OwogICAgICAgICAgfSB3aGlsZSAoZSAhPT0gZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIFFqKGEsIGIpIHsKICAgICAgICBiID0gYi51cGRhdGVRdWV1ZTsKICAgICAgICBiID0gbnVsbCAhPT0gYiA/IGIubGFzdEVmZmVjdCA6IG51bGw7CiAgICAgICAgaWYgKG51bGwgIT09IGIpIHsKICAgICAgICAgIHZhciBjID0gYiA9IGIubmV4dDsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKChjLnRhZyAmIGEpID09PSBhKSB7CiAgICAgICAgICAgICAgdmFyIGQgPSBjLmNyZWF0ZTsKICAgICAgICAgICAgICBjLmRlc3Ryb3kgPSBkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYyA9IGMubmV4dDsKICAgICAgICAgIH0gd2hpbGUgKGMgIT09IGIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBSaihhKSB7CiAgICAgICAgdmFyIGIgPSBhLnJlZjsKICAgICAgICBpZiAobnVsbCAhPT0gYikgewogICAgICAgICAgdmFyIGMgPSBhLnN0YXRlTm9kZTsKICAgICAgICAgIHN3aXRjaCAoYS50YWcpIHsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGEgPSBjOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGEgPSBjOwogICAgICAgICAgfQogICAgICAgICAgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGIgPyBiKGEpIDogYi5jdXJyZW50ID0gYTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gU2ooYSkgewogICAgICAgIHZhciBiID0gYS5hbHRlcm5hdGU7CiAgICAgICAgbnVsbCAhPT0gYiAmJiAoYS5hbHRlcm5hdGUgPSBudWxsLCBTaihiKSk7CiAgICAgICAgYS5jaGlsZCA9IG51bGw7CiAgICAgICAgYS5kZWxldGlvbnMgPSBudWxsOwogICAgICAgIGEuc2libGluZyA9IG51bGw7CiAgICAgICAgNSA9PT0gYS50YWcgJiYgKGIgPSBhLnN0YXRlTm9kZSwgbnVsbCAhPT0gYiAmJiAoZGVsZXRlIGJbT2ZdLCBkZWxldGUgYltQZl0sIGRlbGV0ZSBiW29mXSwgZGVsZXRlIGJbUWZdLCBkZWxldGUgYltSZl0pKTsKICAgICAgICBhLnN0YXRlTm9kZSA9IG51bGw7CiAgICAgICAgYS5yZXR1cm4gPSBudWxsOwogICAgICAgIGEuZGVwZW5kZW5jaWVzID0gbnVsbDsKICAgICAgICBhLm1lbW9pemVkUHJvcHMgPSBudWxsOwogICAgICAgIGEubWVtb2l6ZWRTdGF0ZSA9IG51bGw7CiAgICAgICAgYS5wZW5kaW5nUHJvcHMgPSBudWxsOwogICAgICAgIGEuc3RhdGVOb2RlID0gbnVsbDsKICAgICAgICBhLnVwZGF0ZVF1ZXVlID0gbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBUaihhKSB7CiAgICAgICAgcmV0dXJuIDUgPT09IGEudGFnIHx8IDMgPT09IGEudGFnIHx8IDQgPT09IGEudGFnOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFVqKGEpIHsKICAgICAgICBhOgogICAgICAgICAgZm9yICg7IDsgKSB7CiAgICAgICAgICAgIGZvciAoOyBudWxsID09PSBhLnNpYmxpbmc7ICkgewogICAgICAgICAgICAgIGlmIChudWxsID09PSBhLnJldHVybiB8fCBUaihhLnJldHVybikpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICBhID0gYS5yZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYS5zaWJsaW5nLnJldHVybiA9IGEucmV0dXJuOwogICAgICAgICAgICBmb3IgKGEgPSBhLnNpYmxpbmc7IDUgIT09IGEudGFnICYmIDYgIT09IGEudGFnICYmIDE4ICE9PSBhLnRhZzsgKSB7CiAgICAgICAgICAgICAgaWYgKGEuZmxhZ3MgJiAyKQogICAgICAgICAgICAgICAgY29udGludWUgYTsKICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gYS5jaGlsZCB8fCA0ID09PSBhLnRhZykKICAgICAgICAgICAgICAgIGNvbnRpbnVlIGE7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYS5jaGlsZC5yZXR1cm4gPSBhLCBhID0gYS5jaGlsZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShhLmZsYWdzICYgMikpCiAgICAgICAgICAgICAgcmV0dXJuIGEuc3RhdGVOb2RlOwogICAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIFZqKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IGEudGFnOwogICAgICAgIGlmICg1ID09PSBkIHx8IDYgPT09IGQpCiAgICAgICAgICBhID0gYS5zdGF0ZU5vZGUsIGIgPyA4ID09PSBjLm5vZGVUeXBlID8gYy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLCBiKSA6IGMuaW5zZXJ0QmVmb3JlKGEsIGIpIDogKDggPT09IGMubm9kZVR5cGUgPyAoYiA9IGMucGFyZW50Tm9kZSwgYi5pbnNlcnRCZWZvcmUoYSwgYykpIDogKGIgPSBjLCBiLmFwcGVuZENoaWxkKGEpKSwgYyA9IGMuX3JlYWN0Um9vdENvbnRhaW5lciwgbnVsbCAhPT0gYyAmJiB2b2lkIDAgIT09IGMgfHwgbnVsbCAhPT0gYi5vbmNsaWNrIHx8IChiLm9uY2xpY2sgPSBCZikpOwogICAgICAgIGVsc2UgaWYgKDQgIT09IGQgJiYgKGEgPSBhLmNoaWxkLCBudWxsICE9PSBhKSkKICAgICAgICAgIGZvciAoVmooYSwgYiwgYyksIGEgPSBhLnNpYmxpbmc7IG51bGwgIT09IGE7ICkKICAgICAgICAgICAgVmooYSwgYiwgYyksIGEgPSBhLnNpYmxpbmc7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gV2ooYSwgYiwgYykgewogICAgICAgIHZhciBkID0gYS50YWc7CiAgICAgICAgaWYgKDUgPT09IGQgfHwgNiA9PT0gZCkKICAgICAgICAgIGEgPSBhLnN0YXRlTm9kZSwgYiA/IGMuaW5zZXJ0QmVmb3JlKGEsIGIpIDogYy5hcHBlbmRDaGlsZChhKTsKICAgICAgICBlbHNlIGlmICg0ICE9PSBkICYmIChhID0gYS5jaGlsZCwgbnVsbCAhPT0gYSkpCiAgICAgICAgICBmb3IgKFdqKGEsIGIsIGMpLCBhID0gYS5zaWJsaW5nOyBudWxsICE9PSBhOyApCiAgICAgICAgICAgIFdqKGEsIGIsIGMpLCBhID0gYS5zaWJsaW5nOwogICAgICB9CiAgICAgIHZhciBYID0gbnVsbDsKICAgICAgdmFyIFhqID0gZmFsc2U7CiAgICAgIGZ1bmN0aW9uIFlqKGEsIGIsIGMpIHsKICAgICAgICBmb3IgKGMgPSBjLmNoaWxkOyBudWxsICE9PSBjOyApCiAgICAgICAgICBaaihhLCBiLCBjKSwgYyA9IGMuc2libGluZzsKICAgICAgfQogICAgICBmdW5jdGlvbiBaaihhLCBiLCBjKSB7CiAgICAgICAgaWYgKGxjICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBsYy5vbkNvbW1pdEZpYmVyVW5tb3VudCkKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxjLm9uQ29tbWl0RmliZXJVbm1vdW50KGtjLCBjKTsKICAgICAgICAgIH0gY2F0Y2ggKGgpIHsKICAgICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGMudGFnKSB7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIFUgfHwgTGooYywgYik7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIHZhciBkID0gWCwgZSA9IFhqOwogICAgICAgICAgICBYID0gbnVsbDsKICAgICAgICAgICAgWWooYSwgYiwgYyk7CiAgICAgICAgICAgIFggPSBkOwogICAgICAgICAgICBYaiA9IGU7CiAgICAgICAgICAgIG51bGwgIT09IFggJiYgKFhqID8gKGEgPSBYLCBjID0gYy5zdGF0ZU5vZGUsIDggPT09IGEubm9kZVR5cGUgPyBhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYykgOiBhLnJlbW92ZUNoaWxkKGMpKSA6IFgucmVtb3ZlQ2hpbGQoYy5zdGF0ZU5vZGUpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICBudWxsICE9PSBYICYmIChYaiA/IChhID0gWCwgYyA9IGMuc3RhdGVOb2RlLCA4ID09PSBhLm5vZGVUeXBlID8gS2YoYS5wYXJlbnROb2RlLCBjKSA6IDEgPT09IGEubm9kZVR5cGUgJiYgS2YoYSwgYyksIGJkKGEpKSA6IEtmKFgsIGMuc3RhdGVOb2RlKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBkID0gWDsKICAgICAgICAgICAgZSA9IFhqOwogICAgICAgICAgICBYID0gYy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzsKICAgICAgICAgICAgWGogPSB0cnVlOwogICAgICAgICAgICBZaihhLCBiLCBjKTsKICAgICAgICAgICAgWCA9IGQ7CiAgICAgICAgICAgIFhqID0gZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgIGlmICghVSAmJiAoZCA9IGMudXBkYXRlUXVldWUsIG51bGwgIT09IGQgJiYgKGQgPSBkLmxhc3RFZmZlY3QsIG51bGwgIT09IGQpKSkgewogICAgICAgICAgICAgIGUgPSBkID0gZC5uZXh0OwogICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIHZhciBmID0gZSwgZyA9IGYuZGVzdHJveTsKICAgICAgICAgICAgICAgIGYgPSBmLnRhZzsKICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gZyAmJiAoMCAhPT0gKGYgJiAyKSA/IE1qKGMsIGIsIGcpIDogMCAhPT0gKGYgJiA0KSAmJiBNaihjLCBiLCBnKSk7CiAgICAgICAgICAgICAgICBlID0gZS5uZXh0OwogICAgICAgICAgICAgIH0gd2hpbGUgKGUgIT09IGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFlqKGEsIGIsIGMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgaWYgKCFVICYmIChMaihjLCBiKSwgZCA9IGMuc3RhdGVOb2RlLCAiZnVuY3Rpb24iID09PSB0eXBlb2YgZC5jb21wb25lbnRXaWxsVW5tb3VudCkpCiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGQucHJvcHMgPSBjLm1lbW9pemVkUHJvcHMsIGQuc3RhdGUgPSBjLm1lbW9pemVkU3RhdGUsIGQuY29tcG9uZW50V2lsbFVubW91bnQoKTsKICAgICAgICAgICAgICB9IGNhdGNoIChoKSB7CiAgICAgICAgICAgICAgICBXKGMsIGIsIGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgWWooYSwgYiwgYyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgWWooYSwgYiwgYyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgYy5tb2RlICYgMSA/IChVID0gKGQgPSBVKSB8fCBudWxsICE9PSBjLm1lbW9pemVkU3RhdGUsIFlqKGEsIGIsIGMpLCBVID0gZCkgOiBZaihhLCBiLCBjKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBZaihhLCBiLCBjKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYWsoYSkgewogICAgICAgIHZhciBiID0gYS51cGRhdGVRdWV1ZTsKICAgICAgICBpZiAobnVsbCAhPT0gYikgewogICAgICAgICAgYS51cGRhdGVRdWV1ZSA9IG51bGw7CiAgICAgICAgICB2YXIgYyA9IGEuc3RhdGVOb2RlOwogICAgICAgICAgbnVsbCA9PT0gYyAmJiAoYyA9IGEuc3RhdGVOb2RlID0gbmV3IEtqKCkpOwogICAgICAgICAgYi5mb3JFYWNoKGZ1bmN0aW9uKGIyKSB7CiAgICAgICAgICAgIHZhciBkID0gYmsuYmluZChudWxsLCBhLCBiMik7CiAgICAgICAgICAgIGMuaGFzKGIyKSB8fCAoYy5hZGQoYjIpLCBiMi50aGVuKGQsIGQpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBjayhhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBiLmRlbGV0aW9uczsKICAgICAgICBpZiAobnVsbCAhPT0gYykKICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgYy5sZW5ndGg7IGQrKykgewogICAgICAgICAgICB2YXIgZSA9IGNbZF07CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgdmFyIGYgPSBhLCBnID0gYiwgaCA9IGc7CiAgICAgICAgICAgICAgYToKICAgICAgICAgICAgICAgIGZvciAoOyBudWxsICE9PSBoOyApIHsKICAgICAgICAgICAgICAgICAgc3dpdGNoIChoLnRhZykgewogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgIFggPSBoLnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgICAgICAgIFhqID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgIFggPSBoLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOwogICAgICAgICAgICAgICAgICAgICAgWGogPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICBYID0gaC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzsKICAgICAgICAgICAgICAgICAgICAgIFhqID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaCA9IGgucmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChudWxsID09PSBYKQogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNjApKTsKICAgICAgICAgICAgICBaaihmLCBnLCBlKTsKICAgICAgICAgICAgICBYID0gbnVsbDsKICAgICAgICAgICAgICBYaiA9IGZhbHNlOwogICAgICAgICAgICAgIHZhciBrID0gZS5hbHRlcm5hdGU7CiAgICAgICAgICAgICAgbnVsbCAhPT0gayAmJiAoay5yZXR1cm4gPSBudWxsKTsKICAgICAgICAgICAgICBlLnJldHVybiA9IG51bGw7CiAgICAgICAgICAgIH0gY2F0Y2ggKGwpIHsKICAgICAgICAgICAgICBXKGUsIGIsIGwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgaWYgKGIuc3VidHJlZUZsYWdzICYgMTI4NTQpCiAgICAgICAgICBmb3IgKGIgPSBiLmNoaWxkOyBudWxsICE9PSBiOyApCiAgICAgICAgICAgIGRrKGIsIGEpLCBiID0gYi5zaWJsaW5nOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRrKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGEuYWx0ZXJuYXRlLCBkID0gYS5mbGFnczsKICAgICAgICBzd2l0Y2ggKGEudGFnKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgIGNrKGIsIGEpOwogICAgICAgICAgICBlayhhKTsKICAgICAgICAgICAgaWYgKGQgJiA0KSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFBqKDMsIGEsIGEucmV0dXJuKSwgUWooMywgYSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgVyhhLCBhLnJldHVybiwgdCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBQaig1LCBhLCBhLnJldHVybik7CiAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgVyhhLCBhLnJldHVybiwgdCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBjayhiLCBhKTsKICAgICAgICAgICAgZWsoYSk7CiAgICAgICAgICAgIGQgJiA1MTIgJiYgbnVsbCAhPT0gYyAmJiBMaihjLCBjLnJldHVybik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBjayhiLCBhKTsKICAgICAgICAgICAgZWsoYSk7CiAgICAgICAgICAgIGQgJiA1MTIgJiYgbnVsbCAhPT0gYyAmJiBMaihjLCBjLnJldHVybik7CiAgICAgICAgICAgIGlmIChhLmZsYWdzICYgMzIpIHsKICAgICAgICAgICAgICB2YXIgZSA9IGEuc3RhdGVOb2RlOwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBvYihlLCAiIik7CiAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgVyhhLCBhLnJldHVybiwgdCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkICYgNCAmJiAoZSA9IGEuc3RhdGVOb2RlLCBudWxsICE9IGUpKSB7CiAgICAgICAgICAgICAgdmFyIGYgPSBhLm1lbW9pemVkUHJvcHMsIGcgPSBudWxsICE9PSBjID8gYy5tZW1vaXplZFByb3BzIDogZiwgaCA9IGEudHlwZSwgayA9IGEudXBkYXRlUXVldWU7CiAgICAgICAgICAgICAgYS51cGRhdGVRdWV1ZSA9IG51bGw7CiAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGspCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAiaW5wdXQiID09PSBoICYmICJyYWRpbyIgPT09IGYudHlwZSAmJiBudWxsICE9IGYubmFtZSAmJiBhYihlLCBmKTsKICAgICAgICAgICAgICAgICAgdmIoaCwgZyk7CiAgICAgICAgICAgICAgICAgIHZhciBsID0gdmIoaCwgZik7CiAgICAgICAgICAgICAgICAgIGZvciAoZyA9IDA7IGcgPCBrLmxlbmd0aDsgZyArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBrW2ddLCBxID0ga1tnICsgMV07CiAgICAgICAgICAgICAgICAgICAgInN0eWxlIiA9PT0gbSA/IHNiKGUsIHEpIDogImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiA9PT0gbSA/IG5iKGUsIHEpIDogImNoaWxkcmVuIiA9PT0gbSA/IG9iKGUsIHEpIDogdGEoZSwgbSwgcSwgbCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaW5wdXQiOgogICAgICAgICAgICAgICAgICAgICAgYmIoZSwgZik7CiAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ0ZXh0YXJlYSI6CiAgICAgICAgICAgICAgICAgICAgICBpYihlLCBmKTsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTsKICAgICAgICAgICAgICAgICAgICAgIGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9ICEhZi5tdWx0aXBsZTsKICAgICAgICAgICAgICAgICAgICAgIHZhciB5ID0gZi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0geSA/IGZiKGUsICEhZi5tdWx0aXBsZSwgeSwgZmFsc2UpIDogciAhPT0gISFmLm11bHRpcGxlICYmIChudWxsICE9IGYuZGVmYXVsdFZhbHVlID8gZmIoCiAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICEhZi5tdWx0aXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZi5kZWZhdWx0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgICAgICAgICAgICkgOiBmYihlLCAhIWYubXVsdGlwbGUsIGYubXVsdGlwbGUgPyBbXSA6ICIiLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVbUGZdID0gZjsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgVyhhLCBhLnJldHVybiwgdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIGNrKGIsIGEpOwogICAgICAgICAgICBlayhhKTsKICAgICAgICAgICAgaWYgKGQgJiA0KSB7CiAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGEuc3RhdGVOb2RlKQogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNjIpKTsKICAgICAgICAgICAgICBlID0gYS5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgZiA9IGEubWVtb2l6ZWRQcm9wczsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZS5ub2RlVmFsdWUgPSBmOwogICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIFcoYSwgYS5yZXR1cm4sIHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgY2soYiwgYSk7CiAgICAgICAgICAgIGVrKGEpOwogICAgICAgICAgICBpZiAoZCAmIDQgJiYgbnVsbCAhPT0gYyAmJiBjLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKQogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBiZChiLmNvbnRhaW5lckluZm8pOwogICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIFcoYSwgYS5yZXR1cm4sIHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIGNrKGIsIGEpOwogICAgICAgICAgICBlayhhKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBjayhiLCBhKTsKICAgICAgICAgICAgZWsoYSk7CiAgICAgICAgICAgIGUgPSBhLmNoaWxkOwogICAgICAgICAgICBlLmZsYWdzICYgODE5MiAmJiAoZiA9IG51bGwgIT09IGUubWVtb2l6ZWRTdGF0ZSwgZS5zdGF0ZU5vZGUuaXNIaWRkZW4gPSBmLCAhZiB8fCBudWxsICE9PSBlLmFsdGVybmF0ZSAmJiBudWxsICE9PSBlLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlIHx8IChmayA9IEIoKSkpOwogICAgICAgICAgICBkICYgNCAmJiBhayhhKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICBtID0gbnVsbCAhPT0gYyAmJiBudWxsICE9PSBjLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICAgIGEubW9kZSAmIDEgPyAoVSA9IChsID0gVSkgfHwgbSwgY2soYiwgYSksIFUgPSBsKSA6IGNrKGIsIGEpOwogICAgICAgICAgICBlayhhKTsKICAgICAgICAgICAgaWYgKGQgJiA4MTkyKSB7CiAgICAgICAgICAgICAgbCA9IG51bGwgIT09IGEubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgICAgICBpZiAoKGEuc3RhdGVOb2RlLmlzSGlkZGVuID0gbCkgJiYgIW0gJiYgMCAhPT0gKGEubW9kZSAmIDEpKQogICAgICAgICAgICAgICAgZm9yIChWID0gYSwgbSA9IGEuY2hpbGQ7IG51bGwgIT09IG07ICkgewogICAgICAgICAgICAgICAgICBmb3IgKHEgPSBWID0gbTsgbnVsbCAhPT0gVjsgKSB7CiAgICAgICAgICAgICAgICAgICAgciA9IFY7CiAgICAgICAgICAgICAgICAgICAgeSA9IHIuY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyLnRhZykgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgICAgICBQaig0LCByLCByLnJldHVybik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBMaihyLCByLnJldHVybik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiZnVuY3Rpb24iID09PSB0eXBlb2Ygbi5jb21wb25lbnRXaWxsVW5tb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSByLnJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGQsIG4ucHJvcHMgPSBiLm1lbW9pemVkUHJvcHMsIG4uc3RhdGUgPSBiLm1lbW9pemVkU3RhdGUsIG4uY29tcG9uZW50V2lsbFVubW91bnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKGQsIGMsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgTGoociwgci5yZXR1cm4pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSByLm1lbW9pemVkU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBnayhxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB5ID8gKHkucmV0dXJuID0gciwgViA9IHkpIDogZ2socSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgbSA9IG0uc2libGluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhOgogICAgICAgICAgICAgICAgZm9yIChtID0gbnVsbCwgcSA9IGE7IDsgKSB7CiAgICAgICAgICAgICAgICAgIGlmICg1ID09PSBxLnRhZykgewogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBtKSB7CiAgICAgICAgICAgICAgICAgICAgICBtID0gcTsKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBxLnN0YXRlTm9kZSwgbCA/IChmID0gZS5zdHlsZSwgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGYuc2V0UHJvcGVydHkgPyBmLnNldFByb3BlcnR5KCJkaXNwbGF5IiwgIm5vbmUiLCAiaW1wb3J0YW50IikgOiBmLmRpc3BsYXkgPSAibm9uZSIpIDogKGggPSBxLnN0YXRlTm9kZSwgayA9IHEubWVtb2l6ZWRQcm9wcy5zdHlsZSwgZyA9IHZvaWQgMCAhPT0gayAmJiBudWxsICE9PSBrICYmIGsuaGFzT3duUHJvcGVydHkoImRpc3BsYXkiKSA/IGsuZGlzcGxheSA6IG51bGwsIGguc3R5bGUuZGlzcGxheSA9IHJiKCJkaXNwbGF5IiwgZykpOwogICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBXKGEsIGEucmV0dXJuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoNiA9PT0gcS50YWcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gbSkKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHEuc3RhdGVOb2RlLm5vZGVWYWx1ZSA9IGwgPyAiIiA6IHEubWVtb2l6ZWRQcm9wczsKICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVyhhLCBhLnJldHVybiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKDIyICE9PSBxLnRhZyAmJiAyMyAhPT0gcS50YWcgfHwgbnVsbCA9PT0gcS5tZW1vaXplZFN0YXRlIHx8IHEgPT09IGEpICYmIG51bGwgIT09IHEuY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICBxLmNoaWxkLnJldHVybiA9IHE7CiAgICAgICAgICAgICAgICAgICAgcSA9IHEuY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHEgPT09IGEpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgZm9yICg7IG51bGwgPT09IHEuc2libGluZzsgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHEucmV0dXJuIHx8IHEucmV0dXJuID09PSBhKQogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICBtID09PSBxICYmIChtID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgcSA9IHEucmV0dXJuOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIG0gPT09IHEgJiYgKG0gPSBudWxsKTsKICAgICAgICAgICAgICAgICAgcS5zaWJsaW5nLnJldHVybiA9IHEucmV0dXJuOwogICAgICAgICAgICAgICAgICBxID0gcS5zaWJsaW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgY2soYiwgYSk7CiAgICAgICAgICAgIGVrKGEpOwogICAgICAgICAgICBkICYgNCAmJiBhayhhKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNrKAogICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgYQogICAgICAgICAgICApLCBlayhhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZWsoYSkgewogICAgICAgIHZhciBiID0gYS5mbGFnczsKICAgICAgICBpZiAoYiAmIDIpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGE6IHsKICAgICAgICAgICAgICBmb3IgKHZhciBjID0gYS5yZXR1cm47IG51bGwgIT09IGM7ICkgewogICAgICAgICAgICAgICAgaWYgKFRqKGMpKSB7CiAgICAgICAgICAgICAgICAgIHZhciBkID0gYzsKICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGMgPSBjLnJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNjApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKGQudGFnKSB7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgdmFyIGUgPSBkLnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgIGQuZmxhZ3MgJiAzMiAmJiAob2IoZSwgIiIpLCBkLmZsYWdzICY9IC0zMyk7CiAgICAgICAgICAgICAgICB2YXIgZiA9IFVqKGEpOwogICAgICAgICAgICAgICAgV2ooYSwgZiwgZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgdmFyIGcgPSBkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBoID0gVWooYSk7CiAgICAgICAgICAgICAgICBWaihhLCBoLCBnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDE2MSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChrKSB7CiAgICAgICAgICAgIFcoYSwgYS5yZXR1cm4sIGspOwogICAgICAgICAgfQogICAgICAgICAgYS5mbGFncyAmPSAtMzsKICAgICAgICB9CiAgICAgICAgYiAmIDQwOTYgJiYgKGEuZmxhZ3MgJj0gLTQwOTcpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGhrKGEsIGIsIGMpIHsKICAgICAgICBWID0gYTsKICAgICAgICBpayhhLCBiLCBjKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBpayhhLCBiLCBjKSB7CiAgICAgICAgZm9yICh2YXIgZCA9IDAgIT09IChhLm1vZGUgJiAxKTsgbnVsbCAhPT0gVjsgKSB7CiAgICAgICAgICB2YXIgZSA9IFYsIGYgPSBlLmNoaWxkOwogICAgICAgICAgaWYgKDIyID09PSBlLnRhZyAmJiBkKSB7CiAgICAgICAgICAgIHZhciBnID0gbnVsbCAhPT0gZS5tZW1vaXplZFN0YXRlIHx8IEpqOwogICAgICAgICAgICBpZiAoIWcpIHsKICAgICAgICAgICAgICB2YXIgaCA9IGUuYWx0ZXJuYXRlLCBrID0gbnVsbCAhPT0gaCAmJiBudWxsICE9PSBoLm1lbW9pemVkU3RhdGUgfHwgVTsKICAgICAgICAgICAgICBoID0gSmo7CiAgICAgICAgICAgICAgdmFyIGwgPSBVOwogICAgICAgICAgICAgIEpqID0gZzsKICAgICAgICAgICAgICBpZiAoKFUgPSBrKSAmJiAhbCkKICAgICAgICAgICAgICAgIGZvciAoViA9IGU7IG51bGwgIT09IFY7ICkKICAgICAgICAgICAgICAgICAgZyA9IFYsIGsgPSBnLmNoaWxkLCAyMiA9PT0gZy50YWcgJiYgbnVsbCAhPT0gZy5tZW1vaXplZFN0YXRlID8gamsoZSkgOiBudWxsICE9PSBrID8gKGsucmV0dXJuID0gZywgViA9IGspIDogamsoZSk7CiAgICAgICAgICAgICAgZm9yICg7IG51bGwgIT09IGY7ICkKICAgICAgICAgICAgICAgIFYgPSBmLCBpayhmLCBiLCBjKSwgZiA9IGYuc2libGluZzsKICAgICAgICAgICAgICBWID0gZTsKICAgICAgICAgICAgICBKaiA9IGg7CiAgICAgICAgICAgICAgVSA9IGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2soYSwgYiwgYyk7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgMCAhPT0gKGUuc3VidHJlZUZsYWdzICYgODc3MikgJiYgbnVsbCAhPT0gZiA/IChmLnJldHVybiA9IGUsIFYgPSBmKSA6IGtrKGEsIGIsIGMpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBrayhhKSB7CiAgICAgICAgZm9yICg7IG51bGwgIT09IFY7ICkgewogICAgICAgICAgdmFyIGIgPSBWOwogICAgICAgICAgaWYgKDAgIT09IChiLmZsYWdzICYgODc3MikpIHsKICAgICAgICAgICAgdmFyIGMgPSBiLmFsdGVybmF0ZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBpZiAoMCAhPT0gKGIuZmxhZ3MgJiA4NzcyKSkKICAgICAgICAgICAgICAgIHN3aXRjaCAoYi50YWcpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgIFUgfHwgUWooNSwgYik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGIuc3RhdGVOb2RlOwogICAgICAgICAgICAgICAgICAgIGlmIChiLmZsYWdzICYgNCAmJiAhVSkKICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBjKQogICAgICAgICAgICAgICAgICAgICAgICBkLmNvbXBvbmVudERpZE1vdW50KCk7CiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBiLmVsZW1lbnRUeXBlID09PSBiLnR5cGUgPyBjLm1lbW9pemVkUHJvcHMgOiBDaShiLnR5cGUsIGMubWVtb2l6ZWRQcm9wcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuY29tcG9uZW50RGlkVXBkYXRlKGUsIGMubWVtb2l6ZWRTdGF0ZSwgZC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBiLnVwZGF0ZVF1ZXVlOwogICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGYgJiYgc2goYiwgZiwgZCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGIudXBkYXRlUXVldWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGcpIHsKICAgICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGIuY2hpbGQpCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYi5jaGlsZC50YWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gYi5jaGlsZC5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gYi5jaGlsZC5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHNoKGIsIGcsIGMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgIHZhciBoID0gYi5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGMgJiYgYi5mbGFncyAmIDQpIHsKICAgICAgICAgICAgICAgICAgICAgIGMgPSBoOwogICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBiLm1lbW9pemVkUHJvcHM7CiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGIudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJidXR0b24iOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJpbnB1dCI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInNlbGVjdCI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInRleHRhcmVhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICBrLmF1dG9Gb2N1cyAmJiBjLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImltZyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgay5zcmMgJiYgKGMuc3JjID0gay5zcmMpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGIubWVtb2l6ZWRTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBiLmFsdGVybmF0ZTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gbC5tZW1vaXplZFN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gbS5kZWh5ZHJhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHEgJiYgYmQocSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxNjMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBVIHx8IGIuZmxhZ3MgJiA1MTIgJiYgUmooYik7CiAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICBXKGIsIGIucmV0dXJuLCByKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGIgPT09IGEpIHsKICAgICAgICAgICAgViA9IG51bGw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYyA9IGIuc2libGluZzsKICAgICAgICAgIGlmIChudWxsICE9PSBjKSB7CiAgICAgICAgICAgIGMucmV0dXJuID0gYi5yZXR1cm47CiAgICAgICAgICAgIFYgPSBjOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIFYgPSBiLnJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2soYSkgewogICAgICAgIGZvciAoOyBudWxsICE9PSBWOyApIHsKICAgICAgICAgIHZhciBiID0gVjsKICAgICAgICAgIGlmIChiID09PSBhKSB7CiAgICAgICAgICAgIFYgPSBudWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBjID0gYi5zaWJsaW5nOwogICAgICAgICAgaWYgKG51bGwgIT09IGMpIHsKICAgICAgICAgICAgYy5yZXR1cm4gPSBiLnJldHVybjsKICAgICAgICAgICAgViA9IGM7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgViA9IGIucmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBqayhhKSB7CiAgICAgICAgZm9yICg7IG51bGwgIT09IFY7ICkgewogICAgICAgICAgdmFyIGIgPSBWOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3dpdGNoIChiLnRhZykgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICB2YXIgYyA9IGIucmV0dXJuOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgUWooNCwgYik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChrKSB7CiAgICAgICAgICAgICAgICAgIFcoYiwgYywgayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICB2YXIgZCA9IGIuc3RhdGVOb2RlOwogICAgICAgICAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBkLmNvbXBvbmVudERpZE1vdW50KSB7CiAgICAgICAgICAgICAgICAgIHZhciBlID0gYi5yZXR1cm47CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZC5jb21wb25lbnREaWRNb3VudCgpOwogICAgICAgICAgICAgICAgICB9IGNhdGNoIChrKSB7CiAgICAgICAgICAgICAgICAgICAgVyhiLCBlLCBrKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGYgPSBiLnJldHVybjsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIFJqKGIpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoaykgewogICAgICAgICAgICAgICAgICBXKGIsIGYsIGspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgdmFyIGcgPSBiLnJldHVybjsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIFJqKGIpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoaykgewogICAgICAgICAgICAgICAgICBXKGIsIGcsIGspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChrKSB7CiAgICAgICAgICAgIFcoYiwgYi5yZXR1cm4sIGspOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGIgPT09IGEpIHsKICAgICAgICAgICAgViA9IG51bGw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGggPSBiLnNpYmxpbmc7CiAgICAgICAgICBpZiAobnVsbCAhPT0gaCkgewogICAgICAgICAgICBoLnJldHVybiA9IGIucmV0dXJuOwogICAgICAgICAgICBWID0gaDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBWID0gYi5yZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBsayA9IE1hdGguY2VpbDsKICAgICAgdmFyIG1rID0gdWEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjsKICAgICAgdmFyIG5rID0gdWEuUmVhY3RDdXJyZW50T3duZXI7CiAgICAgIHZhciBvayA9IHVhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOwogICAgICB2YXIgSyA9IDA7CiAgICAgIHZhciBRID0gbnVsbDsKICAgICAgdmFyIFkgPSBudWxsOwogICAgICB2YXIgWiA9IDA7CiAgICAgIHZhciBmaiA9IDA7CiAgICAgIHZhciBlaiA9IFVmKDApOwogICAgICB2YXIgVCA9IDA7CiAgICAgIHZhciBwayA9IG51bGw7CiAgICAgIHZhciByaCA9IDA7CiAgICAgIHZhciBxayA9IDA7CiAgICAgIHZhciByayA9IDA7CiAgICAgIHZhciBzayA9IG51bGw7CiAgICAgIHZhciB0ayA9IG51bGw7CiAgICAgIHZhciBmayA9IDA7CiAgICAgIHZhciBHaiA9IEluZmluaXR5OwogICAgICB2YXIgdWsgPSBudWxsOwogICAgICB2YXIgT2kgPSBmYWxzZTsKICAgICAgdmFyIFBpID0gbnVsbDsKICAgICAgdmFyIFJpID0gbnVsbDsKICAgICAgdmFyIHZrID0gZmFsc2U7CiAgICAgIHZhciB3ayA9IG51bGw7CiAgICAgIHZhciB4ayA9IDA7CiAgICAgIHZhciB5ayA9IDA7CiAgICAgIHZhciB6ayA9IG51bGw7CiAgICAgIHZhciBBayA9IC0xOwogICAgICB2YXIgQmsgPSAwOwogICAgICBmdW5jdGlvbiBSKCkgewogICAgICAgIHJldHVybiAwICE9PSAoSyAmIDYpID8gQigpIDogLTEgIT09IEFrID8gQWsgOiBBayA9IEIoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB5aShhKSB7CiAgICAgICAgaWYgKDAgPT09IChhLm1vZGUgJiAxKSkKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmICgwICE9PSAoSyAmIDIpICYmIDAgIT09IFopCiAgICAgICAgICByZXR1cm4gWiAmIC1aOwogICAgICAgIGlmIChudWxsICE9PSBLZy50cmFuc2l0aW9uKQogICAgICAgICAgcmV0dXJuIDAgPT09IEJrICYmIChCayA9IHljKCkpLCBCazsKICAgICAgICBhID0gQzsKICAgICAgICBpZiAoMCAhPT0gYSkKICAgICAgICAgIHJldHVybiBhOwogICAgICAgIGEgPSB3aW5kb3cuZXZlbnQ7CiAgICAgICAgYSA9IHZvaWQgMCA9PT0gYSA/IDE2IDogamQoYS50eXBlKTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBnaShhLCBiLCBjLCBkKSB7CiAgICAgICAgaWYgKDUwIDwgeWspCiAgICAgICAgICB0aHJvdyB5ayA9IDAsIHprID0gbnVsbCwgRXJyb3IocCgxODUpKTsKICAgICAgICBBYyhhLCBjLCBkKTsKICAgICAgICBpZiAoMCA9PT0gKEsgJiAyKSB8fCBhICE9PSBRKQogICAgICAgICAgYSA9PT0gUSAmJiAoMCA9PT0gKEsgJiAyKSAmJiAocWsgfD0gYyksIDQgPT09IFQgJiYgQ2soYSwgWikpLCBEayhhLCBkKSwgMSA9PT0gYyAmJiAwID09PSBLICYmIDAgPT09IChiLm1vZGUgJiAxKSAmJiAoR2ogPSBCKCkgKyA1MDAsIGZnICYmIGpnKCkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIERrKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IGEuY2FsbGJhY2tOb2RlOwogICAgICAgIHdjKGEsIGIpOwogICAgICAgIHZhciBkID0gdWMoYSwgYSA9PT0gUSA/IFogOiAwKTsKICAgICAgICBpZiAoMCA9PT0gZCkKICAgICAgICAgIG51bGwgIT09IGMgJiYgYmMoYyksIGEuY2FsbGJhY2tOb2RlID0gbnVsbCwgYS5jYWxsYmFja1ByaW9yaXR5ID0gMDsKICAgICAgICBlbHNlIGlmIChiID0gZCAmIC1kLCBhLmNhbGxiYWNrUHJpb3JpdHkgIT09IGIpIHsKICAgICAgICAgIG51bGwgIT0gYyAmJiBiYyhjKTsKICAgICAgICAgIGlmICgxID09PSBiKQogICAgICAgICAgICAwID09PSBhLnRhZyA/IGlnKEVrLmJpbmQobnVsbCwgYSkpIDogaGcoRWsuYmluZChudWxsLCBhKSksIEpmKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIDAgPT09IChLICYgNikgJiYgamcoKTsKICAgICAgICAgICAgfSksIGMgPSBudWxsOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHN3aXRjaCAoRGMoZCkpIHsKICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBjID0gZmM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBjID0gZ2M7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgYyA9IGhjOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA1MzY4NzA5MTI6CiAgICAgICAgICAgICAgICBjID0gamM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgYyA9IGhjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGMgPSBGayhjLCBHay5iaW5kKG51bGwsIGEpKTsKICAgICAgICAgIH0KICAgICAgICAgIGEuY2FsbGJhY2tQcmlvcml0eSA9IGI7CiAgICAgICAgICBhLmNhbGxiYWNrTm9kZSA9IGM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIEdrKGEsIGIpIHsKICAgICAgICBBayA9IC0xOwogICAgICAgIEJrID0gMDsKICAgICAgICBpZiAoMCAhPT0gKEsgJiA2KSkKICAgICAgICAgIHRocm93IEVycm9yKHAoMzI3KSk7CiAgICAgICAgdmFyIGMgPSBhLmNhbGxiYWNrTm9kZTsKICAgICAgICBpZiAoSGsoKSAmJiBhLmNhbGxiYWNrTm9kZSAhPT0gYykKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHZhciBkID0gdWMoYSwgYSA9PT0gUSA/IFogOiAwKTsKICAgICAgICBpZiAoMCA9PT0gZCkKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGlmICgwICE9PSAoZCAmIDMwKSB8fCAwICE9PSAoZCAmIGEuZXhwaXJlZExhbmVzKSB8fCBiKQogICAgICAgICAgYiA9IElrKGEsIGQpOwogICAgICAgIGVsc2UgewogICAgICAgICAgYiA9IGQ7CiAgICAgICAgICB2YXIgZSA9IEs7CiAgICAgICAgICBLIHw9IDI7CiAgICAgICAgICB2YXIgZiA9IEprKCk7CiAgICAgICAgICBpZiAoUSAhPT0gYSB8fCBaICE9PSBiKQogICAgICAgICAgICB1ayA9IG51bGwsIEdqID0gQigpICsgNTAwLCBLayhhLCBiKTsKICAgICAgICAgIGRvCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgTGsoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSBjYXRjaCAoaCkgewogICAgICAgICAgICAgIE1rKGEsIGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoMSk7CiAgICAgICAgICAkZygpOwogICAgICAgICAgbWsuY3VycmVudCA9IGY7CiAgICAgICAgICBLID0gZTsKICAgICAgICAgIG51bGwgIT09IFkgPyBiID0gMCA6IChRID0gbnVsbCwgWiA9IDAsIGIgPSBUKTsKICAgICAgICB9CiAgICAgICAgaWYgKDAgIT09IGIpIHsKICAgICAgICAgIDIgPT09IGIgJiYgKGUgPSB4YyhhKSwgMCAhPT0gZSAmJiAoZCA9IGUsIGIgPSBOayhhLCBlKSkpOwogICAgICAgICAgaWYgKDEgPT09IGIpCiAgICAgICAgICAgIHRocm93IGMgPSBwaywgS2soYSwgMCksIENrKGEsIGQpLCBEayhhLCBCKCkpLCBjOwogICAgICAgICAgaWYgKDYgPT09IGIpCiAgICAgICAgICAgIENrKGEsIGQpOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGUgPSBhLmN1cnJlbnQuYWx0ZXJuYXRlOwogICAgICAgICAgICBpZiAoMCA9PT0gKGQgJiAzMCkgJiYgIU9rKGUpICYmIChiID0gSWsoYSwgZCksIDIgPT09IGIgJiYgKGYgPSB4YyhhKSwgMCAhPT0gZiAmJiAoZCA9IGYsIGIgPSBOayhhLCBmKSkpLCAxID09PSBiKSkKICAgICAgICAgICAgICB0aHJvdyBjID0gcGssIEtrKGEsIDApLCBDayhhLCBkKSwgRGsoYSwgQigpKSwgYzsKICAgICAgICAgICAgYS5maW5pc2hlZFdvcmsgPSBlOwogICAgICAgICAgICBhLmZpbmlzaGVkTGFuZXMgPSBkOwogICAgICAgICAgICBzd2l0Y2ggKGIpIHsKICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgzNDUpKTsKICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBQayhhLCB0aywgdWspOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgQ2soYSwgZCk7CiAgICAgICAgICAgICAgICBpZiAoKGQgJiAxMzAwMjM0MjQpID09PSBkICYmIChiID0gZmsgKyA1MDAgLSBCKCksIDEwIDwgYikpIHsKICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IHVjKGEsIDApKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBlID0gYS5zdXNwZW5kZWRMYW5lczsKICAgICAgICAgICAgICAgICAgaWYgKChlICYgZCkgIT09IGQpIHsKICAgICAgICAgICAgICAgICAgICBSKCk7CiAgICAgICAgICAgICAgICAgICAgYS5waW5nZWRMYW5lcyB8PSBhLnN1c3BlbmRlZExhbmVzICYgZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBhLnRpbWVvdXRIYW5kbGUgPSBGZihQay5iaW5kKG51bGwsIGEsIHRrLCB1ayksIGIpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFBrKGEsIHRrLCB1ayk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBDayhhLCBkKTsKICAgICAgICAgICAgICAgIGlmICgoZCAmIDQxOTQyNDApID09PSBkKQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGIgPSBhLmV2ZW50VGltZXM7CiAgICAgICAgICAgICAgICBmb3IgKGUgPSAtMTsgMCA8IGQ7ICkgewogICAgICAgICAgICAgICAgICB2YXIgZyA9IDMxIC0gb2MoZCk7CiAgICAgICAgICAgICAgICAgIGYgPSAxIDw8IGc7CiAgICAgICAgICAgICAgICAgIGcgPSBiW2ddOwogICAgICAgICAgICAgICAgICBnID4gZSAmJiAoZSA9IGcpOwogICAgICAgICAgICAgICAgICBkICY9IH5mOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZCA9IGU7CiAgICAgICAgICAgICAgICBkID0gQigpIC0gZDsKICAgICAgICAgICAgICAgIGQgPSAoMTIwID4gZCA/IDEyMCA6IDQ4MCA+IGQgPyA0ODAgOiAxMDgwID4gZCA/IDEwODAgOiAxOTIwID4gZCA/IDE5MjAgOiAzZTMgPiBkID8gM2UzIDogNDMyMCA+IGQgPyA0MzIwIDogMTk2MCAqIGxrKGQgLyAxOTYwKSkgLSBkOwogICAgICAgICAgICAgICAgaWYgKDEwIDwgZCkgewogICAgICAgICAgICAgICAgICBhLnRpbWVvdXRIYW5kbGUgPSBGZihQay5iaW5kKG51bGwsIGEsIHRrLCB1ayksIGQpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFBrKGEsIHRrLCB1ayk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICBQayhhLCB0aywgdWspOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzI5KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgRGsoYSwgQigpKTsKICAgICAgICByZXR1cm4gYS5jYWxsYmFja05vZGUgPT09IGMgPyBHay5iaW5kKG51bGwsIGEpIDogbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBOayhhLCBiKSB7CiAgICAgICAgdmFyIGMgPSBzazsKICAgICAgICBhLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQgJiYgKEtrKGEsIGIpLmZsYWdzIHw9IDI1Nik7CiAgICAgICAgYSA9IElrKGEsIGIpOwogICAgICAgIDIgIT09IGEgJiYgKGIgPSB0aywgdGsgPSBjLCBudWxsICE9PSBiICYmIEZqKGIpKTsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBGaihhKSB7CiAgICAgICAgbnVsbCA9PT0gdGsgPyB0ayA9IGEgOiB0ay5wdXNoLmFwcGx5KHRrLCBhKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBPayhhKSB7CiAgICAgICAgZm9yICh2YXIgYiA9IGE7IDsgKSB7CiAgICAgICAgICBpZiAoYi5mbGFncyAmIDE2Mzg0KSB7CiAgICAgICAgICAgIHZhciBjID0gYi51cGRhdGVRdWV1ZTsKICAgICAgICAgICAgaWYgKG51bGwgIT09IGMgJiYgKGMgPSBjLnN0b3JlcywgbnVsbCAhPT0gYykpCiAgICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBjLmxlbmd0aDsgZCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IGNbZF0sIGYgPSBlLmdldFNuYXBzaG90OwogICAgICAgICAgICAgICAgZSA9IGUudmFsdWU7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBpZiAoIUhlKGYoKSwgZSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZykgewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYyA9IGIuY2hpbGQ7CiAgICAgICAgICBpZiAoYi5zdWJ0cmVlRmxhZ3MgJiAxNjM4NCAmJiBudWxsICE9PSBjKQogICAgICAgICAgICBjLnJldHVybiA9IGIsIGIgPSBjOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChiID09PSBhKQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBmb3IgKDsgbnVsbCA9PT0gYi5zaWJsaW5nOyApIHsKICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gYi5yZXR1cm4gfHwgYi5yZXR1cm4gPT09IGEpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICBiID0gYi5yZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYi5zaWJsaW5nLnJldHVybiA9IGIucmV0dXJuOwogICAgICAgICAgICBiID0gYi5zaWJsaW5nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBDayhhLCBiKSB7CiAgICAgICAgYiAmPSB+cms7CiAgICAgICAgYiAmPSB+cWs7CiAgICAgICAgYS5zdXNwZW5kZWRMYW5lcyB8PSBiOwogICAgICAgIGEucGluZ2VkTGFuZXMgJj0gfmI7CiAgICAgICAgZm9yIChhID0gYS5leHBpcmF0aW9uVGltZXM7IDAgPCBiOyApIHsKICAgICAgICAgIHZhciBjID0gMzEgLSBvYyhiKSwgZCA9IDEgPDwgYzsKICAgICAgICAgIGFbY10gPSAtMTsKICAgICAgICAgIGIgJj0gfmQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIEVrKGEpIHsKICAgICAgICBpZiAoMCAhPT0gKEsgJiA2KSkKICAgICAgICAgIHRocm93IEVycm9yKHAoMzI3KSk7CiAgICAgICAgSGsoKTsKICAgICAgICB2YXIgYiA9IHVjKGEsIDApOwogICAgICAgIGlmICgwID09PSAoYiAmIDEpKQogICAgICAgICAgcmV0dXJuIERrKGEsIEIoKSksIG51bGw7CiAgICAgICAgdmFyIGMgPSBJayhhLCBiKTsKICAgICAgICBpZiAoMCAhPT0gYS50YWcgJiYgMiA9PT0gYykgewogICAgICAgICAgdmFyIGQgPSB4YyhhKTsKICAgICAgICAgIDAgIT09IGQgJiYgKGIgPSBkLCBjID0gTmsoYSwgZCkpOwogICAgICAgIH0KICAgICAgICBpZiAoMSA9PT0gYykKICAgICAgICAgIHRocm93IGMgPSBwaywgS2soYSwgMCksIENrKGEsIGIpLCBEayhhLCBCKCkpLCBjOwogICAgICAgIGlmICg2ID09PSBjKQogICAgICAgICAgdGhyb3cgRXJyb3IocCgzNDUpKTsKICAgICAgICBhLmZpbmlzaGVkV29yayA9IGEuY3VycmVudC5hbHRlcm5hdGU7CiAgICAgICAgYS5maW5pc2hlZExhbmVzID0gYjsKICAgICAgICBQayhhLCB0aywgdWspOwogICAgICAgIERrKGEsIEIoKSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gUWsoYSwgYikgewogICAgICAgIHZhciBjID0gSzsKICAgICAgICBLIHw9IDE7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBhKGIpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBLID0gYywgMCA9PT0gSyAmJiAoR2ogPSBCKCkgKyA1MDAsIGZnICYmIGpnKCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBSayhhKSB7CiAgICAgICAgbnVsbCAhPT0gd2sgJiYgMCA9PT0gd2sudGFnICYmIDAgPT09IChLICYgNikgJiYgSGsoKTsKICAgICAgICB2YXIgYiA9IEs7CiAgICAgICAgSyB8PSAxOwogICAgICAgIHZhciBjID0gb2sudHJhbnNpdGlvbiwgZCA9IEM7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChvay50cmFuc2l0aW9uID0gbnVsbCwgQyA9IDEsIGEpCiAgICAgICAgICAgIHJldHVybiBhKCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIEMgPSBkLCBvay50cmFuc2l0aW9uID0gYywgSyA9IGIsIDAgPT09IChLICYgNikgJiYgamcoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gSGooKSB7CiAgICAgICAgZmogPSBlai5jdXJyZW50OwogICAgICAgIEUoZWopOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIEtrKGEsIGIpIHsKICAgICAgICBhLmZpbmlzaGVkV29yayA9IG51bGw7CiAgICAgICAgYS5maW5pc2hlZExhbmVzID0gMDsKICAgICAgICB2YXIgYyA9IGEudGltZW91dEhhbmRsZTsKICAgICAgICAtMSAhPT0gYyAmJiAoYS50aW1lb3V0SGFuZGxlID0gLTEsIEdmKGMpKTsKICAgICAgICBpZiAobnVsbCAhPT0gWSkKICAgICAgICAgIGZvciAoYyA9IFkucmV0dXJuOyBudWxsICE9PSBjOyApIHsKICAgICAgICAgICAgdmFyIGQgPSBjOwogICAgICAgICAgICB3ZyhkKTsKICAgICAgICAgICAgc3dpdGNoIChkLnRhZykgewogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIGQgPSBkLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7CiAgICAgICAgICAgICAgICBudWxsICE9PSBkICYmIHZvaWQgMCAhPT0gZCAmJiAkZigpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgemgoKTsKICAgICAgICAgICAgICAgIEUoV2YpOwogICAgICAgICAgICAgICAgRShIKTsKICAgICAgICAgICAgICAgIEVoKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICBCaChkKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHpoKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgRShMKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICBFKEwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgIGFoKGQudHlwZS5fY29udGV4dCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICBIaigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGMgPSBjLnJldHVybjsKICAgICAgICAgIH0KICAgICAgICBRID0gYTsKICAgICAgICBZID0gYSA9IFBnKGEuY3VycmVudCwgbnVsbCk7CiAgICAgICAgWiA9IGZqID0gYjsKICAgICAgICBUID0gMDsKICAgICAgICBwayA9IG51bGw7CiAgICAgICAgcmsgPSBxayA9IHJoID0gMDsKICAgICAgICB0ayA9IHNrID0gbnVsbDsKICAgICAgICBpZiAobnVsbCAhPT0gZmgpIHsKICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBmaC5sZW5ndGg7IGIrKykKICAgICAgICAgICAgaWYgKGMgPSBmaFtiXSwgZCA9IGMuaW50ZXJsZWF2ZWQsIG51bGwgIT09IGQpIHsKICAgICAgICAgICAgICBjLmludGVybGVhdmVkID0gbnVsbDsKICAgICAgICAgICAgICB2YXIgZSA9IGQubmV4dCwgZiA9IGMucGVuZGluZzsKICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZikgewogICAgICAgICAgICAgICAgdmFyIGcgPSBmLm5leHQ7CiAgICAgICAgICAgICAgICBmLm5leHQgPSBlOwogICAgICAgICAgICAgICAgZC5uZXh0ID0gZzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYy5wZW5kaW5nID0gZDsKICAgICAgICAgICAgfQogICAgICAgICAgZmggPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBNayhhLCBiKSB7CiAgICAgICAgZG8gewogICAgICAgICAgdmFyIGMgPSBZOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJGcoKTsKICAgICAgICAgICAgRmguY3VycmVudCA9IFJoOwogICAgICAgICAgICBpZiAoSWgpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBkID0gTS5tZW1vaXplZFN0YXRlOyBudWxsICE9PSBkOyApIHsKICAgICAgICAgICAgICAgIHZhciBlID0gZC5xdWV1ZTsKICAgICAgICAgICAgICAgIG51bGwgIT09IGUgJiYgKGUucGVuZGluZyA9IG51bGwpOwogICAgICAgICAgICAgICAgZCA9IGQubmV4dDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgSWggPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBIaCA9IDA7CiAgICAgICAgICAgIE8gPSBOID0gTSA9IG51bGw7CiAgICAgICAgICAgIEpoID0gZmFsc2U7CiAgICAgICAgICAgIEtoID0gMDsKICAgICAgICAgICAgbmsuY3VycmVudCA9IG51bGw7CiAgICAgICAgICAgIGlmIChudWxsID09PSBjIHx8IG51bGwgPT09IGMucmV0dXJuKSB7CiAgICAgICAgICAgICAgVCA9IDE7CiAgICAgICAgICAgICAgcGsgPSBiOwogICAgICAgICAgICAgIFkgPSBudWxsOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGE6IHsKICAgICAgICAgICAgICB2YXIgZiA9IGEsIGcgPSBjLnJldHVybiwgaCA9IGMsIGsgPSBiOwogICAgICAgICAgICAgIGIgPSBaOwogICAgICAgICAgICAgIGguZmxhZ3MgfD0gMzI3Njg7CiAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGsgJiYgIm9iamVjdCIgPT09IHR5cGVvZiBrICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBrLnRoZW4pIHsKICAgICAgICAgICAgICAgIHZhciBsID0gaywgbSA9IGgsIHEgPSBtLnRhZzsKICAgICAgICAgICAgICAgIGlmICgwID09PSAobS5tb2RlICYgMSkgJiYgKDAgPT09IHEgfHwgMTEgPT09IHEgfHwgMTUgPT09IHEpKSB7CiAgICAgICAgICAgICAgICAgIHZhciByID0gbS5hbHRlcm5hdGU7CiAgICAgICAgICAgICAgICAgIHIgPyAobS51cGRhdGVRdWV1ZSA9IHIudXBkYXRlUXVldWUsIG0ubWVtb2l6ZWRTdGF0ZSA9IHIubWVtb2l6ZWRTdGF0ZSwgbS5sYW5lcyA9IHIubGFuZXMpIDogKG0udXBkYXRlUXVldWUgPSBudWxsLCBtLm1lbW9pemVkU3RhdGUgPSBudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB5ID0gVWkoZyk7CiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0geSkgewogICAgICAgICAgICAgICAgICB5LmZsYWdzICY9IC0yNTc7CiAgICAgICAgICAgICAgICAgIFZpKHksIGcsIGgsIGYsIGIpOwogICAgICAgICAgICAgICAgICB5Lm1vZGUgJiAxICYmIFNpKGYsIGwsIGIpOwogICAgICAgICAgICAgICAgICBiID0geTsKICAgICAgICAgICAgICAgICAgayA9IGw7CiAgICAgICAgICAgICAgICAgIHZhciBuID0gYi51cGRhdGVRdWV1ZTsKICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgdC5hZGQoayk7CiAgICAgICAgICAgICAgICAgICAgYi51cGRhdGVRdWV1ZSA9IHQ7CiAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIG4uYWRkKGspOwogICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IChiICYgMSkpIHsKICAgICAgICAgICAgICAgICAgICBTaShmLCBsLCBiKTsKICAgICAgICAgICAgICAgICAgICB0aigpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgayA9IEVycm9yKHAoNDI2KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChJICYmIGgubW9kZSAmIDEpIHsKICAgICAgICAgICAgICAgIHZhciBKID0gVWkoZyk7CiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gSikgewogICAgICAgICAgICAgICAgICAwID09PSAoSi5mbGFncyAmIDY1NTM2KSAmJiAoSi5mbGFncyB8PSAyNTYpOwogICAgICAgICAgICAgICAgICBWaShKLCBnLCBoLCBmLCBiKTsKICAgICAgICAgICAgICAgICAgSmcoSmkoaywgaCkpOwogICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmID0gayA9IEppKGssIGgpOwogICAgICAgICAgICAgIDQgIT09IFQgJiYgKFQgPSAyKTsKICAgICAgICAgICAgICBudWxsID09PSBzayA/IHNrID0gW2ZdIDogc2sucHVzaChmKTsKICAgICAgICAgICAgICBmID0gZzsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudGFnKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICBmLmZsYWdzIHw9IDY1NTM2OwogICAgICAgICAgICAgICAgICAgIGIgJj0gLWI7CiAgICAgICAgICAgICAgICAgICAgZi5sYW5lcyB8PSBiOwogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gTmkoZiwgaywgYik7CiAgICAgICAgICAgICAgICAgICAgcGgoZiwgeCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgIGggPSBrOwogICAgICAgICAgICAgICAgICAgIHZhciB3ID0gZi50eXBlLCB1ID0gZi5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IChmLmZsYWdzICYgMTI4KSAmJiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHcuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIHx8IG51bGwgIT09IHUgJiYgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHUuY29tcG9uZW50RGlkQ2F0Y2ggJiYgKG51bGwgPT09IFJpIHx8ICFSaS5oYXModSkpKSkgewogICAgICAgICAgICAgICAgICAgICAgZi5mbGFncyB8PSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgIGIgJj0gLWI7CiAgICAgICAgICAgICAgICAgICAgICBmLmxhbmVzIHw9IGI7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgRiA9IFFpKGYsIGgsIGIpOwogICAgICAgICAgICAgICAgICAgICAgcGgoZiwgRik7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGYgPSBmLnJldHVybjsKICAgICAgICAgICAgICB9IHdoaWxlIChudWxsICE9PSBmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTayhjKTsKICAgICAgICAgIH0gY2F0Y2ggKG5hKSB7CiAgICAgICAgICAgIGIgPSBuYTsKICAgICAgICAgICAgWSA9PT0gYyAmJiBudWxsICE9PSBjICYmIChZID0gYyA9IGMucmV0dXJuKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9IHdoaWxlICgxKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBKaygpIHsKICAgICAgICB2YXIgYSA9IG1rLmN1cnJlbnQ7CiAgICAgICAgbWsuY3VycmVudCA9IFJoOwogICAgICAgIHJldHVybiBudWxsID09PSBhID8gUmggOiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHRqKCkgewogICAgICAgIGlmICgwID09PSBUIHx8IDMgPT09IFQgfHwgMiA9PT0gVCkKICAgICAgICAgIFQgPSA0OwogICAgICAgIG51bGwgPT09IFEgfHwgMCA9PT0gKHJoICYgMjY4NDM1NDU1KSAmJiAwID09PSAocWsgJiAyNjg0MzU0NTUpIHx8IENrKFEsIFopOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIElrKGEsIGIpIHsKICAgICAgICB2YXIgYyA9IEs7CiAgICAgICAgSyB8PSAyOwogICAgICAgIHZhciBkID0gSmsoKTsKICAgICAgICBpZiAoUSAhPT0gYSB8fCBaICE9PSBiKQogICAgICAgICAgdWsgPSBudWxsLCBLayhhLCBiKTsKICAgICAgICBkbwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgVGsoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIE1rKGEsIGUpOwogICAgICAgICAgfQogICAgICAgIHdoaWxlICgxKTsKICAgICAgICAkZygpOwogICAgICAgIEsgPSBjOwogICAgICAgIG1rLmN1cnJlbnQgPSBkOwogICAgICAgIGlmIChudWxsICE9PSBZKQogICAgICAgICAgdGhyb3cgRXJyb3IocCgyNjEpKTsKICAgICAgICBRID0gbnVsbDsKICAgICAgICBaID0gMDsKICAgICAgICByZXR1cm4gVDsKICAgICAgfQogICAgICBmdW5jdGlvbiBUaygpIHsKICAgICAgICBmb3IgKDsgbnVsbCAhPT0gWTsgKQogICAgICAgICAgVWsoWSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gTGsoKSB7CiAgICAgICAgZm9yICg7IG51bGwgIT09IFkgJiYgIWNjKCk7ICkKICAgICAgICAgIFVrKFkpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFVrKGEpIHsKICAgICAgICB2YXIgYiA9IFZrKGEuYWx0ZXJuYXRlLCBhLCBmaik7CiAgICAgICAgYS5tZW1vaXplZFByb3BzID0gYS5wZW5kaW5nUHJvcHM7CiAgICAgICAgbnVsbCA9PT0gYiA/IFNrKGEpIDogWSA9IGI7CiAgICAgICAgbmsuY3VycmVudCA9IG51bGw7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gU2soYSkgewogICAgICAgIHZhciBiID0gYTsKICAgICAgICBkbyB7CiAgICAgICAgICB2YXIgYyA9IGIuYWx0ZXJuYXRlOwogICAgICAgICAgYSA9IGIucmV0dXJuOwogICAgICAgICAgaWYgKDAgPT09IChiLmZsYWdzICYgMzI3NjgpKSB7CiAgICAgICAgICAgIGlmIChjID0gRWooYywgYiwgZmopLCBudWxsICE9PSBjKSB7CiAgICAgICAgICAgICAgWSA9IGM7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjID0gSWooYywgYik7CiAgICAgICAgICAgIGlmIChudWxsICE9PSBjKSB7CiAgICAgICAgICAgICAgYy5mbGFncyAmPSAzMjc2NzsKICAgICAgICAgICAgICBZID0gYzsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG51bGwgIT09IGEpCiAgICAgICAgICAgICAgYS5mbGFncyB8PSAzMjc2OCwgYS5zdWJ0cmVlRmxhZ3MgPSAwLCBhLmRlbGV0aW9ucyA9IG51bGw7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIFQgPSA2OwogICAgICAgICAgICAgIFkgPSBudWxsOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYiA9IGIuc2libGluZzsKICAgICAgICAgIGlmIChudWxsICE9PSBiKSB7CiAgICAgICAgICAgIFkgPSBiOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBZID0gYiA9IGE7CiAgICAgICAgfSB3aGlsZSAobnVsbCAhPT0gYik7CiAgICAgICAgMCA9PT0gVCAmJiAoVCA9IDUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFBrKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IEMsIGUgPSBvay50cmFuc2l0aW9uOwogICAgICAgIHRyeSB7CiAgICAgICAgICBvay50cmFuc2l0aW9uID0gbnVsbCwgQyA9IDEsIFdrKGEsIGIsIGMsIGQpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBvay50cmFuc2l0aW9uID0gZSwgQyA9IGQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFdrKGEsIGIsIGMsIGQpIHsKICAgICAgICBkbwogICAgICAgICAgSGsoKTsKICAgICAgICB3aGlsZSAobnVsbCAhPT0gd2spOwogICAgICAgIGlmICgwICE9PSAoSyAmIDYpKQogICAgICAgICAgdGhyb3cgRXJyb3IocCgzMjcpKTsKICAgICAgICBjID0gYS5maW5pc2hlZFdvcms7CiAgICAgICAgdmFyIGUgPSBhLmZpbmlzaGVkTGFuZXM7CiAgICAgICAgaWYgKG51bGwgPT09IGMpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBhLmZpbmlzaGVkV29yayA9IG51bGw7CiAgICAgICAgYS5maW5pc2hlZExhbmVzID0gMDsKICAgICAgICBpZiAoYyA9PT0gYS5jdXJyZW50KQogICAgICAgICAgdGhyb3cgRXJyb3IocCgxNzcpKTsKICAgICAgICBhLmNhbGxiYWNrTm9kZSA9IG51bGw7CiAgICAgICAgYS5jYWxsYmFja1ByaW9yaXR5ID0gMDsKICAgICAgICB2YXIgZiA9IGMubGFuZXMgfCBjLmNoaWxkTGFuZXM7CiAgICAgICAgQmMoYSwgZik7CiAgICAgICAgYSA9PT0gUSAmJiAoWSA9IFEgPSBudWxsLCBaID0gMCk7CiAgICAgICAgMCA9PT0gKGMuc3VidHJlZUZsYWdzICYgMjA2NCkgJiYgMCA9PT0gKGMuZmxhZ3MgJiAyMDY0KSB8fCB2ayB8fCAodmsgPSB0cnVlLCBGayhoYywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBIaygpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSkpOwogICAgICAgIGYgPSAwICE9PSAoYy5mbGFncyAmIDE1OTkwKTsKICAgICAgICBpZiAoMCAhPT0gKGMuc3VidHJlZUZsYWdzICYgMTU5OTApIHx8IGYpIHsKICAgICAgICAgIGYgPSBvay50cmFuc2l0aW9uOwogICAgICAgICAgb2sudHJhbnNpdGlvbiA9IG51bGw7CiAgICAgICAgICB2YXIgZyA9IEM7CiAgICAgICAgICBDID0gMTsKICAgICAgICAgIHZhciBoID0gSzsKICAgICAgICAgIEsgfD0gNDsKICAgICAgICAgIG5rLmN1cnJlbnQgPSBudWxsOwogICAgICAgICAgT2ooYSwgYyk7CiAgICAgICAgICBkayhjLCBhKTsKICAgICAgICAgIE9lKERmKTsKICAgICAgICAgIGRkID0gISFDZjsKICAgICAgICAgIERmID0gQ2YgPSBudWxsOwogICAgICAgICAgYS5jdXJyZW50ID0gYzsKICAgICAgICAgIGhrKGMsIGEsIGUpOwogICAgICAgICAgZGMoKTsKICAgICAgICAgIEsgPSBoOwogICAgICAgICAgQyA9IGc7CiAgICAgICAgICBvay50cmFuc2l0aW9uID0gZjsKICAgICAgICB9IGVsc2UKICAgICAgICAgIGEuY3VycmVudCA9IGM7CiAgICAgICAgdmsgJiYgKHZrID0gZmFsc2UsIHdrID0gYSwgeGsgPSBlKTsKICAgICAgICBmID0gYS5wZW5kaW5nTGFuZXM7CiAgICAgICAgMCA9PT0gZiAmJiAoUmkgPSBudWxsKTsKICAgICAgICBtYyhjLnN0YXRlTm9kZSwgZCk7CiAgICAgICAgRGsoYSwgQigpKTsKICAgICAgICBpZiAobnVsbCAhPT0gYikKICAgICAgICAgIGZvciAoZCA9IGEub25SZWNvdmVyYWJsZUVycm9yLCBjID0gMDsgYyA8IGIubGVuZ3RoOyBjKyspCiAgICAgICAgICAgIGUgPSBiW2NdLCBkKGUudmFsdWUsIHsgY29tcG9uZW50U3RhY2s6IGUuc3RhY2ssIGRpZ2VzdDogZS5kaWdlc3QgfSk7CiAgICAgICAgaWYgKE9pKQogICAgICAgICAgdGhyb3cgT2kgPSBmYWxzZSwgYSA9IFBpLCBQaSA9IG51bGwsIGE7CiAgICAgICAgMCAhPT0gKHhrICYgMSkgJiYgMCAhPT0gYS50YWcgJiYgSGsoKTsKICAgICAgICBmID0gYS5wZW5kaW5nTGFuZXM7CiAgICAgICAgMCAhPT0gKGYgJiAxKSA/IGEgPT09IHprID8geWsrKyA6ICh5ayA9IDAsIHprID0gYSkgOiB5ayA9IDA7CiAgICAgICAgamcoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBIaygpIHsKICAgICAgICBpZiAobnVsbCAhPT0gd2spIHsKICAgICAgICAgIHZhciBhID0gRGMoeGspLCBiID0gb2sudHJhbnNpdGlvbiwgYyA9IEM7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBvay50cmFuc2l0aW9uID0gbnVsbDsKICAgICAgICAgICAgQyA9IDE2ID4gYSA/IDE2IDogYTsKICAgICAgICAgICAgaWYgKG51bGwgPT09IHdrKQogICAgICAgICAgICAgIHZhciBkID0gZmFsc2U7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIGEgPSB3azsKICAgICAgICAgICAgICB3ayA9IG51bGw7CiAgICAgICAgICAgICAgeGsgPSAwOwogICAgICAgICAgICAgIGlmICgwICE9PSAoSyAmIDYpKQogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgzMzEpKTsKICAgICAgICAgICAgICB2YXIgZSA9IEs7CiAgICAgICAgICAgICAgSyB8PSA0OwogICAgICAgICAgICAgIGZvciAoViA9IGEuY3VycmVudDsgbnVsbCAhPT0gVjsgKSB7CiAgICAgICAgICAgICAgICB2YXIgZiA9IFYsIGcgPSBmLmNoaWxkOwogICAgICAgICAgICAgICAgaWYgKDAgIT09IChWLmZsYWdzICYgMTYpKSB7CiAgICAgICAgICAgICAgICAgIHZhciBoID0gZi5kZWxldGlvbnM7CiAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBoKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBoLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGhba107CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKFYgPSBsOyBudWxsICE9PSBWOyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBWOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG0udGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBqKDgsIG0sIGYpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gbS5jaGlsZDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgcS5yZXR1cm4gPSBtLCBWID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBudWxsICE9PSBWOyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBWOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBtLnNpYmxpbmcsIHkgPSBtLnJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNqKG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gPT09IGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgViA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5yZXR1cm4gPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBuID0gZi5hbHRlcm5hdGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbi5jaGlsZDsKICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4uY2hpbGQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEogPSB0LnNpYmxpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zaWJsaW5nID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gSjsKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobnVsbCAhPT0gdCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFYgPSBmOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoMCAhPT0gKGYuc3VidHJlZUZsYWdzICYgMjA2NCkgJiYgbnVsbCAhPT0gZykKICAgICAgICAgICAgICAgICAgZy5yZXR1cm4gPSBmLCBWID0gZzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgYjoKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgbnVsbCAhPT0gVjsgKSB7CiAgICAgICAgICAgICAgICAgICAgICBmID0gVjsKICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9PSAoZi5mbGFncyAmIDIwNDgpKQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBqKDksIGYsIGYucmV0dXJuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBmLnNpYmxpbmc7CiAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0geCkgewogICAgICAgICAgICAgICAgICAgICAgICB4LnJldHVybiA9IGYucmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBWID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIFYgPSBmLnJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciB3ID0gYS5jdXJyZW50OwogICAgICAgICAgICAgIGZvciAoViA9IHc7IG51bGwgIT09IFY7ICkgewogICAgICAgICAgICAgICAgZyA9IFY7CiAgICAgICAgICAgICAgICB2YXIgdSA9IGcuY2hpbGQ7CiAgICAgICAgICAgICAgICBpZiAoMCAhPT0gKGcuc3VidHJlZUZsYWdzICYgMjA2NCkgJiYgbnVsbCAhPT0gdSkKICAgICAgICAgICAgICAgICAgdS5yZXR1cm4gPSBnLCBWID0gdTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgYjoKICAgICAgICAgICAgICAgICAgICBmb3IgKGcgPSB3OyBudWxsICE9PSBWOyApIHsKICAgICAgICAgICAgICAgICAgICAgIGggPSBWOwogICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IChoLmZsYWdzICYgMjA0OCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoLnRhZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFqKDksIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBXKGgsIGgucmV0dXJuLCBuYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGlmIChoID09PSBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhayBiOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdmFyIEYgPSBoLnNpYmxpbmc7CiAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gRikgewogICAgICAgICAgICAgICAgICAgICAgICBGLnJldHVybiA9IGgucmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBWID0gRjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIFYgPSBoLnJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIEsgPSBlOwogICAgICAgICAgICAgIGpnKCk7CiAgICAgICAgICAgICAgaWYgKGxjICYmICJmdW5jdGlvbiIgPT09IHR5cGVvZiBsYy5vblBvc3RDb21taXRGaWJlclJvb3QpCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBsYy5vblBvc3RDb21taXRGaWJlclJvb3Qoa2MsIGEpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAobmEpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIEMgPSBjLCBvay50cmFuc2l0aW9uID0gYjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFhrKGEsIGIsIGMpIHsKICAgICAgICBiID0gSmkoYywgYik7CiAgICAgICAgYiA9IE5pKGEsIGIsIDEpOwogICAgICAgIGEgPSBuaChhLCBiLCAxKTsKICAgICAgICBiID0gUigpOwogICAgICAgIG51bGwgIT09IGEgJiYgKEFjKGEsIDEsIGIpLCBEayhhLCBiKSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gVyhhLCBiLCBjKSB7CiAgICAgICAgaWYgKDMgPT09IGEudGFnKQogICAgICAgICAgWGsoYSwgYSwgYyk7CiAgICAgICAgZWxzZQogICAgICAgICAgZm9yICg7IG51bGwgIT09IGI7ICkgewogICAgICAgICAgICBpZiAoMyA9PT0gYi50YWcpIHsKICAgICAgICAgICAgICBYayhiLCBhLCBjKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSBlbHNlIGlmICgxID09PSBiLnRhZykgewogICAgICAgICAgICAgIHZhciBkID0gYi5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBiLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIHx8ICJmdW5jdGlvbiIgPT09IHR5cGVvZiBkLmNvbXBvbmVudERpZENhdGNoICYmIChudWxsID09PSBSaSB8fCAhUmkuaGFzKGQpKSkgewogICAgICAgICAgICAgICAgYSA9IEppKGMsIGEpOwogICAgICAgICAgICAgICAgYSA9IFFpKGIsIGEsIDEpOwogICAgICAgICAgICAgICAgYiA9IG5oKGIsIGEsIDEpOwogICAgICAgICAgICAgICAgYSA9IFIoKTsKICAgICAgICAgICAgICAgIG51bGwgIT09IGIgJiYgKEFjKGIsIDEsIGEpLCBEayhiLCBhKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYiA9IGIucmV0dXJuOwogICAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIFRpKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IGEucGluZ0NhY2hlOwogICAgICAgIG51bGwgIT09IGQgJiYgZC5kZWxldGUoYik7CiAgICAgICAgYiA9IFIoKTsKICAgICAgICBhLnBpbmdlZExhbmVzIHw9IGEuc3VzcGVuZGVkTGFuZXMgJiBjOwogICAgICAgIFEgPT09IGEgJiYgKFogJiBjKSA9PT0gYyAmJiAoNCA9PT0gVCB8fCAzID09PSBUICYmIChaICYgMTMwMDIzNDI0KSA9PT0gWiAmJiA1MDAgPiBCKCkgLSBmayA/IEtrKGEsIDApIDogcmsgfD0gYyk7CiAgICAgICAgRGsoYSwgYik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gWWsoYSwgYikgewogICAgICAgIDAgPT09IGIgJiYgKDAgPT09IChhLm1vZGUgJiAxKSA/IGIgPSAxIDogKGIgPSBzYywgc2MgPDw9IDEsIDAgPT09IChzYyAmIDEzMDAyMzQyNCkgJiYgKHNjID0gNDE5NDMwNCkpKTsKICAgICAgICB2YXIgYyA9IFIoKTsKICAgICAgICBhID0gaWgoYSwgYik7CiAgICAgICAgbnVsbCAhPT0gYSAmJiAoQWMoYSwgYiwgYyksIERrKGEsIGMpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiB1aihhKSB7CiAgICAgICAgdmFyIGIgPSBhLm1lbW9pemVkU3RhdGUsIGMgPSAwOwogICAgICAgIG51bGwgIT09IGIgJiYgKGMgPSBiLnJldHJ5TGFuZSk7CiAgICAgICAgWWsoYSwgYyk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYmsoYSwgYikgewogICAgICAgIHZhciBjID0gMDsKICAgICAgICBzd2l0Y2ggKGEudGFnKSB7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICB2YXIgZCA9IGEuc3RhdGVOb2RlOwogICAgICAgICAgICB2YXIgZSA9IGEubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgICAgbnVsbCAhPT0gZSAmJiAoYyA9IGUucmV0cnlMYW5lKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICBkID0gYS5zdGF0ZU5vZGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgzMTQpKTsKICAgICAgICB9CiAgICAgICAgbnVsbCAhPT0gZCAmJiBkLmRlbGV0ZShiKTsKICAgICAgICBZayhhLCBjKTsKICAgICAgfQogICAgICB2YXIgVms7CiAgICAgIFZrID0gZnVuY3Rpb24oYSwgYiwgYykgewogICAgICAgIGlmIChudWxsICE9PSBhKQogICAgICAgICAgaWYgKGEubWVtb2l6ZWRQcm9wcyAhPT0gYi5wZW5kaW5nUHJvcHMgfHwgV2YuY3VycmVudCkKICAgICAgICAgICAgZGggPSB0cnVlOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgwID09PSAoYS5sYW5lcyAmIGMpICYmIDAgPT09IChiLmZsYWdzICYgMTI4KSkKICAgICAgICAgICAgICByZXR1cm4gZGggPSBmYWxzZSwgeWooYSwgYiwgYyk7CiAgICAgICAgICAgIGRoID0gMCAhPT0gKGEuZmxhZ3MgJiAxMzEwNzIpID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIGRoID0gZmFsc2UsIEkgJiYgMCAhPT0gKGIuZmxhZ3MgJiAxMDQ4NTc2KSAmJiB1ZyhiLCBuZywgYi5pbmRleCk7CiAgICAgICAgYi5sYW5lcyA9IDA7CiAgICAgICAgc3dpdGNoIChiLnRhZykgewogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICB2YXIgZCA9IGIudHlwZTsKICAgICAgICAgICAgaWooYSwgYik7CiAgICAgICAgICAgIGEgPSBiLnBlbmRpbmdQcm9wczsKICAgICAgICAgICAgdmFyIGUgPSBZZihiLCBILmN1cnJlbnQpOwogICAgICAgICAgICBjaChiLCBjKTsKICAgICAgICAgICAgZSA9IE5oKG51bGwsIGIsIGQsIGEsIGUsIGMpOwogICAgICAgICAgICB2YXIgZiA9IFNoKCk7CiAgICAgICAgICAgIGIuZmxhZ3MgfD0gMTsKICAgICAgICAgICAgIm9iamVjdCIgPT09IHR5cGVvZiBlICYmIG51bGwgIT09IGUgJiYgImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGUucmVuZGVyICYmIHZvaWQgMCA9PT0gZS4kJHR5cGVvZiA/IChiLnRhZyA9IDEsIGIubWVtb2l6ZWRTdGF0ZSA9IG51bGwsIGIudXBkYXRlUXVldWUgPSBudWxsLCBaZihkKSA/IChmID0gdHJ1ZSwgY2coYikpIDogZiA9IGZhbHNlLCBiLm1lbW9pemVkU3RhdGUgPSBudWxsICE9PSBlLnN0YXRlICYmIHZvaWQgMCAhPT0gZS5zdGF0ZSA/IGUuc3RhdGUgOiBudWxsLCBraChiKSwgZS51cGRhdGVyID0gRWksIGIuc3RhdGVOb2RlID0gZSwgZS5fcmVhY3RJbnRlcm5hbHMgPSBiLCBJaShiLCBkLCBhLCBjKSwgYiA9IGpqKG51bGwsIGIsIGQsIHRydWUsIGYsIGMpKSA6IChiLnRhZyA9IDAsIEkgJiYgZiAmJiB2ZyhiKSwgWGkobnVsbCwgYiwgZSwgYyksIGIgPSBiLmNoaWxkKTsKICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICBkID0gYi5lbGVtZW50VHlwZTsKICAgICAgICAgICAgYTogewogICAgICAgICAgICAgIGlqKGEsIGIpOwogICAgICAgICAgICAgIGEgPSBiLnBlbmRpbmdQcm9wczsKICAgICAgICAgICAgICBlID0gZC5faW5pdDsKICAgICAgICAgICAgICBkID0gZShkLl9wYXlsb2FkKTsKICAgICAgICAgICAgICBiLnR5cGUgPSBkOwogICAgICAgICAgICAgIGUgPSBiLnRhZyA9IFprKGQpOwogICAgICAgICAgICAgIGEgPSBDaShkLCBhKTsKICAgICAgICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgYiA9IGNqKG51bGwsIGIsIGQsIGEsIGMpOwogICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICBiID0gaGoobnVsbCwgYiwgZCwgYSwgYyk7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICBiID0gWWkobnVsbCwgYiwgZCwgYSwgYyk7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICBiID0gJGkobnVsbCwgYiwgZCwgQ2koZC50eXBlLCBhKSwgYyk7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRocm93IEVycm9yKHAoCiAgICAgICAgICAgICAgICAzMDYsCiAgICAgICAgICAgICAgICBkLAogICAgICAgICAgICAgICAgIiIKICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgcmV0dXJuIGQgPSBiLnR5cGUsIGUgPSBiLnBlbmRpbmdQcm9wcywgZSA9IGIuZWxlbWVudFR5cGUgPT09IGQgPyBlIDogQ2koZCwgZSksIGNqKGEsIGIsIGQsIGUsIGMpOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gZCA9IGIudHlwZSwgZSA9IGIucGVuZGluZ1Byb3BzLCBlID0gYi5lbGVtZW50VHlwZSA9PT0gZCA/IGUgOiBDaShkLCBlKSwgaGooYSwgYiwgZCwgZSwgYyk7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGE6IHsKICAgICAgICAgICAgICBraihiKTsKICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gYSkKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMzg3KSk7CiAgICAgICAgICAgICAgZCA9IGIucGVuZGluZ1Byb3BzOwogICAgICAgICAgICAgIGYgPSBiLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICAgICAgZSA9IGYuZWxlbWVudDsKICAgICAgICAgICAgICBsaChhLCBiKTsKICAgICAgICAgICAgICBxaChiLCBkLCBudWxsLCBjKTsKICAgICAgICAgICAgICB2YXIgZyA9IGIubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgICAgICBkID0gZy5lbGVtZW50OwogICAgICAgICAgICAgIGlmIChmLmlzRGVoeWRyYXRlZCkKICAgICAgICAgICAgICAgIGlmIChmID0geyBlbGVtZW50OiBkLCBpc0RlaHlkcmF0ZWQ6IGZhbHNlLCBjYWNoZTogZy5jYWNoZSwgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogZy5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLCB0cmFuc2l0aW9uczogZy50cmFuc2l0aW9ucyB9LCBiLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IGYsIGIubWVtb2l6ZWRTdGF0ZSA9IGYsIGIuZmxhZ3MgJiAyNTYpIHsKICAgICAgICAgICAgICAgICAgZSA9IEppKEVycm9yKHAoNDIzKSksIGIpOwogICAgICAgICAgICAgICAgICBiID0gbGooYSwgYiwgZCwgYywgZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQgIT09IGUpIHsKICAgICAgICAgICAgICAgICAgZSA9IEppKEVycm9yKHAoNDI0KSksIGIpOwogICAgICAgICAgICAgICAgICBiID0gbGooYSwgYiwgZCwgYywgZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgZm9yICh5ZyA9IExmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCksIHhnID0gYiwgSSA9IHRydWUsIHpnID0gbnVsbCwgYyA9IFZnKGIsIG51bGwsIGQsIGMpLCBiLmNoaWxkID0gYzsgYzsgKQogICAgICAgICAgICAgICAgICAgIGMuZmxhZ3MgPSBjLmZsYWdzICYgLTMgfCA0MDk2LCBjID0gYy5zaWJsaW5nOwogICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgSWcoKTsKICAgICAgICAgICAgICAgIGlmIChkID09PSBlKSB7CiAgICAgICAgICAgICAgICAgIGIgPSBaaShhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFhpKGEsIGIsIGQsIGMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBiID0gYi5jaGlsZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgcmV0dXJuIEFoKGIpLCBudWxsID09PSBhICYmIEVnKGIpLCBkID0gYi50eXBlLCBlID0gYi5wZW5kaW5nUHJvcHMsIGYgPSBudWxsICE9PSBhID8gYS5tZW1vaXplZFByb3BzIDogbnVsbCwgZyA9IGUuY2hpbGRyZW4sIEVmKGQsIGUpID8gZyA9IG51bGwgOiBudWxsICE9PSBmICYmIEVmKGQsIGYpICYmIChiLmZsYWdzIHw9IDMyKSwgZ2ooYSwgYiksIFhpKGEsIGIsIGcsIGMpLCBiLmNoaWxkOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gYSAmJiBFZyhiKSwgbnVsbDsKICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgIHJldHVybiBvaihhLCBiLCBjKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuIHloKGIsIGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLCBkID0gYi5wZW5kaW5nUHJvcHMsIG51bGwgPT09IGEgPyBiLmNoaWxkID0gVWcoYiwgbnVsbCwgZCwgYykgOiBYaShhLCBiLCBkLCBjKSwgYi5jaGlsZDsKICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgIHJldHVybiBkID0gYi50eXBlLCBlID0gYi5wZW5kaW5nUHJvcHMsIGUgPSBiLmVsZW1lbnRUeXBlID09PSBkID8gZSA6IENpKGQsIGUpLCBZaShhLCBiLCBkLCBlLCBjKTsKICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgcmV0dXJuIFhpKGEsIGIsIGIucGVuZGluZ1Byb3BzLCBjKSwgYi5jaGlsZDsKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgcmV0dXJuIFhpKGEsIGIsIGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBjKSwgYi5jaGlsZDsKICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgIHJldHVybiBYaShhLCBiLCBiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgYyksIGIuY2hpbGQ7CiAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgZCA9IGIudHlwZS5fY29udGV4dDsKICAgICAgICAgICAgICBlID0gYi5wZW5kaW5nUHJvcHM7CiAgICAgICAgICAgICAgZiA9IGIubWVtb2l6ZWRQcm9wczsKICAgICAgICAgICAgICBnID0gZS52YWx1ZTsKICAgICAgICAgICAgICBHKFdnLCBkLl9jdXJyZW50VmFsdWUpOwogICAgICAgICAgICAgIGQuX2N1cnJlbnRWYWx1ZSA9IGc7CiAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGYpCiAgICAgICAgICAgICAgICBpZiAoSGUoZi52YWx1ZSwgZykpIHsKICAgICAgICAgICAgICAgICAgaWYgKGYuY2hpbGRyZW4gPT09IGUuY2hpbGRyZW4gJiYgIVdmLmN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICBiID0gWmkoYSwgYiwgYyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgIGZvciAoZiA9IGIuY2hpbGQsIG51bGwgIT09IGYgJiYgKGYucmV0dXJuID0gYik7IG51bGwgIT09IGY7ICkgewogICAgICAgICAgICAgICAgICAgIHZhciBoID0gZi5kZXBlbmRlbmNpZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGcgPSBmLmNoaWxkOwogICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IGguZmlyc3RDb250ZXh0OyBudWxsICE9PSBrOyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsuY29udGV4dCA9PT0gZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09PSBmLnRhZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IG1oKC0xLCBjICYgLWMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgay50YWcgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBmLnVwZGF0ZVF1ZXVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGwuc2hhcmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IGwucGVuZGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gbSA/IGsubmV4dCA9IGsgOiAoay5uZXh0ID0gbS5uZXh0LCBtLm5leHQgPSBrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5wZW5kaW5nID0gazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgZi5sYW5lcyB8PSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBmLmFsdGVybmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBrICYmIChrLmxhbmVzIHw9IGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYgogICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaC5sYW5lcyB8PSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBrLm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgxMCA9PT0gZi50YWcpCiAgICAgICAgICAgICAgICAgICAgICBnID0gZi50eXBlID09PSBiLnR5cGUgPyBudWxsIDogZi5jaGlsZDsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgxOCA9PT0gZi50YWcpIHsKICAgICAgICAgICAgICAgICAgICAgIGcgPSBmLnJldHVybjsKICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBnKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihwKDM0MSkpOwogICAgICAgICAgICAgICAgICAgICAgZy5sYW5lcyB8PSBjOwogICAgICAgICAgICAgICAgICAgICAgaCA9IGcuYWx0ZXJuYXRlOwogICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gaCAmJiAoaC5sYW5lcyB8PSBjKTsKICAgICAgICAgICAgICAgICAgICAgIGJoKGcsIGMsIGIpOwogICAgICAgICAgICAgICAgICAgICAgZyA9IGYuc2libGluZzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgIGcgPSBmLmNoaWxkOwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBnKQogICAgICAgICAgICAgICAgICAgICAgZy5yZXR1cm4gPSBmOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgIGZvciAoZyA9IGY7IG51bGwgIT09IGc7ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyA9PT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBnLnNpYmxpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXR1cm4gPSBnLnJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBnID0gZy5yZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZiA9IGc7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBYaShhLCBiLCBlLmNoaWxkcmVuLCBjKTsKICAgICAgICAgICAgICBiID0gYi5jaGlsZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgcmV0dXJuIGUgPSBiLnR5cGUsIGQgPSBiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgY2goYiwgYyksIGUgPSBlaChlKSwgZCA9IGQoZSksIGIuZmxhZ3MgfD0gMSwgWGkoYSwgYiwgZCwgYyksIGIuY2hpbGQ7CiAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICByZXR1cm4gZCA9IGIudHlwZSwgZSA9IENpKGQsIGIucGVuZGluZ1Byb3BzKSwgZSA9IENpKGQudHlwZSwgZSksICRpKGEsIGIsIGQsIGUsIGMpOwogICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgcmV0dXJuIGJqKGEsIGIsIGIudHlwZSwgYi5wZW5kaW5nUHJvcHMsIGMpOwogICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgcmV0dXJuIGQgPSBiLnR5cGUsIGUgPSBiLnBlbmRpbmdQcm9wcywgZSA9IGIuZWxlbWVudFR5cGUgPT09IGQgPyBlIDogQ2koZCwgZSksIGlqKGEsIGIpLCBiLnRhZyA9IDEsIFpmKGQpID8gKGEgPSB0cnVlLCBjZyhiKSkgOiBhID0gZmFsc2UsIGNoKGIsIGMpLCBHaShiLCBkLCBlKSwgSWkoYiwgZCwgZSwgYyksIGpqKG51bGwsIGIsIGQsIHRydWUsIGEsIGMpOwogICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgcmV0dXJuIHhqKGEsIGIsIGMpOwogICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgcmV0dXJuIGRqKGEsIGIsIGMpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBFcnJvcihwKDE1NiwgYi50YWcpKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gRmsoYSwgYikgewogICAgICAgIHJldHVybiBhYyhhLCBiKTsKICAgICAgfQogICAgICBmdW5jdGlvbiAkayhhLCBiLCBjLCBkKSB7CiAgICAgICAgdGhpcy50YWcgPSBhOwogICAgICAgIHRoaXMua2V5ID0gYzsKICAgICAgICB0aGlzLnNpYmxpbmcgPSB0aGlzLmNoaWxkID0gdGhpcy5yZXR1cm4gPSB0aGlzLnN0YXRlTm9kZSA9IHRoaXMudHlwZSA9IHRoaXMuZWxlbWVudFR5cGUgPSBudWxsOwogICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgICAgIHRoaXMucmVmID0gbnVsbDsKICAgICAgICB0aGlzLnBlbmRpbmdQcm9wcyA9IGI7CiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSB0aGlzLm1lbW9pemVkU3RhdGUgPSB0aGlzLnVwZGF0ZVF1ZXVlID0gdGhpcy5tZW1vaXplZFByb3BzID0gbnVsbDsKICAgICAgICB0aGlzLm1vZGUgPSBkOwogICAgICAgIHRoaXMuc3VidHJlZUZsYWdzID0gdGhpcy5mbGFncyA9IDA7CiAgICAgICAgdGhpcy5kZWxldGlvbnMgPSBudWxsOwogICAgICAgIHRoaXMuY2hpbGRMYW5lcyA9IHRoaXMubGFuZXMgPSAwOwogICAgICAgIHRoaXMuYWx0ZXJuYXRlID0gbnVsbDsKICAgICAgfQogICAgICBmdW5jdGlvbiBCZyhhLCBiLCBjLCBkKSB7CiAgICAgICAgcmV0dXJuIG5ldyAkayhhLCBiLCBjLCBkKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBhaihhKSB7CiAgICAgICAgYSA9IGEucHJvdG90eXBlOwogICAgICAgIHJldHVybiAhKCFhIHx8ICFhLmlzUmVhY3RDb21wb25lbnQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIFprKGEpIHsKICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGEpCiAgICAgICAgICByZXR1cm4gYWooYSkgPyAxIDogMDsKICAgICAgICBpZiAodm9pZCAwICE9PSBhICYmIG51bGwgIT09IGEpIHsKICAgICAgICAgIGEgPSBhLiQkdHlwZW9mOwogICAgICAgICAgaWYgKGEgPT09IERhKQogICAgICAgICAgICByZXR1cm4gMTE7CiAgICAgICAgICBpZiAoYSA9PT0gR2EpCiAgICAgICAgICAgIHJldHVybiAxNDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gUGcoYSwgYikgewogICAgICAgIHZhciBjID0gYS5hbHRlcm5hdGU7CiAgICAgICAgbnVsbCA9PT0gYyA/IChjID0gQmcoYS50YWcsIGIsIGEua2V5LCBhLm1vZGUpLCBjLmVsZW1lbnRUeXBlID0gYS5lbGVtZW50VHlwZSwgYy50eXBlID0gYS50eXBlLCBjLnN0YXRlTm9kZSA9IGEuc3RhdGVOb2RlLCBjLmFsdGVybmF0ZSA9IGEsIGEuYWx0ZXJuYXRlID0gYykgOiAoYy5wZW5kaW5nUHJvcHMgPSBiLCBjLnR5cGUgPSBhLnR5cGUsIGMuZmxhZ3MgPSAwLCBjLnN1YnRyZWVGbGFncyA9IDAsIGMuZGVsZXRpb25zID0gbnVsbCk7CiAgICAgICAgYy5mbGFncyA9IGEuZmxhZ3MgJiAxNDY4MDA2NDsKICAgICAgICBjLmNoaWxkTGFuZXMgPSBhLmNoaWxkTGFuZXM7CiAgICAgICAgYy5sYW5lcyA9IGEubGFuZXM7CiAgICAgICAgYy5jaGlsZCA9IGEuY2hpbGQ7CiAgICAgICAgYy5tZW1vaXplZFByb3BzID0gYS5tZW1vaXplZFByb3BzOwogICAgICAgIGMubWVtb2l6ZWRTdGF0ZSA9IGEubWVtb2l6ZWRTdGF0ZTsKICAgICAgICBjLnVwZGF0ZVF1ZXVlID0gYS51cGRhdGVRdWV1ZTsKICAgICAgICBiID0gYS5kZXBlbmRlbmNpZXM7CiAgICAgICAgYy5kZXBlbmRlbmNpZXMgPSBudWxsID09PSBiID8gbnVsbCA6IHsgbGFuZXM6IGIubGFuZXMsIGZpcnN0Q29udGV4dDogYi5maXJzdENvbnRleHQgfTsKICAgICAgICBjLnNpYmxpbmcgPSBhLnNpYmxpbmc7CiAgICAgICAgYy5pbmRleCA9IGEuaW5kZXg7CiAgICAgICAgYy5yZWYgPSBhLnJlZjsKICAgICAgICByZXR1cm4gYzsKICAgICAgfQogICAgICBmdW5jdGlvbiBSZyhhLCBiLCBjLCBkLCBlLCBmKSB7CiAgICAgICAgdmFyIGcgPSAyOwogICAgICAgIGQgPSBhOwogICAgICAgIGlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgYSkKICAgICAgICAgIGFqKGEpICYmIChnID0gMSk7CiAgICAgICAgZWxzZSBpZiAoInN0cmluZyIgPT09IHR5cGVvZiBhKQogICAgICAgICAgZyA9IDU7CiAgICAgICAgZWxzZQogICAgICAgICAgYToKICAgICAgICAgICAgc3dpdGNoIChhKSB7CiAgICAgICAgICAgICAgY2FzZSB5YToKICAgICAgICAgICAgICAgIHJldHVybiBUZyhjLmNoaWxkcmVuLCBlLCBmLCBiKTsKICAgICAgICAgICAgICBjYXNlIHphOgogICAgICAgICAgICAgICAgZyA9IDg7CiAgICAgICAgICAgICAgICBlIHw9IDg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIEFhOgogICAgICAgICAgICAgICAgcmV0dXJuIGEgPSBCZygxMiwgYywgYiwgZSB8IDIpLCBhLmVsZW1lbnRUeXBlID0gQWEsIGEubGFuZXMgPSBmLCBhOwogICAgICAgICAgICAgIGNhc2UgRWE6CiAgICAgICAgICAgICAgICByZXR1cm4gYSA9IEJnKDEzLCBjLCBiLCBlKSwgYS5lbGVtZW50VHlwZSA9IEVhLCBhLmxhbmVzID0gZiwgYTsKICAgICAgICAgICAgICBjYXNlIEZhOgogICAgICAgICAgICAgICAgcmV0dXJuIGEgPSBCZygxOSwgYywgYiwgZSksIGEuZWxlbWVudFR5cGUgPSBGYSwgYS5sYW5lcyA9IGYsIGE7CiAgICAgICAgICAgICAgY2FzZSBJYToKICAgICAgICAgICAgICAgIHJldHVybiBwaihjLCBlLCBmLCBiKTsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaWYgKCJvYmplY3QiID09PSB0eXBlb2YgYSAmJiBudWxsICE9PSBhKQogICAgICAgICAgICAgICAgICBzd2l0Y2ggKGEuJCR0eXBlb2YpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIEJhOgogICAgICAgICAgICAgICAgICAgICAgZyA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICBjYXNlIENhOgogICAgICAgICAgICAgICAgICAgICAgZyA9IDk7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgIGNhc2UgRGE6CiAgICAgICAgICAgICAgICAgICAgICBnID0gMTE7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgIGNhc2UgR2E6CiAgICAgICAgICAgICAgICAgICAgICBnID0gMTQ7CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgIGNhc2UgSGE6CiAgICAgICAgICAgICAgICAgICAgICBnID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICBkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHAoMTMwLCBudWxsID09IGEgPyBhIDogdHlwZW9mIGEsICIiKSk7CiAgICAgICAgICAgIH0KICAgICAgICBiID0gQmcoZywgYywgYiwgZSk7CiAgICAgICAgYi5lbGVtZW50VHlwZSA9IGE7CiAgICAgICAgYi50eXBlID0gZDsKICAgICAgICBiLmxhbmVzID0gZjsKICAgICAgICByZXR1cm4gYjsKICAgICAgfQogICAgICBmdW5jdGlvbiBUZyhhLCBiLCBjLCBkKSB7CiAgICAgICAgYSA9IEJnKDcsIGEsIGQsIGIpOwogICAgICAgIGEubGFuZXMgPSBjOwogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBqKGEsIGIsIGMsIGQpIHsKICAgICAgICBhID0gQmcoMjIsIGEsIGQsIGIpOwogICAgICAgIGEuZWxlbWVudFR5cGUgPSBJYTsKICAgICAgICBhLmxhbmVzID0gYzsKICAgICAgICBhLnN0YXRlTm9kZSA9IHsgaXNIaWRkZW46IGZhbHNlIH07CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gUWcoYSwgYiwgYykgewogICAgICAgIGEgPSBCZyg2LCBhLCBudWxsLCBiKTsKICAgICAgICBhLmxhbmVzID0gYzsKICAgICAgICByZXR1cm4gYTsKICAgICAgfQogICAgICBmdW5jdGlvbiBTZyhhLCBiLCBjKSB7CiAgICAgICAgYiA9IEJnKDQsIG51bGwgIT09IGEuY2hpbGRyZW4gPyBhLmNoaWxkcmVuIDogW10sIGEua2V5LCBiKTsKICAgICAgICBiLmxhbmVzID0gYzsKICAgICAgICBiLnN0YXRlTm9kZSA9IHsgY29udGFpbmVySW5mbzogYS5jb250YWluZXJJbmZvLCBwZW5kaW5nQ2hpbGRyZW46IG51bGwsIGltcGxlbWVudGF0aW9uOiBhLmltcGxlbWVudGF0aW9uIH07CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYWwoYSwgYiwgYywgZCwgZSkgewogICAgICAgIHRoaXMudGFnID0gYjsKICAgICAgICB0aGlzLmNvbnRhaW5lckluZm8gPSBhOwogICAgICAgIHRoaXMuZmluaXNoZWRXb3JrID0gdGhpcy5waW5nQ2FjaGUgPSB0aGlzLmN1cnJlbnQgPSB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7CiAgICAgICAgdGhpcy50aW1lb3V0SGFuZGxlID0gLTE7CiAgICAgICAgdGhpcy5jYWxsYmFja05vZGUgPSB0aGlzLnBlbmRpbmdDb250ZXh0ID0gdGhpcy5jb250ZXh0ID0gbnVsbDsKICAgICAgICB0aGlzLmNhbGxiYWNrUHJpb3JpdHkgPSAwOwogICAgICAgIHRoaXMuZXZlbnRUaW1lcyA9IHpjKDApOwogICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWVzID0gemMoLTEpOwogICAgICAgIHRoaXMuZW50YW5nbGVkTGFuZXMgPSB0aGlzLmZpbmlzaGVkTGFuZXMgPSB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSB0aGlzLmV4cGlyZWRMYW5lcyA9IHRoaXMucGluZ2VkTGFuZXMgPSB0aGlzLnN1c3BlbmRlZExhbmVzID0gdGhpcy5wZW5kaW5nTGFuZXMgPSAwOwogICAgICAgIHRoaXMuZW50YW5nbGVtZW50cyA9IHpjKDApOwogICAgICAgIHRoaXMuaWRlbnRpZmllclByZWZpeCA9IGQ7CiAgICAgICAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBlOwogICAgICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYmwoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaykgewogICAgICAgIGEgPSBuZXcgYWwoYSwgYiwgYywgaCwgayk7CiAgICAgICAgMSA9PT0gYiA/IChiID0gMSwgdHJ1ZSA9PT0gZiAmJiAoYiB8PSA4KSkgOiBiID0gMDsKICAgICAgICBmID0gQmcoMywgbnVsbCwgbnVsbCwgYik7CiAgICAgICAgYS5jdXJyZW50ID0gZjsKICAgICAgICBmLnN0YXRlTm9kZSA9IGE7CiAgICAgICAgZi5tZW1vaXplZFN0YXRlID0geyBlbGVtZW50OiBkLCBpc0RlaHlkcmF0ZWQ6IGMsIGNhY2hlOiBudWxsLCB0cmFuc2l0aW9uczogbnVsbCwgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbCB9OwogICAgICAgIGtoKGYpOwogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGNsKGEsIGIsIGMpIHsKICAgICAgICB2YXIgZCA9IDMgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdID8gYXJndW1lbnRzWzNdIDogbnVsbDsKICAgICAgICByZXR1cm4geyAkJHR5cGVvZjogd2EsIGtleTogbnVsbCA9PSBkID8gbnVsbCA6ICIiICsgZCwgY2hpbGRyZW46IGEsIGNvbnRhaW5lckluZm86IGIsIGltcGxlbWVudGF0aW9uOiBjIH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZGwoYSkgewogICAgICAgIGlmICghYSkKICAgICAgICAgIHJldHVybiBWZjsKICAgICAgICBhID0gYS5fcmVhY3RJbnRlcm5hbHM7CiAgICAgICAgYTogewogICAgICAgICAgaWYgKFZiKGEpICE9PSBhIHx8IDEgIT09IGEudGFnKQogICAgICAgICAgICB0aHJvdyBFcnJvcihwKDE3MCkpOwogICAgICAgICAgdmFyIGIgPSBhOwogICAgICAgICAgZG8gewogICAgICAgICAgICBzd2l0Y2ggKGIudGFnKSB7CiAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgYiA9IGIuc3RhdGVOb2RlLmNvbnRleHQ7CiAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIGlmIChaZihiLnR5cGUpKSB7CiAgICAgICAgICAgICAgICAgIGIgPSBiLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDsKICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBiID0gYi5yZXR1cm47CiAgICAgICAgICB9IHdoaWxlIChudWxsICE9PSBiKTsKICAgICAgICAgIHRocm93IEVycm9yKHAoMTcxKSk7CiAgICAgICAgfQogICAgICAgIGlmICgxID09PSBhLnRhZykgewogICAgICAgICAgdmFyIGMgPSBhLnR5cGU7CiAgICAgICAgICBpZiAoWmYoYykpCiAgICAgICAgICAgIHJldHVybiBiZyhhLCBjLCBiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZWwoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaykgewogICAgICAgIGEgPSBibChjLCBkLCB0cnVlLCBhLCBlLCBmLCBnLCBoLCBrKTsKICAgICAgICBhLmNvbnRleHQgPSBkbChudWxsKTsKICAgICAgICBjID0gYS5jdXJyZW50OwogICAgICAgIGQgPSBSKCk7CiAgICAgICAgZSA9IHlpKGMpOwogICAgICAgIGYgPSBtaChkLCBlKTsKICAgICAgICBmLmNhbGxiYWNrID0gdm9pZCAwICE9PSBiICYmIG51bGwgIT09IGIgPyBiIDogbnVsbDsKICAgICAgICBuaChjLCBmLCBlKTsKICAgICAgICBhLmN1cnJlbnQubGFuZXMgPSBlOwogICAgICAgIEFjKGEsIGUsIGQpOwogICAgICAgIERrKGEsIGQpOwogICAgICAgIHJldHVybiBhOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGZsKGEsIGIsIGMsIGQpIHsKICAgICAgICB2YXIgZSA9IGIuY3VycmVudCwgZiA9IFIoKSwgZyA9IHlpKGUpOwogICAgICAgIGMgPSBkbChjKTsKICAgICAgICBudWxsID09PSBiLmNvbnRleHQgPyBiLmNvbnRleHQgPSBjIDogYi5wZW5kaW5nQ29udGV4dCA9IGM7CiAgICAgICAgYiA9IG1oKGYsIGcpOwogICAgICAgIGIucGF5bG9hZCA9IHsgZWxlbWVudDogYSB9OwogICAgICAgIGQgPSB2b2lkIDAgPT09IGQgPyBudWxsIDogZDsKICAgICAgICBudWxsICE9PSBkICYmIChiLmNhbGxiYWNrID0gZCk7CiAgICAgICAgYSA9IG5oKGUsIGIsIGcpOwogICAgICAgIG51bGwgIT09IGEgJiYgKGdpKGEsIGUsIGcsIGYpLCBvaChhLCBlLCBnKSk7CiAgICAgICAgcmV0dXJuIGc7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2woYSkgewogICAgICAgIGEgPSBhLmN1cnJlbnQ7CiAgICAgICAgaWYgKCFhLmNoaWxkKQogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgc3dpdGNoIChhLmNoaWxkLnRhZykgewogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByZXR1cm4gYS5jaGlsZC5zdGF0ZU5vZGU7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gYS5jaGlsZC5zdGF0ZU5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGhsKGEsIGIpIHsKICAgICAgICBhID0gYS5tZW1vaXplZFN0YXRlOwogICAgICAgIGlmIChudWxsICE9PSBhICYmIG51bGwgIT09IGEuZGVoeWRyYXRlZCkgewogICAgICAgICAgdmFyIGMgPSBhLnJldHJ5TGFuZTsKICAgICAgICAgIGEucmV0cnlMYW5lID0gMCAhPT0gYyAmJiBjIDwgYiA/IGMgOiBiOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBpbChhLCBiKSB7CiAgICAgICAgaGwoYSwgYik7CiAgICAgICAgKGEgPSBhLmFsdGVybmF0ZSkgJiYgaGwoYSwgYik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gamwoKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdmFyIGtsID0gImZ1bmN0aW9uIiA9PT0gdHlwZW9mIHJlcG9ydEVycm9yID8gcmVwb3J0RXJyb3IgOiBmdW5jdGlvbihhKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihhKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gbGwoYSkgewogICAgICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IGE7CiAgICAgIH0KICAgICAgbWwucHJvdG90eXBlLnJlbmRlciA9IGxsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbihhKSB7CiAgICAgICAgdmFyIGIgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7CiAgICAgICAgaWYgKG51bGwgPT09IGIpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDQwOSkpOwogICAgICAgIGZsKGEsIGIsIG51bGwsIG51bGwpOwogICAgICB9OwogICAgICBtbC5wcm90b3R5cGUudW5tb3VudCA9IGxsLnByb3RvdHlwZS51bm1vdW50ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7CiAgICAgICAgaWYgKG51bGwgIT09IGEpIHsKICAgICAgICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IG51bGw7CiAgICAgICAgICB2YXIgYiA9IGEuY29udGFpbmVySW5mbzsKICAgICAgICAgIFJrKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmbChudWxsLCBhLCBudWxsLCBudWxsKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYlt1Zl0gPSBudWxsOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZnVuY3Rpb24gbWwoYSkgewogICAgICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IGE7CiAgICAgIH0KICAgICAgbWwucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uID0gZnVuY3Rpb24oYSkgewogICAgICAgIGlmIChhKSB7CiAgICAgICAgICB2YXIgYiA9IEhjKCk7CiAgICAgICAgICBhID0geyBibG9ja2VkT246IG51bGwsIHRhcmdldDogYSwgcHJpb3JpdHk6IGIgfTsKICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgUWMubGVuZ3RoICYmIDAgIT09IGIgJiYgYiA8IFFjW2NdLnByaW9yaXR5OyBjKyspCiAgICAgICAgICAgIDsKICAgICAgICAgIFFjLnNwbGljZShjLCAwLCBhKTsKICAgICAgICAgIDAgPT09IGMgJiYgVmMoYSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBmdW5jdGlvbiBubChhKSB7CiAgICAgICAgcmV0dXJuICEoIWEgfHwgMSAhPT0gYS5ub2RlVHlwZSAmJiA5ICE9PSBhLm5vZGVUeXBlICYmIDExICE9PSBhLm5vZGVUeXBlKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBvbChhKSB7CiAgICAgICAgcmV0dXJuICEoIWEgfHwgMSAhPT0gYS5ub2RlVHlwZSAmJiA5ICE9PSBhLm5vZGVUeXBlICYmIDExICE9PSBhLm5vZGVUeXBlICYmICg4ICE9PSBhLm5vZGVUeXBlIHx8ICIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgIiAhPT0gYS5ub2RlVmFsdWUpKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBwbCgpIHsKICAgICAgfQogICAgICBmdW5jdGlvbiBxbChhLCBiLCBjLCBkLCBlKSB7CiAgICAgICAgaWYgKGUpIHsKICAgICAgICAgIGlmICgiZnVuY3Rpb24iID09PSB0eXBlb2YgZCkgewogICAgICAgICAgICB2YXIgZiA9IGQ7CiAgICAgICAgICAgIGQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgYTIgPSBnbChnKTsKICAgICAgICAgICAgICBmLmNhbGwoYTIpOwogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgdmFyIGcgPSBlbChiLCBkLCBhLCAwLCBudWxsLCBmYWxzZSwgZmFsc2UsICIiLCBwbCk7CiAgICAgICAgICBhLl9yZWFjdFJvb3RDb250YWluZXIgPSBnOwogICAgICAgICAgYVt1Zl0gPSBnLmN1cnJlbnQ7CiAgICAgICAgICBzZig4ID09PSBhLm5vZGVUeXBlID8gYS5wYXJlbnROb2RlIDogYSk7CiAgICAgICAgICBSaygpOwogICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgfQogICAgICAgIGZvciAoOyBlID0gYS5sYXN0Q2hpbGQ7ICkKICAgICAgICAgIGEucmVtb3ZlQ2hpbGQoZSk7CiAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBkKSB7CiAgICAgICAgICB2YXIgaCA9IGQ7CiAgICAgICAgICBkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBhMiA9IGdsKGspOwogICAgICAgICAgICBoLmNhbGwoYTIpOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgdmFyIGsgPSBibChhLCAwLCBmYWxzZSwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCAiIiwgcGwpOwogICAgICAgIGEuX3JlYWN0Um9vdENvbnRhaW5lciA9IGs7CiAgICAgICAgYVt1Zl0gPSBrLmN1cnJlbnQ7CiAgICAgICAgc2YoOCA9PT0gYS5ub2RlVHlwZSA/IGEucGFyZW50Tm9kZSA6IGEpOwogICAgICAgIFJrKGZ1bmN0aW9uKCkgewogICAgICAgICAgZmwoYiwgaywgYywgZCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGs7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmwoYSwgYiwgYywgZCwgZSkgewogICAgICAgIHZhciBmID0gYy5fcmVhY3RSb290Q29udGFpbmVyOwogICAgICAgIGlmIChmKSB7CiAgICAgICAgICB2YXIgZyA9IGY7CiAgICAgICAgICBpZiAoImZ1bmN0aW9uIiA9PT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgdmFyIGggPSBlOwogICAgICAgICAgICBlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgdmFyIGEyID0gZ2woZyk7CiAgICAgICAgICAgICAgaC5jYWxsKGEyKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIGZsKGIsIGcsIGEsIGUpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgZyA9IHFsKGMsIGIsIGEsIGUsIGQpOwogICAgICAgIHJldHVybiBnbChnKTsKICAgICAgfQogICAgICBFYyA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICBzd2l0Y2ggKGEudGFnKSB7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHZhciBiID0gYS5zdGF0ZU5vZGU7CiAgICAgICAgICAgIGlmIChiLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpIHsKICAgICAgICAgICAgICB2YXIgYyA9IHRjKGIucGVuZGluZ0xhbmVzKTsKICAgICAgICAgICAgICAwICE9PSBjICYmIChDYyhiLCBjIHwgMSksIERrKGIsIEIoKSksIDAgPT09IChLICYgNikgJiYgKEdqID0gQigpICsgNTAwLCBqZygpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBSayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgYjIgPSBpaChhLCAxKTsKICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gYjIpIHsKICAgICAgICAgICAgICAgIHZhciBjMiA9IFIoKTsKICAgICAgICAgICAgICAgIGdpKGIyLCBhLCAxLCBjMik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSwgaWwoYSwgMSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBGYyA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICBpZiAoMTMgPT09IGEudGFnKSB7CiAgICAgICAgICB2YXIgYiA9IGloKGEsIDEzNDIxNzcyOCk7CiAgICAgICAgICBpZiAobnVsbCAhPT0gYikgewogICAgICAgICAgICB2YXIgYyA9IFIoKTsKICAgICAgICAgICAgZ2koYiwgYSwgMTM0MjE3NzI4LCBjKTsKICAgICAgICAgIH0KICAgICAgICAgIGlsKGEsIDEzNDIxNzcyOCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBHYyA9IGZ1bmN0aW9uKGEpIHsKICAgICAgICBpZiAoMTMgPT09IGEudGFnKSB7CiAgICAgICAgICB2YXIgYiA9IHlpKGEpLCBjID0gaWgoYSwgYik7CiAgICAgICAgICBpZiAobnVsbCAhPT0gYykgewogICAgICAgICAgICB2YXIgZCA9IFIoKTsKICAgICAgICAgICAgZ2koYywgYSwgYiwgZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpbChhLCBiKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEhjID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIEM7CiAgICAgIH07CiAgICAgIEljID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgIHZhciBjID0gQzsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIEMgPSBhLCBiKCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIEMgPSBjOwogICAgICAgIH0KICAgICAgfTsKICAgICAgeWIgPSBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICAgICAgc3dpdGNoIChiKSB7CiAgICAgICAgICBjYXNlICJpbnB1dCI6CiAgICAgICAgICAgIGJiKGEsIGMpOwogICAgICAgICAgICBiID0gYy5uYW1lOwogICAgICAgICAgICBpZiAoInJhZGlvIiA9PT0gYy50eXBlICYmIG51bGwgIT0gYikgewogICAgICAgICAgICAgIGZvciAoYyA9IGE7IGMucGFyZW50Tm9kZTsgKQogICAgICAgICAgICAgICAgYyA9IGMucGFyZW50Tm9kZTsKICAgICAgICAgICAgICBjID0gYy5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIgKyBKU09OLnN0cmluZ2lmeSgiIiArIGIpICsgJ11bdHlwZT0icmFkaW8iXScpOwogICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBjLmxlbmd0aDsgYisrKSB7CiAgICAgICAgICAgICAgICB2YXIgZCA9IGNbYl07CiAgICAgICAgICAgICAgICBpZiAoZCAhPT0gYSAmJiBkLmZvcm0gPT09IGEuZm9ybSkgewogICAgICAgICAgICAgICAgICB2YXIgZSA9IERiKGQpOwogICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocCg5MCkpOwogICAgICAgICAgICAgICAgICBXYShkKTsKICAgICAgICAgICAgICAgICAgYmIoZCwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidGV4dGFyZWEiOgogICAgICAgICAgICBpYihhLCBjKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJzZWxlY3QiOgogICAgICAgICAgICBiID0gYy52YWx1ZSwgbnVsbCAhPSBiICYmIGZiKGEsICEhYy5tdWx0aXBsZSwgYiwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgR2IgPSBRazsKICAgICAgSGIgPSBSazsKICAgICAgdmFyIHNsID0geyB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLCBFdmVudHM6IFtDYiwgdWUsIERiLCBFYiwgRmIsIFFrXSB9OwogICAgICB2YXIgdGwgPSB7IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBXYywgYnVuZGxlVHlwZTogMCwgdmVyc2lvbjogIjE4LjMuMSIsIHJlbmRlcmVyUGFja2FnZU5hbWU6ICJyZWFjdC1kb20iIH07CiAgICAgIHZhciB1bCA9IHsgYnVuZGxlVHlwZTogdGwuYnVuZGxlVHlwZSwgdmVyc2lvbjogdGwudmVyc2lvbiwgcmVuZGVyZXJQYWNrYWdlTmFtZTogdGwucmVuZGVyZXJQYWNrYWdlTmFtZSwgcmVuZGVyZXJDb25maWc6IHRsLnJlbmRlcmVyQ29uZmlnLCBvdmVycmlkZUhvb2tTdGF0ZTogbnVsbCwgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBudWxsLCBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6IG51bGwsIG92ZXJyaWRlUHJvcHM6IG51bGwsIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOiBudWxsLCBvdmVycmlkZVByb3BzUmVuYW1lUGF0aDogbnVsbCwgc2V0RXJyb3JIYW5kbGVyOiBudWxsLCBzZXRTdXNwZW5zZUhhbmRsZXI6IG51bGwsIHNjaGVkdWxlVXBkYXRlOiBudWxsLCBjdXJyZW50RGlzcGF0Y2hlclJlZjogdWEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlciwgZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6IGZ1bmN0aW9uKGEpIHsKICAgICAgICBhID0gWmIoYSk7CiAgICAgICAgcmV0dXJuIG51bGwgPT09IGEgPyBudWxsIDogYS5zdGF0ZU5vZGU7CiAgICAgIH0sIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiB0bC5maW5kRmliZXJCeUhvc3RJbnN0YW5jZSB8fCBqbCwgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOiBudWxsLCBzY2hlZHVsZVJlZnJlc2g6IG51bGwsIHNjaGVkdWxlUm9vdDogbnVsbCwgc2V0UmVmcmVzaEhhbmRsZXI6IG51bGwsIGdldEN1cnJlbnRGaWJlcjogbnVsbCwgcmVjb25jaWxlclZlcnNpb246ICIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2IiB9OwogICAgICBpZiAoInVuZGVmaW5lZCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIHsKICAgICAgICB2bCA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXzsKICAgICAgICBpZiAoIXZsLmlzRGlzYWJsZWQgJiYgdmwuc3VwcG9ydHNGaWJlcikKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGtjID0gdmwuaW5qZWN0KHVsKSwgbGMgPSB2bDsKICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgIH0KICAgICAgfQogICAgICB2YXIgdmw7CiAgICAgIGV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBzbDsKICAgICAgZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgdmFyIGMgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IG51bGw7CiAgICAgICAgaWYgKCFubChiKSkKICAgICAgICAgIHRocm93IEVycm9yKHAoMjAwKSk7CiAgICAgICAgcmV0dXJuIGNsKGEsIGIsIG51bGwsIGMpOwogICAgICB9OwogICAgICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgaWYgKCFubChhKSkKICAgICAgICAgIHRocm93IEVycm9yKHAoMjk5KSk7CiAgICAgICAgdmFyIGMgPSBmYWxzZSwgZCA9ICIiLCBlID0ga2w7CiAgICAgICAgbnVsbCAhPT0gYiAmJiB2b2lkIDAgIT09IGIgJiYgKHRydWUgPT09IGIudW5zdGFibGVfc3RyaWN0TW9kZSAmJiAoYyA9IHRydWUpLCB2b2lkIDAgIT09IGIuaWRlbnRpZmllclByZWZpeCAmJiAoZCA9IGIuaWRlbnRpZmllclByZWZpeCksIHZvaWQgMCAhPT0gYi5vblJlY292ZXJhYmxlRXJyb3IgJiYgKGUgPSBiLm9uUmVjb3ZlcmFibGVFcnJvcikpOwogICAgICAgIGIgPSBibChhLCAxLCBmYWxzZSwgbnVsbCwgbnVsbCwgYywgZmFsc2UsIGQsIGUpOwogICAgICAgIGFbdWZdID0gYi5jdXJyZW50OwogICAgICAgIHNmKDggPT09IGEubm9kZVR5cGUgPyBhLnBhcmVudE5vZGUgOiBhKTsKICAgICAgICByZXR1cm4gbmV3IGxsKGIpOwogICAgICB9OwogICAgICBleHBvcnRzLmZpbmRET01Ob2RlID0gZnVuY3Rpb24oYSkgewogICAgICAgIGlmIChudWxsID09IGEpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBpZiAoMSA9PT0gYS5ub2RlVHlwZSkKICAgICAgICAgIHJldHVybiBhOwogICAgICAgIHZhciBiID0gYS5fcmVhY3RJbnRlcm5hbHM7CiAgICAgICAgaWYgKHZvaWQgMCA9PT0gYikgewogICAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT09IHR5cGVvZiBhLnJlbmRlcikKICAgICAgICAgICAgdGhyb3cgRXJyb3IocCgxODgpKTsKICAgICAgICAgIGEgPSBPYmplY3Qua2V5cyhhKS5qb2luKCIsIik7CiAgICAgICAgICB0aHJvdyBFcnJvcihwKDI2OCwgYSkpOwogICAgICAgIH0KICAgICAgICBhID0gWmIoYik7CiAgICAgICAgYSA9IG51bGwgPT09IGEgPyBudWxsIDogYS5zdGF0ZU5vZGU7CiAgICAgICAgcmV0dXJuIGE7CiAgICAgIH07CiAgICAgIGV4cG9ydHMuZmx1c2hTeW5jID0gZnVuY3Rpb24oYSkgewogICAgICAgIHJldHVybiBSayhhKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy5oeWRyYXRlID0gZnVuY3Rpb24oYSwgYiwgYykgewogICAgICAgIGlmICghb2woYikpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDIwMCkpOwogICAgICAgIHJldHVybiBybChudWxsLCBhLCBiLCB0cnVlLCBjKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgICAgICBpZiAoIW5sKGEpKQogICAgICAgICAgdGhyb3cgRXJyb3IocCg0MDUpKTsKICAgICAgICB2YXIgZCA9IG51bGwgIT0gYyAmJiBjLmh5ZHJhdGVkU291cmNlcyB8fCBudWxsLCBlID0gZmFsc2UsIGYgPSAiIiwgZyA9IGtsOwogICAgICAgIG51bGwgIT09IGMgJiYgdm9pZCAwICE9PSBjICYmICh0cnVlID09PSBjLnVuc3RhYmxlX3N0cmljdE1vZGUgJiYgKGUgPSB0cnVlKSwgdm9pZCAwICE9PSBjLmlkZW50aWZpZXJQcmVmaXggJiYgKGYgPSBjLmlkZW50aWZpZXJQcmVmaXgpLCB2b2lkIDAgIT09IGMub25SZWNvdmVyYWJsZUVycm9yICYmIChnID0gYy5vblJlY292ZXJhYmxlRXJyb3IpKTsKICAgICAgICBiID0gZWwoYiwgbnVsbCwgYSwgMSwgbnVsbCAhPSBjID8gYyA6IG51bGwsIGUsIGZhbHNlLCBmLCBnKTsKICAgICAgICBhW3VmXSA9IGIuY3VycmVudDsKICAgICAgICBzZihhKTsKICAgICAgICBpZiAoZCkKICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCBkLmxlbmd0aDsgYSsrKQogICAgICAgICAgICBjID0gZFthXSwgZSA9IGMuX2dldFZlcnNpb24sIGUgPSBlKGMuX3NvdXJjZSksIG51bGwgPT0gYi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID8gYi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW2MsIGVdIDogYi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2goCiAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICBlCiAgICAgICAgICAgICk7CiAgICAgICAgcmV0dXJuIG5ldyBtbChiKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy5yZW5kZXIgPSBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICAgICAgaWYgKCFvbChiKSkKICAgICAgICAgIHRocm93IEVycm9yKHAoMjAwKSk7CiAgICAgICAgcmV0dXJuIHJsKG51bGwsIGEsIGIsIGZhbHNlLCBjKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gZnVuY3Rpb24oYSkgewogICAgICAgIGlmICghb2woYSkpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDQwKSk7CiAgICAgICAgcmV0dXJuIGEuX3JlYWN0Um9vdENvbnRhaW5lciA/IChSayhmdW5jdGlvbigpIHsKICAgICAgICAgIHJsKG51bGwsIG51bGwsIGEsIGZhbHNlLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgYS5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDsKICAgICAgICAgICAgYVt1Zl0gPSBudWxsOwogICAgICAgICAgfSk7CiAgICAgICAgfSksIHRydWUpIDogZmFsc2U7CiAgICAgIH07CiAgICAgIGV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBRazsKICAgICAgZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHsKICAgICAgICBpZiAoIW9sKGMpKQogICAgICAgICAgdGhyb3cgRXJyb3IocCgyMDApKTsKICAgICAgICBpZiAobnVsbCA9PSBhIHx8IHZvaWQgMCA9PT0gYS5fcmVhY3RJbnRlcm5hbHMpCiAgICAgICAgICB0aHJvdyBFcnJvcihwKDM4KSk7CiAgICAgICAgcmV0dXJuIHJsKGEsIGIsIGMsIGZhbHNlLCBkKTsKICAgICAgfTsKICAgICAgZXhwb3J0cy52ZXJzaW9uID0gIjE4LjMuMS1uZXh0LWYxMzM4ZjgwODAtMjAyNDA0MjYiOwogICAgfQogIH0pOwoKICAvLyBub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzCiAgdmFyIHJlcXVpcmVfcmVhY3RfZG9tID0gX19jb21tb25KUyh7CiAgICAibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qcyIoZXhwb3J0cywgbW9kdWxlKSB7CiAgICAgICJ1c2Ugc3RyaWN0IjsKICAgICAgZnVuY3Rpb24gY2hlY2tEQ0UoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICJ1bmRlZmluZWQiIHx8IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGZhbHNlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIl5fXiIpOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRydWUpIHsKICAgICAgICBjaGVja0RDRSgpOwogICAgICAgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZV9yZWFjdF9kb21fcHJvZHVjdGlvbl9taW4oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG51bGw7CiAgICAgIH0KICAgIH0KICB9KTsKCiAgLy8gbGliL2Rhc2hib2FyZC9jbGllbnQtZW50cnkuanMKICB2YXIgaW1wb3J0X3JlYWN0MTkgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7CiAgdmFyIGltcG9ydF9yZWFjdF9kb20gPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3RfZG9tKCksIDEpOwoKICAvLyBsaWIvZGFzaGJvYXJkL2FwcC5qcwogIHZhciBpbXBvcnRfcmVhY3QxOCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTsKCiAgLy8gbGliL2Rhc2hib2FyZC9wbGFubmluZy5qcwogIHZhciBpbXBvcnRfcmVhY3QyID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCkpOwoKICAvLyBsaWIvZGFzaGJvYXJkL3dpZGdldC13cmFwcGVyLmpzCiAgdmFyIGltcG9ydF9yZWFjdCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTsKICBmdW5jdGlvbiBXaWRnZXRXcmFwcGVyKHsgdGl0bGUsIGljb24sIHdpZGdldElkLCBjb25maWd1cmFibGUsIG9uQ29uZmlndXJlLCBoZWFkZXJBY3Rpb25zLCBjaGlsZHJlbiB9KSB7CiAgICBjb25zdCBoID0gaW1wb3J0X3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudDsKICAgIGNvbnN0IGhhbmRsZUNvbmZpZ3VyZSA9IGFzeW5jICgpID0+IHsKICAgICAgaWYgKG9uQ29uZmlndXJlKSB7CiAgICAgICAgb25Db25maWd1cmUoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsUGx1Z2luKCJjb25maWd1cmUiLCB3aWRnZXRJZCk7CiAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBoKAogICAgICAiZGl2IiwKICAgICAgeyBjbGFzc05hbWU6ICJ3aWRnZXQgd2lkZ2V0LSIgKyB3aWRnZXRJZCB9LAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAid2lkZ2V0LWhlYWRlciIgfSwKICAgICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJ3aWRnZXQtaWNvbiIgfSwgaWNvbiksCiAgICAgICAgaCgiaDMiLCB7IGNsYXNzTmFtZTogIndpZGdldC10aXRsZSIgfSwgdGl0bGUpLAogICAgICAgIGhlYWRlckFjdGlvbnMgfHwgbnVsbCwKICAgICAgICBjb25maWd1cmFibGUgPyBoKCJidXR0b24iLCB7IGNsYXNzTmFtZTogIndpZGdldC1jb25maWd1cmUiLCBvbkNsaWNrOiBoYW5kbGVDb25maWd1cmUgfSwgIlx1MjY5OSBDb25maWd1cmUiKSA6IG51bGwKICAgICAgKSwKICAgICAgaCgiZGl2IiwgeyBjbGFzc05hbWU6ICJ3aWRnZXQtYm9keSIgfSwgY2hpbGRyZW4pCiAgICApOwogIH0KCiAgLy8gbGliL2Rhc2hib2FyZC9wbGFubmluZy5qcwogIGZ1bmN0aW9uIFBsYW5uaW5nV2lkZ2V0KHsgcXVhcnRlcmx5UGxhbnMgfSkgewogICAgY29uc3QgaCA9IGltcG9ydF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgW2FjdGl2ZVRhYiwgc2V0QWN0aXZlVGFiXSA9IGltcG9ydF9yZWFjdDIuZGVmYXVsdC51c2VTdGF0ZSgoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLmdldE1vbnRoKCkpOwogICAgY29uc3QgaGFuZGxlT3BlblBsYW4gPSBhc3luYyAocGxhbikgPT4gewogICAgICBpZiAocGxhbi5ub3RlVVVJRCkgewogICAgICAgIGF3YWl0IGNhbGxQbHVnaW4oIm5hdmlnYXRlVG9Ob3RlIiwgcGxhbi5ub3RlVVVJRCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXdhaXQgY2FsbFBsdWdpbigiY3JlYXRlUXVhcnRlcmx5UGxhbiIsIHsKICAgICAgICAgIGxhYmVsOiBwbGFuLmxhYmVsLAogICAgICAgICAgeWVhcjogcGxhbi55ZWFyLAogICAgICAgICAgcXVhcnRlcjogcGxhbi5xdWFydGVyCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBtb250aHMgPSBfZ2V0UXVhcnRlck1vbnRocyhxdWFydGVybHlQbGFucy5jdXJyZW50LCBxdWFydGVybHlQbGFucy5uZXh0KTsKICAgIHJldHVybiBoKAogICAgICBXaWRnZXRXcmFwcGVyLAogICAgICB7IHRpdGxlOiAiUGxhbm5pbmciLCBpY29uOiAiXHV7MUY0Q0J9Iiwgd2lkZ2V0SWQ6ICJwbGFubmluZyIgfSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogInBsYW5uaW5nLXF1YXJ0ZXJzIiB9LAogICAgICAgIFtxdWFydGVybHlQbGFucy5jdXJyZW50LCBxdWFydGVybHlQbGFucy5uZXh0XS5tYXAoCiAgICAgICAgICAocGxhbikgPT4gaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIHsga2V5OiBwbGFuLmxhYmVsLCBjbGFzc05hbWU6ICJxdWFydGVyLWNhcmQiLCBvbkNsaWNrOiAoKSA9PiBoYW5kbGVPcGVuUGxhbihwbGFuKSB9LAogICAgICAgICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJxdWFydGVyLWxhYmVsIiB9LCBwbGFuLmxhYmVsKSwKICAgICAgICAgICAgaCgKICAgICAgICAgICAgICAic3BhbiIsCiAgICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJxdWFydGVyLXN0YXR1cyIgfSwKICAgICAgICAgICAgICBwbGFuLm5vdGVVVUlEID8gIlx1ezFGNEREfSBPcGVuIFBsYW4iIDogIisgQ3JlYXRlIFBsYW4iCiAgICAgICAgICAgICkKICAgICAgICAgICkKICAgICAgICApCiAgICAgICksCiAgICAgIGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJtb250aC10YWJzIiB9LAogICAgICAgIG1vbnRocy5tYXAoCiAgICAgICAgICAobSkgPT4gaCgiYnV0dG9uIiwgewogICAgICAgICAgICBrZXk6IG0uaW5kZXgsCiAgICAgICAgICAgIGNsYXNzTmFtZTogIm1vbnRoLXRhYiIgKyAobS5pbmRleCA9PT0gYWN0aXZlVGFiID8gIiBhY3RpdmUiIDogIiIpLAogICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBzZXRBY3RpdmVUYWIobS5pbmRleCkKICAgICAgICAgIH0sIG0uc2hvcnQpCiAgICAgICAgKQogICAgICApCiAgICApOwogIH0KICBmdW5jdGlvbiBfZ2V0UXVhcnRlck1vbnRocyhjdXJyZW50LCBuZXh0KSB7CiAgICBjb25zdCBNT05USF9OQU1FUyA9IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXTsKICAgIGNvbnN0IHN0YXJ0TW9udGggPSAoY3VycmVudC5xdWFydGVyIC0gMSkgKiAzOwogICAgY29uc3QgbW9udGhzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICBjb25zdCBpZHggPSAoc3RhcnRNb250aCArIGkpICUgMTI7CiAgICAgIG1vbnRocy5wdXNoKHsgaW5kZXg6IGlkeCwgc2hvcnQ6IE1PTlRIX05BTUVTW2lkeF0gfSk7CiAgICB9CiAgICByZXR1cm4gbW9udGhzOwogIH0KCiAgLy8gbGliL2Rhc2hib2FyZC92aWN0b3J5LXZhbHVlLmpzCiAgdmFyIGltcG9ydF9yZWFjdDUgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSk7CgogIC8vIGxpYi9kYXNoYm9hcmQvY29uZmlnLXBvcHVwLmpzCiAgdmFyIGltcG9ydF9yZWFjdDMgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7CiAgZnVuY3Rpb24gQ29uZmlnUG9wdXAoeyB0aXRsZSwgb25TdWJtaXQsIG9uQ2FuY2VsLCBzdWJtaXRMYWJlbCA9ICJTdWJtaXQiLCBjaGlsZHJlbiB9KSB7CiAgICBjb25zdCBoID0gaW1wb3J0X3JlYWN0My5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgaGFuZGxlT3ZlcmxheUNsaWNrID0gKGUpID0+IHsKICAgICAgaWYgKGUudGFyZ2V0ID09PSBlLmN1cnJlbnRUYXJnZXQpCiAgICAgICAgb25DYW5jZWwoKTsKICAgIH07CiAgICByZXR1cm4gaCgKICAgICAgImRpdiIsCiAgICAgIHsgY2xhc3NOYW1lOiAiY29uZmlnLXBvcHVwLW92ZXJsYXkiLCBvbkNsaWNrOiBoYW5kbGVPdmVybGF5Q2xpY2sgfSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC1jb250YWluZXIiIH0sCiAgICAgICAgdGl0bGUgPyBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC1oZWFkZXIiIH0sCiAgICAgICAgICBoKCJoMyIsIHsgY2xhc3NOYW1lOiAiY29uZmlnLXBvcHVwLXRpdGxlIiB9LCB0aXRsZSkKICAgICAgICApIDogbnVsbCwKICAgICAgICBoKCJkaXYiLCB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC1ib2R5IiB9LCBjaGlsZHJlbiksCiAgICAgICAgaCgKICAgICAgICAgICJkaXYiLAogICAgICAgICAgeyBjbGFzc05hbWU6ICJjb25maWctcG9wdXAtYWN0aW9ucyIgfSwKICAgICAgICAgIGgoImJ1dHRvbiIsIHsgY2xhc3NOYW1lOiAiY29uZmlnLXBvcHVwLWJ0biBjb25maWctcG9wdXAtYnRuLS1jYW5jZWwiLCBvbkNsaWNrOiBvbkNhbmNlbCB9LCAiQ2FuY2VsIiksCiAgICAgICAgICBoKCJidXR0b24iLCB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tc3VibWl0Iiwgb25DbGljazogb25TdWJtaXQgfSwgc3VibWl0TGFiZWwpCiAgICAgICAgKQogICAgICApCiAgICApOwogIH0KCiAgLy8gbGliL2Rhc2hib2FyZC90b29sdGlwLmpzCiAgdmFyIGltcG9ydF9yZWFjdDQgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7CiAgZnVuY3Rpb24gRGFzaGJvYXJkVG9vbHRpcCh7IGxlZnQsIHZpc2libGUsIGNoaWxkcmVuIH0pIHsKICAgIGlmICghdmlzaWJsZSkKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBoID0gaW1wb3J0X3JlYWN0NC5jcmVhdGVFbGVtZW50OwogICAgcmV0dXJuIGgoCiAgICAgICJkaXYiLAogICAgICB7CiAgICAgICAgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXRvb2x0aXAiLAogICAgICAgIHN0eWxlOiB7IGxlZnQ6IGAke2xlZnR9cHhgIH0KICAgICAgfSwKICAgICAgaCgiZGl2IiwgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtdG9vbHRpcC1hcnJvdyIgfSksCiAgICAgIGgoImRpdiIsIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXRvb2x0aXAtY29udGVudCIgfSwgY2hpbGRyZW4pCiAgICApOwogIH0KCiAgLy8gbm9kZV9tb2R1bGVzL21hcmtlZC9saWIvbWFya2VkLmVzbS5qcwogIGZ1bmN0aW9uIF9nZXREZWZhdWx0cygpIHsKICAgIHJldHVybiB7CiAgICAgIGFzeW5jOiBmYWxzZSwKICAgICAgYnJlYWtzOiBmYWxzZSwKICAgICAgZXh0ZW5zaW9uczogbnVsbCwKICAgICAgZ2ZtOiB0cnVlLAogICAgICBob29rczogbnVsbCwKICAgICAgcGVkYW50aWM6IGZhbHNlLAogICAgICByZW5kZXJlcjogbnVsbCwKICAgICAgc2lsZW50OiBmYWxzZSwKICAgICAgdG9rZW5pemVyOiBudWxsLAogICAgICB3YWxrVG9rZW5zOiBudWxsCiAgICB9OwogIH0KICB2YXIgX2RlZmF1bHRzID0gX2dldERlZmF1bHRzKCk7CiAgZnVuY3Rpb24gY2hhbmdlRGVmYXVsdHMobmV3RGVmYXVsdHMpIHsKICAgIF9kZWZhdWx0cyA9IG5ld0RlZmF1bHRzOwogIH0KICB2YXIgbm9vcFRlc3QgPSB7IGV4ZWM6ICgpID0+IG51bGwgfTsKICBmdW5jdGlvbiBlZGl0KHJlZ2V4LCBvcHQgPSAiIikgewogICAgbGV0IHNvdXJjZSA9IHR5cGVvZiByZWdleCA9PT0gInN0cmluZyIgPyByZWdleCA6IHJlZ2V4LnNvdXJjZTsKICAgIGNvbnN0IG9iaiA9IHsKICAgICAgcmVwbGFjZTogKG5hbWUsIHZhbCkgPT4gewogICAgICAgIGxldCB2YWxTb3VyY2UgPSB0eXBlb2YgdmFsID09PSAic3RyaW5nIiA/IHZhbCA6IHZhbC5zb3VyY2U7CiAgICAgICAgdmFsU291cmNlID0gdmFsU291cmNlLnJlcGxhY2Uob3RoZXIuY2FyZXQsICIkMSIpOwogICAgICAgIHNvdXJjZSA9IHNvdXJjZS5yZXBsYWNlKG5hbWUsIHZhbFNvdXJjZSk7CiAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfSwKICAgICAgZ2V0UmVnZXg6ICgpID0+IHsKICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIG9wdCk7CiAgICAgIH0KICAgIH07CiAgICByZXR1cm4gb2JqOwogIH0KICB2YXIgb3RoZXIgPSB7CiAgICBjb2RlUmVtb3ZlSW5kZW50OiAvXig/OiB7MSw0fXwgezAsM31cdCkvZ20sCiAgICBvdXRwdXRMaW5rUmVwbGFjZTogL1xcKFtcW1xdXSkvZywKICAgIGluZGVudENvZGVDb21wZW5zYXRpb246IC9eKFxzKykoPzpgYGApLywKICAgIGJlZ2lubmluZ1NwYWNlOiAvXlxzKy8sCiAgICBlbmRpbmdIYXNoOiAvIyQvLAogICAgc3RhcnRpbmdTcGFjZUNoYXI6IC9eIC8sCiAgICBlbmRpbmdTcGFjZUNoYXI6IC8gJC8sCiAgICBub25TcGFjZUNoYXI6IC9bXiBdLywKICAgIG5ld0xpbmVDaGFyR2xvYmFsOiAvXG4vZywKICAgIHRhYkNoYXJHbG9iYWw6IC9cdC9nLAogICAgbXVsdGlwbGVTcGFjZUdsb2JhbDogL1xzKy9nLAogICAgYmxhbmtMaW5lOiAvXlsgXHRdKiQvLAogICAgZG91YmxlQmxhbmtMaW5lOiAvXG5bIFx0XSpcblsgXHRdKiQvLAogICAgYmxvY2txdW90ZVN0YXJ0OiAvXiB7MCwzfT4vLAogICAgYmxvY2txdW90ZVNldGV4dFJlcGxhY2U6IC9cbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cbnwkKS9nLAogICAgYmxvY2txdW90ZVNldGV4dFJlcGxhY2UyOiAvXiB7MCwzfT5bIFx0XT8vZ20sCiAgICBsaXN0UmVwbGFjZVRhYnM6IC9eXHQrLywKICAgIGxpc3RSZXBsYWNlTmVzdGluZzogL14gezEsNH0oPz0oIHs0fSkqW14gXSkvZywKICAgIGxpc3RJc1Rhc2s6IC9eXFtbIHhYXVxdIC8sCiAgICBsaXN0UmVwbGFjZVRhc2s6IC9eXFtbIHhYXVxdICsvLAogICAgYW55TGluZTogL1xuLipcbi8sCiAgICBocmVmQnJhY2tldHM6IC9ePCguKik+JC8sCiAgICB0YWJsZURlbGltaXRlcjogL1s6fF0vLAogICAgdGFibGVBbGlnbkNoYXJzOiAvXlx8fFx8ICokL2csCiAgICB0YWJsZVJvd0JsYW5rTGluZTogL1xuWyBcdF0qJC8sCiAgICB0YWJsZUFsaWduUmlnaHQ6IC9eICotKzogKiQvLAogICAgdGFibGVBbGlnbkNlbnRlcjogL14gKjotKzogKiQvLAogICAgdGFibGVBbGlnbkxlZnQ6IC9eICo6LSsgKiQvLAogICAgc3RhcnRBVGFnOiAvXjxhIC9pLAogICAgZW5kQVRhZzogL148XC9hPi9pLAogICAgc3RhcnRQcmVTY3JpcHRUYWc6IC9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLAogICAgZW5kUHJlU2NyaXB0VGFnOiAvXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLAogICAgc3RhcnRBbmdsZUJyYWNrZXQ6IC9ePC8sCiAgICBlbmRBbmdsZUJyYWNrZXQ6IC8+JC8sCiAgICBwZWRhbnRpY0hyZWZUaXRsZTogL14oW14nIl0qW15cc10pXHMrKFsnIl0pKC4qKVwyLywKICAgIHVuaWNvZGVBbHBoYU51bWVyaWM6IC9bXHB7TH1ccHtOfV0vdSwKICAgIGVzY2FwZVRlc3Q6IC9bJjw+IiddLywKICAgIGVzY2FwZVJlcGxhY2U6IC9bJjw+IiddL2csCiAgICBlc2NhcGVUZXN0Tm9FbmNvZGU6IC9bPD4iJ118Jig/ISgjXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XHcrKTspLywKICAgIGVzY2FwZVJlcGxhY2VOb0VuY29kZTogL1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvZywKICAgIHVuZXNjYXBlVGVzdDogLyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWcsCiAgICBjYXJldDogLyhefFteXFtdKVxeL2csCiAgICBwZXJjZW50RGVjb2RlOiAvJTI1L2csCiAgICBmaW5kUGlwZTogL1x8L2csCiAgICBzcGxpdFBpcGU6IC8gXHwvLAogICAgc2xhc2hQaXBlOiAvXFxcfC9nLAogICAgY2FycmlhZ2VSZXR1cm46IC9cclxufFxyL2csCiAgICBzcGFjZUxpbmU6IC9eICskL2dtLAogICAgbm90U3BhY2VTdGFydDogL15cUyovLAogICAgZW5kaW5nTmV3bGluZTogL1xuJC8sCiAgICBsaXN0SXRlbVJlZ2V4OiAoYnVsbCkgPT4gbmV3IFJlZ0V4cChgXiggezAsM30ke2J1bGx9KSgoPzpbCSBdW15cXG5dKik/KD86XFxufCQpKWApLAogICAgbmV4dEJ1bGxldFJlZ2V4OiAoaW5kZW50KSA9PiBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkoKD86WyAJXVteXFxuXSopPyg/OlxcbnwkKSlgKSwKICAgIGhyUmVnZXg6IChpbmRlbnQpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcKiAqKXszLH0pKD86XFxuK3wkKWApLAogICAgZmVuY2VzQmVnaW5SZWdleDogKGluZGVudCkgPT4gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpcYFxgXGB8fn5+KWApLAogICAgaGVhZGluZ0JlZ2luUmVnZXg6IChpbmRlbnQpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19I2ApLAogICAgaHRtbEJlZ2luUmVnZXg6IChpbmRlbnQpID0+IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19PCg/OlthLXpdLio+fCEtLSlgLCAiaSIpCiAgfTsKICB2YXIgbmV3bGluZSA9IC9eKD86WyBcdF0qKD86XG58JCkpKy87CiAgdmFyIGJsb2NrQ29kZSA9IC9eKCg/OiB7NH18IHswLDN9XHQpW15cbl0rKD86XG4oPzpbIFx0XSooPzpcbnwkKSkqKT8pKy87CiAgdmFyIGZlbmNlcyA9IC9eIHswLDN9KGB7Myx9KD89W15gXG5dKig/OlxufCQpKXx+ezMsfSkoW15cbl0qKSg/OlxufCQpKD86fChbXHNcU10qPykoPzpcbnwkKSkoPzogezAsM31cMVt+YF0qICooPz1cbnwkKXwkKS87CiAgdmFyIGhyID0gL14gezAsM30oKD86LVtcdCBdKil7Myx9fCg/Ol9bIFx0XSopezMsfXwoPzpcKlsgXHRdKil7Myx9KSg/OlxuK3wkKS87CiAgdmFyIGhlYWRpbmcgPSAvXiB7MCwzfSgjezEsNn0pKD89XHN8JCkoLiopKD86XG4rfCQpLzsKICB2YXIgYnVsbGV0ID0gLyg/OlsqKy1dfFxkezEsOX1bLildKS87CiAgdmFyIGxoZWFkaW5nQ29yZSA9IC9eKD8hYnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkoKD86Lnxcbig/IVxzKj9cbnxidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sfHRhYmxlKSkrPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS87CiAgdmFyIGxoZWFkaW5nID0gZWRpdChsaGVhZGluZ0NvcmUpLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KS5yZXBsYWNlKC9ibG9ja0NvZGUvZywgLyg/OiB7NH18IHswLDN9XHQpLykucmVwbGFjZSgvZmVuY2VzL2csIC8gezAsM30oPzpgezMsfXx+ezMsfSkvKS5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykucmVwbGFjZSgvaGVhZGluZy9nLCAvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLCAvIHswLDN9PFteXG4+XSs+XG4vKS5yZXBsYWNlKC9cfHRhYmxlL2csICIiKS5nZXRSZWdleCgpOwogIHZhciBsaGVhZGluZ0dmbSA9IGVkaXQobGhlYWRpbmdDb3JlKS5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkucmVwbGFjZSgvYmxvY2tDb2RlL2csIC8oPzogezR9fCB7MCwzfVx0KS8pLnJlcGxhY2UoL2ZlbmNlcy9nLCAvIHswLDN9KD86YHszLH18fnszLH0pLykucmVwbGFjZSgvYmxvY2txdW90ZS9nLCAvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywgLyB7MCwzfSN7MSw2fS8pLnJlcGxhY2UoL2h0bWwvZywgLyB7MCwzfTxbXlxuPl0rPlxuLykucmVwbGFjZSgvdGFibGUvZywgLyB7MCwzfVx8Pyg/Ols6XC0gXSpcfCkrW1w6XC0gXSpcbi8pLmdldFJlZ2V4KCk7CiAgdmFyIF9wYXJhZ3JhcGggPSAvXihbXlxuXSsoPzpcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXG4pW15cbl0rKSopLzsKICB2YXIgYmxvY2tUZXh0ID0gL15bXlxuXSsvOwogIHZhciBfYmxvY2tMYWJlbCA9IC8oPyFccypcXSkoPzpcXC58W15cW1xdXFxdKSsvOwogIHZhciBkZWYgPSBlZGl0KC9eIHswLDN9XFsobGFiZWwpXF06ICooPzpcblsgXHRdKik/KFtePFxzXVteXHNdKnw8Lio/PikoPzooPzogKyg/OlxuWyBcdF0qKT98ICpcblsgXHRdKikodGl0bGUpKT8gKig/OlxuK3wkKS8pLnJlcGxhY2UoImxhYmVsIiwgX2Jsb2NrTGFiZWwpLnJlcGxhY2UoInRpdGxlIiwgLyg/OiIoPzpcXCI/fFteIlxcXSkqInwnW14nXG5dKig/OlxuW14nXG5dKykqXG4/J3xcKFteKCldKlwpKS8pLmdldFJlZ2V4KCk7CiAgdmFyIGxpc3QgPSBlZGl0KC9eKCB7MCwzfWJ1bGwpKFsgXHRdW15cbl0rPyk/KD86XG58JCkvKS5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkuZ2V0UmVnZXgoKTsKICB2YXIgX3RhZyA9ICJhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbnxjZW50ZXJ8Y29sfGNvbGdyb3VwfGRkfGRldGFpbHN8ZGlhbG9nfGRpcnxkaXZ8ZGx8ZHR8ZmllbGRzZXR8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb258cHxwYXJhbXxzZWFyY2h8c2VjdGlvbnxzdW1tYXJ5fHRhYmxlfHRib2R5fHRkfHRmb290fHRofHRoZWFkfHRpdGxlfHRyfHRyYWNrfHVsIjsKICB2YXIgX2NvbW1lbnQgPSAvPCEtLSg/Oi0/PnxbXHNcU10qPyg/Oi0tPnwkKSkvOwogIHZhciBodG1sID0gZWRpdCgKICAgICJeIHswLDN9KD86PChzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVtcXHM+XVtcXHNcXFNdKj8oPzo8L1xcMT5bXlxcbl0qXFxuK3wkKXxjb21tZW50W15cXG5dKihcXG4rfCQpfDxcXD9bXFxzXFxTXSo/KD86XFw/Plxcbip8JCl8PCFbQS1aXVtcXHNcXFNdKj8oPzo+XFxuKnwkKXw8IVxcW0NEQVRBXFxbW1xcc1xcU10qPyg/OlxcXVxcXT5cXG4qfCQpfDwvPyh0YWcpKD86ICt8XFxufC8/PilbXFxzXFxTXSo/KD86KD86XFxuWyAJXSopK1xcbnwkKXw8KD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSkoW2Etel1bXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuWyAJXSopK1xcbnwkKXw8Lyg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW2Etel1bXFx3LV0qXFxzKj4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG5bIAldKikrXFxufCQpKSIsCiAgICAiaSIKICApLnJlcGxhY2UoImNvbW1lbnQiLCBfY29tbWVudCkucmVwbGFjZSgidGFnIiwgX3RhZykucmVwbGFjZSgiYXR0cmlidXRlIiwgLyArW2EtekEtWjpfXVtcdy46LV0qKD86ICo9ICoiW14iXG5dKiJ8ICo9IConW14nXG5dKid8ICo9ICpbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCk7CiAgdmFyIHBhcmFncmFwaCA9IGVkaXQoX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLCBocikucmVwbGFjZSgiaGVhZGluZyIsICIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCAiIikucmVwbGFjZSgifHRhYmxlIiwgIiIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCAiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsICIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsICIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsICI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsIF90YWcpLmdldFJlZ2V4KCk7CiAgdmFyIGJsb2NrcXVvdGUgPSBlZGl0KC9eKCB7MCwzfT4gPyhwYXJhZ3JhcGh8W15cbl0qKSg/OlxufCQpKSsvKS5yZXBsYWNlKCJwYXJhZ3JhcGgiLCBwYXJhZ3JhcGgpLmdldFJlZ2V4KCk7CiAgdmFyIGJsb2NrTm9ybWFsID0gewogICAgYmxvY2txdW90ZSwKICAgIGNvZGU6IGJsb2NrQ29kZSwKICAgIGRlZiwKICAgIGZlbmNlcywKICAgIGhlYWRpbmcsCiAgICBociwKICAgIGh0bWwsCiAgICBsaGVhZGluZywKICAgIGxpc3QsCiAgICBuZXdsaW5lLAogICAgcGFyYWdyYXBoLAogICAgdGFibGU6IG5vb3BUZXN0LAogICAgdGV4dDogYmxvY2tUZXh0CiAgfTsKICB2YXIgZ2ZtVGFibGUgPSBlZGl0KAogICAgIl4gKihbXlxcbiBdLiopXFxuIHswLDN9KCg/OlxcfCAqKT86Py0rOj8gKig/OlxcfCAqOj8tKzo/ICopKig/OlxcfCAqKT8pKD86XFxuKCg/Oig/ISAqXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXG58JCkpKilcXG4qfCQpIgogICkucmVwbGFjZSgiaHIiLCBocikucmVwbGFjZSgiaGVhZGluZyIsICIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwgIiB7MCwzfT4iKS5yZXBsYWNlKCJjb2RlIiwgIig/OiB7NH18IHswLDN9CSlbXlxcbl0iKS5yZXBsYWNlKCJmZW5jZXMiLCAiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCAiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCAiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLCBfdGFnKS5nZXRSZWdleCgpOwogIHZhciBibG9ja0dmbSA9IHsKICAgIC4uLmJsb2NrTm9ybWFsLAogICAgbGhlYWRpbmc6IGxoZWFkaW5nR2ZtLAogICAgdGFibGU6IGdmbVRhYmxlLAogICAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpLnJlcGxhY2UoImhyIiwgaHIpLnJlcGxhY2UoImhlYWRpbmciLCAiIHswLDN9I3sxLDZ9KD86XFxzfCQpIikucmVwbGFjZSgifGxoZWFkaW5nIiwgIiIpLnJlcGxhY2UoInRhYmxlIiwgZ2ZtVGFibGUpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCAiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsICIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsICIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsICI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsIF90YWcpLmdldFJlZ2V4KCkKICB9OwogIHZhciBibG9ja1BlZGFudGljID0gewogICAgLi4uYmxvY2tOb3JtYWwsCiAgICBodG1sOiBlZGl0KAogICAgICBgXiAqKD86Y29tbWVudCAqKD86XFxufFxccyokKXw8KHRhZylbXFxzXFxTXSs/PC9cXDE+ICooPzpcXG57Mix9fFxccyokKXw8dGFnKD86IlteIl0qInwnW14nXSonfFxcc1teJyIvPlxcc10qKSo/Lz8+ICooPzpcXG57Mix9fFxccyokKSlgCiAgICApLnJlcGxhY2UoImNvbW1lbnQiLCBfY29tbWVudCkucmVwbGFjZSgvdGFnL2csICIoPyEoPzphfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3VifHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZylcXGIpXFx3Kyg/ITp8W15cXHdcXHNAXSpAKVxcYiIpLmdldFJlZ2V4KCksCiAgICBkZWY6IC9eICpcWyhbXlxdXSspXF06ICo8PyhbXlxzPl0rKT4/KD86ICsoWyIoXVteXG5dK1siKV0pKT8gKig/OlxuK3wkKS8sCiAgICBoZWFkaW5nOiAvXigjezEsNn0pKC4qKSg/OlxuK3wkKS8sCiAgICBmZW5jZXM6IG5vb3BUZXN0LAogICAgLy8gZmVuY2VzIG5vdCBzdXBwb3J0ZWQKICAgIGxoZWFkaW5nOiAvXiguKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLAogICAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpLnJlcGxhY2UoImhyIiwgaHIpLnJlcGxhY2UoImhlYWRpbmciLCAiICojezEsNn0gKlteXG5dIikucmVwbGFjZSgibGhlYWRpbmciLCBsaGVhZGluZykucmVwbGFjZSgifHRhYmxlIiwgIiIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCAiIHswLDN9PiIpLnJlcGxhY2UoInxmZW5jZXMiLCAiIikucmVwbGFjZSgifGxpc3QiLCAiIikucmVwbGFjZSgifGh0bWwiLCAiIikucmVwbGFjZSgifHRhZyIsICIiKS5nZXRSZWdleCgpCiAgfTsKICB2YXIgZXNjYXBlID0gL15cXChbISIjJCUmJygpKissXC0uLzo7PD0+P0BcW1xdXFxeX2B7fH1+XSkvOwogIHZhciBpbmxpbmVDb2RlID0gL14oYCspKFteYF18W15gXVtcc1xTXSo/W15gXSlcMSg/IWApLzsKICB2YXIgYnIgPSAvXiggezIsfXxcXClcbig/IVxzKiQpLzsKICB2YXIgaW5saW5lVGV4dCA9IC9eKGArfFteYF0pKD86KD89IHsyLH1cbil8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCpfXXxcYl98JCl8W14gXSg/PSB7Mix9XG4pKSkvOwogIHZhciBfcHVuY3R1YXRpb24gPSAvW1xwe1B9XHB7U31dL3U7CiAgdmFyIF9wdW5jdHVhdGlvbk9yU3BhY2UgPSAvW1xzXHB7UH1ccHtTfV0vdTsKICB2YXIgX25vdFB1bmN0dWF0aW9uT3JTcGFjZSA9IC9bXlxzXHB7UH1ccHtTfV0vdTsKICB2YXIgcHVuY3R1YXRpb24gPSBlZGl0KC9eKCg/IVsqX10pcHVuY3RTcGFjZSkvLCAidSIpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZSkuZ2V0UmVnZXgoKTsKICB2YXIgX3B1bmN0dWF0aW9uR2ZtU3Ryb25nRW0gPSAvKD8hfilbXHB7UH1ccHtTfV0vdTsKICB2YXIgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtID0gLyg/IX4pW1xzXHB7UH1ccHtTfV0vdTsKICB2YXIgX25vdFB1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtID0gLyg/OlteXHNccHtQfVxwe1N9XXx+KS91OwogIHZhciBibG9ja1NraXAgPSAvXFtbXltcXV0qP1xdXCgoPzpcXC58W15cXFwoXCldfFwoKD86XFwufFteXFxcKFwpXSkqXCkpKlwpfGBbXmBdKj9gfDxbXjw+XSo/Pi9nOwogIHZhciBlbVN0cm9uZ0xEZWxpbUNvcmUgPSAvXig/OlwqKyg/OigoPyFcKilwdW5jdCl8W15ccypdKSl8Xl8rKD86KCg/IV8pcHVuY3QpfChbXlxzX10pKS87CiAgdmFyIGVtU3Ryb25nTERlbGltID0gZWRpdChlbVN0cm9uZ0xEZWxpbUNvcmUsICJ1IikucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpOwogIHZhciBlbVN0cm9uZ0xEZWxpbUdmbSA9IGVkaXQoZW1TdHJvbmdMRGVsaW1Db3JlLCAidSIpLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbkdmbVN0cm9uZ0VtKS5nZXRSZWdleCgpOwogIHZhciBlbVN0cm9uZ1JEZWxpbUFzdENvcmUgPSAiXlteXypdKj9fX1teXypdKj9cXCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXFwqKXB1bmN0KFxcKispKD89W1xcc118JCl8bm90UHVuY3RTcGFjZShcXCorKSg/IVxcKikoPz1wdW5jdFNwYWNlfCQpfCg/IVxcKilwdW5jdFNwYWNlKFxcKispKD89bm90UHVuY3RTcGFjZSl8W1xcc10oXFwqKykoPyFcXCopKD89cHVuY3QpfCg/IVxcKilwdW5jdChcXCorKSg/IVxcKikoPz1wdW5jdCl8bm90UHVuY3RTcGFjZShcXCorKSg/PW5vdFB1bmN0U3BhY2UpIjsKICB2YXIgZW1TdHJvbmdSRGVsaW1Bc3QgPSBlZGl0KGVtU3Ryb25nUkRlbGltQXN0Q29yZSwgImd1IikucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTsKICB2YXIgZW1TdHJvbmdSRGVsaW1Bc3RHZm0gPSBlZGl0KGVtU3Ryb25nUkRlbGltQXN0Q29yZSwgImd1IikucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlR2ZtU3Ryb25nRW0pLnJlcGxhY2UoL3B1bmN0U3BhY2UvZywgX3B1bmN0dWF0aW9uT3JTcGFjZUdmbVN0cm9uZ0VtKS5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb25HZm1TdHJvbmdFbSkuZ2V0UmVnZXgoKTsKICB2YXIgZW1TdHJvbmdSRGVsaW1VbmQgPSBlZGl0KAogICAgIl5bXl8qXSo/XFwqXFwqW15fKl0qP19bXl8qXSo/KD89XFwqXFwqKXxbXl9dKyg/PVteX10pfCg/IV8pcHVuY3QoXyspKD89W1xcc118JCl8bm90UHVuY3RTcGFjZShfKykoPyFfKSg/PXB1bmN0U3BhY2V8JCl8KD8hXylwdW5jdFNwYWNlKF8rKSg/PW5vdFB1bmN0U3BhY2UpfFtcXHNdKF8rKSg/IV8pKD89cHVuY3QpfCg/IV8pcHVuY3QoXyspKD8hXykoPz1wdW5jdCkiLAogICAgImd1IgogICkucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLCBfbm90UHVuY3R1YXRpb25PclNwYWNlKS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csIF9wdW5jdHVhdGlvbk9yU3BhY2UpLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTsKICB2YXIgYW55UHVuY3R1YXRpb24gPSBlZGl0KC9cXChwdW5jdCkvLCAiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7CiAgdmFyIGF1dG9saW5rID0gZWRpdCgvXjwoc2NoZW1lOlteXHNceDAwLVx4MWY8Pl0qfGVtYWlsKT4vKS5yZXBsYWNlKCJzY2hlbWUiLCAvW2EtekEtWl1bYS16QS1aMC05Ky4tXXsxLDMxfS8pLnJlcGxhY2UoImVtYWlsIiwgL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKyg/IVstX10pLykuZ2V0UmVnZXgoKTsKICB2YXIgX2lubGluZUNvbW1lbnQgPSBlZGl0KF9jb21tZW50KS5yZXBsYWNlKCIoPzotLT58JCkiLCAiLS0+IikuZ2V0UmVnZXgoKTsKICB2YXIgdGFnID0gZWRpdCgKICAgICJeY29tbWVudHxePC9bYS16QS1aXVtcXHc6LV0qXFxzKj58XjxbYS16QS1aXVtcXHctXSooPzphdHRyaWJ1dGUpKj9cXHMqLz8+fF48XFw/W1xcc1xcU10qP1xcPz58XjwhW2EtekEtWl0rXFxzW1xcc1xcU10qPz58XjwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPiIKICApLnJlcGxhY2UoImNvbW1lbnQiLCBfaW5saW5lQ29tbWVudCkucmVwbGFjZSgiYXR0cmlidXRlIiwgL1xzK1thLXpBLVo6X11bXHcuOi1dKig/OlxzKj1ccyoiW14iXSoifFxzKj1ccyonW14nXSonfFxzKj1ccypbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCk7CiAgdmFyIF9pbmxpbmVMYWJlbCA9IC8oPzpcWyg/OlxcLnxbXlxbXF1cXF0pKlxdfFxcLnxgW15gXSpgfFteXFtcXVxcYF0pKj8vOwogIHZhciBsaW5rID0gZWRpdCgvXiE/XFsobGFiZWwpXF1cKFxzKihocmVmKSg/Oig/OlsgXHRdKig/OlxuWyBcdF0qKT8pKHRpdGxlKSk/XHMqXCkvKS5yZXBsYWNlKCJsYWJlbCIsIF9pbmxpbmVMYWJlbCkucmVwbGFjZSgiaHJlZiIsIC88KD86XFwufFteXG48PlxcXSkrPnxbXiBcdFxuXHgwMC1ceDFmXSovKS5yZXBsYWNlKCJ0aXRsZSIsIC8iKD86XFwiP3xbXiJcXF0pKiJ8Jyg/OlxcJz98W14nXFxdKSonfFwoKD86XFxcKT98W14pXFxdKSpcKS8pLmdldFJlZ2V4KCk7CiAgdmFyIHJlZmxpbmsgPSBlZGl0KC9eIT9cWyhsYWJlbClcXVxbKHJlZilcXS8pLnJlcGxhY2UoImxhYmVsIiwgX2lubGluZUxhYmVsKS5yZXBsYWNlKCJyZWYiLCBfYmxvY2tMYWJlbCkuZ2V0UmVnZXgoKTsKICB2YXIgbm9saW5rID0gZWRpdCgvXiE/XFsocmVmKVxdKD86XFtcXSk/LykucmVwbGFjZSgicmVmIiwgX2Jsb2NrTGFiZWwpLmdldFJlZ2V4KCk7CiAgdmFyIHJlZmxpbmtTZWFyY2ggPSBlZGl0KCJyZWZsaW5rfG5vbGluayg/IVxcKCkiLCAiZyIpLnJlcGxhY2UoInJlZmxpbmsiLCByZWZsaW5rKS5yZXBsYWNlKCJub2xpbmsiLCBub2xpbmspLmdldFJlZ2V4KCk7CiAgdmFyIGlubGluZU5vcm1hbCA9IHsKICAgIF9iYWNrcGVkYWw6IG5vb3BUZXN0LAogICAgLy8gb25seSB1c2VkIGZvciBHRk0gdXJsCiAgICBhbnlQdW5jdHVhdGlvbiwKICAgIGF1dG9saW5rLAogICAgYmxvY2tTa2lwLAogICAgYnIsCiAgICBjb2RlOiBpbmxpbmVDb2RlLAogICAgZGVsOiBub29wVGVzdCwKICAgIGVtU3Ryb25nTERlbGltLAogICAgZW1TdHJvbmdSRGVsaW1Bc3QsCiAgICBlbVN0cm9uZ1JEZWxpbVVuZCwKICAgIGVzY2FwZSwKICAgIGxpbmssCiAgICBub2xpbmssCiAgICBwdW5jdHVhdGlvbiwKICAgIHJlZmxpbmssCiAgICByZWZsaW5rU2VhcmNoLAogICAgdGFnLAogICAgdGV4dDogaW5saW5lVGV4dCwKICAgIHVybDogbm9vcFRlc3QKICB9OwogIHZhciBpbmxpbmVQZWRhbnRpYyA9IHsKICAgIC4uLmlubGluZU5vcm1hbCwKICAgIGxpbms6IGVkaXQoL14hP1xbKGxhYmVsKVxdXCgoLio/KVwpLykucmVwbGFjZSgibGFiZWwiLCBfaW5saW5lTGFiZWwpLmdldFJlZ2V4KCksCiAgICByZWZsaW5rOiBlZGl0KC9eIT9cWyhsYWJlbClcXVxzKlxbKFteXF1dKilcXS8pLnJlcGxhY2UoImxhYmVsIiwgX2lubGluZUxhYmVsKS5nZXRSZWdleCgpCiAgfTsKICB2YXIgaW5saW5lR2ZtID0gewogICAgLi4uaW5saW5lTm9ybWFsLAogICAgZW1TdHJvbmdSRGVsaW1Bc3Q6IGVtU3Ryb25nUkRlbGltQXN0R2ZtLAogICAgZW1TdHJvbmdMRGVsaW06IGVtU3Ryb25nTERlbGltR2ZtLAogICAgdXJsOiBlZGl0KC9eKCg/OmZ0cHxodHRwcz8pOlwvXC98d3d3XC4pKD86W2EtekEtWjAtOVwtXStcLj8pK1teXHM8XSp8XmVtYWlsLywgImkiKS5yZXBsYWNlKCJlbWFpbCIsIC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLykuZ2V0UmVnZXgoKSwKICAgIF9iYWNrcGVkYWw6IC8oPzpbXj8hLiw6OypfJyJ+KCkmXSt8XChbXildKlwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJyJ+KV0rKD8hJCkpKy8sCiAgICBkZWw6IC9eKH5+PykoPz1bXlxzfl0pKCg/OlxcLnxbXlxcXSkqPyg/OlxcLnxbXlxzflxcXSkpXDEoPz1bXn5dfCQpLywKICAgIHRleHQ6IC9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApfFtcc1xTXSo/KD86KD89W1xcPCFcW2Aqfl9dfFxiX3xodHRwcz86XC9cL3xmdHA6XC9cL3x3d3dcLnwkKXxbXiBdKD89IHsyLH1cbil8W15hLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCkpKS8KICB9OwogIHZhciBpbmxpbmVCcmVha3MgPSB7CiAgICAuLi5pbmxpbmVHZm0sCiAgICBicjogZWRpdChicikucmVwbGFjZSgiezIsfSIsICIqIikuZ2V0UmVnZXgoKSwKICAgIHRleHQ6IGVkaXQoaW5saW5lR2ZtLnRleHQpLnJlcGxhY2UoIlxcYl8iLCAiXFxiX3wgezIsfVxcbiIpLnJlcGxhY2UoL1x7MixcfS9nLCAiKiIpLmdldFJlZ2V4KCkKICB9OwogIHZhciBibG9jayA9IHsKICAgIG5vcm1hbDogYmxvY2tOb3JtYWwsCiAgICBnZm06IGJsb2NrR2ZtLAogICAgcGVkYW50aWM6IGJsb2NrUGVkYW50aWMKICB9OwogIHZhciBpbmxpbmUgPSB7CiAgICBub3JtYWw6IGlubGluZU5vcm1hbCwKICAgIGdmbTogaW5saW5lR2ZtLAogICAgYnJlYWtzOiBpbmxpbmVCcmVha3MsCiAgICBwZWRhbnRpYzogaW5saW5lUGVkYW50aWMKICB9OwogIHZhciBlc2NhcGVSZXBsYWNlbWVudHMgPSB7CiAgICAiJiI6ICImYW1wOyIsCiAgICAiPCI6ICImbHQ7IiwKICAgICI+IjogIiZndDsiLAogICAgJyInOiAiJnF1b3Q7IiwKICAgICInIjogIiYjMzk7IgogIH07CiAgdmFyIGdldEVzY2FwZVJlcGxhY2VtZW50ID0gKGNoKSA9PiBlc2NhcGVSZXBsYWNlbWVudHNbY2hdOwogIGZ1bmN0aW9uIGVzY2FwZTIoaHRtbDIsIGVuY29kZSkgewogICAgaWYgKGVuY29kZSkgewogICAgICBpZiAob3RoZXIuZXNjYXBlVGVzdC50ZXN0KGh0bWwyKSkgewogICAgICAgIHJldHVybiBodG1sMi5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2UsIGdldEVzY2FwZVJlcGxhY2VtZW50KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKG90aGVyLmVzY2FwZVRlc3ROb0VuY29kZS50ZXN0KGh0bWwyKSkgewogICAgICAgIHJldHVybiBodG1sMi5yZXBsYWNlKG90aGVyLmVzY2FwZVJlcGxhY2VOb0VuY29kZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaHRtbDI7CiAgfQogIGZ1bmN0aW9uIGNsZWFuVXJsKGhyZWYpIHsKICAgIHRyeSB7CiAgICAgIGhyZWYgPSBlbmNvZGVVUkkoaHJlZikucmVwbGFjZShvdGhlci5wZXJjZW50RGVjb2RlLCAiJSIpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGhyZWY7CiAgfQogIGZ1bmN0aW9uIHNwbGl0Q2VsbHModGFibGVSb3csIGNvdW50KSB7CiAgICBjb25zdCByb3cgPSB0YWJsZVJvdy5yZXBsYWNlKG90aGVyLmZpbmRQaXBlLCAobWF0Y2gsIG9mZnNldCwgc3RyKSA9PiB7CiAgICAgIGxldCBlc2NhcGVkID0gZmFsc2U7CiAgICAgIGxldCBjdXJyID0gb2Zmc2V0OwogICAgICB3aGlsZSAoLS1jdXJyID49IDAgJiYgc3RyW2N1cnJdID09PSAiXFwiKQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZDsKICAgICAgaWYgKGVzY2FwZWQpIHsKICAgICAgICByZXR1cm4gInwiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiIHwiOwogICAgICB9CiAgICB9KSwgY2VsbHMgPSByb3cuc3BsaXQob3RoZXIuc3BsaXRQaXBlKTsKICAgIGxldCBpID0gMDsKICAgIGlmICghY2VsbHNbMF0udHJpbSgpKSB7CiAgICAgIGNlbGxzLnNoaWZ0KCk7CiAgICB9CiAgICBpZiAoY2VsbHMubGVuZ3RoID4gMCAmJiAhY2VsbHMuYXQoLTEpPy50cmltKCkpIHsKICAgICAgY2VsbHMucG9wKCk7CiAgICB9CiAgICBpZiAoY291bnQpIHsKICAgICAgaWYgKGNlbGxzLmxlbmd0aCA+IGNvdW50KSB7CiAgICAgICAgY2VsbHMuc3BsaWNlKGNvdW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoY2VsbHMubGVuZ3RoIDwgY291bnQpCiAgICAgICAgICBjZWxscy5wdXNoKCIiKTsKICAgICAgfQogICAgfQogICAgZm9yICg7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykgewogICAgICBjZWxsc1tpXSA9IGNlbGxzW2ldLnRyaW0oKS5yZXBsYWNlKG90aGVyLnNsYXNoUGlwZSwgInwiKTsKICAgIH0KICAgIHJldHVybiBjZWxsczsKICB9CiAgZnVuY3Rpb24gcnRyaW0oc3RyLCBjLCBpbnZlcnQpIHsKICAgIGNvbnN0IGwgPSBzdHIubGVuZ3RoOwogICAgaWYgKGwgPT09IDApIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgbGV0IHN1ZmZMZW4gPSAwOwogICAgd2hpbGUgKHN1ZmZMZW4gPCBsKSB7CiAgICAgIGNvbnN0IGN1cnJDaGFyID0gc3RyLmNoYXJBdChsIC0gc3VmZkxlbiAtIDEpOwogICAgICBpZiAoY3VyckNoYXIgPT09IGMgJiYgIWludmVydCkgewogICAgICAgIHN1ZmZMZW4rKzsKICAgICAgfSBlbHNlIGlmIChjdXJyQ2hhciAhPT0gYyAmJiBpbnZlcnQpIHsKICAgICAgICBzdWZmTGVuKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdHIuc2xpY2UoMCwgbCAtIHN1ZmZMZW4pOwogIH0KICBmdW5jdGlvbiBmaW5kQ2xvc2luZ0JyYWNrZXQoc3RyLCBiKSB7CiAgICBpZiAoc3RyLmluZGV4T2YoYlsxXSkgPT09IC0xKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGxldCBsZXZlbCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICBpZiAoc3RyW2ldID09PSAiXFwiKSB7CiAgICAgICAgaSsrOwogICAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gYlswXSkgewogICAgICAgIGxldmVsKys7CiAgICAgIH0gZWxzZSBpZiAoc3RyW2ldID09PSBiWzFdKSB7CiAgICAgICAgbGV2ZWwtLTsKICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChsZXZlbCA+IDApIHsKICAgICAgcmV0dXJuIC0yOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KICBmdW5jdGlvbiBvdXRwdXRMaW5rKGNhcCwgbGluazIsIHJhdywgbGV4ZXIyLCBydWxlcykgewogICAgY29uc3QgaHJlZiA9IGxpbmsyLmhyZWY7CiAgICBjb25zdCB0aXRsZSA9IGxpbmsyLnRpdGxlIHx8IG51bGw7CiAgICBjb25zdCB0ZXh0ID0gY2FwWzFdLnJlcGxhY2UocnVsZXMub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsICIkMSIpOwogICAgbGV4ZXIyLnN0YXRlLmluTGluayA9IHRydWU7CiAgICBjb25zdCB0b2tlbiA9IHsKICAgICAgdHlwZTogY2FwWzBdLmNoYXJBdCgwKSA9PT0gIiEiID8gImltYWdlIiA6ICJsaW5rIiwKICAgICAgcmF3LAogICAgICBocmVmLAogICAgICB0aXRsZSwKICAgICAgdGV4dCwKICAgICAgdG9rZW5zOiBsZXhlcjIuaW5saW5lVG9rZW5zKHRleHQpCiAgICB9OwogICAgbGV4ZXIyLnN0YXRlLmluTGluayA9IGZhbHNlOwogICAgcmV0dXJuIHRva2VuOwogIH0KICBmdW5jdGlvbiBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdywgdGV4dCwgcnVsZXMpIHsKICAgIGNvbnN0IG1hdGNoSW5kZW50VG9Db2RlID0gcmF3Lm1hdGNoKHJ1bGVzLm90aGVyLmluZGVudENvZGVDb21wZW5zYXRpb24pOwogICAgaWYgKG1hdGNoSW5kZW50VG9Db2RlID09PSBudWxsKSB7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgY29uc3QgaW5kZW50VG9Db2RlID0gbWF0Y2hJbmRlbnRUb0NvZGVbMV07CiAgICByZXR1cm4gdGV4dC5zcGxpdCgiXG4iKS5tYXAoKG5vZGUpID0+IHsKICAgICAgY29uc3QgbWF0Y2hJbmRlbnRJbk5vZGUgPSBub2RlLm1hdGNoKHJ1bGVzLm90aGVyLmJlZ2lubmluZ1NwYWNlKTsKICAgICAgaWYgKG1hdGNoSW5kZW50SW5Ob2RlID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgICAgY29uc3QgW2luZGVudEluTm9kZV0gPSBtYXRjaEluZGVudEluTm9kZTsKICAgICAgaWYgKGluZGVudEluTm9kZS5sZW5ndGggPj0gaW5kZW50VG9Db2RlLmxlbmd0aCkgewogICAgICAgIHJldHVybiBub2RlLnNsaWNlKGluZGVudFRvQ29kZS5sZW5ndGgpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlOwogICAgfSkuam9pbigiXG4iKTsKICB9CiAgdmFyIF9Ub2tlbml6ZXIgPSBjbGFzcyB7CiAgICBvcHRpb25zOwogICAgcnVsZXM7CiAgICAvLyBzZXQgYnkgdGhlIGxleGVyCiAgICBsZXhlcjsKICAgIC8vIHNldCBieSB0aGUgbGV4ZXIKICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMyKSB7CiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMyIHx8IF9kZWZhdWx0czsKICAgIH0KICAgIHNwYWNlKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhzcmMpOwogICAgICBpZiAoY2FwICYmIGNhcFswXS5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJzcGFjZSIsCiAgICAgICAgICByYXc6IGNhcFswXQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGNvZGUoc3JjKSB7CiAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKHNyYyk7CiAgICAgIGlmIChjYXApIHsKICAgICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5jb2RlUmVtb3ZlSW5kZW50LCAiIik7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJjb2RlIiwKICAgICAgICAgIHJhdzogY2FwWzBdLAogICAgICAgICAgY29kZUJsb2NrU3R5bGU6ICJpbmRlbnRlZCIsCiAgICAgICAgICB0ZXh0OiAhdGhpcy5vcHRpb25zLnBlZGFudGljID8gcnRyaW0odGV4dCwgIlxuIikgOiB0ZXh0CiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgZmVuY2VzKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmZlbmNlcy5leGVjKHNyYyk7CiAgICAgIGlmIChjYXApIHsKICAgICAgICBjb25zdCByYXcgPSBjYXBbMF07CiAgICAgICAgY29uc3QgdGV4dCA9IGluZGVudENvZGVDb21wZW5zYXRpb24ocmF3LCBjYXBbM10gfHwgIiIsIHRoaXMucnVsZXMpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiY29kZSIsCiAgICAgICAgICByYXcsCiAgICAgICAgICBsYW5nOiBjYXBbMl0gPyBjYXBbMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICIkMSIpIDogY2FwWzJdLAogICAgICAgICAgdGV4dAogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGhlYWRpbmcoc3JjKSB7CiAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKHNyYyk7CiAgICAgIGlmIChjYXApIHsKICAgICAgICBsZXQgdGV4dCA9IGNhcFsyXS50cmltKCk7CiAgICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuZW5kaW5nSGFzaC50ZXN0KHRleHQpKSB7CiAgICAgICAgICBjb25zdCB0cmltbWVkID0gcnRyaW0odGV4dCwgIiMiKTsKICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHsKICAgICAgICAgICAgdGV4dCA9IHRyaW1tZWQudHJpbSgpOwogICAgICAgICAgfSBlbHNlIGlmICghdHJpbW1lZCB8fCB0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KHRyaW1tZWQpKSB7CiAgICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJoZWFkaW5nIiwKICAgICAgICAgIHJhdzogY2FwWzBdLAogICAgICAgICAgZGVwdGg6IGNhcFsxXS5sZW5ndGgsCiAgICAgICAgICB0ZXh0LAogICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGhyKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiaHIiLAogICAgICAgICAgcmF3OiBydHJpbShjYXBbMF0sICJcbiIpCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgYmxvY2txdW90ZShzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIGxldCBsaW5lcyA9IHJ0cmltKGNhcFswXSwgIlxuIikuc3BsaXQoIlxuIik7CiAgICAgICAgbGV0IHJhdyA9ICIiOwogICAgICAgIGxldCB0ZXh0ID0gIiI7CiAgICAgICAgY29uc3QgdG9rZW5zID0gW107CiAgICAgICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGxldCBpbkJsb2NrcXVvdGUgPSBmYWxzZTsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRMaW5lcyA9IFtdOwogICAgICAgICAgbGV0IGk7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHRoaXMucnVsZXMub3RoZXIuYmxvY2txdW90ZVN0YXJ0LnRlc3QobGluZXNbaV0pKSB7CiAgICAgICAgICAgICAgY3VycmVudExpbmVzLnB1c2gobGluZXNbaV0pOwogICAgICAgICAgICAgIGluQmxvY2txdW90ZSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWluQmxvY2txdW90ZSkgewogICAgICAgICAgICAgIGN1cnJlbnRMaW5lcy5wdXNoKGxpbmVzW2ldKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbGluZXMgPSBsaW5lcy5zbGljZShpKTsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRSYXcgPSBjdXJyZW50TGluZXMuam9pbigiXG4iKTsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRUZXh0ID0gY3VycmVudFJhdy5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuYmxvY2txdW90ZVNldGV4dFJlcGxhY2UsICJcbiAgICAkMSIpLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTIsICIiKTsKICAgICAgICAgIHJhdyA9IHJhdyA/IGAke3Jhd30KJHtjdXJyZW50UmF3fWAgOiBjdXJyZW50UmF3OwogICAgICAgICAgdGV4dCA9IHRleHQgPyBgJHt0ZXh0fQoke2N1cnJlbnRUZXh0fWAgOiBjdXJyZW50VGV4dDsKICAgICAgICAgIGNvbnN0IHRvcCA9IHRoaXMubGV4ZXIuc3RhdGUudG9wOwogICAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0cnVlOwogICAgICAgICAgdGhpcy5sZXhlci5ibG9ja1Rva2VucyhjdXJyZW50VGV4dCwgdG9rZW5zLCB0cnVlKTsKICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUudG9wID0gdG9wOwogICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7CiAgICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAiY29kZSIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gImJsb2NrcXVvdGUiKSB7CiAgICAgICAgICAgIGNvbnN0IG9sZFRva2VuID0gbGFzdFRva2VuOwogICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gb2xkVG9rZW4ucmF3ICsgIlxuIiArIGxpbmVzLmpvaW4oIlxuIik7CiAgICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5ibG9ja3F1b3RlKG5ld1RleHQpOwogICAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdID0gbmV3VG9rZW47CiAgICAgICAgICAgIHJhdyA9IHJhdy5zdWJzdHJpbmcoMCwgcmF3Lmxlbmd0aCAtIG9sZFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3OwogICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSBvbGRUb2tlbi50ZXh0Lmxlbmd0aCkgKyBuZXdUb2tlbi50ZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSBpZiAobGFzdFRva2VuPy50eXBlID09PSAibGlzdCIpIHsKICAgICAgICAgICAgY29uc3Qgb2xkVG9rZW4gPSBsYXN0VG9rZW47CiAgICAgICAgICAgIGNvbnN0IG5ld1RleHQgPSBvbGRUb2tlbi5yYXcgKyAiXG4iICsgbGluZXMuam9pbigiXG4iKTsKICAgICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSB0aGlzLmxpc3QobmV3VGV4dCk7CiAgICAgICAgICAgIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0gPSBuZXdUb2tlbjsKICAgICAgICAgICAgcmF3ID0gcmF3LnN1YnN0cmluZygwLCByYXcubGVuZ3RoIC0gbGFzdFRva2VuLnJhdy5sZW5ndGgpICsgbmV3VG9rZW4ucmF3OwogICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGggLSBvbGRUb2tlbi5yYXcubGVuZ3RoKSArIG5ld1Rva2VuLnJhdzsKICAgICAgICAgICAgbGluZXMgPSBuZXdUZXh0LnN1YnN0cmluZyh0b2tlbnMuYXQoLTEpLnJhdy5sZW5ndGgpLnNwbGl0KCJcbiIpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJibG9ja3F1b3RlIiwKICAgICAgICAgIHJhdywKICAgICAgICAgIHRva2VucywKICAgICAgICAgIHRleHQKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICBsaXN0KHNyYykgewogICAgICBsZXQgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIGxldCBidWxsID0gY2FwWzFdLnRyaW0oKTsKICAgICAgICBjb25zdCBpc29yZGVyZWQgPSBidWxsLmxlbmd0aCA+IDE7CiAgICAgICAgY29uc3QgbGlzdDIgPSB7CiAgICAgICAgICB0eXBlOiAibGlzdCIsCiAgICAgICAgICByYXc6ICIiLAogICAgICAgICAgb3JkZXJlZDogaXNvcmRlcmVkLAogICAgICAgICAgc3RhcnQ6IGlzb3JkZXJlZCA/ICtidWxsLnNsaWNlKDAsIC0xKSA6ICIiLAogICAgICAgICAgbG9vc2U6IGZhbHNlLAogICAgICAgICAgaXRlbXM6IFtdCiAgICAgICAgfTsKICAgICAgICBidWxsID0gaXNvcmRlcmVkID8gYFxcZHsxLDl9XFwke2J1bGwuc2xpY2UoLTEpfWAgOiBgXFwke2J1bGx9YDsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7CiAgICAgICAgICBidWxsID0gaXNvcmRlcmVkID8gYnVsbCA6ICJbKistXSI7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGl0ZW1SZWdleCA9IHRoaXMucnVsZXMub3RoZXIubGlzdEl0ZW1SZWdleChidWxsKTsKICAgICAgICBsZXQgZW5kc1dpdGhCbGFua0xpbmUgPSBmYWxzZTsKICAgICAgICB3aGlsZSAoc3JjKSB7CiAgICAgICAgICBsZXQgZW5kRWFybHkgPSBmYWxzZTsKICAgICAgICAgIGxldCByYXcgPSAiIjsKICAgICAgICAgIGxldCBpdGVtQ29udGVudHMgPSAiIjsKICAgICAgICAgIGlmICghKGNhcCA9IGl0ZW1SZWdleC5leGVjKHNyYykpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChzcmMpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcmF3ID0gY2FwWzBdOwogICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhyYXcubGVuZ3RoKTsKICAgICAgICAgIGxldCBsaW5lID0gY2FwWzJdLnNwbGl0KCJcbiIsIDEpWzBdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5saXN0UmVwbGFjZVRhYnMsICh0KSA9PiAiICIucmVwZWF0KDMgKiB0Lmxlbmd0aCkpOwogICAgICAgICAgbGV0IG5leHRMaW5lID0gc3JjLnNwbGl0KCJcbiIsIDEpWzBdOwogICAgICAgICAgbGV0IGJsYW5rTGluZSA9ICFsaW5lLnRyaW0oKTsKICAgICAgICAgIGxldCBpbmRlbnQgPSAwOwogICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykgewogICAgICAgICAgICBpbmRlbnQgPSAyOwogICAgICAgICAgICBpdGVtQ29udGVudHMgPSBsaW5lLnRyaW1TdGFydCgpOwogICAgICAgICAgfSBlbHNlIGlmIChibGFua0xpbmUpIHsKICAgICAgICAgICAgaW5kZW50ID0gY2FwWzFdLmxlbmd0aCArIDE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbmRlbnQgPSBjYXBbMl0uc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKTsKICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50ID4gNCA/IDEgOiBpbmRlbnQ7CiAgICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUuc2xpY2UoaW5kZW50KTsKICAgICAgICAgICAgaW5kZW50ICs9IGNhcFsxXS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYmxhbmtMaW5lICYmIHRoaXMucnVsZXMub3RoZXIuYmxhbmtMaW5lLnRlc3QobmV4dExpbmUpKSB7CiAgICAgICAgICAgIHJhdyArPSBuZXh0TGluZSArICJcbiI7CiAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcobmV4dExpbmUubGVuZ3RoICsgMSk7CiAgICAgICAgICAgIGVuZEVhcmx5ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghZW5kRWFybHkpIHsKICAgICAgICAgICAgY29uc3QgbmV4dEJ1bGxldFJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5uZXh0QnVsbGV0UmVnZXgoaW5kZW50KTsKICAgICAgICAgICAgY29uc3QgaHJSZWdleCA9IHRoaXMucnVsZXMub3RoZXIuaHJSZWdleChpbmRlbnQpOwogICAgICAgICAgICBjb25zdCBmZW5jZXNCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5mZW5jZXNCZWdpblJlZ2V4KGluZGVudCk7CiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmdCZWdpblJlZ2V4ID0gdGhpcy5ydWxlcy5vdGhlci5oZWFkaW5nQmVnaW5SZWdleChpbmRlbnQpOwogICAgICAgICAgICBjb25zdCBodG1sQmVnaW5SZWdleCA9IHRoaXMucnVsZXMub3RoZXIuaHRtbEJlZ2luUmVnZXgoaW5kZW50KTsKICAgICAgICAgICAgd2hpbGUgKHNyYykgewogICAgICAgICAgICAgIGNvbnN0IHJhd0xpbmUgPSBzcmMuc3BsaXQoIlxuIiwgMSlbMF07CiAgICAgICAgICAgICAgbGV0IG5leHRMaW5lV2l0aG91dFRhYnM7CiAgICAgICAgICAgICAgbmV4dExpbmUgPSByYXdMaW5lOwogICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHsKICAgICAgICAgICAgICAgIG5leHRMaW5lID0gbmV4dExpbmUucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlTmVzdGluZywgIiAgIik7CiAgICAgICAgICAgICAgICBuZXh0TGluZVdpdGhvdXRUYWJzID0gbmV4dExpbmU7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHRMaW5lV2l0aG91dFRhYnMgPSBuZXh0TGluZS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFiQ2hhckdsb2JhbCwgIiAgICAiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaGVhZGluZ0JlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaHRtbEJlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobmV4dEJ1bGxldFJlZ2V4LnRlc3QobmV4dExpbmUpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChuZXh0TGluZSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobmV4dExpbmVXaXRob3V0VGFicy5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpID49IGluZGVudCB8fCAhbmV4dExpbmUudHJpbSgpKSB7CiAgICAgICAgICAgICAgICBpdGVtQ29udGVudHMgKz0gIlxuIiArIG5leHRMaW5lV2l0aG91dFRhYnMuc2xpY2UoaW5kZW50KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGJsYW5rTGluZSkgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsaW5lLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCAiICAgICIpLnNlYXJjaCh0aGlzLnJ1bGVzLm90aGVyLm5vblNwYWNlQ2hhcikgPj0gNCkgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChmZW5jZXNCZWdpblJlZ2V4LnRlc3QobGluZSkpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGVhZGluZ0JlZ2luUmVnZXgudGVzdChsaW5lKSkgewogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChoclJlZ2V4LnRlc3QobGluZSkpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpdGVtQ29udGVudHMgKz0gIlxuIiArIG5leHRMaW5lOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoIWJsYW5rTGluZSAmJiAhbmV4dExpbmUudHJpbSgpKSB7CiAgICAgICAgICAgICAgICBibGFua0xpbmUgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByYXcgKz0gcmF3TGluZSArICJcbiI7CiAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhyYXdMaW5lLmxlbmd0aCArIDEpOwogICAgICAgICAgICAgIGxpbmUgPSBuZXh0TGluZVdpdGhvdXRUYWJzLnNsaWNlKGluZGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghbGlzdDIubG9vc2UpIHsKICAgICAgICAgICAgaWYgKGVuZHNXaXRoQmxhbmtMaW5lKSB7CiAgICAgICAgICAgICAgbGlzdDIubG9vc2UgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIuZG91YmxlQmxhbmtMaW5lLnRlc3QocmF3KSkgewogICAgICAgICAgICAgIGVuZHNXaXRoQmxhbmtMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbGV0IGlzdGFzayA9IG51bGw7CiAgICAgICAgICBsZXQgaXNjaGVja2VkOwogICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5nZm0pIHsKICAgICAgICAgICAgaXN0YXNrID0gdGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLmV4ZWMoaXRlbUNvbnRlbnRzKTsKICAgICAgICAgICAgaWYgKGlzdGFzaykgewogICAgICAgICAgICAgIGlzY2hlY2tlZCA9IGlzdGFza1swXSAhPT0gIlsgXSAiOwogICAgICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGl0ZW1Db250ZW50cy5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VUYXNrLCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxpc3QyLml0ZW1zLnB1c2goewogICAgICAgICAgICB0eXBlOiAibGlzdF9pdGVtIiwKICAgICAgICAgICAgcmF3LAogICAgICAgICAgICB0YXNrOiAhIWlzdGFzaywKICAgICAgICAgICAgY2hlY2tlZDogaXNjaGVja2VkLAogICAgICAgICAgICBsb29zZTogZmFsc2UsCiAgICAgICAgICAgIHRleHQ6IGl0ZW1Db250ZW50cywKICAgICAgICAgICAgdG9rZW5zOiBbXQogICAgICAgICAgfSk7CiAgICAgICAgICBsaXN0Mi5yYXcgKz0gcmF3OwogICAgICAgIH0KICAgICAgICBjb25zdCBsYXN0SXRlbSA9IGxpc3QyLml0ZW1zLmF0KC0xKTsKICAgICAgICBpZiAobGFzdEl0ZW0pIHsKICAgICAgICAgIGxhc3RJdGVtLnJhdyA9IGxhc3RJdGVtLnJhdy50cmltRW5kKCk7CiAgICAgICAgICBsYXN0SXRlbS50ZXh0ID0gbGFzdEl0ZW0udGV4dC50cmltRW5kKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGlzdDIucmF3ID0gbGlzdDIucmF3LnRyaW1FbmQoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QyLml0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IGZhbHNlOwogICAgICAgICAgbGlzdDIuaXRlbXNbaV0udG9rZW5zID0gdGhpcy5sZXhlci5ibG9ja1Rva2VucyhsaXN0Mi5pdGVtc1tpXS50ZXh0LCBbXSk7CiAgICAgICAgICBpZiAoIWxpc3QyLmxvb3NlKSB7CiAgICAgICAgICAgIGNvbnN0IHNwYWNlcnMgPSBsaXN0Mi5pdGVtc1tpXS50b2tlbnMuZmlsdGVyKCh0KSA9PiB0LnR5cGUgPT09ICJzcGFjZSIpOwogICAgICAgICAgICBjb25zdCBoYXNNdWx0aXBsZUxpbmVCcmVha3MgPSBzcGFjZXJzLmxlbmd0aCA+IDAgJiYgc3BhY2Vycy5zb21lKCh0KSA9PiB0aGlzLnJ1bGVzLm90aGVyLmFueUxpbmUudGVzdCh0LnJhdykpOwogICAgICAgICAgICBsaXN0Mi5sb29zZSA9IGhhc011bHRpcGxlTGluZUJyZWFrczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGxpc3QyLmxvb3NlKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QyLml0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxpc3QyLml0ZW1zW2ldLmxvb3NlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3QyOwogICAgICB9CiAgICB9CiAgICBodG1sKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyhzcmMpOwogICAgICBpZiAoY2FwKSB7CiAgICAgICAgY29uc3QgdG9rZW4gPSB7CiAgICAgICAgICB0eXBlOiAiaHRtbCIsCiAgICAgICAgICBibG9jazogdHJ1ZSwKICAgICAgICAgIHJhdzogY2FwWzBdLAogICAgICAgICAgcHJlOiBjYXBbMV0gPT09ICJwcmUiIHx8IGNhcFsxXSA9PT0gInNjcmlwdCIgfHwgY2FwWzFdID09PSAic3R5bGUiLAogICAgICAgICAgdGV4dDogY2FwWzBdCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgIH0KICAgIH0KICAgIGRlZihzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyhzcmMpOwogICAgICBpZiAoY2FwKSB7CiAgICAgICAgY29uc3QgdGFnMiA9IGNhcFsxXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5tdWx0aXBsZVNwYWNlR2xvYmFsLCAiICIpOwogICAgICAgIGNvbnN0IGhyZWYgPSBjYXBbMl0gPyBjYXBbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmhyZWZCcmFja2V0cywgIiQxIikucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgIiQxIikgOiAiIjsKICAgICAgICBjb25zdCB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zdWJzdHJpbmcoMSwgY2FwWzNdLmxlbmd0aCAtIDEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICIkMSIpIDogY2FwWzNdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiZGVmIiwKICAgICAgICAgIHRhZzogdGFnMiwKICAgICAgICAgIHJhdzogY2FwWzBdLAogICAgICAgICAgaHJlZiwKICAgICAgICAgIHRpdGxlCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgdGFibGUoc3JjKSB7CiAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2sudGFibGUuZXhlYyhzcmMpOwogICAgICBpZiAoIWNhcCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIXRoaXMucnVsZXMub3RoZXIudGFibGVEZWxpbWl0ZXIudGVzdChjYXBbMl0pKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGhlYWRlcnMgPSBzcGxpdENlbGxzKGNhcFsxXSk7CiAgICAgIGNvbnN0IGFsaWducyA9IGNhcFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNoYXJzLCAiIikuc3BsaXQoInwiKTsKICAgICAgY29uc3Qgcm93cyA9IGNhcFszXT8udHJpbSgpID8gY2FwWzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSwgIiIpLnNwbGl0KCJcbiIpIDogW107CiAgICAgIGNvbnN0IGl0ZW0gPSB7CiAgICAgICAgdHlwZTogInRhYmxlIiwKICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICBoZWFkZXI6IFtdLAogICAgICAgIGFsaWduOiBbXSwKICAgICAgICByb3dzOiBbXQogICAgICB9OwogICAgICBpZiAoaGVhZGVycy5sZW5ndGggIT09IGFsaWducy5sZW5ndGgpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBhbGlnbiBvZiBhbGlnbnMpIHsKICAgICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduUmlnaHQudGVzdChhbGlnbikpIHsKICAgICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgicmlnaHQiKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNlbnRlci50ZXN0KGFsaWduKSkgewogICAgICAgICAgaXRlbS5hbGlnbi5wdXNoKCJjZW50ZXIiKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkxlZnQudGVzdChhbGlnbikpIHsKICAgICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgibGVmdCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpdGVtLmFsaWduLnB1c2gobnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIGl0ZW0uaGVhZGVyLnB1c2goewogICAgICAgICAgdGV4dDogaGVhZGVyc1tpXSwKICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoaGVhZGVyc1tpXSksCiAgICAgICAgICBoZWFkZXI6IHRydWUsCiAgICAgICAgICBhbGlnbjogaXRlbS5hbGlnbltpXQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHsKICAgICAgICBpdGVtLnJvd3MucHVzaChzcGxpdENlbGxzKHJvdywgaXRlbS5oZWFkZXIubGVuZ3RoKS5tYXAoKGNlbGwsIGkpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRleHQ6IGNlbGwsCiAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2VsbCksCiAgICAgICAgICAgIGhlYWRlcjogZmFsc2UsCiAgICAgICAgICAgIGFsaWduOiBpdGVtLmFsaWduW2ldCiAgICAgICAgICB9OwogICAgICAgIH0pKTsKICAgICAgfQogICAgICByZXR1cm4gaXRlbTsKICAgIH0KICAgIGxoZWFkaW5nKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiaGVhZGluZyIsCiAgICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICAgIGRlcHRoOiBjYXBbMl0uY2hhckF0KDApID09PSAiPSIgPyAxIDogMiwKICAgICAgICAgIHRleHQ6IGNhcFsxXSwKICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2FwWzFdKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIHBhcmFncmFwaChzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyhzcmMpOwogICAgICBpZiAoY2FwKSB7CiAgICAgICAgY29uc3QgdGV4dCA9IGNhcFsxXS5jaGFyQXQoY2FwWzFdLmxlbmd0aCAtIDEpID09PSAiXG4iID8gY2FwWzFdLnNsaWNlKDAsIC0xKSA6IGNhcFsxXTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICAgIHRleHQsCiAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgdGV4dChzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICAgIHRleHQ6IGNhcFswXSwKICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2FwWzBdKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGVzY2FwZShzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiZXNjYXBlIiwKICAgICAgICAgIHJhdzogY2FwWzBdLAogICAgICAgICAgdGV4dDogY2FwWzFdCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgdGFnKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS50YWcuZXhlYyhzcmMpOwogICAgICBpZiAoY2FwKSB7CiAgICAgICAgaWYgKCF0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiB0aGlzLnJ1bGVzLm90aGVyLnN0YXJ0QVRhZy50ZXN0KGNhcFswXSkpIHsKICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIHRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KGNhcFswXSkpIHsKICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdChjYXBbMF0pKSB7CiAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrICYmIHRoaXMucnVsZXMub3RoZXIuZW5kUHJlU2NyaXB0VGFnLnRlc3QoY2FwWzBdKSkgewogICAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiaHRtbCIsCiAgICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICAgIGluTGluazogdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssCiAgICAgICAgICBpblJhd0Jsb2NrOiB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssCiAgICAgICAgICBibG9jazogZmFsc2UsCiAgICAgICAgICB0ZXh0OiBjYXBbMF0KICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICBsaW5rKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIGNvbnN0IHRyaW1tZWRVcmwgPSBjYXBbMl0udHJpbSgpOwogICAgICAgIGlmICghdGhpcy5vcHRpb25zLnBlZGFudGljICYmIHRoaXMucnVsZXMub3RoZXIuc3RhcnRBbmdsZUJyYWNrZXQudGVzdCh0cmltbWVkVXJsKSkgewogICAgICAgICAgaWYgKCF0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJ0cmltU2xhc2ggPSBydHJpbSh0cmltbWVkVXJsLnNsaWNlKDAsIC0xKSwgIlxcIik7CiAgICAgICAgICBpZiAoKHRyaW1tZWRVcmwubGVuZ3RoIC0gcnRyaW1TbGFzaC5sZW5ndGgpICUgMiA9PT0gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGxhc3RQYXJlbkluZGV4ID0gZmluZENsb3NpbmdCcmFja2V0KGNhcFsyXSwgIigpIik7CiAgICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPT09IC0yKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsYXN0UGFyZW5JbmRleCA+IC0xKSB7CiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY2FwWzBdLmluZGV4T2YoIiEiKSA9PT0gMCA/IDUgOiA0OwogICAgICAgICAgICBjb25zdCBsaW5rTGVuID0gc3RhcnQgKyBjYXBbMV0ubGVuZ3RoICsgbGFzdFBhcmVuSW5kZXg7CiAgICAgICAgICAgIGNhcFsyXSA9IGNhcFsyXS5zdWJzdHJpbmcoMCwgbGFzdFBhcmVuSW5kZXgpOwogICAgICAgICAgICBjYXBbMF0gPSBjYXBbMF0uc3Vic3RyaW5nKDAsIGxpbmtMZW4pLnRyaW0oKTsKICAgICAgICAgICAgY2FwWzNdID0gIiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBocmVmID0gY2FwWzJdOwogICAgICAgIGxldCB0aXRsZSA9ICIiOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHsKICAgICAgICAgIGNvbnN0IGxpbmsyID0gdGhpcy5ydWxlcy5vdGhlci5wZWRhbnRpY0hyZWZUaXRsZS5leGVjKGhyZWYpOwogICAgICAgICAgaWYgKGxpbmsyKSB7CiAgICAgICAgICAgIGhyZWYgPSBsaW5rMlsxXTsKICAgICAgICAgICAgdGl0bGUgPSBsaW5rMlszXTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGl0bGUgPSBjYXBbM10gPyBjYXBbM10uc2xpY2UoMSwgLTEpIDogIiI7CiAgICAgICAgfQogICAgICAgIGhyZWYgPSBocmVmLnRyaW0oKTsKICAgICAgICBpZiAodGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KGhyZWYpKSB7CiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljICYmICF0aGlzLnJ1bGVzLm90aGVyLmVuZEFuZ2xlQnJhY2tldC50ZXN0KHRyaW1tZWRVcmwpKSB7CiAgICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSwgLTEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIHsKICAgICAgICAgIGhyZWY6IGhyZWYgPyBocmVmLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICIkMSIpIDogaHJlZiwKICAgICAgICAgIHRpdGxlOiB0aXRsZSA/IHRpdGxlLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICIkMSIpIDogdGl0bGUKICAgICAgICB9LCBjYXBbMF0sIHRoaXMubGV4ZXIsIHRoaXMucnVsZXMpOwogICAgICB9CiAgICB9CiAgICByZWZsaW5rKHNyYywgbGlua3MpIHsKICAgICAgbGV0IGNhcDsKICAgICAgaWYgKChjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5yZWZsaW5rLmV4ZWMoc3JjKSkgfHwgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKHNyYykpKSB7CiAgICAgICAgY29uc3QgbGlua1N0cmluZyA9IChjYXBbMl0gfHwgY2FwWzFdKS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubXVsdGlwbGVTcGFjZUdsb2JhbCwgIiAiKTsKICAgICAgICBjb25zdCBsaW5rMiA9IGxpbmtzW2xpbmtTdHJpbmcudG9Mb3dlckNhc2UoKV07CiAgICAgICAgaWYgKCFsaW5rMikgewogICAgICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5jaGFyQXQoMCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICAgIHJhdzogdGV4dCwKICAgICAgICAgICAgdGV4dAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCBsaW5rMiwgY2FwWzBdLCB0aGlzLmxleGVyLCB0aGlzLnJ1bGVzKTsKICAgICAgfQogICAgfQogICAgZW1TdHJvbmcoc3JjLCBtYXNrZWRTcmMsIHByZXZDaGFyID0gIiIpIHsKICAgICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhzcmMpOwogICAgICBpZiAoIW1hdGNoKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKG1hdGNoWzNdICYmIHByZXZDaGFyLm1hdGNoKHRoaXMucnVsZXMub3RoZXIudW5pY29kZUFscGhhTnVtZXJpYykpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBuZXh0Q2hhciA9IG1hdGNoWzFdIHx8IG1hdGNoWzJdIHx8ICIiOwogICAgICBpZiAoIW5leHRDaGFyIHx8ICFwcmV2Q2hhciB8fCB0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHByZXZDaGFyKSkgewogICAgICAgIGNvbnN0IGxMZW5ndGggPSBbLi4ubWF0Y2hbMF1dLmxlbmd0aCAtIDE7CiAgICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGgsIG1pZERlbGltVG90YWwgPSAwOwogICAgICAgIGNvbnN0IGVuZFJlZyA9IG1hdGNoWzBdWzBdID09PSAiKiIgPyB0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbUFzdCA6IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nUkRlbGltVW5kOwogICAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwOwogICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgtMSAqIHNyYy5sZW5ndGggKyBsTGVuZ3RoKTsKICAgICAgICB3aGlsZSAoKG1hdGNoID0gZW5kUmVnLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkgewogICAgICAgICAgckRlbGltID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgbWF0Y2hbNl07CiAgICAgICAgICBpZiAoIXJEZWxpbSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICByTGVuZ3RoID0gWy4uLnJEZWxpbV0ubGVuZ3RoOwogICAgICAgICAgaWYgKG1hdGNoWzNdIHx8IG1hdGNoWzRdKSB7CiAgICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoWzVdIHx8IG1hdGNoWzZdKSB7CiAgICAgICAgICAgIGlmIChsTGVuZ3RoICUgMyAmJiAhKChsTGVuZ3RoICsgckxlbmd0aCkgJSAzKSkgewogICAgICAgICAgICAgIG1pZERlbGltVG90YWwgKz0gckxlbmd0aDsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZGVsaW1Ub3RhbCAtPSByTGVuZ3RoOwogICAgICAgICAgaWYgKGRlbGltVG90YWwgPiAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIHJMZW5ndGggPSBNYXRoLm1pbihyTGVuZ3RoLCByTGVuZ3RoICsgZGVsaW1Ub3RhbCArIG1pZERlbGltVG90YWwpOwogICAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDsKICAgICAgICAgIGNvbnN0IHJhdyA9IHNyYy5zbGljZSgwLCBsTGVuZ3RoICsgbWF0Y2guaW5kZXggKyBsYXN0Q2hhckxlbmd0aCArIHJMZW5ndGgpOwogICAgICAgICAgaWYgKE1hdGgubWluKGxMZW5ndGgsIHJMZW5ndGgpICUgMikgewogICAgICAgICAgICBjb25zdCB0ZXh0MiA9IHJhdy5zbGljZSgxLCAtMSk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHlwZTogImVtIiwKICAgICAgICAgICAgICByYXcsCiAgICAgICAgICAgICAgdGV4dDogdGV4dDIsCiAgICAgICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZVRva2Vucyh0ZXh0MikKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMiwgLTIpOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogInN0cm9uZyIsCiAgICAgICAgICAgIHJhdywKICAgICAgICAgICAgdGV4dCwKICAgICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZVRva2Vucyh0ZXh0KQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvZGVzcGFuKHNyYykgewogICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIGxldCB0ZXh0ID0gY2FwWzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCwgIiAiKTsKICAgICAgICBjb25zdCBoYXNOb25TcGFjZUNoYXJzID0gdGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIudGVzdCh0ZXh0KTsKICAgICAgICBjb25zdCBoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcyA9IHRoaXMucnVsZXMub3RoZXIuc3RhcnRpbmdTcGFjZUNoYXIudGVzdCh0ZXh0KSAmJiB0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KHRleHQpOwogICAgICAgIGlmIChoYXNOb25TcGFjZUNoYXJzICYmIGhhc1NwYWNlQ2hhcnNPbkJvdGhFbmRzKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJjb2Rlc3BhbiIsCiAgICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICAgIHRleHQKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICBicihzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyhzcmMpOwogICAgICBpZiAoY2FwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJiciIsCiAgICAgICAgICByYXc6IGNhcFswXQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGRlbChzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuZGVsLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiZGVsIiwKICAgICAgICAgIHJhdzogY2FwWzBdLAogICAgICAgICAgdGV4dDogY2FwWzJdLAogICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZVRva2VucyhjYXBbMl0pCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgYXV0b2xpbmsoc3JjKSB7CiAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWMoc3JjKTsKICAgICAgaWYgKGNhcCkgewogICAgICAgIGxldCB0ZXh0LCBocmVmOwogICAgICAgIGlmIChjYXBbMl0gPT09ICJAIikgewogICAgICAgICAgdGV4dCA9IGNhcFsxXTsKICAgICAgICAgIGhyZWYgPSAibWFpbHRvOiIgKyB0ZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0ID0gY2FwWzFdOwogICAgICAgICAgaHJlZiA9IHRleHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAibGluayIsCiAgICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICAgIHRleHQsCiAgICAgICAgICBocmVmLAogICAgICAgICAgdG9rZW5zOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICAgICAgcmF3OiB0ZXh0LAogICAgICAgICAgICAgIHRleHQKICAgICAgICAgICAgfQogICAgICAgICAgXQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIHVybChzcmMpIHsKICAgICAgbGV0IGNhcDsKICAgICAgaWYgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnVybC5leGVjKHNyYykpIHsKICAgICAgICBsZXQgdGV4dCwgaHJlZjsKICAgICAgICBpZiAoY2FwWzJdID09PSAiQCIpIHsKICAgICAgICAgIHRleHQgPSBjYXBbMF07CiAgICAgICAgICBocmVmID0gIm1haWx0bzoiICsgdGV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IHByZXZDYXBaZXJvOwogICAgICAgICAgZG8gewogICAgICAgICAgICBwcmV2Q2FwWmVybyA9IGNhcFswXTsKICAgICAgICAgICAgY2FwWzBdID0gdGhpcy5ydWxlcy5pbmxpbmUuX2JhY2twZWRhbC5leGVjKGNhcFswXSk/LlswXSA/PyAiIjsKICAgICAgICAgIH0gd2hpbGUgKHByZXZDYXBaZXJvICE9PSBjYXBbMF0pOwogICAgICAgICAgdGV4dCA9IGNhcFswXTsKICAgICAgICAgIGlmIChjYXBbMV0gPT09ICJ3d3cuIikgewogICAgICAgICAgICBocmVmID0gImh0dHA6Ly8iICsgY2FwWzBdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaHJlZiA9IGNhcFswXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJsaW5rIiwKICAgICAgICAgIHJhdzogY2FwWzBdLAogICAgICAgICAgdGV4dCwKICAgICAgICAgIGhyZWYsCiAgICAgICAgICB0b2tlbnM6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgIHR5cGU6ICJ0ZXh0IiwKICAgICAgICAgICAgICByYXc6IHRleHQsCiAgICAgICAgICAgICAgdGV4dAogICAgICAgICAgICB9CiAgICAgICAgICBdCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgaW5saW5lVGV4dChzcmMpIHsKICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKHNyYyk7CiAgICAgIGlmIChjYXApIHsKICAgICAgICBjb25zdCBlc2NhcGVkID0gdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICByYXc6IGNhcFswXSwKICAgICAgICAgIHRleHQ6IGNhcFswXSwKICAgICAgICAgIGVzY2FwZWQKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfTsKICB2YXIgX0xleGVyID0gY2xhc3MgX19MZXhlciB7CiAgICB0b2tlbnM7CiAgICBvcHRpb25zOwogICAgc3RhdGU7CiAgICB0b2tlbml6ZXI7CiAgICBpbmxpbmVRdWV1ZTsKICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMyKSB7CiAgICAgIHRoaXMudG9rZW5zID0gW107CiAgICAgIHRoaXMudG9rZW5zLmxpbmtzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMyIHx8IF9kZWZhdWx0czsKICAgICAgdGhpcy5vcHRpb25zLnRva2VuaXplciA9IHRoaXMub3B0aW9ucy50b2tlbml6ZXIgfHwgbmV3IF9Ub2tlbml6ZXIoKTsKICAgICAgdGhpcy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyOwogICAgICB0aGlzLnRva2VuaXplci5vcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICB0aGlzLnRva2VuaXplci5sZXhlciA9IHRoaXM7CiAgICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTsKICAgICAgdGhpcy5zdGF0ZSA9IHsKICAgICAgICBpbkxpbms6IGZhbHNlLAogICAgICAgIGluUmF3QmxvY2s6IGZhbHNlLAogICAgICAgIHRvcDogdHJ1ZQogICAgICB9OwogICAgICBjb25zdCBydWxlcyA9IHsKICAgICAgICBvdGhlciwKICAgICAgICBibG9jazogYmxvY2subm9ybWFsLAogICAgICAgIGlubGluZTogaW5saW5lLm5vcm1hbAogICAgICB9OwogICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7CiAgICAgICAgcnVsZXMuYmxvY2sgPSBibG9jay5wZWRhbnRpYzsKICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUucGVkYW50aWM7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdmbSkgewogICAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2suZ2ZtOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnJlYWtzKSB7CiAgICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUuYnJlYWtzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUuZ2ZtOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnRva2VuaXplci5ydWxlcyA9IHJ1bGVzOwogICAgfQogICAgLyoqCiAgICAgKiBFeHBvc2UgUnVsZXMKICAgICAqLwogICAgc3RhdGljIGdldCBydWxlcygpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBibG9jaywKICAgICAgICBpbmxpbmUKICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGljIExleCBNZXRob2QKICAgICAqLwogICAgc3RhdGljIGxleChzcmMsIG9wdGlvbnMyKSB7CiAgICAgIGNvbnN0IGxleGVyMiA9IG5ldyBfX0xleGVyKG9wdGlvbnMyKTsKICAgICAgcmV0dXJuIGxleGVyMi5sZXgoc3JjKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGljIExleCBJbmxpbmUgTWV0aG9kCiAgICAgKi8KICAgIHN0YXRpYyBsZXhJbmxpbmUoc3JjLCBvcHRpb25zMikgewogICAgICBjb25zdCBsZXhlcjIgPSBuZXcgX19MZXhlcihvcHRpb25zMik7CiAgICAgIHJldHVybiBsZXhlcjIuaW5saW5lVG9rZW5zKHNyYyk7CiAgICB9CiAgICAvKioKICAgICAqIFByZXByb2Nlc3NpbmcKICAgICAqLwogICAgbGV4KHNyYykgewogICAgICBzcmMgPSBzcmMucmVwbGFjZShvdGhlci5jYXJyaWFnZVJldHVybiwgIlxuIik7CiAgICAgIHRoaXMuYmxvY2tUb2tlbnMoc3JjLCB0aGlzLnRva2Vucyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmlubGluZVF1ZXVlW2ldOwogICAgICAgIHRoaXMuaW5saW5lVG9rZW5zKG5leHQuc3JjLCBuZXh0LnRva2Vucyk7CiAgICAgIH0KICAgICAgdGhpcy5pbmxpbmVRdWV1ZSA9IFtdOwogICAgICByZXR1cm4gdGhpcy50b2tlbnM7CiAgICB9CiAgICBibG9ja1Rva2VucyhzcmMsIHRva2VucyA9IFtdLCBsYXN0UGFyYWdyYXBoQ2xpcHBlZCA9IGZhbHNlKSB7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHsKICAgICAgICBzcmMgPSBzcmMucmVwbGFjZShvdGhlci50YWJDaGFyR2xvYmFsLCAiICAgICIpLnJlcGxhY2Uob3RoZXIuc3BhY2VMaW5lLCAiIik7CiAgICAgIH0KICAgICAgd2hpbGUgKHNyYykgewogICAgICAgIGxldCB0b2tlbjsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmJsb2NrPy5zb21lKChleHRUb2tlbml6ZXIpID0+IHsKICAgICAgICAgIGlmICh0b2tlbiA9IGV4dFRva2VuaXplci5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgc3JjLCB0b2tlbnMpKSB7CiAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5zcGFjZShzcmMpKSB7CiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTsKICAgICAgICAgIGlmICh0b2tlbi5yYXcubGVuZ3RoID09PSAxICYmIGxhc3RUb2tlbiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gIlxuIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2RlKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpOwogICAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gInBhcmFncmFwaCIgfHwgbGFzdFRva2VuPy50eXBlID09PSAidGV4dCIpIHsKICAgICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAiXG4iICsgdG9rZW4ucmF3OwogICAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAiXG4iICsgdG9rZW4udGV4dDsKICAgICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkuc3JjID0gbGFzdFRva2VuLnRleHQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZmVuY2VzKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaGVhZGluZyhzcmMpKSB7CiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmhyKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYmxvY2txdW90ZShzcmMpKSB7CiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpc3Qoc3JjKSkgewogICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTsKICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5odG1sKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVmKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpOwogICAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gInBhcmFncmFwaCIgfHwgbGFzdFRva2VuPy50eXBlID09PSAidGV4dCIpIHsKICAgICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAiXG4iICsgdG9rZW4ucmF3OwogICAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAiXG4iICsgdG9rZW4ucmF3OwogICAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmMgPSBsYXN0VG9rZW4udGV4dDsKICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudG9rZW5zLmxpbmtzW3Rva2VuLnRhZ10pIHsKICAgICAgICAgICAgdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSA9IHsKICAgICAgICAgICAgICBocmVmOiB0b2tlbi5ocmVmLAogICAgICAgICAgICAgIHRpdGxlOiB0b2tlbi50aXRsZQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRhYmxlKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGhlYWRpbmcoc3JjKSkgewogICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTsKICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBsZXQgY3V0U3JjID0gc3JjOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8uc3RhcnRCbG9jaykgewogICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTsKICAgICAgICAgIGNvbnN0IHRlbXBTcmMgPSBzcmMuc2xpY2UoMSk7CiAgICAgICAgICBsZXQgdGVtcFN0YXJ0OwogICAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jay5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7CiAgICAgICAgICAgIHRlbXBTdGFydCA9IGdldFN0YXJ0SW5kZXguY2FsbCh7IGxleGVyOiB0aGlzIH0sIHRlbXBTcmMpOwogICAgICAgICAgICBpZiAodHlwZW9mIHRlbXBTdGFydCA9PT0gIm51bWJlciIgJiYgdGVtcFN0YXJ0ID49IDApIHsKICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkgewogICAgICAgICAgICBjdXRTcmMgPSBzcmMuc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXggKyAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc3RhdGUudG9wICYmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnBhcmFncmFwaChjdXRTcmMpKSkgewogICAgICAgICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zLmF0KC0xKTsKICAgICAgICAgIGlmIChsYXN0UGFyYWdyYXBoQ2xpcHBlZCAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICJwYXJhZ3JhcGgiKSB7CiAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gIlxuIiArIHRva2VuLnJhdzsKICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gIlxuIiArIHRva2VuLnRleHQ7CiAgICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUucG9wKCk7CiAgICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYyA9IGxhc3RUb2tlbi50ZXh0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgfQogICAgICAgICAgbGFzdFBhcmFncmFwaENsaXBwZWQgPSBjdXRTcmMubGVuZ3RoICE9PSBzcmMubGVuZ3RoOwogICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50ZXh0KHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpOwogICAgICAgICAgaWYgKGxhc3RUb2tlbj8udHlwZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gIlxuIiArIHRva2VuLnJhdzsKICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gIlxuIiArIHRva2VuLnRleHQ7CiAgICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUucG9wKCk7CiAgICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYyA9IGxhc3RUb2tlbi50ZXh0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChzcmMpIHsKICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIgKyBzcmMuY2hhckNvZGVBdCgwKTsKICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5zdGF0ZS50b3AgPSB0cnVlOwogICAgICByZXR1cm4gdG9rZW5zOwogICAgfQogICAgaW5saW5lKHNyYywgdG9rZW5zID0gW10pIHsKICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHsgc3JjLCB0b2tlbnMgfSk7CiAgICAgIHJldHVybiB0b2tlbnM7CiAgICB9CiAgICAvKioKICAgICAqIExleGluZy9Db21waWxpbmcKICAgICAqLwogICAgaW5saW5lVG9rZW5zKHNyYywgdG9rZW5zID0gW10pIHsKICAgICAgbGV0IG1hc2tlZFNyYyA9IHNyYzsKICAgICAgbGV0IG1hdGNoID0gbnVsbDsKICAgICAgaWYgKHRoaXMudG9rZW5zLmxpbmtzKSB7CiAgICAgICAgY29uc3QgbGlua3MgPSBPYmplY3Qua2V5cyh0aGlzLnRva2Vucy5saW5rcyk7CiAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHsKICAgICAgICAgICAgaWYgKGxpbmtzLmluY2x1ZGVzKG1hdGNoWzBdLnNsaWNlKG1hdGNoWzBdLmxhc3RJbmRleE9mKCJbIikgKyAxLCAtMSkpKSB7CiAgICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArICJbIiArICJhIi5yZXBlYXQobWF0Y2hbMF0ubGVuZ3RoIC0gMikgKyAiXSIgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkgewogICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAiKysiICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpOwogICAgICB9CiAgICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkgewogICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAiWyIgKyAiYSIucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIDIpICsgIl0iICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTsKICAgICAgfQogICAgICBsZXQga2VlcFByZXZDaGFyID0gZmFsc2U7CiAgICAgIGxldCBwcmV2Q2hhciA9ICIiOwogICAgICB3aGlsZSAoc3JjKSB7CiAgICAgICAgaWYgKCFrZWVwUHJldkNoYXIpIHsKICAgICAgICAgIHByZXZDaGFyID0gIiI7CiAgICAgICAgfQogICAgICAgIGtlZXBQcmV2Q2hhciA9IGZhbHNlOwogICAgICAgIGxldCB0b2tlbjsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LmlubGluZT8uc29tZSgoZXh0VG9rZW5pemVyKSA9PiB7CiAgICAgICAgICBpZiAodG9rZW4gPSBleHRUb2tlbml6ZXIuY2FsbCh7IGxleGVyOiB0aGlzIH0sIHNyYywgdG9rZW5zKSkgewogICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZXNjYXBlKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGFnKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGluayhzcmMpKSB7CiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnJlZmxpbmsoc3JjLCB0aGlzLnRva2Vucy5saW5rcykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICBjb25zdCBsYXN0VG9rZW4gPSB0b2tlbnMuYXQoLTEpOwogICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICJ0ZXh0IiAmJiBsYXN0VG9rZW4/LnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdzsKICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gdG9rZW4udGV4dDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5lbVN0cm9uZyhzcmMsIG1hc2tlZFNyYywgcHJldkNoYXIpKSB7CiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmNvZGVzcGFuKHNyYykpIHsKICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7CiAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYnIoc3JjKSkgewogICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTsKICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5kZWwoc3JjKSkgewogICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTsKICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5hdXRvbGluayhzcmMpKSB7CiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5zdGF0ZS5pbkxpbmsgJiYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudXJsKHNyYykpKSB7CiAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpOwogICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCBjdXRTcmMgPSBzcmM7CiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5zdGFydElubGluZSkgewogICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTsKICAgICAgICAgIGNvbnN0IHRlbXBTcmMgPSBzcmMuc2xpY2UoMSk7CiAgICAgICAgICBsZXQgdGVtcFN0YXJ0OwogICAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaCgoZ2V0U3RhcnRJbmRleCkgPT4gewogICAgICAgICAgICB0ZW1wU3RhcnQgPSBnZXRTdGFydEluZGV4LmNhbGwoeyBsZXhlcjogdGhpcyB9LCB0ZW1wU3JjKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICJudW1iZXIiICYmIHRlbXBTdGFydCA+PSAwKSB7CiAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRlbXBTdGFydCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCBJbmZpbml0eSAmJiBzdGFydEluZGV4ID49IDApIHsKICAgICAgICAgICAgY3V0U3JjID0gc3JjLnN1YnN0cmluZygwLCBzdGFydEluZGV4ICsgMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmlubGluZVRleHQoY3V0U3JjKSkgewogICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTsKICAgICAgICAgIGlmICh0b2tlbi5yYXcuc2xpY2UoLTEpICE9PSAiXyIpIHsKICAgICAgICAgICAgcHJldkNoYXIgPSB0b2tlbi5yYXcuc2xpY2UoLTEpOwogICAgICAgICAgfQogICAgICAgICAga2VlcFByZXZDaGFyID0gdHJ1ZTsKICAgICAgICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vucy5hdCgtMSk7CiAgICAgICAgICBpZiAobGFzdFRva2VuPy50eXBlID09PSAidGV4dCIpIHsKICAgICAgICAgICAgbGFzdFRva2VuLnJhdyArPSB0b2tlbi5yYXc7CiAgICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9IHRva2VuLnRleHQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHNyYykgewogICAgICAgICAgY29uc3QgZXJyTXNnID0gIkluZmluaXRlIGxvb3Agb24gYnl0ZTogIiArIHNyYy5jaGFyQ29kZUF0KDApOwogICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdG9rZW5zOwogICAgfQogIH07CiAgdmFyIF9SZW5kZXJlciA9IGNsYXNzIHsKICAgIG9wdGlvbnM7CiAgICBwYXJzZXI7CiAgICAvLyBzZXQgYnkgdGhlIHBhcnNlcgogICAgY29uc3RydWN0b3Iob3B0aW9uczIpIHsKICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczIgfHwgX2RlZmF1bHRzOwogICAgfQogICAgc3BhY2UodG9rZW4pIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29kZSh7IHRleHQsIGxhbmcsIGVzY2FwZWQgfSkgewogICAgICBjb25zdCBsYW5nU3RyaW5nID0gKGxhbmcgfHwgIiIpLm1hdGNoKG90aGVyLm5vdFNwYWNlU3RhcnQpPy5bMF07CiAgICAgIGNvbnN0IGNvZGUgPSB0ZXh0LnJlcGxhY2Uob3RoZXIuZW5kaW5nTmV3bGluZSwgIiIpICsgIlxuIjsKICAgICAgaWYgKCFsYW5nU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuICI8cHJlPjxjb2RlPiIgKyAoZXNjYXBlZCA/IGNvZGUgOiBlc2NhcGUyKGNvZGUsIHRydWUpKSArICI8L2NvZGU+PC9wcmU+XG4iOwogICAgICB9CiAgICAgIHJldHVybiAnPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtJyArIGVzY2FwZTIobGFuZ1N0cmluZykgKyAnIj4nICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlMihjb2RlLCB0cnVlKSkgKyAiPC9jb2RlPjwvcHJlPlxuIjsKICAgIH0KICAgIGJsb2NrcXVvdGUoeyB0b2tlbnMgfSkgewogICAgICBjb25zdCBib2R5ID0gdGhpcy5wYXJzZXIucGFyc2UodG9rZW5zKTsKICAgICAgcmV0dXJuIGA8YmxvY2txdW90ZT4KJHtib2R5fTwvYmxvY2txdW90ZT4KYDsKICAgIH0KICAgIGh0bWwoeyB0ZXh0IH0pIHsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICBoZWFkaW5nKHsgdG9rZW5zLCBkZXB0aCB9KSB7CiAgICAgIHJldHVybiBgPGgke2RlcHRofT4ke3RoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyl9PC9oJHtkZXB0aH0+CmA7CiAgICB9CiAgICBocih0b2tlbikgewogICAgICByZXR1cm4gIjxocj5cbiI7CiAgICB9CiAgICBsaXN0KHRva2VuKSB7CiAgICAgIGNvbnN0IG9yZGVyZWQgPSB0b2tlbi5vcmRlcmVkOwogICAgICBjb25zdCBzdGFydCA9IHRva2VuLnN0YXJ0OwogICAgICBsZXQgYm9keSA9ICIiOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRva2VuLml0ZW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgY29uc3QgaXRlbSA9IHRva2VuLml0ZW1zW2pdOwogICAgICAgIGJvZHkgKz0gdGhpcy5saXN0aXRlbShpdGVtKTsKICAgICAgfQogICAgICBjb25zdCB0eXBlID0gb3JkZXJlZCA/ICJvbCIgOiAidWwiOwogICAgICBjb25zdCBzdGFydEF0dHIgPSBvcmRlcmVkICYmIHN0YXJ0ICE9PSAxID8gJyBzdGFydD0iJyArIHN0YXJ0ICsgJyInIDogIiI7CiAgICAgIHJldHVybiAiPCIgKyB0eXBlICsgc3RhcnRBdHRyICsgIj5cbiIgKyBib2R5ICsgIjwvIiArIHR5cGUgKyAiPlxuIjsKICAgIH0KICAgIGxpc3RpdGVtKGl0ZW0pIHsKICAgICAgbGV0IGl0ZW1Cb2R5ID0gIiI7CiAgICAgIGlmIChpdGVtLnRhc2spIHsKICAgICAgICBjb25zdCBjaGVja2JveCA9IHRoaXMuY2hlY2tib3goeyBjaGVja2VkOiAhIWl0ZW0uY2hlY2tlZCB9KTsKICAgICAgICBpZiAoaXRlbS5sb29zZSkgewogICAgICAgICAgaWYgKGl0ZW0udG9rZW5zWzBdPy50eXBlID09PSAicGFyYWdyYXBoIikgewogICAgICAgICAgICBpdGVtLnRva2Vuc1swXS50ZXh0ID0gY2hlY2tib3ggKyAiICIgKyBpdGVtLnRva2Vuc1swXS50ZXh0OwogICAgICAgICAgICBpZiAoaXRlbS50b2tlbnNbMF0udG9rZW5zICYmIGl0ZW0udG9rZW5zWzBdLnRva2Vucy5sZW5ndGggPiAwICYmIGl0ZW0udG9rZW5zWzBdLnRva2Vuc1swXS50eXBlID09PSAidGV4dCIpIHsKICAgICAgICAgICAgICBpdGVtLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dCA9IGNoZWNrYm94ICsgIiAiICsgZXNjYXBlMihpdGVtLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dCk7CiAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udG9rZW5zWzBdLmVzY2FwZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KHsKICAgICAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICAgICAgcmF3OiBjaGVja2JveCArICIgIiwKICAgICAgICAgICAgICB0ZXh0OiBjaGVja2JveCArICIgIiwKICAgICAgICAgICAgICBlc2NhcGVkOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpdGVtQm9keSArPSBjaGVja2JveCArICIgIjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaXRlbUJvZHkgKz0gdGhpcy5wYXJzZXIucGFyc2UoaXRlbS50b2tlbnMsICEhaXRlbS5sb29zZSk7CiAgICAgIHJldHVybiBgPGxpPiR7aXRlbUJvZHl9PC9saT4KYDsKICAgIH0KICAgIGNoZWNrYm94KHsgY2hlY2tlZCB9KSB7CiAgICAgIHJldHVybiAiPGlucHV0ICIgKyAoY2hlY2tlZCA/ICdjaGVja2VkPSIiICcgOiAiIikgKyAnZGlzYWJsZWQ9IiIgdHlwZT0iY2hlY2tib3giPic7CiAgICB9CiAgICBwYXJhZ3JhcGgoeyB0b2tlbnMgfSkgewogICAgICByZXR1cm4gYDxwPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L3A+CmA7CiAgICB9CiAgICB0YWJsZSh0b2tlbikgewogICAgICBsZXQgaGVhZGVyID0gIiI7CiAgICAgIGxldCBjZWxsID0gIiI7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG9rZW4uaGVhZGVyLmxlbmd0aDsgaisrKSB7CiAgICAgICAgY2VsbCArPSB0aGlzLnRhYmxlY2VsbCh0b2tlbi5oZWFkZXJbal0pOwogICAgICB9CiAgICAgIGhlYWRlciArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCB9KTsKICAgICAgbGV0IGJvZHkgPSAiIjsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b2tlbi5yb3dzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgY29uc3Qgcm93ID0gdG9rZW4ucm93c1tqXTsKICAgICAgICBjZWxsID0gIiI7CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByb3cubGVuZ3RoOyBrKyspIHsKICAgICAgICAgIGNlbGwgKz0gdGhpcy50YWJsZWNlbGwocm93W2tdKTsKICAgICAgICB9CiAgICAgICAgYm9keSArPSB0aGlzLnRhYmxlcm93KHsgdGV4dDogY2VsbCB9KTsKICAgICAgfQogICAgICBpZiAoYm9keSkKICAgICAgICBib2R5ID0gYDx0Ym9keT4ke2JvZHl9PC90Ym9keT5gOwogICAgICByZXR1cm4gIjx0YWJsZT5cbjx0aGVhZD5cbiIgKyBoZWFkZXIgKyAiPC90aGVhZD5cbiIgKyBib2R5ICsgIjwvdGFibGU+XG4iOwogICAgfQogICAgdGFibGVyb3coeyB0ZXh0IH0pIHsKICAgICAgcmV0dXJuIGA8dHI+CiR7dGV4dH08L3RyPgpgOwogICAgfQogICAgdGFibGVjZWxsKHRva2VuKSB7CiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbi50b2tlbnMpOwogICAgICBjb25zdCB0eXBlID0gdG9rZW4uaGVhZGVyID8gInRoIiA6ICJ0ZCI7CiAgICAgIGNvbnN0IHRhZzIgPSB0b2tlbi5hbGlnbiA/IGA8JHt0eXBlfSBhbGlnbj0iJHt0b2tlbi5hbGlnbn0iPmAgOiBgPCR7dHlwZX0+YDsKICAgICAgcmV0dXJuIHRhZzIgKyBjb250ZW50ICsgYDwvJHt0eXBlfT4KYDsKICAgIH0KICAgIC8qKgogICAgICogc3BhbiBsZXZlbCByZW5kZXJlcgogICAgICovCiAgICBzdHJvbmcoeyB0b2tlbnMgfSkgewogICAgICByZXR1cm4gYDxzdHJvbmc+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvc3Ryb25nPmA7CiAgICB9CiAgICBlbSh7IHRva2VucyB9KSB7CiAgICAgIHJldHVybiBgPGVtPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKX08L2VtPmA7CiAgICB9CiAgICBjb2Rlc3Bhbih7IHRleHQgfSkgewogICAgICByZXR1cm4gYDxjb2RlPiR7ZXNjYXBlMih0ZXh0LCB0cnVlKX08L2NvZGU+YDsKICAgIH0KICAgIGJyKHRva2VuKSB7CiAgICAgIHJldHVybiAiPGJyPiI7CiAgICB9CiAgICBkZWwoeyB0b2tlbnMgfSkgewogICAgICByZXR1cm4gYDxkZWw+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpfTwvZGVsPmA7CiAgICB9CiAgICBsaW5rKHsgaHJlZiwgdGl0bGUsIHRva2VucyB9KSB7CiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnBhcnNlci5wYXJzZUlubGluZSh0b2tlbnMpOwogICAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTsKICAgICAgaWYgKGNsZWFuSHJlZiA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiB0ZXh0OwogICAgICB9CiAgICAgIGhyZWYgPSBjbGVhbkhyZWY7CiAgICAgIGxldCBvdXQgPSAnPGEgaHJlZj0iJyArIGhyZWYgKyAnIic7CiAgICAgIGlmICh0aXRsZSkgewogICAgICAgIG91dCArPSAnIHRpdGxlPSInICsgZXNjYXBlMih0aXRsZSkgKyAnIic7CiAgICAgIH0KICAgICAgb3V0ICs9ICI+IiArIHRleHQgKyAiPC9hPiI7CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBpbWFnZSh7IGhyZWYsIHRpdGxlLCB0ZXh0LCB0b2tlbnMgfSkgewogICAgICBpZiAodG9rZW5zKSB7CiAgICAgICAgdGV4dCA9IHRoaXMucGFyc2VyLnBhcnNlSW5saW5lKHRva2VucywgdGhpcy5wYXJzZXIudGV4dFJlbmRlcmVyKTsKICAgICAgfQogICAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTsKICAgICAgaWYgKGNsZWFuSHJlZiA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBlc2NhcGUyKHRleHQpOwogICAgICB9CiAgICAgIGhyZWYgPSBjbGVhbkhyZWY7CiAgICAgIGxldCBvdXQgPSBgPGltZyBzcmM9IiR7aHJlZn0iIGFsdD0iJHt0ZXh0fSJgOwogICAgICBpZiAodGl0bGUpIHsKICAgICAgICBvdXQgKz0gYCB0aXRsZT0iJHtlc2NhcGUyKHRpdGxlKX0iYDsKICAgICAgfQogICAgICBvdXQgKz0gIj4iOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgdGV4dCh0b2tlbikgewogICAgICByZXR1cm4gInRva2VucyIgaW4gdG9rZW4gJiYgdG9rZW4udG9rZW5zID8gdGhpcy5wYXJzZXIucGFyc2VJbmxpbmUodG9rZW4udG9rZW5zKSA6ICJlc2NhcGVkIiBpbiB0b2tlbiAmJiB0b2tlbi5lc2NhcGVkID8gdG9rZW4udGV4dCA6IGVzY2FwZTIodG9rZW4udGV4dCk7CiAgICB9CiAgfTsKICB2YXIgX1RleHRSZW5kZXJlciA9IGNsYXNzIHsKICAgIC8vIG5vIG5lZWQgZm9yIGJsb2NrIGxldmVsIHJlbmRlcmVycwogICAgc3Ryb25nKHsgdGV4dCB9KSB7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgZW0oeyB0ZXh0IH0pIHsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICBjb2Rlc3Bhbih7IHRleHQgfSkgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIGRlbCh7IHRleHQgfSkgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIGh0bWwoeyB0ZXh0IH0pIHsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICB0ZXh0KHsgdGV4dCB9KSB7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgbGluayh7IHRleHQgfSkgewogICAgICByZXR1cm4gIiIgKyB0ZXh0OwogICAgfQogICAgaW1hZ2UoeyB0ZXh0IH0pIHsKICAgICAgcmV0dXJuICIiICsgdGV4dDsKICAgIH0KICAgIGJyKCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgfTsKICB2YXIgX1BhcnNlciA9IGNsYXNzIF9fUGFyc2VyIHsKICAgIG9wdGlvbnM7CiAgICByZW5kZXJlcjsKICAgIHRleHRSZW5kZXJlcjsKICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMyKSB7CiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMyIHx8IF9kZWZhdWx0czsKICAgICAgdGhpcy5vcHRpb25zLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXIoKTsKICAgICAgdGhpcy5yZW5kZXJlciA9IHRoaXMub3B0aW9ucy5yZW5kZXJlcjsKICAgICAgdGhpcy5yZW5kZXJlci5vcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICB0aGlzLnJlbmRlcmVyLnBhcnNlciA9IHRoaXM7CiAgICAgIHRoaXMudGV4dFJlbmRlcmVyID0gbmV3IF9UZXh0UmVuZGVyZXIoKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGljIFBhcnNlIE1ldGhvZAogICAgICovCiAgICBzdGF0aWMgcGFyc2UodG9rZW5zLCBvcHRpb25zMikgewogICAgICBjb25zdCBwYXJzZXIyID0gbmV3IF9fUGFyc2VyKG9wdGlvbnMyKTsKICAgICAgcmV0dXJuIHBhcnNlcjIucGFyc2UodG9rZW5zKTsKICAgIH0KICAgIC8qKgogICAgICogU3RhdGljIFBhcnNlIElubGluZSBNZXRob2QKICAgICAqLwogICAgc3RhdGljIHBhcnNlSW5saW5lKHRva2Vucywgb3B0aW9uczIpIHsKICAgICAgY29uc3QgcGFyc2VyMiA9IG5ldyBfX1BhcnNlcihvcHRpb25zMik7CiAgICAgIHJldHVybiBwYXJzZXIyLnBhcnNlSW5saW5lKHRva2Vucyk7CiAgICB9CiAgICAvKioKICAgICAqIFBhcnNlIExvb3AKICAgICAqLwogICAgcGFyc2UodG9rZW5zLCB0b3AgPSB0cnVlKSB7CiAgICAgIGxldCBvdXQgPSAiIjsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBhbnlUb2tlbiA9IHRva2Vuc1tpXTsKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnJlbmRlcmVycz8uW2FueVRva2VuLnR5cGVdKSB7CiAgICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSBhbnlUb2tlbjsKICAgICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tnZW5lcmljVG9rZW4udHlwZV0uY2FsbCh7IHBhcnNlcjogdGhpcyB9LCBnZW5lcmljVG9rZW4pOwogICAgICAgICAgaWYgKHJldCAhPT0gZmFsc2UgfHwgIVsic3BhY2UiLCAiaHIiLCAiaGVhZGluZyIsICJjb2RlIiwgInRhYmxlIiwgImJsb2NrcXVvdGUiLCAibGlzdCIsICJodG1sIiwgInBhcmFncmFwaCIsICJ0ZXh0Il0uaW5jbHVkZXMoZ2VuZXJpY1Rva2VuLnR5cGUpKSB7CiAgICAgICAgICAgIG91dCArPSByZXQgfHwgIiI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCB0b2tlbiA9IGFueVRva2VuOwogICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkgewogICAgICAgICAgY2FzZSAic3BhY2UiOiB7CiAgICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLnNwYWNlKHRva2VuKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlICJociI6IHsKICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaHIodG9rZW4pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgImhlYWRpbmciOiB7CiAgICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhlYWRpbmcodG9rZW4pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgImNvZGUiOiB7CiAgICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmNvZGUodG9rZW4pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgInRhYmxlIjogewogICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci50YWJsZSh0b2tlbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAiYmxvY2txdW90ZSI6IHsKICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZSh0b2tlbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAibGlzdCI6IHsKICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIubGlzdCh0b2tlbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAiaHRtbCI6IHsKICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaHRtbCh0b2tlbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAicGFyYWdyYXBoIjogewogICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodG9rZW4pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgInRleHQiOiB7CiAgICAgICAgICAgIGxldCB0ZXh0VG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgbGV0IGJvZHkgPSB0aGlzLnJlbmRlcmVyLnRleHQodGV4dFRva2VuKTsKICAgICAgICAgICAgd2hpbGUgKGkgKyAxIDwgdG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbaSArIDFdLnR5cGUgPT09ICJ0ZXh0IikgewogICAgICAgICAgICAgIHRleHRUb2tlbiA9IHRva2Vuc1srK2ldOwogICAgICAgICAgICAgIGJvZHkgKz0gIlxuIiArIHRoaXMucmVuZGVyZXIudGV4dCh0ZXh0VG9rZW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b3ApIHsKICAgICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgoewogICAgICAgICAgICAgICAgdHlwZTogInBhcmFncmFwaCIsCiAgICAgICAgICAgICAgICByYXc6IGJvZHksCiAgICAgICAgICAgICAgICB0ZXh0OiBib2R5LAogICAgICAgICAgICAgICAgdG9rZW5zOiBbeyB0eXBlOiAidGV4dCIsIHJhdzogYm9keSwgdGV4dDogYm9keSwgZXNjYXBlZDogdHJ1ZSB9XQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG91dCArPSBib2R5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICBjb25zdCBlcnJNc2cgPSAnVG9rZW4gd2l0aCAiJyArIHRva2VuLnR5cGUgKyAnIiB0eXBlIHdhcyBub3QgZm91bmQuJzsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHsKICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1zZyk7CiAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICAvKioKICAgICAqIFBhcnNlIElubGluZSBUb2tlbnMKICAgICAqLwogICAgcGFyc2VJbmxpbmUodG9rZW5zLCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXIpIHsKICAgICAgbGV0IG91dCA9ICIiOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGFueVRva2VuID0gdG9rZW5zW2ldOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYW55VG9rZW4udHlwZV0pIHsKICAgICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1thbnlUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGFueVRva2VuKTsKICAgICAgICAgIGlmIChyZXQgIT09IGZhbHNlIHx8ICFbImVzY2FwZSIsICJodG1sIiwgImxpbmsiLCAiaW1hZ2UiLCAic3Ryb25nIiwgImVtIiwgImNvZGVzcGFuIiwgImJyIiwgImRlbCIsICJ0ZXh0Il0uaW5jbHVkZXMoYW55VG9rZW4udHlwZSkpIHsKICAgICAgICAgICAgb3V0ICs9IHJldCB8fCAiIjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRva2VuID0gYW55VG9rZW47CiAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7CiAgICAgICAgICBjYXNlICJlc2NhcGUiOiB7CiAgICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRva2VuKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlICJodG1sIjogewogICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaHRtbCh0b2tlbik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAibGluayI6IHsKICAgICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmxpbmsodG9rZW4pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgImltYWdlIjogewogICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaW1hZ2UodG9rZW4pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgInN0cm9uZyI6IHsKICAgICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLnN0cm9uZyh0b2tlbik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAiZW0iOiB7CiAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5lbSh0b2tlbik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAiY29kZXNwYW4iOiB7CiAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5jb2Rlc3Bhbih0b2tlbik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAiYnIiOiB7CiAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5icih0b2tlbik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAiZGVsIjogewogICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZGVsKHRva2VuKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlICJ0ZXh0IjogewogICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0b2tlbik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICBjb25zdCBlcnJNc2cgPSAnVG9rZW4gd2l0aCAiJyArIHRva2VuLnR5cGUgKyAnIiB0eXBlIHdhcyBub3QgZm91bmQuJzsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHsKICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1zZyk7CiAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgfTsKICB2YXIgX0hvb2tzID0gY2xhc3MgewogICAgb3B0aW9uczsKICAgIGJsb2NrOwogICAgY29uc3RydWN0b3Iob3B0aW9uczIpIHsKICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczIgfHwgX2RlZmF1bHRzOwogICAgfQogICAgc3RhdGljIHBhc3NUaHJvdWdoSG9va3MgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbCiAgICAgICJwcmVwcm9jZXNzIiwKICAgICAgInBvc3Rwcm9jZXNzIiwKICAgICAgInByb2Nlc3NBbGxUb2tlbnMiCiAgICBdKTsKICAgIC8qKgogICAgICogUHJvY2VzcyBtYXJrZG93biBiZWZvcmUgbWFya2VkCiAgICAgKi8KICAgIHByZXByb2Nlc3MobWFya2Rvd24pIHsKICAgICAgcmV0dXJuIG1hcmtkb3duOwogICAgfQogICAgLyoqCiAgICAgKiBQcm9jZXNzIEhUTUwgYWZ0ZXIgbWFya2VkIGlzIGZpbmlzaGVkCiAgICAgKi8KICAgIHBvc3Rwcm9jZXNzKGh0bWwyKSB7CiAgICAgIHJldHVybiBodG1sMjsKICAgIH0KICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgdG9rZW5zIGJlZm9yZSB3YWxrIHRva2VucwogICAgICovCiAgICBwcm9jZXNzQWxsVG9rZW5zKHRva2VucykgewogICAgICByZXR1cm4gdG9rZW5zOwogICAgfQogICAgLyoqCiAgICAgKiBQcm92aWRlIGZ1bmN0aW9uIHRvIHRva2VuaXplIG1hcmtkb3duCiAgICAgKi8KICAgIHByb3ZpZGVMZXhlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfTGV4ZXIubGV4IDogX0xleGVyLmxleElubGluZTsKICAgIH0KICAgIC8qKgogICAgICogUHJvdmlkZSBmdW5jdGlvbiB0byBwYXJzZSB0b2tlbnMKICAgICAqLwogICAgcHJvdmlkZVBhcnNlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuYmxvY2sgPyBfUGFyc2VyLnBhcnNlIDogX1BhcnNlci5wYXJzZUlubGluZTsKICAgIH0KICB9OwogIHZhciBNYXJrZWQgPSBjbGFzcyB7CiAgICBkZWZhdWx0cyA9IF9nZXREZWZhdWx0cygpOwogICAgb3B0aW9ucyA9IHRoaXMuc2V0T3B0aW9uczsKICAgIHBhcnNlID0gdGhpcy5wYXJzZU1hcmtkb3duKHRydWUpOwogICAgcGFyc2VJbmxpbmUgPSB0aGlzLnBhcnNlTWFya2Rvd24oZmFsc2UpOwogICAgUGFyc2VyID0gX1BhcnNlcjsKICAgIFJlbmRlcmVyID0gX1JlbmRlcmVyOwogICAgVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjsKICAgIExleGVyID0gX0xleGVyOwogICAgVG9rZW5pemVyID0gX1Rva2VuaXplcjsKICAgIEhvb2tzID0gX0hvb2tzOwogICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICB0aGlzLnVzZSguLi5hcmdzKTsKICAgIH0KICAgIC8qKgogICAgICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlbgogICAgICovCiAgICB3YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spIHsKICAgICAgbGV0IHZhbHVlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VucykgewogICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoY2FsbGJhY2suY2FsbCh0aGlzLCB0b2tlbikpOwogICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkgewogICAgICAgICAgY2FzZSAidGFibGUiOiB7CiAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRhYmxlVG9rZW4uaGVhZGVyKSB7CiAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2YgdGFibGVUb2tlbi5yb3dzKSB7CiAgICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykgewogICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoY2VsbC50b2tlbnMsIGNhbGxiYWNrKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAibGlzdCI6IHsKICAgICAgICAgICAgY29uc3QgbGlzdFRva2VuID0gdG9rZW47CiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGxpc3RUb2tlbi5pdGVtcywgY2FsbGJhY2spKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGNvbnN0IGdlbmVyaWNUb2tlbiA9IHRva2VuOwogICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0cy5leHRlbnNpb25zPy5jaGlsZFRva2Vucz8uW2dlbmVyaWNUb2tlbi50eXBlXSkgewogICAgICAgICAgICAgIHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tnZW5lcmljVG9rZW4udHlwZV0uZm9yRWFjaCgoY2hpbGRUb2tlbnMpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuczIgPSBnZW5lcmljVG9rZW5bY2hpbGRUb2tlbnNdLmZsYXQoSW5maW5pdHkpOwogICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnModG9rZW5zMiwgY2FsbGJhY2spKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5lcmljVG9rZW4udG9rZW5zKSB7CiAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoZ2VuZXJpY1Rva2VuLnRva2VucywgY2FsbGJhY2spKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdmFsdWVzOwogICAgfQogICAgdXNlKC4uLmFyZ3MpIHsKICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyB8fCB7IHJlbmRlcmVyczoge30sIGNoaWxkVG9rZW5zOiB7fSB9OwogICAgICBhcmdzLmZvckVhY2goKHBhY2spID0+IHsKICAgICAgICBjb25zdCBvcHRzID0geyAuLi5wYWNrIH07CiAgICAgICAgb3B0cy5hc3luYyA9IHRoaXMuZGVmYXVsdHMuYXN5bmMgfHwgb3B0cy5hc3luYyB8fCBmYWxzZTsKICAgICAgICBpZiAocGFjay5leHRlbnNpb25zKSB7CiAgICAgICAgICBwYWNrLmV4dGVuc2lvbnMuZm9yRWFjaCgoZXh0KSA9PiB7CiAgICAgICAgICAgIGlmICghZXh0Lm5hbWUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBuYW1lIHJlcXVpcmVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCJyZW5kZXJlciIgaW4gZXh0KSB7CiAgICAgICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdOwogICAgICAgICAgICAgIGlmIChwcmV2UmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXSA9IGZ1bmN0aW9uKC4uLmFyZ3MyKSB7CiAgICAgICAgICAgICAgICAgIGxldCByZXQgPSBleHQucmVuZGVyZXIuYXBwbHkodGhpcywgYXJnczIpOwogICAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldCA9IHByZXZSZW5kZXJlci5hcHBseSh0aGlzLCBhcmdzMik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXSA9IGV4dC5yZW5kZXJlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCJ0b2tlbml6ZXIiIGluIGV4dCkgewogICAgICAgICAgICAgIGlmICghZXh0LmxldmVsIHx8IGV4dC5sZXZlbCAhPT0gImJsb2NrIiAmJiBleHQubGV2ZWwgIT09ICJpbmxpbmUiKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSciKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0TGV2ZWwgPSBleHRlbnNpb25zW2V4dC5sZXZlbF07CiAgICAgICAgICAgICAgaWYgKGV4dExldmVsKSB7CiAgICAgICAgICAgICAgICBleHRMZXZlbC51bnNoaWZ0KGV4dC50b2tlbml6ZXIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBleHRlbnNpb25zW2V4dC5sZXZlbF0gPSBbZXh0LnRva2VuaXplcl07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChleHQuc3RhcnQpIHsKICAgICAgICAgICAgICAgIGlmIChleHQubGV2ZWwgPT09ICJibG9jayIpIHsKICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnMuc3RhcnRCbG9jaykgewogICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jay5wdXNoKGV4dC5zdGFydCk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5zdGFydEJsb2NrID0gW2V4dC5zdGFydF07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LmxldmVsID09PSAiaW5saW5lIikgewogICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zdGFydElubGluZSkgewogICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUucHVzaChleHQuc3RhcnQpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUgPSBbZXh0LnN0YXJ0XTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoImNoaWxkVG9rZW5zIiBpbiBleHQgJiYgZXh0LmNoaWxkVG9rZW5zKSB7CiAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tleHQubmFtZV0gPSBleHQuY2hpbGRUb2tlbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb3B0cy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKICAgICAgICB9CiAgICAgICAgaWYgKHBhY2sucmVuZGVyZXIpIHsKICAgICAgICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5kZWZhdWx0cy5yZW5kZXJlciB8fCBuZXcgX1JlbmRlcmVyKHRoaXMuZGVmYXVsdHMpOwogICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2sucmVuZGVyZXIpIHsKICAgICAgICAgICAgaWYgKCEocHJvcCBpbiByZW5kZXJlcikpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlbmRlcmVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChbIm9wdGlvbnMiLCAicGFyc2VyIl0uaW5jbHVkZXMocHJvcCkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZW5kZXJlclByb3AgPSBwcm9wOwogICAgICAgICAgICBjb25zdCByZW5kZXJlckZ1bmMgPSBwYWNrLnJlbmRlcmVyW3JlbmRlcmVyUHJvcF07CiAgICAgICAgICAgIGNvbnN0IHByZXZSZW5kZXJlciA9IHJlbmRlcmVyW3JlbmRlcmVyUHJvcF07CiAgICAgICAgICAgIHJlbmRlcmVyW3JlbmRlcmVyUHJvcF0gPSAoLi4uYXJnczIpID0+IHsKICAgICAgICAgICAgICBsZXQgcmV0ID0gcmVuZGVyZXJGdW5jLmFwcGx5KHJlbmRlcmVyLCBhcmdzMik7CiAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldCA9IHByZXZSZW5kZXJlci5hcHBseShyZW5kZXJlciwgYXJnczIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gcmV0IHx8ICIiOwogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgb3B0cy5yZW5kZXJlciA9IHJlbmRlcmVyOwogICAgICAgIH0KICAgICAgICBpZiAocGFjay50b2tlbml6ZXIpIHsKICAgICAgICAgIGNvbnN0IHRva2VuaXplciA9IHRoaXMuZGVmYXVsdHMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyKHRoaXMuZGVmYXVsdHMpOwogICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2sudG9rZW5pemVyKSB7CiAgICAgICAgICAgIGlmICghKHByb3AgaW4gdG9rZW5pemVyKSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChbIm9wdGlvbnMiLCAicnVsZXMiLCAibGV4ZXIiXS5pbmNsdWRlcyhwcm9wKSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHRva2VuaXplclByb3AgPSBwcm9wOwogICAgICAgICAgICBjb25zdCB0b2tlbml6ZXJGdW5jID0gcGFjay50b2tlbml6ZXJbdG9rZW5pemVyUHJvcF07CiAgICAgICAgICAgIGNvbnN0IHByZXZUb2tlbml6ZXIgPSB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF07CiAgICAgICAgICAgIHRva2VuaXplclt0b2tlbml6ZXJQcm9wXSA9ICguLi5hcmdzMikgPT4gewogICAgICAgICAgICAgIGxldCByZXQgPSB0b2tlbml6ZXJGdW5jLmFwcGx5KHRva2VuaXplciwgYXJnczIpOwogICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXQgPSBwcmV2VG9rZW5pemVyLmFwcGx5KHRva2VuaXplciwgYXJnczIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgb3B0cy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7CiAgICAgICAgfQogICAgICAgIGlmIChwYWNrLmhvb2tzKSB7CiAgICAgICAgICBjb25zdCBob29rcyA9IHRoaXMuZGVmYXVsdHMuaG9va3MgfHwgbmV3IF9Ib29rcygpOwogICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2suaG9va3MpIHsKICAgICAgICAgICAgaWYgKCEocHJvcCBpbiBob29rcykpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGhvb2sgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFsib3B0aW9ucyIsICJibG9jayJdLmluY2x1ZGVzKHByb3ApKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaG9va3NQcm9wID0gcHJvcDsKICAgICAgICAgICAgY29uc3QgaG9va3NGdW5jID0gcGFjay5ob29rc1tob29rc1Byb3BdOwogICAgICAgICAgICBjb25zdCBwcmV2SG9vayA9IGhvb2tzW2hvb2tzUHJvcF07CiAgICAgICAgICAgIGlmIChfSG9va3MucGFzc1Rocm91Z2hIb29rcy5oYXMocHJvcCkpIHsKICAgICAgICAgICAgICBob29rc1tob29rc1Byb3BdID0gKGFyZykgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShob29rc0Z1bmMuY2FsbChob29rcywgYXJnKSkudGhlbigocmV0MikgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2SG9vay5jYWxsKGhvb2tzLCByZXQyKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTsKICAgICAgICAgICAgICAgIHJldHVybiBwcmV2SG9vay5jYWxsKGhvb2tzLCByZXQpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaG9va3NbaG9va3NQcm9wXSA9ICguLi5hcmdzMikgPT4gewogICAgICAgICAgICAgICAgbGV0IHJldCA9IGhvb2tzRnVuYy5hcHBseShob29rcywgYXJnczIpOwogICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgcmV0ID0gcHJldkhvb2suYXBwbHkoaG9va3MsIGFyZ3MyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgb3B0cy5ob29rcyA9IGhvb2tzOwogICAgICAgIH0KICAgICAgICBpZiAocGFjay53YWxrVG9rZW5zKSB7CiAgICAgICAgICBjb25zdCB3YWxrVG9rZW5zMiA9IHRoaXMuZGVmYXVsdHMud2Fsa1Rva2VuczsKICAgICAgICAgIGNvbnN0IHBhY2tXYWxrdG9rZW5zID0gcGFjay53YWxrVG9rZW5zOwogICAgICAgICAgb3B0cy53YWxrVG9rZW5zID0gZnVuY3Rpb24odG9rZW4pIHsKICAgICAgICAgICAgbGV0IHZhbHVlcyA9IFtdOwogICAgICAgICAgICB2YWx1ZXMucHVzaChwYWNrV2Fsa3Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7CiAgICAgICAgICAgIGlmICh3YWxrVG9rZW5zMikgewogICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQod2Fsa1Rva2VuczIuY2FsbCh0aGlzLCB0b2tlbikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICB0aGlzLmRlZmF1bHRzID0geyAuLi50aGlzLmRlZmF1bHRzLCAuLi5vcHRzIH07CiAgICAgIH0pOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldE9wdGlvbnMob3B0KSB7CiAgICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdCB9OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGxleGVyKHNyYywgb3B0aW9uczIpIHsKICAgICAgcmV0dXJuIF9MZXhlci5sZXgoc3JjLCBvcHRpb25zMiA/PyB0aGlzLmRlZmF1bHRzKTsKICAgIH0KICAgIHBhcnNlcih0b2tlbnMsIG9wdGlvbnMyKSB7CiAgICAgIHJldHVybiBfUGFyc2VyLnBhcnNlKHRva2Vucywgb3B0aW9uczIgPz8gdGhpcy5kZWZhdWx0cyk7CiAgICB9CiAgICBwYXJzZU1hcmtkb3duKGJsb2NrVHlwZSkgewogICAgICBjb25zdCBwYXJzZTIgPSAoc3JjLCBvcHRpb25zMikgPT4gewogICAgICAgIGNvbnN0IG9yaWdPcHQgPSB7IC4uLm9wdGlvbnMyIH07CiAgICAgICAgY29uc3Qgb3B0ID0geyAuLi50aGlzLmRlZmF1bHRzLCAuLi5vcmlnT3B0IH07CiAgICAgICAgY29uc3QgdGhyb3dFcnJvciA9IHRoaXMub25FcnJvcighIW9wdC5zaWxlbnQsICEhb3B0LmFzeW5jKTsKICAgICAgICBpZiAodGhpcy5kZWZhdWx0cy5hc3luYyA9PT0gdHJ1ZSAmJiBvcmlnT3B0LmFzeW5jID09PSBmYWxzZSkgewogICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCJtYXJrZWQoKTogVGhlIGFzeW5jIG9wdGlvbiB3YXMgc2V0IHRvIHRydWUgYnkgYW4gZXh0ZW5zaW9uLiBSZW1vdmUgYXN5bmM6IGZhbHNlIGZyb20gdGhlIHBhcnNlIG9wdGlvbnMgb2JqZWN0IHRvIHJldHVybiBhIFByb21pc2UuIikpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHNyYyA9PT0gInVuZGVmaW5lZCIgfHwgc3JjID09PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwiKSk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2Ygc3JjICE9PSAic3RyaW5nIikgewogICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgIiArIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpICsgIiwgc3RyaW5nIGV4cGVjdGVkIikpOwogICAgICAgIH0KICAgICAgICBpZiAob3B0Lmhvb2tzKSB7CiAgICAgICAgICBvcHQuaG9va3Mub3B0aW9ucyA9IG9wdDsKICAgICAgICAgIG9wdC5ob29rcy5ibG9jayA9IGJsb2NrVHlwZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGV4ZXIyID0gb3B0Lmhvb2tzID8gb3B0Lmhvb2tzLnByb3ZpZGVMZXhlcigpIDogYmxvY2tUeXBlID8gX0xleGVyLmxleCA6IF9MZXhlci5sZXhJbmxpbmU7CiAgICAgICAgY29uc3QgcGFyc2VyMiA9IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm92aWRlUGFyc2VyKCkgOiBibG9ja1R5cGUgPyBfUGFyc2VyLnBhcnNlIDogX1BhcnNlci5wYXJzZUlubGluZTsKICAgICAgICBpZiAob3B0LmFzeW5jKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgOiBzcmMpLnRoZW4oKHNyYzIpID0+IGxleGVyMihzcmMyLCBvcHQpKS50aGVuKCh0b2tlbnMpID0+IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2VucykgOiB0b2tlbnMpLnRoZW4oKHRva2VucykgPT4gb3B0LndhbGtUb2tlbnMgPyBQcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnModG9rZW5zLCBvcHQud2Fsa1Rva2VucykpLnRoZW4oKCkgPT4gdG9rZW5zKSA6IHRva2VucykudGhlbigodG9rZW5zKSA9PiBwYXJzZXIyKHRva2Vucywgb3B0KSkudGhlbigoaHRtbDIpID0+IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wb3N0cHJvY2VzcyhodG1sMikgOiBodG1sMikuY2F0Y2godGhyb3dFcnJvcik7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAob3B0Lmhvb2tzKSB7CiAgICAgICAgICAgIHNyYyA9IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYyk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgdG9rZW5zID0gbGV4ZXIyKHNyYywgb3B0KTsKICAgICAgICAgIGlmIChvcHQuaG9va3MpIHsKICAgICAgICAgICAgdG9rZW5zID0gb3B0Lmhvb2tzLnByb2Nlc3NBbGxUb2tlbnModG9rZW5zKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcHQud2Fsa1Rva2VucykgewogICAgICAgICAgICB0aGlzLndhbGtUb2tlbnModG9rZW5zLCBvcHQud2Fsa1Rva2Vucyk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgaHRtbDIgPSBwYXJzZXIyKHRva2Vucywgb3B0KTsKICAgICAgICAgIGlmIChvcHQuaG9va3MpIHsKICAgICAgICAgICAgaHRtbDIgPSBvcHQuaG9va3MucG9zdHByb2Nlc3MoaHRtbDIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGh0bWwyOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIHBhcnNlMjsKICAgIH0KICAgIG9uRXJyb3Ioc2lsZW50LCBhc3luYykgewogICAgICByZXR1cm4gKGUpID0+IHsKICAgICAgICBlLm1lc3NhZ2UgKz0gIlxuUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuIjsKICAgICAgICBpZiAoc2lsZW50KSB7CiAgICAgICAgICBjb25zdCBtc2cgPSAiPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+IiArIGVzY2FwZTIoZS5tZXNzYWdlICsgIiIsIHRydWUpICsgIjwvcHJlPiI7CiAgICAgICAgICBpZiAoYXN5bmMpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtc2cpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICB9CiAgICAgICAgaWYgKGFzeW5jKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgICAgfQogICAgICAgIHRocm93IGU7CiAgICAgIH07CiAgICB9CiAgfTsKICB2YXIgbWFya2VkSW5zdGFuY2UgPSBuZXcgTWFya2VkKCk7CiAgZnVuY3Rpb24gbWFya2VkKHNyYywgb3B0KSB7CiAgICByZXR1cm4gbWFya2VkSW5zdGFuY2UucGFyc2Uoc3JjLCBvcHQpOwogIH0KICBtYXJrZWQub3B0aW9ucyA9IG1hcmtlZC5zZXRPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9uczIpIHsKICAgIG1hcmtlZEluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9uczIpOwogICAgbWFya2VkLmRlZmF1bHRzID0gbWFya2VkSW5zdGFuY2UuZGVmYXVsdHM7CiAgICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpOwogICAgcmV0dXJuIG1hcmtlZDsKICB9OwogIG1hcmtlZC5nZXREZWZhdWx0cyA9IF9nZXREZWZhdWx0czsKICBtYXJrZWQuZGVmYXVsdHMgPSBfZGVmYXVsdHM7CiAgbWFya2VkLnVzZSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgIG1hcmtlZEluc3RhbmNlLnVzZSguLi5hcmdzKTsKICAgIG1hcmtlZC5kZWZhdWx0cyA9IG1hcmtlZEluc3RhbmNlLmRlZmF1bHRzOwogICAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTsKICAgIHJldHVybiBtYXJrZWQ7CiAgfTsKICBtYXJrZWQud2Fsa1Rva2VucyA9IGZ1bmN0aW9uKHRva2VucywgY2FsbGJhY2spIHsKICAgIHJldHVybiBtYXJrZWRJbnN0YW5jZS53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spOwogIH07CiAgbWFya2VkLnBhcnNlSW5saW5lID0gbWFya2VkSW5zdGFuY2UucGFyc2VJbmxpbmU7CiAgbWFya2VkLlBhcnNlciA9IF9QYXJzZXI7CiAgbWFya2VkLnBhcnNlciA9IF9QYXJzZXIucGFyc2U7CiAgbWFya2VkLlJlbmRlcmVyID0gX1JlbmRlcmVyOwogIG1hcmtlZC5UZXh0UmVuZGVyZXIgPSBfVGV4dFJlbmRlcmVyOwogIG1hcmtlZC5MZXhlciA9IF9MZXhlcjsKICBtYXJrZWQubGV4ZXIgPSBfTGV4ZXIubGV4OwogIG1hcmtlZC5Ub2tlbml6ZXIgPSBfVG9rZW5pemVyOwogIG1hcmtlZC5Ib29rcyA9IF9Ib29rczsKICBtYXJrZWQucGFyc2UgPSBtYXJrZWQ7CiAgdmFyIG9wdGlvbnMgPSBtYXJrZWQub3B0aW9uczsKICB2YXIgc2V0T3B0aW9ucyA9IG1hcmtlZC5zZXRPcHRpb25zOwogIHZhciB1c2UgPSBtYXJrZWQudXNlOwogIHZhciB3YWxrVG9rZW5zID0gbWFya2VkLndhbGtUb2tlbnM7CiAgdmFyIHBhcnNlSW5saW5lID0gbWFya2VkLnBhcnNlSW5saW5lOwogIHZhciBwYXJzZXIgPSBfUGFyc2VyLnBhcnNlOwogIHZhciBsZXhlciA9IF9MZXhlci5sZXg7CgogIC8vIGxpYi91dGlsL3V0aWxpdHkuanMKICBtYXJrZWQudXNlKHsKICAgIGJyZWFrczogdHJ1ZSwKICAgIGdmbTogdHJ1ZSwKICAgIHJlbmRlcmVyOiB7CiAgICAgIGxpbmsoeyBocmVmLCB0aXRsZSwgdGV4dCB9KSB7CiAgICAgICAgY29uc3QgdGl0bGVBdHRyID0gdGl0bGUgPyBgIHRpdGxlPSIke3RpdGxlfSJgIDogIiI7CiAgICAgICAgcmV0dXJuIGA8YSBocmVmPSIke2hyZWZ9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiR7dGl0bGVBdHRyfT4ke3RleHR9PC9hPmA7CiAgICAgIH0KICAgIH0KICB9KTsKICBmdW5jdGlvbiByZW5kZXJNYXJrZG93bih0ZXh0KSB7CiAgICBpZiAoIXRleHQpCiAgICAgIHJldHVybiAiIjsKICAgIHJldHVybiBtYXJrZWQucGFyc2VJbmxpbmUodGV4dCk7CiAgfQoKICAvLyBsaWIvdXRpbC9kYXRlLXV0aWxpdHkuanMKICBmdW5jdGlvbiBkYXRlRnJvbURhdGVJbnB1dChkYXRlSW5wdXQpIHsKICAgIGlmICghZGF0ZUlucHV0KQogICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICBpZiAoZGF0ZUlucHV0IGluc3RhbmNlb2YgRGF0ZSkKICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVJbnB1dCk7CiAgICBpZiAodHlwZW9mIGRhdGVJbnB1dCA9PT0gInN0cmluZyIgJiYgL15cZHs0fS1cZHsyfS1cZHsyfSQvLnRlc3QoZGF0ZUlucHV0KSkgewogICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBkYXRlSW5wdXQuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKTsKICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTsKICAgIH0KICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKGRhdGVJbnB1dCk7CiAgICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKQogICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICByZXR1cm4gcGFyc2VkOwogIH0KICBmdW5jdGlvbiBkYXRlS2V5RnJvbURhdGVJbnB1dChkYXRlSW5wdXQpIHsKICAgIGNvbnN0IGRhdGUgPSBkYXRlRnJvbURhdGVJbnB1dChkYXRlSW5wdXQpOwogICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICIwIik7CiAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICIwIik7CiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDsKICB9CiAgZnVuY3Rpb24gd2Vla1N0YXJ0RnJvbURhdGVJbnB1dChkYXRlSW5wdXQpIHsKICAgIGNvbnN0IGRhdGUgPSBkYXRlRnJvbURhdGVJbnB1dChkYXRlSW5wdXQpOwogICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTsKICAgIGNvbnN0IG1vbmRheURlbHRhID0gZGF5T2ZXZWVrID09PSAwID8gLTYgOiAxIC0gZGF5T2ZXZWVrOwogICAgY29uc3Qgd2Vla1N0YXJ0ID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpICsgbW9uZGF5RGVsdGEpOwogICAgd2Vla1N0YXJ0LnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIHdlZWtTdGFydDsKICB9CiAgZnVuY3Rpb24gd2Vla0VuZEZyb21EYXRlSW5wdXQoZGF0ZUlucHV0KSB7CiAgICBjb25zdCB3ZWVrU3RhcnQgPSB3ZWVrU3RhcnRGcm9tRGF0ZUlucHV0KGRhdGVJbnB1dCk7CiAgICBjb25zdCB3ZWVrRW5kID0gbmV3IERhdGUod2Vla1N0YXJ0KTsKICAgIHdlZWtFbmQuc2V0RGF0ZSh3ZWVrRW5kLmdldERhdGUoKSArIDYpOwogICAgd2Vla0VuZC5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOwogICAgcmV0dXJuIHdlZWtFbmQ7CiAgfQogIGZ1bmN0aW9uIHdlZWtCb3VuZGFyaWVzRnJvbURhdGVJbnB1dChkYXRlSW5wdXQpIHsKICAgIGNvbnN0IHdlZWtTdGFydCA9IHdlZWtTdGFydEZyb21EYXRlSW5wdXQoZGF0ZUlucHV0KTsKICAgIGNvbnN0IGJvdW5kYXJpZXMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAgICAgIGNvbnN0IGRheVN0YXJ0ID0gbmV3IERhdGUod2Vla1N0YXJ0LmdldEZ1bGxZZWFyKCksIHdlZWtTdGFydC5nZXRNb250aCgpLCB3ZWVrU3RhcnQuZ2V0RGF0ZSgpICsgaSk7CiAgICAgIGNvbnN0IGRheUVuZCA9IG5ldyBEYXRlKHdlZWtTdGFydC5nZXRGdWxsWWVhcigpLCB3ZWVrU3RhcnQuZ2V0TW9udGgoKSwgd2Vla1N0YXJ0LmdldERhdGUoKSArIGkgKyAxKTsKICAgICAgYm91bmRhcmllcy5wdXNoKHsKICAgICAgICBmcm9tOiBNYXRoLmZsb29yKGRheVN0YXJ0LmdldFRpbWUoKSAvIDFlMyksCiAgICAgICAgdG86IE1hdGguZmxvb3IoZGF5RW5kLmdldFRpbWUoKSAvIDFlMyksCiAgICAgICAgZGF0ZUtleTogZGF0ZUtleUZyb21EYXRlSW5wdXQoZGF5U3RhcnQpCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHsgYm91bmRhcmllcywgd2Vla1N0YXJ0S2V5OiBkYXRlS2V5RnJvbURhdGVJbnB1dCh3ZWVrU3RhcnQpIH07CiAgfQogIGZ1bmN0aW9uIHdlZWtEYXRlU2xvdHNGcm9tRGF0ZUlucHV0KGRhdGVJbnB1dCkgewogICAgY29uc3Qgd2Vla1N0YXJ0ID0gd2Vla1N0YXJ0RnJvbURhdGVJbnB1dChkYXRlSW5wdXQpOwogICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDcgfSwgKF8sIGluZGV4KSA9PiB7CiAgICAgIGNvbnN0IGN1cnJlbnQgPSBuZXcgRGF0ZSh3ZWVrU3RhcnQuZ2V0RnVsbFllYXIoKSwgd2Vla1N0YXJ0LmdldE1vbnRoKCksIHdlZWtTdGFydC5nZXREYXRlKCkgKyBpbmRleCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF5OiBjdXJyZW50LnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsIHsgd2Vla2RheTogInNob3J0IiB9KSwKICAgICAgICBkYXRlOiBjdXJyZW50LnRvSVNPU3RyaW5nKCksCiAgICAgICAgZGF0ZUtleTogZGF0ZUtleUZyb21EYXRlSW5wdXQoY3VycmVudCkKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiB0b29sdGlwTGFiZWxGcm9tRGF0ZUlucHV0KGRhdGVJbnB1dCkgewogICAgY29uc3QgZGF0ZSA9IGRhdGVGcm9tRGF0ZUlucHV0KGRhdGVJbnB1dCk7CiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLCB7IHdlZWtkYXk6ICJzaG9ydCIsIG1vbnRoOiAic2hvcnQiLCBkYXk6ICJudW1lcmljIiB9KTsKICB9CgogIC8vIGxpYi9kYXNoYm9hcmQvdmljdG9yeS12YWx1ZS5qcwogIHZhciBNT09EUyA9IFsKICAgIHsgdmFsdWU6IC0yLCBlbW9qaTogIlx1ezFGNjIyfSIsIGxhYmVsOiAiQXdmdWwiIH0sCiAgICB7IHZhbHVlOiAtMSwgZW1vamk6ICJcdXsxRjYxRn0iLCBsYWJlbDogIkJhZCIgfSwKICAgIHsgdmFsdWU6IDAsIGVtb2ppOiAiXHV7MUY2MTB9IiwgbGFiZWw6ICJPa2F5IiB9LAogICAgeyB2YWx1ZTogMSwgZW1vamk6ICJcdXsxRjY0Mn0iLCBsYWJlbDogIkdvb2QiIH0sCiAgICB7IHZhbHVlOiAyLCBlbW9qaTogIlx1ezFGNjA0fSIsIGxhYmVsOiAiR3JlYXQiIH0KICBdOwogIGZ1bmN0aW9uIGZvcm1hdFdlZWtEYXRlUmFuZ2UoY2hhcnREYWlseVZhbHVlcykgewogICAgaWYgKCFjaGFydERhaWx5VmFsdWVzIHx8IGNoYXJ0RGFpbHlWYWx1ZXMubGVuZ3RoIDwgNykKICAgICAgcmV0dXJuICIiOwogICAgY29uc3Qgc3RhcnQgPSBkYXRlRnJvbURhdGVJbnB1dChjaGFydERhaWx5VmFsdWVzWzBdLmRhdGUpOwogICAgY29uc3QgZW5kID0gZGF0ZUZyb21EYXRlSW5wdXQoY2hhcnREYWlseVZhbHVlc1s2XS5kYXRlKTsKICAgIGNvbnN0IGZtdCA9IChkKSA9PiBkLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsIHsgbW9udGg6ICJzaG9ydCIsIGRheTogIm51bWVyaWMiIH0pOwogICAgcmV0dXJuIGAke2ZtdChzdGFydCl9IFx1MjAxMyAke2ZtdChlbmQpfWA7CiAgfQogIGZ1bmN0aW9uIHNoaWZ0V2Vla0RhdGUocmVmZXJlbmNlRGF0ZSwgZGVsdGFXZWVrcykgewogICAgY29uc3QgZGF0ZSA9IGRhdGVGcm9tRGF0ZUlucHV0KHJlZmVyZW5jZURhdGUpOwogICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGVsdGFXZWVrcyAqIDcpOwogICAgcmV0dXJuIGRhdGVLZXlGcm9tRGF0ZUlucHV0KGRhdGUpOwogIH0KICBmdW5jdGlvbiBpc0N1cnJlbnRXZWVrT3JMYXRlcihyZWZlcmVuY2VEYXRlKSB7CiAgICBjb25zdCByZWZXZWVrU3RhcnQgPSB3ZWVrU3RhcnRGcm9tRGF0ZUlucHV0KHJlZmVyZW5jZURhdGUpOwogICAgY29uc3QgdG9kYXlXZWVrU3RhcnQgPSB3ZWVrU3RhcnRGcm9tRGF0ZUlucHV0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKTsKICAgIHJldHVybiByZWZXZWVrU3RhcnQgPj0gdG9kYXlXZWVrU3RhcnQ7CiAgfQogIGZ1bmN0aW9uIGJ1aWxkRGFpbHlWYWx1ZXNGcm9tQ29tcGxldGVkVGFza3MoZGFpbHlWYWx1ZXMsIGNvbXBsZXRlZFRhc2tzQnlEYXRlKSB7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGFpbHlWYWx1ZXMpIHx8IGRhaWx5VmFsdWVzLmxlbmd0aCA9PT0gMCkKICAgICAgcmV0dXJuIFtdOwogICAgaWYgKCFjb21wbGV0ZWRUYXNrc0J5RGF0ZSB8fCB0eXBlb2YgY29tcGxldGVkVGFza3NCeURhdGUgIT09ICJvYmplY3QiKQogICAgICByZXR1cm4gZGFpbHlWYWx1ZXM7CiAgICByZXR1cm4gZGFpbHlWYWx1ZXMubWFwKChlbnRyeSkgPT4gewogICAgICBjb25zdCBkYXRlS2V5ID0gZGF0ZUtleUZyb21EYXRlSW5wdXQoZW50cnkuZGF0ZSk7CiAgICAgIGNvbnN0IHRhc2tzRm9yRGF5ID0gQXJyYXkuaXNBcnJheShjb21wbGV0ZWRUYXNrc0J5RGF0ZVtkYXRlS2V5XSkgPyBjb21wbGV0ZWRUYXNrc0J5RGF0ZVtkYXRlS2V5XSA6IFtdOwogICAgICBjb25zdCBjb21wdXRlZFZhbHVlID0gdGFza3NGb3JEYXkucmVkdWNlKChzdW0sIHRhc2spID0+IHN1bSArICh0YXNrLnZpY3RvcnlWYWx1ZSB8fCAwKSwgMCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgLi4uZW50cnksCiAgICAgICAgdmFsdWU6IGNvbXB1dGVkVmFsdWUsCiAgICAgICAgdGFza0NvdW50OiB0YXNrc0ZvckRheS5sZW5ndGgKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBidWlsZERhaWx5VmFsdWVzRm9yV2VlayhyZWZlcmVuY2VEYXRlLCBkYWlseVZhbHVlcywgY29tcGxldGVkVGFza3NCeURhdGUpIHsKICAgIGNvbnN0IHdlZWtTbG90cyA9IHdlZWtEYXRlU2xvdHNGcm9tRGF0ZUlucHV0KHJlZmVyZW5jZURhdGUpOwogICAgaWYgKCFjb21wbGV0ZWRUYXNrc0J5RGF0ZSB8fCB0eXBlb2YgY29tcGxldGVkVGFza3NCeURhdGUgIT09ICJvYmplY3QiKSB7CiAgICAgIHJldHVybiBidWlsZERhaWx5VmFsdWVzRnJvbUNvbXBsZXRlZFRhc2tzKGRhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSk7CiAgICB9CiAgICByZXR1cm4gd2Vla1Nsb3RzLm1hcCgoc2xvdCkgPT4gewogICAgICBjb25zdCB0YXNrc0ZvckRheSA9IEFycmF5LmlzQXJyYXkoY29tcGxldGVkVGFza3NCeURhdGVbc2xvdC5kYXRlS2V5XSkgPyBjb21wbGV0ZWRUYXNrc0J5RGF0ZVtzbG90LmRhdGVLZXldIDogW107CiAgICAgIGNvbnN0IGNvbXB1dGVkVmFsdWUgPSB0YXNrc0ZvckRheS5yZWR1Y2UoKHN1bSwgdGFzaykgPT4gc3VtICsgKHRhc2sudmljdG9yeVZhbHVlIHx8IDApLCAwKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBkYXk6IHNsb3QuZGF5LAogICAgICAgIGRhdGU6IHNsb3QuZGF0ZSwKICAgICAgICB2YWx1ZTogY29tcHV0ZWRWYWx1ZSwKICAgICAgICB0YXNrQ291bnQ6IHRhc2tzRm9yRGF5Lmxlbmd0aAogICAgICB9OwogICAgfSk7CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNvbmZpZ1N1Ym1pdCh0aW1lUmFuZ2UsIHNob3dNb29kLCBzZXRDb25maWdPcGVuKSB7CiAgICBjb25zdCByZXN1bHQgPSBbdGltZVJhbmdlLCBTdHJpbmcoc2hvd01vb2QpXTsKICAgIGF3YWl0IGNhbGxQbHVnaW4oInNhdmVTZXR0aW5nIiwgInZpY3RvcnktdmFsdWUiLCByZXN1bHQpOwogICAgc2V0Q29uZmlnT3BlbihmYWxzZSk7CiAgfQogIGZ1bmN0aW9uIHBhcnNlU2hvd01vb2RTZXR0aW5nKHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCB8fCB2YWx1ZSA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gdmFsdWUgPT09ICJ0cnVlIiB8fCB2YWx1ZSA9PT0gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gaGFuZGxlQ29uZmlnQ2FuY2VsKGN1cnJlbnRDb25maWcsIHNldFRpbWVSYW5nZSwgc2V0U2hvd01vb2QsIHNldENvbmZpZ09wZW4pIHsKICAgIHNldFRpbWVSYW5nZShjdXJyZW50Q29uZmlnWzBdIHx8ICJ3ZWVrIik7CiAgICBzZXRTaG93TW9vZChwYXJzZVNob3dNb29kU2V0dGluZyhjdXJyZW50Q29uZmlnWzFdKSk7CiAgICBzZXRDb25maWdPcGVuKGZhbHNlKTsKICB9CiAgZnVuY3Rpb24gaGFuZGxlQ2FudmFzTW91c2VNb3ZlKGNhbnZhc1JlZiwgc2V0SG92ZXJlZEJhciwgZSkgewogICAgY29uc3QgY2FudmFzID0gY2FudmFzUmVmLmN1cnJlbnQ7CiAgICBpZiAoIWNhbnZhcykKICAgICAgcmV0dXJuOwogICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGNvbnN0IG1vdXNlWCA9IGUuY2xpZW50WCAtIHJlY3QubGVmdDsKICAgIGNvbnN0IHcgPSByZWN0LndpZHRoOwogICAgY29uc3QgYmFyVyA9ICh3IC0gODApIC8gNzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAgICAgIGNvbnN0IHpvbmVTdGFydCA9IDQwICsgaSAqIGJhclc7CiAgICAgIGNvbnN0IHpvbmVFbmQgPSB6b25lU3RhcnQgKyBiYXJXOwogICAgICBpZiAobW91c2VYID49IHpvbmVTdGFydCAmJiBtb3VzZVggPCB6b25lRW5kKSB7CiAgICAgICAgc2V0SG92ZXJlZEJhcihpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIHNldEhvdmVyZWRCYXIobnVsbCk7CiAgfQogIGZ1bmN0aW9uIGdldFRvb2x0aXBMZWZ0KGNhbnZhc1JlZiwgaW5kZXgpIHsKICAgIGNvbnN0IGNhbnZhcyA9IGNhbnZhc1JlZi5jdXJyZW50OwogICAgaWYgKCFjYW52YXMpCiAgICAgIHJldHVybiAwOwogICAgY29uc3QgdyA9IGNhbnZhcy5vZmZzZXRXaWR0aDsKICAgIGNvbnN0IGJhclcgPSAodyAtIDgwKSAvIDc7CiAgICByZXR1cm4gNDAgKyBpbmRleCAqIGJhclcgKyBiYXJXICogMC41OwogIH0KICBmdW5jdGlvbiBnZXRIb3ZlcmVkRGF5VGFza3MoaW5kZXgsIGRhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSkgewogICAgaWYgKCFjb21wbGV0ZWRUYXNrc0J5RGF0ZSB8fCAhZGFpbHlWYWx1ZXNbaW5kZXhdKQogICAgICByZXR1cm4gW107CiAgICBjb25zdCBkYXRlS2V5ID0gZGF0ZUtleUZyb21EYXRlSW5wdXQoZGFpbHlWYWx1ZXNbaW5kZXhdLmRhdGUpOwogICAgcmV0dXJuIChjb21wbGV0ZWRUYXNrc0J5RGF0ZVtkYXRlS2V5XSB8fCBbXSkuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiAoYi52aWN0b3J5VmFsdWUgfHwgMCkgLSAoYS52aWN0b3J5VmFsdWUgfHwgMCkpOwogIH0KICBmdW5jdGlvbiBnZXRIb3ZlcmVkRGF5TW9vZChpbmRleCwgbW9vZFJhdGluZ3MpIHsKICAgIGlmICghbW9vZFJhdGluZ3MgfHwgIW1vb2RSYXRpbmdzW2luZGV4XSkKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCByYXRpbmcgPSBtb29kUmF0aW5nc1tpbmRleF0ucmF0aW5nOwogICAgcmV0dXJuIE1PT0RTLmZpbmQoKG0pID0+IG0udmFsdWUgPT09IHJhdGluZykgfHwgbnVsbDsKICB9CiAgZnVuY3Rpb24gZHJhd0JhcnMoY3R4LCBkYWlseVZhbHVlcywgbWF4VmFsdWUsIGJhclcsIGNoYXJ0SCwgaHQpIHsKICAgIGRhaWx5VmFsdWVzLmZvckVhY2goKGQsIGkpID0+IHsKICAgICAgY29uc3QgYmFySCA9IGQudmFsdWUgLyBtYXhWYWx1ZSAqIGNoYXJ0SCAqIDAuODU7CiAgICAgIGNvbnN0IHggPSA0MCArIGkgKiBiYXJXICsgYmFyVyAqIDAuMTU7CiAgICAgIGNvbnN0IHkgPSBjaGFydEggLSBiYXJIICsgMTA7CiAgICAgIGN0eC5maWxsU3R5bGUgPSBkLnZhbHVlID4gMCA/ICIjNjM2NmYxIiA6ICIjZTVlN2ViIjsKICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICBjdHgucm91bmRSZWN0KHgsIHksIGJhclcgKiAwLjcsIGJhckgsIFs0LCA0LCAwLCAwXSk7CiAgICAgIGN0eC5maWxsKCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzZiNzI4MCI7CiAgICAgIGN0eC5mb250ID0gIjExcHggc3lzdGVtLXVpIjsKICAgICAgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgICBjdHguZmlsbFRleHQoZC5kYXksIHggKyBiYXJXICogMC4zNSwgaHQgLSAxNSk7CiAgICAgIGNvbnN0IGRhdGVPYmogPSBkYXRlRnJvbURhdGVJbnB1dChkLmRhdGUpOwogICAgICBjb25zdCBtb250aERheSA9IGRhdGVPYmoudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCwgeyBtb250aDogInNob3J0IiwgZGF5OiAibnVtZXJpYyIgfSk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzljYTNhZiI7CiAgICAgIGN0eC5mb250ID0gIjlweCBzeXN0ZW0tdWkiOwogICAgICBjdHguZmlsbFRleHQobW9udGhEYXksIHggKyBiYXJXICogMC4zNSwgaHQgLSAzKTsKICAgICAgaWYgKGQudmFsdWUgPiAwKSB7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjZmZmZmZmIjsKICAgICAgICBjdHguZm9udCA9ICJib2xkIDEwcHggc3lzdGVtLXVpIjsKICAgICAgICBjdHguZmlsbFRleHQoZm9ybWF0QmFyUG9pbnRWYWx1ZShkLnZhbHVlKSwgeCArIGJhclcgKiAwLjM1LCB5ICsgMTQpOwogICAgICB9CiAgICB9KTsKICB9CiAgZnVuY3Rpb24gZm9ybWF0QmFyUG9pbnRWYWx1ZSh2YWx1ZSkgewogICAgcmV0dXJuIChNYXRoLnJvdW5kKCh2YWx1ZSB8fCAwKSAqIDEwKSAvIDEwKS50b0ZpeGVkKDEpOwogIH0KICBmdW5jdGlvbiBkcmF3TW9vZE92ZXJsYXkoY3R4LCBtb29kUmF0aW5ncywgYmFyVywgY2hhcnRIKSB7CiAgICBjdHguc3Ryb2tlU3R5bGUgPSAiI2Y1OWUwYiI7CiAgICBjdHgubGluZVdpZHRoID0gMjsKICAgIGN0eC5iZWdpblBhdGgoKTsKICAgIG1vb2RSYXRpbmdzLmZvckVhY2goKG0sIGkpID0+IHsKICAgICAgY29uc3Qgbm9ybWFsaXplZFkgPSBjaGFydEggLSAobS5yYXRpbmcgKyAyKSAvIDQgKiBjaGFydEggKyAxMDsKICAgICAgY29uc3QgeCA9IDQwICsgaSAqIGJhclcgKyBiYXJXICogMC41OwogICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgIGN0eC5tb3ZlVG8oeCwgbm9ybWFsaXplZFkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjdHgubGluZVRvKHgsIG5vcm1hbGl6ZWRZKTsKICAgIH0pOwogICAgY3R4LnN0cm9rZSgpOwogICAgbW9vZFJhdGluZ3MuZm9yRWFjaCgobSwgaSkgPT4gewogICAgICBjb25zdCBub3JtYWxpemVkWSA9IGNoYXJ0SCAtIChtLnJhdGluZyArIDIpIC8gNCAqIGNoYXJ0SCArIDEwOwogICAgICBjb25zdCB4ID0gNDAgKyBpICogYmFyVyArIGJhclcgKiAwLjU7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI2Y1OWUwYiI7CiAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgY3R4LmFyYyh4LCBub3JtYWxpemVkWSwgMywgMCwgTWF0aC5QSSAqIDIpOwogICAgICBjdHguZmlsbCgpOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGRyYXdDaGFydChjYW52YXNSZWYsIGRhaWx5VmFsdWVzLCBtYXhWYWx1ZSwgbW9vZFJhdGluZ3MsIHNob3dNb29kKSB7CiAgICBjb25zdCBjYW52YXMgPSBjYW52YXNSZWYuY3VycmVudDsKICAgIGNvbnNvbGUubG9nKCJEcmF3aW5nIGNoYXJ0IGluIFZpY3RvcnlWYWx1ZSB3aXRoIGRhaWx5VmFsdWVzIiwgZGFpbHlWYWx1ZXMsICJhbmQgbW9vZFJhdGluZ3MiLCBtb29kUmF0aW5ncyk7CiAgICBpZiAoIWNhbnZhcykKICAgICAgcmV0dXJuOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBjb25zdCBXID0gY2FudmFzLndpZHRoID0gY2FudmFzLm9mZnNldFdpZHRoICogMjsKICAgIGNvbnN0IEggPSBjYW52YXMuaGVpZ2h0ID0gY2FudmFzLm9mZnNldEhlaWdodCAqIDI7CiAgICBjdHguc2NhbGUoMiwgMik7CiAgICBjb25zdCB3ID0gVyAvIDI7CiAgICBjb25zdCBodCA9IEggLyAyOwogICAgY29uc3QgYmFyVyA9ICh3IC0gODApIC8gNzsKICAgIGNvbnN0IGNoYXJ0SCA9IGh0IC0gNTA7CiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGh0KTsKICAgIGRyYXdCYXJzKGN0eCwgZGFpbHlWYWx1ZXMsIG1heFZhbHVlLCBiYXJXLCBjaGFydEgsIGh0KTsKICAgIGlmIChzaG93TW9vZCAmJiBtb29kUmF0aW5ncyAmJiBtb29kUmF0aW5ncy5sZW5ndGggPiAwKSB7CiAgICAgIGRyYXdNb29kT3ZlcmxheShjdHgsIG1vb2RSYXRpbmdzLCBiYXJXLCBjaGFydEgpOwogICAgfQogIH0KICBmdW5jdGlvbiBidWlsZEV4cGVjdGVkVGFza3NEZWJ1Z0luZm8oZGFpbHlWYWx1ZXMsIGNvbXBsZXRlZFRhc2tzQnlEYXRlKSB7CiAgICByZXR1cm4gZGFpbHlWYWx1ZXMubWFwKChkYWlseUVudHJ5LCBpbmRleCkgPT4gewogICAgICBjb25zdCB0YXNrcyA9IGdldEhvdmVyZWREYXlUYXNrcyhpbmRleCwgZGFpbHlWYWx1ZXMsIGNvbXBsZXRlZFRhc2tzQnlEYXRlKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBkYXk6IGRhaWx5RW50cnkuZGF5LAogICAgICAgIGRhdGU6IGRhaWx5RW50cnkuZGF0ZSwKICAgICAgICBkYXRlS2V5OiBkYXRlS2V5RnJvbURhdGVJbnB1dChkYWlseUVudHJ5LmRhdGUpLAogICAgICAgIGV4cGVjdGVkVGFza0NvdW50OiB0YXNrcy5sZW5ndGgsCiAgICAgICAgZXhwZWN0ZWRUYXNrczogdGFza3MubWFwKCh0YXNrKSA9PiAoewogICAgICAgICAgdXVpZDogdGFzay51dWlkIHx8IG51bGwsCiAgICAgICAgICBjb250ZW50OiB0YXNrLmNvbnRlbnQgfHwgIiIsCiAgICAgICAgICB2aWN0b3J5VmFsdWU6IHRhc2sudmljdG9yeVZhbHVlIHx8IDAKICAgICAgICB9KSkKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBsb2dFeHBlY3RlZFRhc2tzRGVidWdJbmZvKGRhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSkgewogICAgY29uc3QgZXhwZWN0ZWRUYXNrc0J5RGF5ID0gYnVpbGRFeHBlY3RlZFRhc2tzRGVidWdJbmZvKGRhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSk7CiAgICBjb25zb2xlLmRlYnVnKCJbVmljdG9yeVZhbHVlXSBleHBlY3RlZCB0b29sdGlwIHRhc2tzIGJ5IGRheSIsIGV4cGVjdGVkVGFza3NCeURheSk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlclRvb2x0aXBUYXNrUm93cyhoLCB0YXNrcykgewogICAgcmV0dXJuIHRhc2tzLm1hcCgodGFzaywgaSkgPT4gaCgKICAgICAgImRpdiIsCiAgICAgIHsga2V5OiB0YXNrLnV1aWQgfHwgaSwgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXRvb2x0aXAtcm93IiB9LAogICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtdG9vbHRpcC1yb3ctbGFiZWwiLCBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHJlbmRlck1hcmtkb3duKHRhc2suY29udGVudCkgfSB9KSwKICAgICAgaCgKICAgICAgICAic3BhbiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtdG9vbHRpcC1yb3ctdmFsdWUiIH0sCiAgICAgICAgKHRhc2sudmljdG9yeVZhbHVlIHx8IDApICsgIiBwdHMiCiAgICAgICkKICAgICkpOwogIH0KICBmdW5jdGlvbiByZW5kZXJUb29sdGlwKGgsIGhvdmVyZWRCYXIsIGRhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSwgbW9vZFJhdGluZ3MsIGNhbnZhc1JlZikgewogICAgY29uc3QgdGFza3MgPSBob3ZlcmVkQmFyICE9PSBudWxsID8gZ2V0SG92ZXJlZERheVRhc2tzKGhvdmVyZWRCYXIsIGRhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSkgOiBbXTsKICAgIGNvbnN0IG1vb2QgPSBob3ZlcmVkQmFyICE9PSBudWxsID8gZ2V0SG92ZXJlZERheU1vb2QoaG92ZXJlZEJhciwgbW9vZFJhdGluZ3MpIDogbnVsbDsKICAgIGNvbnN0IGRhdGVMYWJlbCA9IGhvdmVyZWRCYXIgIT09IG51bGwgJiYgZGFpbHlWYWx1ZXNbaG92ZXJlZEJhcl0gPyB0b29sdGlwTGFiZWxGcm9tRGF0ZUlucHV0KGRhaWx5VmFsdWVzW2hvdmVyZWRCYXJdLmRhdGUpIDogIiI7CiAgICByZXR1cm4gaCgKICAgICAgRGFzaGJvYXJkVG9vbHRpcCwKICAgICAgewogICAgICAgIGxlZnQ6IGhvdmVyZWRCYXIgIT09IG51bGwgPyBnZXRUb29sdGlwTGVmdChjYW52YXNSZWYsIGhvdmVyZWRCYXIpIDogMCwKICAgICAgICB2aXNpYmxlOiBob3ZlcmVkQmFyICE9PSBudWxsCiAgICAgIH0sCiAgICAgIGgoImRpdiIsIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXRvb2x0aXAtaGVhZGVyIiB9LCBkYXRlTGFiZWwpLAogICAgICBtb29kID8gaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC10b29sdGlwLXNlY3Rpb24iIH0sCiAgICAgICAgaCgic3BhbiIsIG51bGwsIG1vb2QuZW1vamkpLAogICAgICAgIGgoInNwYW4iLCBudWxsLCAiICIgKyBtb29kLmxhYmVsKQogICAgICApIDogbnVsbCwKICAgICAgdGFza3MubGVuZ3RoID4gMCA/IHJlbmRlclRvb2x0aXBUYXNrUm93cyhoLCB0YXNrcykgOiBoKCJkaXYiLCB7IGNsYXNzTmFtZTogImRhc2hib2FyZC10b29sdGlwLWVtcHR5IiB9LCAiTm8gY29tcGxldGVkIHRhc2tzIikKICAgICk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlclRpbWVSYW5nZU9wdGlvbnMoaCwgdGltZVJhbmdlLCBzZXRUaW1lUmFuZ2UpIHsKICAgIHJldHVybiBbIndlZWsiLCAibW9udGgiLCAiMzBkYXlzIl0ubWFwKCh2YWx1ZSkgPT4gaCgKICAgICAgImxhYmVsIiwKICAgICAgeyBrZXk6IHZhbHVlIH0sCiAgICAgIGgoImlucHV0IiwgewogICAgICAgIHR5cGU6ICJyYWRpbyIsCiAgICAgICAgbmFtZTogInZ2LXRpbWUtcmFuZ2UiLAogICAgICAgIHZhbHVlLAogICAgICAgIGNoZWNrZWQ6IHRpbWVSYW5nZSA9PT0gdmFsdWUsCiAgICAgICAgb25DaGFuZ2U6IHNldFRpbWVSYW5nZS5iaW5kKG51bGwsIHZhbHVlKQogICAgICB9KSwKICAgICAgdmFsdWUgPT09ICJ3ZWVrIiA/ICJUaGlzIHdlZWsiIDogdmFsdWUgPT09ICJtb250aCIgPyAiVGhpcyBtb250aCIgOiAiTGFzdCAzMCBkYXlzIgogICAgKSk7CiAgfQogIGZ1bmN0aW9uIFZpY3RvcnlWYWx1ZVdpZGdldCh7IGNvbXBsZXRlZFRhc2tzQnlEYXRlLCBkYWlseVZhbHVlcywgbW9vZFJhdGluZ3MsIG9uUmVmZXJlbmNlRGF0ZUNoYW5nZSwgcmVmZXJlbmNlRGF0ZSwgc2V0dGluZ3MsIHdlZWtseVRvdGFsIH0pIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3Q1LmNyZWF0ZUVsZW1lbnQ7CiAgICBjb25zdCBjYW52YXNSZWYgPSAoMCwgaW1wb3J0X3JlYWN0NS51c2VSZWYpKG51bGwpOwogICAgY29uc3QgY2hhcnREYWlseVZhbHVlcyA9IGJ1aWxkRGFpbHlWYWx1ZXNGb3JXZWVrKHJlZmVyZW5jZURhdGUsIGRhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSk7CiAgICBjb25zdCBtYXhWYWx1ZSA9IE1hdGgubWF4KC4uLmNoYXJ0RGFpbHlWYWx1ZXMubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpLCAxKTsKICAgIGNvbnN0IGNoYXJ0V2Vla2x5VG90YWwgPSBjaGFydERhaWx5VmFsdWVzLnJlZHVjZSgoc3VtLCBlbnRyeSkgPT4gc3VtICsgKGVudHJ5LnZhbHVlIHx8IDApLCAwKTsKICAgIGNvbnN0IHJvdW5kZWRXZWVrbHlUb3RhbCA9IE1hdGgucm91bmQoY2hhcnRXZWVrbHlUb3RhbCB8fCB3ZWVrbHlUb3RhbCB8fCAwKTsKICAgIGNvbnN0IFtjb25maWdPcGVuLCBzZXRDb25maWdPcGVuXSA9ICgwLCBpbXBvcnRfcmVhY3Q1LnVzZVN0YXRlKShmYWxzZSk7CiAgICBjb25zdCBbaG92ZXJlZEJhciwgc2V0SG92ZXJlZEJhcl0gPSAoMCwgaW1wb3J0X3JlYWN0NS51c2VTdGF0ZSkobnVsbCk7CiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gc2V0dGluZ3M/LlsiZGFzaGJvYXJkX3ZpY3RvcnktdmFsdWVfY29uZmlnIl0gfHwgW107CiAgICBjb25zdCBbdGltZVJhbmdlLCBzZXRUaW1lUmFuZ2VdID0gKDAsIGltcG9ydF9yZWFjdDUudXNlU3RhdGUpKGN1cnJlbnRDb25maWdbMF0gfHwgIndlZWsiKTsKICAgIGNvbnN0IFtzaG93TW9vZCwgc2V0U2hvd01vb2RdID0gKDAsIGltcG9ydF9yZWFjdDUudXNlU3RhdGUpKHBhcnNlU2hvd01vb2RTZXR0aW5nKGN1cnJlbnRDb25maWdbMV0pKTsKICAgIGNvbnN0IG9uQ29uZmlndXJlID0gc2V0Q29uZmlnT3Blbi5iaW5kKG51bGwsIHRydWUpOwogICAgY29uc3Qgb25Db25maWdTdWJtaXQgPSBoYW5kbGVDb25maWdTdWJtaXQuYmluZChudWxsLCB0aW1lUmFuZ2UsIHNob3dNb29kLCBzZXRDb25maWdPcGVuKTsKICAgIGNvbnN0IG9uQ29uZmlnQ2FuY2VsID0gaGFuZGxlQ29uZmlnQ2FuY2VsLmJpbmQobnVsbCwgY3VycmVudENvbmZpZywgc2V0VGltZVJhbmdlLCBzZXRTaG93TW9vZCwgc2V0Q29uZmlnT3Blbik7CiAgICBjb25zdCBvbkNhbnZhc01vdXNlTW92ZSA9IGhhbmRsZUNhbnZhc01vdXNlTW92ZS5iaW5kKG51bGwsIGNhbnZhc1JlZiwgc2V0SG92ZXJlZEJhcik7CiAgICBjb25zdCBvbkNhbnZhc01vdXNlTGVhdmUgPSBzZXRIb3ZlcmVkQmFyLmJpbmQobnVsbCwgbnVsbCk7CiAgICBjb25zdCB3ZWVrRGF0ZVJhbmdlID0gZm9ybWF0V2Vla0RhdGVSYW5nZShjaGFydERhaWx5VmFsdWVzKTsKICAgIGNvbnNvbGUubG9nKCJGaXhpbiB0byByZW5kZXIgVlYgd2lkZ2V0IHdpdGggY29tcGxldGVkVGFza3NCeURhdGUiLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSk7CiAgICAoMCwgaW1wb3J0X3JlYWN0NS51c2VFZmZlY3QpKCgpID0+IHsKICAgICAgZHJhd0NoYXJ0KGNhbnZhc1JlZiwgY2hhcnREYWlseVZhbHVlcywgbWF4VmFsdWUsIG1vb2RSYXRpbmdzLCBzaG93TW9vZCk7CiAgICB9LCBbY2hhcnREYWlseVZhbHVlcywgbWF4VmFsdWUsIG1vb2RSYXRpbmdzLCBzaG93TW9vZF0pOwogICAgKDAsIGltcG9ydF9yZWFjdDUudXNlRWZmZWN0KSgoKSA9PiB7CiAgICAgIGxvZ0V4cGVjdGVkVGFza3NEZWJ1Z0luZm8oY2hhcnREYWlseVZhbHVlcywgY29tcGxldGVkVGFza3NCeURhdGUpOwogICAgfSwgW2NoYXJ0RGFpbHlWYWx1ZXMsIGNvbXBsZXRlZFRhc2tzQnlEYXRlXSk7CiAgICByZXR1cm4gaCgKICAgICAgV2lkZ2V0V3JhcHBlciwKICAgICAgewogICAgICAgIHRpdGxlOiAiVmljdG9yeSBWYWx1ZSIsCiAgICAgICAgaWNvbjogIlx1ezFGM0M2fSIsCiAgICAgICAgd2lkZ2V0SWQ6ICJ2aWN0b3J5LXZhbHVlIiwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgb25Db25maWd1cmUKICAgICAgfSwKICAgICAgY29uZmlnT3BlbiA/IGgoCiAgICAgICAgQ29uZmlnUG9wdXAsCiAgICAgICAgewogICAgICAgICAgdGl0bGU6ICJDb25maWd1cmUgVmljdG9yeSBWYWx1ZSIsCiAgICAgICAgICBvblN1Ym1pdDogb25Db25maWdTdWJtaXQsCiAgICAgICAgICBvbkNhbmNlbDogb25Db25maWdDYW5jZWwKICAgICAgICB9LAogICAgICAgIGgoCiAgICAgICAgICAiZGl2IiwKICAgICAgICAgIHsgY2xhc3NOYW1lOiAiY29uZmlnLWZpZWxkIiB9LAogICAgICAgICAgaCgiZGl2IiwgeyBjbGFzc05hbWU6ICJjb25maWctZmllbGQtbGFiZWwiIH0sICJUaW1lIHJhbmdlIiksCiAgICAgICAgICByZW5kZXJUaW1lUmFuZ2VPcHRpb25zKGgsIHRpbWVSYW5nZSwgc2V0VGltZVJhbmdlKQogICAgICAgICksCiAgICAgICAgaCgKICAgICAgICAgICJkaXYiLAogICAgICAgICAgeyBjbGFzc05hbWU6ICJjb25maWctZmllbGQiIH0sCiAgICAgICAgICBoKCJkaXYiLCB7IGNsYXNzTmFtZTogImNvbmZpZy1maWVsZC1sYWJlbCIgfSwgIk1vb2Qgb3ZlcmxheSIpLAogICAgICAgICAgaCgKICAgICAgICAgICAgImxhYmVsIiwKICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgaCgiaW5wdXQiLCB7CiAgICAgICAgICAgICAgdHlwZTogImNoZWNrYm94IiwKICAgICAgICAgICAgICBjaGVja2VkOiBzaG93TW9vZCwKICAgICAgICAgICAgICBvbkNoYW5nZTogKGV2ZW50KSA9PiBzZXRTaG93TW9vZChldmVudC50YXJnZXQuY2hlY2tlZCkKICAgICAgICAgICAgfSksCiAgICAgICAgICAgICJTaG93IG1vb2Qgb3ZlcmxheSIKICAgICAgICAgICkKICAgICAgICApCiAgICAgICkgOiBudWxsLAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAidnYtaGVhZGVyIiB9LAogICAgICAgIGgoInNwYW4iLCB7IGNsYXNzTmFtZTogInZ2LXRvdGFsIiB9LCByb3VuZGVkV2Vla2x5VG90YWwpLAogICAgICAgIGgoInNwYW4iLCB7IGNsYXNzTmFtZTogInZ2LWxhYmVsIiB9LCBgcG9pbnRzICR7d2Vla0RhdGVSYW5nZX1gKQogICAgICApLAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAidnYtY2hhcnQtY29udGFpbmVyIiB9LAogICAgICAgIGgoImJ1dHRvbiIsIHsKICAgICAgICAgIGNsYXNzTmFtZTogInZ2LW5hdi1hcnJvdyIsCiAgICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IG9uUmVmZXJlbmNlRGF0ZUNoYW5nZSAmJiBvblJlZmVyZW5jZURhdGVDaGFuZ2Uoc2hpZnRXZWVrRGF0ZShyZWZlcmVuY2VEYXRlLCAtMSkpLAogICAgICAgICAgdGl0bGU6ICJQcmV2aW91cyB3ZWVrIiwKICAgICAgICAgICJhcmlhLWxhYmVsIjogIlByZXZpb3VzIHdlZWsiCiAgICAgICAgfSwgIlx1MjAzOSIpLAogICAgICAgIGgoCiAgICAgICAgICAiZGl2IiwKICAgICAgICAgIHsgY2xhc3NOYW1lOiAidnYtY2hhcnQtd3JhcCIgfSwKICAgICAgICAgIGgoImNhbnZhcyIsIHsKICAgICAgICAgICAgcmVmOiBjYW52YXNSZWYsCiAgICAgICAgICAgIGNsYXNzTmFtZTogInZ2LWNoYXJ0IiwKICAgICAgICAgICAgc3R5bGU6IHsgd2lkdGg6ICIxMDAlIiwgaGVpZ2h0OiAiMTgwcHgiIH0sCiAgICAgICAgICAgIG9uTW91c2VNb3ZlOiBvbkNhbnZhc01vdXNlTW92ZSwKICAgICAgICAgICAgb25Nb3VzZUxlYXZlOiBvbkNhbnZhc01vdXNlTGVhdmUKICAgICAgICAgIH0pLAogICAgICAgICAgcmVuZGVyVG9vbHRpcChoLCBob3ZlcmVkQmFyLCBjaGFydERhaWx5VmFsdWVzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZSwgbW9vZFJhdGluZ3MsIGNhbnZhc1JlZikKICAgICAgICApLAogICAgICAgIGgoImJ1dHRvbiIsIHsKICAgICAgICAgIGNsYXNzTmFtZTogInZ2LW5hdi1hcnJvdyIsCiAgICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICAgIGRpc2FibGVkOiBpc0N1cnJlbnRXZWVrT3JMYXRlcihyZWZlcmVuY2VEYXRlKSwKICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IG9uUmVmZXJlbmNlRGF0ZUNoYW5nZSAmJiBvblJlZmVyZW5jZURhdGVDaGFuZ2Uoc2hpZnRXZWVrRGF0ZShyZWZlcmVuY2VEYXRlLCAxKSksCiAgICAgICAgICB0aXRsZTogIk5leHQgd2VlayIsCiAgICAgICAgICAiYXJpYS1sYWJlbCI6ICJOZXh0IHdlZWsiCiAgICAgICAgfSwgIlx1MjAzQSIpCiAgICAgICkKICAgICk7CiAgfQoKICAvLyBsaWIvZGFzaGJvYXJkL21vb2QuanMKICB2YXIgaW1wb3J0X3JlYWN0NiA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpKTsKICBmdW5jdGlvbiBNb29kV2lkZ2V0KHsgbW9vZFJhdGluZ3MgfSkgewogICAgY29uc3QgaCA9IGltcG9ydF9yZWFjdDYuZGVmYXVsdC5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgTU9PRFMyID0gWwogICAgICB7IHZhbHVlOiAtMiwgZW1vamk6ICJcdXsxRjYyMn0iLCBsYWJlbDogIkF3ZnVsIiB9LAogICAgICB7IHZhbHVlOiAtMSwgZW1vamk6ICJcdXsxRjYxRn0iLCBsYWJlbDogIkJhZCIgfSwKICAgICAgeyB2YWx1ZTogMCwgZW1vamk6ICJcdXsxRjYxMH0iLCBsYWJlbDogIk9rYXkiIH0sCiAgICAgIHsgdmFsdWU6IDEsIGVtb2ppOiAiXHV7MUY2NDJ9IiwgbGFiZWw6ICJHb29kIiB9LAogICAgICB7IHZhbHVlOiAyLCBlbW9qaTogIlx1ezFGNjA0fSIsIGxhYmVsOiAiR3JlYXQiIH0KICAgIF07CiAgICBjb25zdCByZWNlbnRNb29kcyA9IChtb29kUmF0aW5ncyB8fCBbXSkuc2xpY2UoLTcpOwogICAgY29uc3QgYXZnTW9vZCA9IHJlY2VudE1vb2RzLmxlbmd0aCA/IChyZWNlbnRNb29kcy5yZWR1Y2UoKHMsIG0pID0+IHMgKyBtLnJhdGluZywgMCkgLyByZWNlbnRNb29kcy5sZW5ndGgpLnRvRml4ZWQoMSkgOiAiXHUyMDE0IjsKICAgIHJldHVybiBoKAogICAgICBXaWRnZXRXcmFwcGVyLAogICAgICB7IHRpdGxlOiAiSG93IGFyZSB5b3UgZmVlbGluZz8iLCBpY29uOiAiXHV7MUYzQUR9Iiwgd2lkZ2V0SWQ6ICJtb29kIiB9LAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAibW9vZC1zZWxlY3RvciIgfSwKICAgICAgICBNT09EUzIubWFwKChtKSA9PiBoKCJidXR0b24iLCB7CiAgICAgICAgICBrZXk6IG0udmFsdWUsCiAgICAgICAgICBjbGFzc05hbWU6ICJtb29kLWJ0biIsCiAgICAgICAgICB0aXRsZTogbS5sYWJlbAogICAgICAgIH0sIGgoInNwYW4iLCB7IGNsYXNzTmFtZTogIm1vb2QtZW1vamkiIH0sIG0uZW1vamkpKSkKICAgICAgKSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogIm1vb2Qtc3VtbWFyeSIgfSwKICAgICAgICBoKCJzcGFuIiwgbnVsbCwgIkF2ZyBtb29kICg3ZCk6ICIgKyBhdmdNb29kKSwKICAgICAgICBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IGNsYXNzTmFtZTogIm1vb2Qtc3BhcmtsaW5lIiB9LAogICAgICAgICAgcmVjZW50TW9vZHMubWFwKChtLCBpKSA9PiBoKCJkaXYiLCB7CiAgICAgICAgICAgIGtleTogaSwKICAgICAgICAgICAgY2xhc3NOYW1lOiAibW9vZC1kb3QiLAogICAgICAgICAgICBzdHlsZTogeyBib3R0b206IChtLnJhdGluZyArIDIpIC8gNCAqIDEwMCArICIlIiB9CiAgICAgICAgICB9KSkKICAgICAgICApCiAgICAgICkKICAgICk7CiAgfQoKICAvLyBsaWIvZGFzaGJvYXJkL2NhbGVuZGFyLmpzCiAgdmFyIGltcG9ydF9yZWFjdDcgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSk7CiAgZnVuY3Rpb24gQ2FsZW5kYXJXaWRnZXQoeyBvcGVuVGFza3MsIGNvbXBsZXRlZFRhc2tzQnlEYXRlLCBjdXJyZW50RGF0ZSwgc2V0dGluZ3MsIHNlbGVjdGVkRGF0ZSwgb25EYXRlU2VsZWN0IH0pIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3Q3LmNyZWF0ZUVsZW1lbnQ7CiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlKTsKICAgIGNvbnN0IFt2aWV3RGF0ZSwgc2V0Vmlld0RhdGVdID0gKDAsIGltcG9ydF9yZWFjdDcudXNlU3RhdGUpKG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpKTsKICAgIGNvbnN0IHdlZWtTdGFydHNPbiA9IHNldHRpbmdzPy5bImRhc2hib2FyZF9jYWxlbmRhcl9jb25maWciXT8uWzBdID09PSAiMSIgPyAxIDogMDsKICAgIGNvbnN0IFtjb25maWdPcGVuLCBzZXRDb25maWdPcGVuXSA9ICgwLCBpbXBvcnRfcmVhY3Q3LnVzZVN0YXRlKShmYWxzZSk7CiAgICBjb25zdCBbd2Vla1N0YXJ0LCBzZXRXZWVrU3RhcnRdID0gKDAsIGltcG9ydF9yZWFjdDcudXNlU3RhdGUpKFN0cmluZyh3ZWVrU3RhcnRzT24pKTsKICAgIGNvbnN0IGhhbmRsZUNvbmZpZ1N1Ym1pdDIgPSBhc3luYyAoKSA9PiB7CiAgICAgIGF3YWl0IGNhbGxQbHVnaW4oInNhdmVTZXR0aW5nIiwgImNhbGVuZGFyIiwgW3dlZWtTdGFydF0pOwogICAgICBzZXRDb25maWdPcGVuKGZhbHNlKTsKICAgIH07CiAgICBjb25zdCBoYW5kbGVDb25maWdDYW5jZWwyID0gKCkgPT4gewogICAgICBzZXRXZWVrU3RhcnQoU3RyaW5nKHdlZWtTdGFydHNPbikpOwogICAgICBzZXRDb25maWdPcGVuKGZhbHNlKTsKICAgIH07CiAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHZpZXdEYXRlLmdldE1vbnRoKCkgKyAxLCAwKS5nZXREYXRlKCk7CiAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IChuZXcgRGF0ZSh2aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB2aWV3RGF0ZS5nZXRNb250aCgpLCAxKS5nZXREYXkoKSAtIHdlZWtTdGFydHNPbiArIDcpICUgNzsKICAgIGNvbnN0IERBWV9MQUJFTFMgPSB3ZWVrU3RhcnRzT24gPT09IDEgPyBbIk1vIiwgIlR1IiwgIldlIiwgIlRoIiwgIkZyIiwgIlNhIiwgIlN1Il0gOiBbIlN1IiwgIk1vIiwgIlR1IiwgIldlIiwgIlRoIiwgIkZyIiwgIlNhIl07CiAgICBjb25zdCB0YXNrQ291bnRCeURheSA9IHt9OwogICAgY29uc3Qgdmlld1llYXIgPSB2aWV3RGF0ZS5nZXRGdWxsWWVhcigpOwogICAgY29uc3Qgdmlld01vbnRoID0gdmlld0RhdGUuZ2V0TW9udGgoKTsKICAgIGNvbnN0IG1vbnRoUHJlZml4ID0gYCR7dmlld1llYXJ9LSR7U3RyaW5nKHZpZXdNb250aCArIDEpLnBhZFN0YXJ0KDIsICIwIil9LWA7CiAgICBbb3BlblRhc2tzLCBjb21wbGV0ZWRUYXNrc0J5RGF0ZV0uZm9yRWFjaCgoZ3JvdXBlZCkgPT4gewogICAgICBPYmplY3Qua2V5cyhncm91cGVkIHx8IHt9KS5mb3JFYWNoKChkYXRlS2V5KSA9PiB7CiAgICAgICAgaWYgKGRhdGVLZXkuc3RhcnRzV2l0aChtb250aFByZWZpeCkpIHsKICAgICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGRhdGVLZXkuc3Vic3RyaW5nKDgpLCAxMCk7CiAgICAgICAgICB0YXNrQ291bnRCeURheVtkYXldID0gKHRhc2tDb3VudEJ5RGF5W2RheV0gfHwgMCkgKyAoZ3JvdXBlZFtkYXRlS2V5XT8ubGVuZ3RoIHx8IDApOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICAgIGNvbnN0IHByZXZNb250aCA9ICgpID0+IHNldFZpZXdEYXRlKG5ldyBEYXRlKHZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHZpZXdEYXRlLmdldE1vbnRoKCkgLSAxLCAxKSk7CiAgICBjb25zdCBuZXh0TW9udGggPSAoKSA9PiBzZXRWaWV3RGF0ZShuZXcgRGF0ZSh2aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB2aWV3RGF0ZS5nZXRNb250aCgpICsgMSwgMSkpOwogICAgY29uc3QgbW9udGhOYW1lID0gdmlld0RhdGUudG9Mb2NhbGVTdHJpbmcoImRlZmF1bHQiLCB7IG1vbnRoOiAibG9uZyIsIHllYXI6ICJudW1lcmljIiB9KTsKICAgIGNvbnN0IGlzVG9kYXkgPSAoZGF5KSA9PiBkYXkgPT09IHRvZGF5LmdldERhdGUoKSAmJiB2aWV3RGF0ZS5nZXRNb250aCgpID09PSB0b2RheS5nZXRNb250aCgpICYmIHZpZXdEYXRlLmdldEZ1bGxZZWFyKCkgPT09IHRvZGF5LmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBtYWtlRGF0ZUtleSA9IChkYXkpID0+IHsKICAgICAgY29uc3QgeSA9IHZpZXdEYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgIGNvbnN0IG0gPSBTdHJpbmcodmlld0RhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICIwIik7CiAgICAgIGNvbnN0IGQgPSBTdHJpbmcoZGF5KS5wYWRTdGFydCgyLCAiMCIpOwogICAgICByZXR1cm4gYCR7eX0tJHttfS0ke2R9YDsKICAgIH07CiAgICBjb25zdCBpc1NlbGVjdGVkID0gKGRheSkgPT4gc2VsZWN0ZWREYXRlICYmIG1ha2VEYXRlS2V5KGRheSkgPT09IHNlbGVjdGVkRGF0ZTsKICAgIGNvbnN0IGhhbmRsZURheUNsaWNrID0gKGRheSkgPT4gewogICAgICBpZiAob25EYXRlU2VsZWN0KSB7CiAgICAgICAgY29uc3QgZGF0ZUtleSA9IG1ha2VEYXRlS2V5KGRheSk7CiAgICAgICAgb25EYXRlU2VsZWN0KGRhdGVLZXkgPT09IHNlbGVjdGVkRGF0ZSA/IG51bGwgOiBkYXRlS2V5KTsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IGNlbGxzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0RGF5T2ZXZWVrOyBpKyspCiAgICAgIGNlbGxzLnB1c2goaCgiZGl2IiwgeyBrZXk6ICJlbXB0eS0iICsgaSwgY2xhc3NOYW1lOiAiY2FsLWNlbGwgZW1wdHkiIH0pKTsKICAgIGZvciAobGV0IGRheSA9IDE7IGRheSA8PSBkYXlzSW5Nb250aDsgZGF5KyspIHsKICAgICAgY29uc3QgY291bnQgPSB0YXNrQ291bnRCeURheVtkYXldIHx8IDA7CiAgICAgIGNvbnN0IGRvdENvbG9yID0gY291bnQgPT09IDAgPyAibm9uZSIgOiBjb3VudCA8PSAyID8gIiM4NmVmYWMiIDogY291bnQgPD0gNSA/ICIjZmJiZjI0IiA6ICIjZjg3MTcxIjsKICAgICAgbGV0IGNlbGxDbGFzcyA9ICJjYWwtY2VsbCI7CiAgICAgIGlmIChpc1RvZGF5KGRheSkpCiAgICAgICAgY2VsbENsYXNzICs9ICIgdG9kYXkiOwogICAgICBpZiAoaXNTZWxlY3RlZChkYXkpKQogICAgICAgIGNlbGxDbGFzcyArPSAiIHNlbGVjdGVkIjsKICAgICAgY2VsbHMucHVzaChoKAogICAgICAgICJkaXYiLAogICAgICAgIHsKICAgICAgICAgIGtleTogZGF5LAogICAgICAgICAgY2xhc3NOYW1lOiBjZWxsQ2xhc3MsCiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBoYW5kbGVEYXlDbGljayhkYXkpCiAgICAgICAgfSwKICAgICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJjYWwtZGF5IiB9LCBkYXkpLAogICAgICAgIGRvdENvbG9yICE9PSAibm9uZSIgPyBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJjYWwtZG90Iiwgc3R5bGU6IHsgYmFja2dyb3VuZENvbG9yOiBkb3RDb2xvciB9IH0pIDogbnVsbAogICAgICApKTsKICAgIH0KICAgIHJldHVybiBoKAogICAgICBXaWRnZXRXcmFwcGVyLAogICAgICB7CiAgICAgICAgdGl0bGU6ICJDYWxlbmRhciIsCiAgICAgICAgaWNvbjogIlx1ezFGNEM1fSIsCiAgICAgICAgd2lkZ2V0SWQ6ICJjYWxlbmRhciIsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgIG9uQ29uZmlndXJlOiAoKSA9PiBzZXRDb25maWdPcGVuKHRydWUpCiAgICAgIH0sCiAgICAgIGNvbmZpZ09wZW4gPyBoKAogICAgICAgIENvbmZpZ1BvcHVwLAogICAgICAgIHsKICAgICAgICAgIHRpdGxlOiAiQ29uZmlndXJlIENhbGVuZGFyIiwKICAgICAgICAgIG9uU3VibWl0OiBoYW5kbGVDb25maWdTdWJtaXQyLAogICAgICAgICAgb25DYW5jZWw6IGhhbmRsZUNvbmZpZ0NhbmNlbDIKICAgICAgICB9LAogICAgICAgIGgoCiAgICAgICAgICAiZGl2IiwKICAgICAgICAgIHsgY2xhc3NOYW1lOiAiY29uZmlnLWZpZWxkIiB9LAogICAgICAgICAgaCgiZGl2IiwgeyBjbGFzc05hbWU6ICJjb25maWctZmllbGQtbGFiZWwiIH0sICJXZWVrIHN0YXJ0cyBvbiIpLAogICAgICAgICAgW1siMCIsICJTdW5kYXkiXSwgWyIxIiwgIk1vbmRheSJdXS5tYXAoCiAgICAgICAgICAgIChbdmFsdWUsIGxhYmVsXSkgPT4gaCgKICAgICAgICAgICAgICAibGFiZWwiLAogICAgICAgICAgICAgIHsga2V5OiB2YWx1ZSB9LAogICAgICAgICAgICAgIGgoImlucHV0IiwgewogICAgICAgICAgICAgICAgdHlwZTogInJhZGlvIiwKICAgICAgICAgICAgICAgIG5hbWU6ICJjYWwtd2Vlay1zdGFydCIsCiAgICAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgICAgIGNoZWNrZWQ6IHdlZWtTdGFydCA9PT0gdmFsdWUsCiAgICAgICAgICAgICAgICBvbkNoYW5nZTogKCkgPT4gc2V0V2Vla1N0YXJ0KHZhbHVlKQogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgIGxhYmVsCiAgICAgICAgICAgICkKICAgICAgICAgICkKICAgICAgICApCiAgICAgICkgOiBudWxsLAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAiY2FsLW5hdiIgfSwKICAgICAgICBoKCJidXR0b24iLCB7IG9uQ2xpY2s6IHByZXZNb250aCwgY2xhc3NOYW1lOiAiY2FsLWFycm93IiB9LCAiXHUyNUMwIiksCiAgICAgICAgaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAiY2FsLW1vbnRoIiB9LCBtb250aE5hbWUpLAogICAgICAgIGgoImJ1dHRvbiIsIHsgb25DbGljazogbmV4dE1vbnRoLCBjbGFzc05hbWU6ICJjYWwtYXJyb3ciIH0sICJcdTI1QjYiKQogICAgICApLAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAiY2FsLWdyaWQiIH0sCiAgICAgICAgREFZX0xBQkVMUy5tYXAoKGQpID0+IGgoImRpdiIsIHsga2V5OiBkLCBjbGFzc05hbWU6ICJjYWwtaGVhZGVyIiB9LCBkKSksCiAgICAgICAgLi4uY2VsbHMKICAgICAgKQogICAgKTsKICB9CgogIC8vIGxpYi9kYXNoYm9hcmQvYWdlbmRhLmpzCiAgdmFyIGltcG9ydF9yZWFjdDggPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSk7CiAgdmFyIERBVEVTX1BFUl9QQUdFID0gMzsKICBmdW5jdGlvbiBBZ2VuZGFXaWRnZXQoeyB0YXNrcywgY3VycmVudERhdGUsIHNlbGVjdGVkRGF0ZSB9KSB7CiAgICBjb25zdCBoID0gaW1wb3J0X3JlYWN0OC5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgW3BhZ2UsIHNldFBhZ2VdID0gKDAsIGltcG9ydF9yZWFjdDgudXNlU3RhdGUpKDApOwogICAgY29uc3QgdG9kYXlEYXRlS2V5ID0gZm9ybWF0RGF0ZUtleShjdXJyZW50RGF0ZSB8fCAoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCkpOwogICAgY29uc3QgdGFza0RhdGVLZXlzID0gT2JqZWN0LmtleXModGFza3MgfHwge30pLnNvcnQoKTsKICAgIGNvbnN0IGFsbERhdGVLZXlzID0gc2VsZWN0ZWREYXRlICYmICF0YXNrRGF0ZUtleXMuaW5jbHVkZXMoc2VsZWN0ZWREYXRlKSA/IFsuLi50YXNrRGF0ZUtleXMsIHNlbGVjdGVkRGF0ZV0uc29ydCgpIDogdGFza0RhdGVLZXlzOwogICAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChhbGxEYXRlS2V5cy5sZW5ndGggLyBEQVRFU19QRVJfUEFHRSkpOwogICAgKDAsIGltcG9ydF9yZWFjdDgudXNlRWZmZWN0KSgoKSA9PiB7CiAgICAgIGlmICghc2VsZWN0ZWREYXRlKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgZGF0ZUluZGV4ID0gYWxsRGF0ZUtleXMuaW5kZXhPZihzZWxlY3RlZERhdGUpOwogICAgICBpZiAoZGF0ZUluZGV4ID49IDApIHsKICAgICAgICBzZXRQYWdlKE1hdGguZmxvb3IoZGF0ZUluZGV4IC8gREFURVNfUEVSX1BBR0UpKTsKICAgICAgfQogICAgfSwgW3NlbGVjdGVkRGF0ZV0pOwogICAgY29uc3QgY3VycmVudFBhZ2UgPSBNYXRoLm1pbihwYWdlLCB0b3RhbFBhZ2VzIC0gMSk7CiAgICBjb25zdCB2aXNpYmxlRGF0ZUtleXMgPSBhbGxEYXRlS2V5cy5zbGljZSgKICAgICAgY3VycmVudFBhZ2UgKiBEQVRFU19QRVJfUEFHRSwKICAgICAgKGN1cnJlbnRQYWdlICsgMSkgKiBEQVRFU19QRVJfUEFHRQogICAgKTsKICAgIGNvbnN0IHByaW9yaXR5Q2xhc3NOYW1lID0gKHRhc2spID0+IHsKICAgICAgaWYgKHRhc2suaW1wb3J0YW50ICYmIHRhc2sudXJnZW50KQogICAgICAgIHJldHVybiAicHJpb3JpdHktY3JpdGljYWwiOwogICAgICBpZiAodGFzay5pbXBvcnRhbnQpCiAgICAgICAgcmV0dXJuICJwcmlvcml0eS1pbXBvcnRhbnQiOwogICAgICBpZiAodGFzay51cmdlbnQpCiAgICAgICAgcmV0dXJuICJwcmlvcml0eS11cmdlbnQiOwogICAgICByZXR1cm4gInByaW9yaXR5LW5vcm1hbCI7CiAgICB9OwogICAgY29uc3QgZm9ybWF0VGltZSA9ICh0aW1lc3RhbXApID0+IHsKICAgICAgaWYgKCF0aW1lc3RhbXApCiAgICAgICAgcmV0dXJuICIiOwogICAgICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wKS50b0xvY2FsZVRpbWVTdHJpbmcoW10sIHsgaG91cjogIjItZGlnaXQiLCBtaW51dGU6ICIyLWRpZ2l0IiB9KTsKICAgIH07CiAgICBjb25zdCBnZXRUYXNrTm90ZVV1aWQgPSAodGFzaykgPT4gdGFzay5ub3RlVVVJRCB8fCB0YXNrLm5vdGVVdWlkIHx8IHRhc2subm90ZT8udXVpZCB8fCBudWxsOwogICAgY29uc3QgZ2V0VGFza05vdGVMYWJlbCA9ICh0YXNrKSA9PiB0YXNrLm5vdGVOYW1lIHx8IHRhc2subm90ZVRpdGxlIHx8IHRhc2subm90ZT8ubmFtZSB8fCAiT3BlbiBub3RlIjsKICAgIGNvbnN0IG5hdmlnYXRlVG9UYXNrID0gYXN5bmMgKHRhc2spID0+IHsKICAgICAgY29uc3Qgbm90ZVV1aWQgPSBnZXRUYXNrTm90ZVV1aWQodGFzayk7CiAgICAgIGlmICghbm90ZVV1aWQgfHwgIXRhc2sudXVpZCkKICAgICAgICByZXR1cm47CiAgICAgIGF3YWl0IGNhbGxQbHVnaW4oIm5hdmlnYXRlVG9UYXNrIiwgbm90ZVV1aWQsIHRhc2sudXVpZCk7CiAgICB9OwogICAgY29uc3QgbmF2aWdhdGVUb1Rhc2tOb3RlID0gYXN5bmMgKHRhc2ssIGV2ZW50KSA9PiB7CiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBjb25zdCBub3RlVXVpZCA9IGdldFRhc2tOb3RlVXVpZCh0YXNrKTsKICAgICAgaWYgKCFub3RlVXVpZCkKICAgICAgICByZXR1cm47CiAgICAgIGF3YWl0IGNhbGxQbHVnaW4oIm5hdmlnYXRlVG9Ob3RlIiwgbm90ZVV1aWQpOwogICAgfTsKICAgIGNvbnN0IHJlbmRlckRhdGVMYWJlbCA9IChkYXRlS2V5KSA9PiB7CiAgICAgIGNvbnN0IGRhdGVGb3JMYWJlbCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZShgJHtkYXRlS2V5fVQwMDowMDowMGApOwogICAgICByZXR1cm4gZGF0ZUZvckxhYmVsLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSwgewogICAgICAgIHdlZWtkYXk6ICJzaG9ydCIsCiAgICAgICAgbW9udGg6ICJzaG9ydCIsCiAgICAgICAgZGF5OiAibnVtZXJpYyIKICAgICAgfSk7CiAgICB9OwogICAgY29uc3QgcGFnaW5hdGlvbkNvbnRyb2xzID0gdG90YWxQYWdlcyA+IDEgPyBoKAogICAgICAiZGl2IiwKICAgICAgeyBjbGFzc05hbWU6ICJhZ2VuZGEtcGFnaW5hdGlvbiIgfSwKICAgICAgaCgiYnV0dG9uIiwgewogICAgICAgIGNsYXNzTmFtZTogImFnZW5kYS1wYWdlLWFycm93IiwKICAgICAgICBvbkNsaWNrOiAoKSA9PiBzZXRQYWdlKChwKSA9PiBNYXRoLm1heCgwLCBwIC0gMSkpLAogICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA9PT0gMAogICAgICB9LCAiXHUyNUMwIiksCiAgICAgIGgoInNwYW4iLCB7IGNsYXNzTmFtZTogImFnZW5kYS1wYWdlLWluZGljYXRvciIgfSwgYCR7Y3VycmVudFBhZ2UgKyAxfSAvICR7dG90YWxQYWdlc31gKSwKICAgICAgaCgiYnV0dG9uIiwgewogICAgICAgIGNsYXNzTmFtZTogImFnZW5kYS1wYWdlLWFycm93IiwKICAgICAgICBvbkNsaWNrOiAoKSA9PiBzZXRQYWdlKChwKSA9PiBNYXRoLm1pbih0b3RhbFBhZ2VzIC0gMSwgcCArIDEpKSwKICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gdG90YWxQYWdlcyAtIDEKICAgICAgfSwgIlx1MjVCNiIpCiAgICApIDogbnVsbDsKICAgIHJldHVybiBoKAogICAgICBXaWRnZXRXcmFwcGVyLAogICAgICB7CiAgICAgICAgdGl0bGU6ICJVcGNvbWluZyBBZ2VuZGEiLAogICAgICAgIGljb246ICJcdXsxRjRDQn0iLAogICAgICAgIHdpZGdldElkOiAiYWdlbmRhIiwKICAgICAgICBoZWFkZXJBY3Rpb25zOiBwYWdpbmF0aW9uQ29udHJvbHMKICAgICAgfSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImFnZW5kYS1saXN0IiB9LAogICAgICAgIHZpc2libGVEYXRlS2V5cy5tYXAoKGRhdGVLZXkpID0+IHsKICAgICAgICAgIGNvbnN0IHRhc2tzRm9yRGF0ZSA9IHRhc2tzW2RhdGVLZXldIHx8IFtdOwogICAgICAgICAgY29uc3QgaXNUb2RheVNlY3Rpb24gPSBkYXRlS2V5ID09PSB0b2RheURhdGVLZXk7CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgInNlY3Rpb24iLAogICAgICAgICAgICB7IGtleTogZGF0ZUtleSwgY2xhc3NOYW1lOiAiYWdlbmRhLWRheSIgfSwKICAgICAgICAgICAgaCgiaDQiLCB7IGNsYXNzTmFtZTogImFnZW5kYS1kYXRlLWxhYmVsIiB9LCByZW5kZXJEYXRlTGFiZWwoZGF0ZUtleSkpLAogICAgICAgICAgICB0YXNrc0ZvckRhdGUubGVuZ3RoID09PSAwID8gaCgKICAgICAgICAgICAgICAicCIsCiAgICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJhZ2VuZGEtZW1wdHktZGF5IiB9LAogICAgICAgICAgICAgIGlzVG9kYXlTZWN0aW9uID8gIk5vIHRhc2tzIHNjaGVkdWxlZCBmb3IgdG9kYXkiIDogIk5vIHRhc2tzIHNjaGVkdWxlZCIKICAgICAgICAgICAgKSA6IHRhc2tzRm9yRGF0ZS5tYXAoKHRhc2spID0+IGgoCiAgICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAga2V5OiB0YXNrLnV1aWQsCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJhZ2VuZGEtaXRlbSBhZ2VuZGEtdGFzay1yb3ciLAogICAgICAgICAgICAgICAgb25DbGljazogKGUpID0+IHsKICAgICAgICAgICAgICAgICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KCJhIikpCiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGVUb1Rhc2sodGFzayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBoKCJkaXYiLCB7IGNsYXNzTmFtZTogYGFnZW5kYS1pbmRpY2F0b3IgJHtwcmlvcml0eUNsYXNzTmFtZSh0YXNrKX1gIH0pLAogICAgICAgICAgICAgIGgoCiAgICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAiYWdlbmRhLWNvbnRlbnQiIH0sCiAgICAgICAgICAgICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJhZ2VuZGEtdGltZSIsIHRpdGxlOiBgJHt0YXNrLnN0YXJ0QXQgPyAiU3RhcnQiIDogIkRlYWRsaW5lIn0gdGltZSBmb3IgdGFza2AgfSwgZm9ybWF0VGltZSh0YXNrLnN0YXJ0QXQgfHwgdGFzay5kZWFkbGluZSkpLAogICAgICAgICAgICAgICAgaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAiYWdlbmRhLXRleHQiLCBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHJlbmRlck1hcmtkb3duKHRhc2suY29udGVudCkgfHwgIlVudGl0bGVkIHRhc2siIH0gfSksCiAgICAgICAgICAgICAgICBnZXRUYXNrTm90ZVV1aWQodGFzaykgPyBoKCJidXR0b24iLCB7CiAgICAgICAgICAgICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJhZ2VuZGEtbm90ZS1saW5rIiwKICAgICAgICAgICAgICAgICAgb25DbGljazogKGV2ZW50KSA9PiBuYXZpZ2F0ZVRvVGFza05vdGUodGFzaywgZXZlbnQpCiAgICAgICAgICAgICAgICB9LCBnZXRUYXNrTm90ZUxhYmVsKHRhc2spKSA6IG51bGwKICAgICAgICAgICAgICApLAogICAgICAgICAgICAgIHRhc2suZW5kQXQgJiYgdGFzay5zdGFydEF0ICYmIHRhc2suZW5kQXQgPiB0YXNrLnN0YXJ0QXQgPyBoKAogICAgICAgICAgICAgICAgInNwYW4iLAogICAgICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJhZ2VuZGEtZHVyYXRpb24iIH0sCiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKCh0YXNrLmVuZEF0IC0gdGFzay5zdGFydEF0KSAvIDZlNCkgKyAibSIKICAgICAgICAgICAgICApIDogbnVsbAogICAgICAgICAgICApKQogICAgICAgICAgKTsKICAgICAgICB9KQogICAgICApCiAgICApOwogIH0KICBmdW5jdGlvbiBmb3JtYXREYXRlS2V5KGRhdGVWYWx1ZSkgewogICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGVWYWx1ZSk7CiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgIjAiKTsKICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgIjAiKTsKICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gOwogIH0KCiAgLy8gbGliL2Rhc2hib2FyZC9xdW90ZXMuanMKICB2YXIgaW1wb3J0X3JlYWN0OSA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpKTsKICBmdW5jdGlvbiBRdW90ZXNXaWRnZXQoeyBxdW90ZXMsIHBsYW5Db250ZW50IH0pIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3Q5LmNyZWF0ZUVsZW1lbnQ7CiAgICBjb25zdCBbZGlzcGxheVF1b3Rlcywgc2V0RGlzcGxheVF1b3Rlc10gPSAoMCwgaW1wb3J0X3JlYWN0OS51c2VTdGF0ZSkocXVvdGVzIHx8IFtdKTsKICAgIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9ICgwLCBpbXBvcnRfcmVhY3Q5LnVzZVN0YXRlKSghcXVvdGVzKTsKICAgIGNvbnN0IEJHX0lNQUdFUyA9IFsKICAgICAgImh0dHBzOi8vaW1hZ2VzLnVuc3BsYXNoLmNvbS9waG90by0xNTA2OTA1OTI1MzQ2LTIxYmRhNGQzMmRmND93PTYwMCZoPTMwMCZmaXQ9Y3JvcCIsCiAgICAgICJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ3MDA3MTQ1OTYwNC0zYjVlYzNhN2ZlMDU/dz02MDAmaD0zMDAmZml0PWNyb3AiCiAgICBdOwogICAgKDAsIGltcG9ydF9yZWFjdDkudXNlRWZmZWN0KSgoKSA9PiB7CiAgICAgIGlmICghcXVvdGVzKSB7CiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTsKICAgICAgICBjYWxsUGx1Z2luKCJmZXRjaFF1b3RlcyIsIHBsYW5Db250ZW50KS50aGVuKChxKSA9PiB7CiAgICAgICAgICBzZXREaXNwbGF5UXVvdGVzKHEgfHwgW10pOwogICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sIFtdKTsKICAgIGlmIChsb2FkaW5nKQogICAgICByZXR1cm4gaCgKICAgICAgICBXaWRnZXRXcmFwcGVyLAogICAgICAgIHsgdGl0bGU6ICJJbnNwaXJhdGlvbiIsIGljb246ICJcdXsxRjRBMX0iLCB3aWRnZXRJZDogInF1b3RlcyIgfSwKICAgICAgICBoKCJkaXYiLCB7IGNsYXNzTmFtZTogInF1b3Rlcy1sb2FkaW5nIiB9LCAiR2VuZXJhdGluZyBxdW90ZXMuLi4iKQogICAgICApOwogICAgcmV0dXJuIGgoCiAgICAgIFdpZGdldFdyYXBwZXIsCiAgICAgIHsgdGl0bGU6ICJJbnNwaXJhdGlvbiIsIGljb246ICJcdXsxRjRBMX0iLCB3aWRnZXRJZDogInF1b3RlcyIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAicXVvdGVzLWdyaWQiIH0sCiAgICAgICAgZGlzcGxheVF1b3Rlcy5zbGljZSgwLCAyKS5tYXAoCiAgICAgICAgICAocSwgaSkgPT4gaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBrZXk6IGksCiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAicXVvdGUtdGlsZSIsCiAgICAgICAgICAgICAgc3R5bGU6IHsgYmFja2dyb3VuZEltYWdlOiAibGluZWFyLWdyYWRpZW50KHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwLjYpKSwgdXJsKCIgKyBCR19JTUFHRVNbaSAlIEJHX0lNQUdFUy5sZW5ndGhdICsgIikiIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgaCgicCIsIHsgY2xhc3NOYW1lOiAicXVvdGUtdGV4dCIgfSwgJyInICsgcS50ZXh0ICsgJyInKSwKICAgICAgICAgICAgcS5hdXRob3IgPyBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJxdW90ZS1hdXRob3IiIH0sICJcdTIwMTQgIiArIHEuYXV0aG9yKSA6IG51bGwKICAgICAgICAgICkKICAgICAgICApCiAgICAgICkKICAgICk7CiAgfQoKICAvLyBsaWIvZGFzaGJvYXJkL2FpLXBsdWdpbnMuanMKICB2YXIgaW1wb3J0X3JlYWN0MTAgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSk7CiAgZnVuY3Rpb24gQUlQbHVnaW5zV2lkZ2V0KHsgdGFza0NvdW50LCBmbGFzaGNhcmRzRHVlIH0pIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3QxMC5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgaXRlbXMgPSBbCiAgICAgIHsgbGFiZWw6ICJQcm9wb3NlIFRhc2sgVmFsdWVzIiwgYmFkZ2U6IHRhc2tDb3VudCB8fCAwLCBpY29uOiAiXHV7MUYzQUZ9IiB9LAogICAgICB7IGxhYmVsOiAiRmxhc2hjYXJkIFJldmlldyIsIGJhZGdlOiBmbGFzaGNhcmRzRHVlIHx8IDAsIGljb246ICJcdXsxRjBDRn0iIH0KICAgIF07CiAgICByZXR1cm4gaCgKICAgICAgV2lkZ2V0V3JhcHBlciwKICAgICAgeyB0aXRsZTogIkFJICYgUGx1Z2lucyIsIGljb246ICJcdXsxRjkxNn0iLCB3aWRnZXRJZDogImFpLXBsdWdpbnMiIH0sCiAgICAgIGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJhaXAtbGlzdCIgfSwKICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IGgoCiAgICAgICAgICAiZGl2IiwKICAgICAgICAgIHsga2V5OiBpdGVtLmxhYmVsLCBjbGFzc05hbWU6ICJhaXAtaXRlbSIgfSwKICAgICAgICAgIGgoInNwYW4iLCB7IGNsYXNzTmFtZTogImFpcC1pY29uIiB9LCBpdGVtLmljb24pLAogICAgICAgICAgaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAiYWlwLWxhYmVsIiB9LCBpdGVtLmxhYmVsKSwKICAgICAgICAgIGl0ZW0uYmFkZ2UgPiAwID8gaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAiYWlwLWJhZGdlIiB9LCBpdGVtLmJhZGdlKSA6IG51bGwKICAgICAgICApKQogICAgICApCiAgICApOwogIH0KCiAgLy8gbGliL2Rhc2hib2FyZC9xdWljay1hY3Rpb25zLmpzCiAgdmFyIGltcG9ydF9yZWFjdDExID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCkpOwogIGZ1bmN0aW9uIFF1aWNrQWN0aW9uc1dpZGdldCgpIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3QxMS5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgYWN0aW9ucyA9IFsKICAgICAgeyBsYWJlbDogIkRhaWx5IEpvdCIsIGljb246ICJcdXsxRjRERH0iLCBhY3Rpb246ICJkYWlseUpvdCIgfSwKICAgICAgeyBsYWJlbDogIkpvdXJuYWwiLCBpY29uOiAiXHV7MUY0RDN9IiwgYWN0aW9uOiAiam91cm5hbCIgfSwKICAgICAgeyBsYWJlbDogIkFkZCBQZXJzb24iLCBpY29uOiAiXHV7MUY0NjR9IiwgYWN0aW9uOiAiYWRkUGVyc29uIiB9LAogICAgICB7IGxhYmVsOiAiQnJvd3NlIENSTSIsIGljb246ICJcdXsxRjRDN30iLCBhY3Rpb246ICJicm93c2VDUk0iIH0KICAgIF07CiAgICBjb25zdCBoYW5kbGVBY3Rpb24gPSBhc3luYyAoYWN0aW9uKSA9PiB7CiAgICAgIGF3YWl0IGNhbGxQbHVnaW4oInF1aWNrQWN0aW9uIiwgYWN0aW9uKTsKICAgIH07CiAgICByZXR1cm4gaCgKICAgICAgV2lkZ2V0V3JhcHBlciwKICAgICAgeyB0aXRsZTogIlF1aWNrIEFjdGlvbnMiLCBpY29uOiAiXHUyNkExIiwgd2lkZ2V0SWQ6ICJxdWljay1hY3Rpb25zIiB9LAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAicWEtZ3JpZCIgfSwKICAgICAgICBhY3Rpb25zLm1hcCgoYSkgPT4gaCgKICAgICAgICAgICJidXR0b24iLAogICAgICAgICAgewogICAgICAgICAgICBrZXk6IGEuYWN0aW9uLAogICAgICAgICAgICBjbGFzc05hbWU6ICJxYS1idXR0b24iLAogICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiBoYW5kbGVBY3Rpb24oYS5hY3Rpb24pCiAgICAgICAgICB9LAogICAgICAgICAgaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAicWEtaWNvbiIgfSwgYS5pY29uKSwKICAgICAgICAgIGgoInNwYW4iLCB7IGNsYXNzTmFtZTogInFhLWxhYmVsIiB9LCBhLmxhYmVsKQogICAgICAgICkpCiAgICAgICkKICAgICk7CiAgfQoKICAvLyBsaWIvZGFzaGJvYXJkL3Rhc2stZG9tYWlucy5qcwogIHZhciBpbXBvcnRfcmVhY3QxMiA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpKTsKICBmdW5jdGlvbiBUYXNrRG9tYWlucyh7IGRvbWFpbnMsIGFjdGl2ZVRhc2tEb21haW4sIG9uRG9tYWluQ2hhbmdlIH0pIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3QxMi5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgW3JlZnJlc2hpbmcsIHNldFJlZnJlc2hpbmddID0gKDAsIGltcG9ydF9yZWFjdDEyLnVzZVN0YXRlKShmYWxzZSk7CiAgICBjb25zdCBoYW5kbGVSZWZyZXNoID0gYXN5bmMgKCkgPT4gewogICAgICBzZXRSZWZyZXNoaW5nKHRydWUpOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGxQbHVnaW4oInJlZnJlc2hUYXNrRG9tYWlucyIpOwogICAgICAgIGlmIChyZXN1bHQgJiYgb25Eb21haW5DaGFuZ2UpIHsKICAgICAgICAgIG9uRG9tYWluQ2hhbmdlKHJlc3VsdC5kb21haW5zLCByZXN1bHQuYWN0aXZlVGFza0RvbWFpbik7CiAgICAgICAgfQogICAgICB9IGZpbmFsbHkgewogICAgICAgIHNldFJlZnJlc2hpbmcoZmFsc2UpOwogICAgICB9CiAgICB9OwogICAgY29uc3QgaGFuZGxlU2VsZWN0ID0gYXN5bmMgKGRvbWFpblV1aWQpID0+IHsKICAgICAgaWYgKGRvbWFpblV1aWQgPT09IGFjdGl2ZVRhc2tEb21haW4pCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsUGx1Z2luKCJzZXRBY3RpdmVUYXNrRG9tYWluIiwgZG9tYWluVXVpZCk7CiAgICAgIGlmIChyZXN1bHQgJiYgb25Eb21haW5DaGFuZ2UpIHsKICAgICAgICBvbkRvbWFpbkNoYW5nZShudWxsLCBkb21haW5VdWlkLCByZXN1bHQpOwogICAgICB9CiAgICB9OwogICAgY29uc3QgaGFuZGxlT3BlbkRvbWFpblNldHRpbmdzID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBhd2FpdCBjYWxsUGx1Z2luKCJuYXZpZ2F0ZVRvVXJsIiwgImh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXM/dGFnPXRhc2tfY2FsZW5kYXIiKTsKICAgIH07CiAgICBpZiAoIWRvbWFpbnMgfHwgZG9tYWlucy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJ0YXNrLWRvbWFpbnMiIH0sCiAgICAgICAgaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAidGFzay1kb21haW5zLWVtcHR5IiB9LCAiTm8gdGFzayBkb21haW5zIGZvdW5kLiIpLAogICAgICAgIGgoImJ1dHRvbiIsIHsKICAgICAgICAgIGNsYXNzTmFtZTogInRhc2stZG9tYWlucy1yZWZyZXNoIiwKICAgICAgICAgIG9uQ2xpY2s6IGhhbmRsZVJlZnJlc2gsCiAgICAgICAgICBkaXNhYmxlZDogcmVmcmVzaGluZwogICAgICAgIH0sIHJlZnJlc2hpbmcgPyAiUmVmcmVzaGluZy4uLiIgOiAiUmVmcmVzaCIpCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gaCgKICAgICAgImRpdiIsCiAgICAgIHsgY2xhc3NOYW1lOiAidGFzay1kb21haW5zIiB9LAogICAgICBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAidGFzay1kb21haW5zLWxpc3QiIH0sCiAgICAgICAgZG9tYWlucy5tYXAoCiAgICAgICAgICAoZG9tYWluKSA9PiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgewogICAgICAgICAgICAgIGtleTogZG9tYWluLnV1aWQsCiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGFzay1kb21haW4taXRlbSIgKyAoZG9tYWluLnV1aWQgPT09IGFjdGl2ZVRhc2tEb21haW4gPyAiIGFjdGl2ZSIgOiAiIiksCiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gaGFuZGxlU2VsZWN0KGRvbWFpbi51dWlkKQogICAgICAgICAgICB9LAogICAgICAgICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJ0YXNrLWRvbWFpbi1uYW1lIiB9LCBkb21haW4ubmFtZSkKICAgICAgICAgICkKICAgICAgICApCiAgICAgICksCiAgICAgIGgoImJ1dHRvbiIsIHsKICAgICAgICBjbGFzc05hbWU6ICJ0YXNrLWRvbWFpbnMtcmVmcmVzaCIsCiAgICAgICAgb25DbGljazogaGFuZGxlUmVmcmVzaCwKICAgICAgICBkaXNhYmxlZDogcmVmcmVzaGluZwogICAgICB9LCByZWZyZXNoaW5nID8gIlJlZnJlc2hpbmcuLi4iIDogIlx1MjFCQiBSZWZyZXNoIFRhc2sgRG9tYWlucyIpCiAgICApOwogIH0KCiAgLy8gbGliL2Rhc2hib2FyZC9kYXNoYm9hcmQtY29uZmlnLXBvcHVwLmpzCiAgdmFyIGltcG9ydF9yZWFjdDEzID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCkpOwoKICAvLyBsaWIvY29uc3RhbnRzL3NldHRpbmdzLmpzCiAgdmFyIERBU0hCT0FSRF9DT01QT05FTlRTID0gImRhc2hib2FyZF9lbGVtZW50cyI7CiAgdmFyIERBU0hCT0FSRF9GT0NVUyA9IHsKICAgIERFRkFVTFQ6ICJkZWZhdWx0IiwKICAgIExBWU9VVF9DT05GSUc6ICJsYXlvdXRDb25maWciLAogICAgU0VUVElOR1NfQ09ORklHOiAic2V0dGluZ3NDb25maWciCiAgfTsKICB2YXIgU0VUVElOR19LRVlTID0gewogICAgTExNX0FQSV9LRVk6ICJMTE0gQVBJIEtleSIsCiAgICBMTE1fUFJPVklERVI6ICJMTE0gUHJvdmlkZXIiLAogICAgQkFDS0dST1VORF9JTUFHRV9VUkw6ICJCYWNrZ3JvdW5kIEltYWdlIFVSTCIsCiAgICBCQUNLR1JPVU5EX0lNQUdFX01PREU6ICJCYWNrZ3JvdW5kIEltYWdlIE1vZGUiCiAgfTsKICB2YXIgQkFDS0dST1VORF9NT0RFX09QVElPTlMgPSBbCiAgICB7IHZhbHVlOiAiY292ZXIiLCBsYWJlbDogIkNvdmVyIChmaWxsIGVudGlyZSBiYWNrZ3JvdW5kKSIgfSwKICAgIHsgdmFsdWU6ICJjb250YWluIiwgbGFiZWw6ICJDb250YWluIChmaXQgd2l0aG91dCBjcm9wcGluZykiIH0sCiAgICB7IHZhbHVlOiAicmVwZWF0IiwgbGFiZWw6ICJSZXBlYXQgKHRpbGUgdGhlIGltYWdlKSIgfSwKICAgIHsgdmFsdWU6ICJyZXBlYXQteCIsIGxhYmVsOiAiUmVwZWF0IGhvcml6b250YWxseSIgfSwKICAgIHsgdmFsdWU6ICJyZXBlYXQteSIsIGxhYmVsOiAiUmVwZWF0IHZlcnRpY2FsbHkiIH0sCiAgICB7IHZhbHVlOiAibm8tcmVwZWF0IiwgbGFiZWw6ICJObyByZXBlYXQgKHNpbmdsZSBjZW50ZXJlZCBpbWFnZSkiIH0KICBdOwogIHZhciBUQVNLX0RPTUFJTl9TVEFMRV9NUyA9IDI0ICogNjAgKiA2MCAqIDFlMzsKICB2YXIgV0lER0VUX1JFR0lTVFJZID0gWwogICAgewogICAgICB3aWRnZXRJZDogInBsYW5uaW5nIiwKICAgICAgbmFtZTogIlF1YXJ0ZXJseSBQbGFubmluZyIsCiAgICAgIGRlc2NyaXB0aW9uOiAiUGxhbiBhbmQgdHJhY2sgeW91ciBxdWFydGVybHkgZ29hbHMgYW5kIHByaW9yaXRpZXMiLAogICAgICBpY29uOiAiXHV7MUY0Q0J9IiwKICAgICAgZGVmYXVsdEdyaWRXaWR0aFNpemU6IDIsCiAgICAgIG1heEhvcml6b250YWxUaWxlczogNCwKICAgICAgbWF4VmVydGljYWxUaWxlczogMgogICAgfSwKICAgIHsKICAgICAgd2lkZ2V0SWQ6ICJ2aWN0b3J5LXZhbHVlIiwKICAgICAgbmFtZTogIlZpY3RvcnkgVmFsdWUiLAogICAgICBkZXNjcmlwdGlvbjogIkNlbGVicmF0ZSB3aW5zIGFuZCB0cmFjayBoaWdoLXZhbHVlIHRhc2sgY29tcGxldGlvbnMiLAogICAgICBpY29uOiAiXHV7MUYzQzZ9IiwKICAgICAgZGVmYXVsdEdyaWRXaWR0aFNpemU6IDIsCiAgICAgIG1heEhvcml6b250YWxUaWxlczogNCwKICAgICAgbWF4VmVydGljYWxUaWxlczogMgogICAgfSwKICAgIHsKICAgICAgd2lkZ2V0SWQ6ICJtb29kIiwKICAgICAgbmFtZTogIk1vb2QgVHJhY2tlciIsCiAgICAgIGRlc2NyaXB0aW9uOiAiTG9nIHlvdXIgZGFpbHkgbW9vZCBhbmQgdmlzdWFsaXplIHRyZW5kcyBvdmVyIHRpbWUiLAogICAgICBpY29uOiAiXHV7MUYzQUR9IiwKICAgICAgZGVmYXVsdEdyaWRXaWR0aFNpemU6IDEsCiAgICAgIG1heEhvcml6b250YWxUaWxlczogMiwKICAgICAgbWF4VmVydGljYWxUaWxlczogMgogICAgfSwKICAgIHsKICAgICAgd2lkZ2V0SWQ6ICJjYWxlbmRhciIsCiAgICAgIG5hbWU6ICJDYWxlbmRhciIsCiAgICAgIGRlc2NyaXB0aW9uOiAiU2VlIHVwY29taW5nIGV2ZW50cyBhbmQgYXBwb2ludG1lbnRzIGF0IGEgZ2xhbmNlIiwKICAgICAgaWNvbjogIlx1ezFGNEM1fSIsCiAgICAgIGRlZmF1bHRHcmlkV2lkdGhTaXplOiAxLAogICAgICBtYXhIb3Jpem9udGFsVGlsZXM6IDIsCiAgICAgIG1heFZlcnRpY2FsVGlsZXM6IDIKICAgIH0sCiAgICB7CiAgICAgIHdpZGdldElkOiAiYWdlbmRhIiwKICAgICAgbmFtZTogIlRhc2sgQWdlbmRhIiwKICAgICAgZGVzY3JpcHRpb246ICJWaWV3IGFuZCBtYW5hZ2UgeW91ciBwcmlvcml0aXplZCB0YXNrIGxpc3QiLAogICAgICBpY29uOiAiXHV7MUY0Q0N9IiwKICAgICAgZGVmYXVsdEdyaWRXaWR0aFNpemU6IDIsCiAgICAgIG1heEhvcml6b250YWxUaWxlczogNCwKICAgICAgbWF4VmVydGljYWxUaWxlczogMgogICAgfSwKICAgIHsKICAgICAgd2lkZ2V0SWQ6ICJxdW90ZXMiLAogICAgICBuYW1lOiAiUXVvdGVzIiwKICAgICAgZGVzY3JpcHRpb246ICJSb3RhdGluZyBpbnNwaXJhdGlvbmFsIHF1b3RlcyB0byBrZWVwIHlvdSBtb3RpdmF0ZWQiLAogICAgICBpY29uOiAiXHV7MUY0QTF9IiwKICAgICAgZGVmYXVsdEdyaWRXaWR0aFNpemU6IDIsCiAgICAgIG1heEhvcml6b250YWxUaWxlczogNCwKICAgICAgbWF4VmVydGljYWxUaWxlczogMgogICAgfSwKICAgIHsKICAgICAgd2lkZ2V0SWQ6ICJhaS1wbHVnaW5zIiwKICAgICAgbmFtZTogIkFJIFBsdWdpbnMiLAogICAgICBkZXNjcmlwdGlvbjogIk9uZS10YXAgYWNjZXNzIHRvIHlvdXIgaW5zdGFsbGVkIEFJLXBvd2VyZWQgbm90ZSBwbHVnaW5zIiwKICAgICAgaWNvbjogIlx1ezFGOTE2fSIsCiAgICAgIGRlZmF1bHRHcmlkV2lkdGhTaXplOiAxLAogICAgICBtYXhIb3Jpem9udGFsVGlsZXM6IDIsCiAgICAgIG1heFZlcnRpY2FsVGlsZXM6IDIKICAgIH0sCiAgICB7CiAgICAgIHdpZGdldElkOiAicXVpY2stYWN0aW9ucyIsCiAgICAgIG5hbWU6ICJRdWljayBBY3Rpb25zIiwKICAgICAgZGVzY3JpcHRpb246ICJTaG9ydGN1dHMgZm9yIHlvdXIgbW9zdCBmcmVxdWVudGx5IHVzZWQgZGFzaGJvYXJkIGFjdGlvbnMiLAogICAgICBpY29uOiAiXHUyNkExIiwKICAgICAgZGVmYXVsdEdyaWRXaWR0aFNpemU6IDEsCiAgICAgIG1heEhvcml6b250YWxUaWxlczogMiwKICAgICAgbWF4VmVydGljYWxUaWxlczogMgogICAgfQogIF07CiAgdmFyIERFRkFVTFRfREFTSEJPQVJEX0NPTVBPTkVOVFMgPSBXSURHRVRfUkVHSVNUUlkubWFwKCh3KSA9PiAoewogICAgd2lkZ2V0SWQ6IHcud2lkZ2V0SWQsCiAgICBncmlkV2lkdGhTaXplOiB3LmRlZmF1bHRHcmlkV2lkdGhTaXplLAogICAgZ3JpZEhlaWdodFNpemU6IDEsCiAgICBzZXR0aW5nczoge30KICB9KSk7CgogIC8vIGxpYi9kYXNoYm9hcmQvZGFzaGJvYXJkLWNvbmZpZy1wb3B1cC5qcwogIGZ1bmN0aW9uIGdldFdpZGdldCh3aWRnZXRJZCkgewogICAgcmV0dXJuIFdJREdFVF9SRUdJU1RSWS5maW5kKCh3KSA9PiB3LndpZGdldElkID09PSB3aWRnZXRJZCk7CiAgfQogIGZ1bmN0aW9uIGRlcml2ZUluaXRpYWxJZHMoY3VycmVudExheW91dCkgewogICAgY29uc3QgYWxsV2lkZ2V0SWRzID0gV0lER0VUX1JFR0lTVFJZLm1hcCgodykgPT4gdy53aWRnZXRJZCk7CiAgICBjb25zdCByZW5kZXJlZElkcyA9IChjdXJyZW50TGF5b3V0IHx8IFtdKS5tYXAoKGMpID0+IGMud2lkZ2V0SWQpLmZpbHRlcigoaWQpID0+IGFsbFdpZGdldElkcy5pbmNsdWRlcyhpZCkpOwogICAgY29uc3QgaGlkZGVuSWRzID0gYWxsV2lkZ2V0SWRzLmZpbHRlcigoaWQpID0+ICFyZW5kZXJlZElkcy5pbmNsdWRlcyhpZCkpOwogICAgcmV0dXJuIHsgcmVuZGVyZWRJZHMsIGhpZGRlbklkcyB9OwogIH0KICBmdW5jdGlvbiBhcHBseU1vdmUocmVuZGVyZWRJZHMsIGhpZGRlbklkcywgd2lkZ2V0SWQsIGRpcmVjdGlvbikgewogICAgY29uc3QgY29tYmluZWQgPSBbLi4ucmVuZGVyZWRJZHMsIC4uLmhpZGRlbklkc107CiAgICBjb25zdCBpbmRleCA9IGNvbWJpbmVkLmluZGV4T2Yod2lkZ2V0SWQpOwogICAgaWYgKGRpcmVjdGlvbiA9PT0gInVwIiAmJiBpbmRleCA9PT0gMCkKICAgICAgcmV0dXJuIG51bGw7CiAgICBpZiAoZGlyZWN0aW9uID09PSAiZG93biIgJiYgaW5kZXggPT09IGNvbWJpbmVkLmxlbmd0aCAtIDEpCiAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgbmV4dCA9IFsuLi5jb21iaW5lZF07CiAgICBjb25zdCBzd2FwID0gZGlyZWN0aW9uID09PSAidXAiID8gaW5kZXggLSAxIDogaW5kZXggKyAxOwogICAgW25leHRbaW5kZXhdLCBuZXh0W3N3YXBdXSA9IFtuZXh0W3N3YXBdLCBuZXh0W2luZGV4XV07CiAgICByZXR1cm4geyByZW5kZXJlZElkczogbmV4dC5zbGljZSgwLCByZW5kZXJlZElkcy5sZW5ndGgpLCBoaWRkZW5JZHM6IG5leHQuc2xpY2UocmVuZGVyZWRJZHMubGVuZ3RoKSB9OwogIH0KICBmdW5jdGlvbiBhcHBseURyb3BPbkl0ZW0ocmVuZGVyZWRJZHMsIGhpZGRlbklkcywgZHJhZ2dlZElkLCB0YXJnZXRJZCkgewogICAgY29uc3QgbmV3UmVuZGVyZWQgPSByZW5kZXJlZElkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gZHJhZ2dlZElkKTsKICAgIGNvbnN0IG5ld0hpZGRlbiA9IGhpZGRlbklkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gZHJhZ2dlZElkKTsKICAgIGlmIChyZW5kZXJlZElkcy5pbmNsdWRlcyh0YXJnZXRJZCkpIHsKICAgICAgbmV3UmVuZGVyZWQuc3BsaWNlKG5ld1JlbmRlcmVkLmluZGV4T2YodGFyZ2V0SWQpLCAwLCBkcmFnZ2VkSWQpOwogICAgfSBlbHNlIHsKICAgICAgbmV3SGlkZGVuLnNwbGljZShuZXdIaWRkZW4uaW5kZXhPZih0YXJnZXRJZCksIDAsIGRyYWdnZWRJZCk7CiAgICB9CiAgICByZXR1cm4geyByZW5kZXJlZElkczogbmV3UmVuZGVyZWQsIGhpZGRlbklkczogbmV3SGlkZGVuIH07CiAgfQogIGZ1bmN0aW9uIGFwcGx5RHJvcE9uU2VjdGlvbihyZW5kZXJlZElkcywgaGlkZGVuSWRzLCBkcmFnZ2VkSWQsIHNlY3Rpb24pIHsKICAgIGNvbnN0IG5ld1JlbmRlcmVkID0gcmVuZGVyZWRJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IGRyYWdnZWRJZCk7CiAgICBjb25zdCBuZXdIaWRkZW4gPSBoaWRkZW5JZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IGRyYWdnZWRJZCk7CiAgICAoc2VjdGlvbiA9PT0gInJlbmRlcmVkIiA/IG5ld1JlbmRlcmVkIDogbmV3SGlkZGVuKS5wdXNoKGRyYWdnZWRJZCk7CiAgICByZXR1cm4geyByZW5kZXJlZElkczogbmV3UmVuZGVyZWQsIGhpZGRlbklkczogbmV3SGlkZGVuIH07CiAgfQogIGZ1bmN0aW9uIHJlbmRlckl0ZW0oaCwgd2lkZ2V0SWQsIGN0eCkgewogICAgY29uc3Qgd2lkZ2V0ID0gZ2V0V2lkZ2V0KHdpZGdldElkKTsKICAgIGlmICghd2lkZ2V0KQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGNvbWJpbmVkID0gWy4uLmN0eC5yZW5kZXJlZElkcywgLi4uY3R4LmhpZGRlbklkc107CiAgICBjb25zdCBpZHggPSBjb21iaW5lZC5pbmRleE9mKHdpZGdldElkKTsKICAgIHJldHVybiBoKAogICAgICAiZGl2IiwKICAgICAgewogICAgICAgIGtleTogd2lkZ2V0SWQsCiAgICAgICAgY2xhc3NOYW1lOiBbCiAgICAgICAgICAiZGFzaGJvYXJkLWNvbmZpZy1pdGVtIiwKICAgICAgICAgIGN0eC5kcmFnZ2luZ0lkID09PSB3aWRnZXRJZCA/ICJkYXNoYm9hcmQtY29uZmlnLWl0ZW0tLWRyYWdnaW5nIiA6ICIiLAogICAgICAgICAgY3R4LmRyYWdPdmVySWQgPT09IHdpZGdldElkID8gImRhc2hib2FyZC1jb25maWctaXRlbS0tZHJhZy1vdmVyIiA6ICIiCiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpLAogICAgICAgIGRyYWdnYWJsZTogdHJ1ZSwKICAgICAgICBvbkRyYWdTdGFydDogKGUpID0+IGN0eC5vbkRyYWdTdGFydChlLCB3aWRnZXRJZCksCiAgICAgICAgb25EcmFnRW5kOiBjdHgub25EcmFnRW5kLAogICAgICAgIG9uRHJhZ092ZXI6IChlKSA9PiBjdHgub25EcmFnT3Zlckl0ZW0oZSwgd2lkZ2V0SWQpLAogICAgICAgIG9uRHJvcDogKGUpID0+IGN0eC5vbkRyb3BPbkl0ZW0oZSwgd2lkZ2V0SWQpCiAgICAgIH0sCiAgICAgIGgoInNwYW4iLCB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1jb25maWctaXRlbS1oYW5kbGUiLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIgfSwgIlx1MjgzRiIpLAogICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtY29uZmlnLWl0ZW0taWNvbiIsICJhcmlhLWhpZGRlbiI6ICJ0cnVlIiB9LCB3aWRnZXQuaWNvbiksCiAgICAgIGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtY29uZmlnLWl0ZW0taW5mbyIgfSwKICAgICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtY29uZmlnLWl0ZW0tbmFtZSIgfSwgd2lkZ2V0Lm5hbWUpLAogICAgICAgIHdpZGdldC5kZXNjcmlwdGlvbiAmJiBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtY29uZmlnLWl0ZW0tZGVzY3JpcHRpb24iIH0sIHdpZGdldC5kZXNjcmlwdGlvbikKICAgICAgKSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1jb25maWctaXRlbS1hY3Rpb25zIiB9LAogICAgICAgIGgoImJ1dHRvbiIsIHsKICAgICAgICAgIGNsYXNzTmFtZTogImRhc2hib2FyZC1jb25maWctYXJyb3ctYnV0dG9uIiwKICAgICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgICAgZGlzYWJsZWQ6IGlkeCA9PT0gMCwKICAgICAgICAgIHRpdGxlOiAiTW92ZSB1cCIsCiAgICAgICAgICAiYXJpYS1sYWJlbCI6IGBNb3ZlICR7d2lkZ2V0Lm5hbWV9IHVwYCwKICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGN0eC5vbk1vdmUod2lkZ2V0SWQsICJ1cCIpOwogICAgICAgICAgfQogICAgICAgIH0sICJcdTIxOTEiKSwKICAgICAgICBoKCJidXR0b24iLCB7CiAgICAgICAgICBjbGFzc05hbWU6ICJkYXNoYm9hcmQtY29uZmlnLWFycm93LWJ1dHRvbiIsCiAgICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICAgIGRpc2FibGVkOiBpZHggPT09IGNvbWJpbmVkLmxlbmd0aCAtIDEsCiAgICAgICAgICB0aXRsZTogIk1vdmUgZG93biIsCiAgICAgICAgICAiYXJpYS1sYWJlbCI6IGBNb3ZlICR7d2lkZ2V0Lm5hbWV9IGRvd25gLAogICAgICAgICAgb25DbGljazogKGUpID0+IHsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgY3R4Lm9uTW92ZSh3aWRnZXRJZCwgImRvd24iKTsKICAgICAgICAgIH0KICAgICAgICB9LCAiXHUyMTkzIikKICAgICAgKQogICAgKTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyU2VjdGlvbihoLCBzZWN0aW9uSWQsIGxhYmVsLCBpY29uLCBpdGVtcywgY3R4KSB7CiAgICByZXR1cm4gaCgKICAgICAgImRpdiIsCiAgICAgIHsKICAgICAgICBjbGFzc05hbWU6IFsiZGFzaGJvYXJkLWNvbmZpZy1zZWN0aW9uIiwgY3R4LmRyYWdPdmVyU2VjdGlvbiA9PT0gc2VjdGlvbklkID8gImRhc2hib2FyZC1jb25maWctc2VjdGlvbi0tZHJhZy1vdmVyIiA6ICIiXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpLAogICAgICAgIG9uRHJhZ092ZXI6IChlKSA9PiBjdHgub25EcmFnT3ZlclNlY3Rpb24oZSwgc2VjdGlvbklkKSwKICAgICAgICBvbkRyYWdMZWF2ZTogY3R4Lm9uRHJhZ0xlYXZlU2VjdGlvbiwKICAgICAgICBvbkRyb3A6IChlKSA9PiBjdHgub25Ecm9wT25TZWN0aW9uKGUsIHNlY3Rpb25JZCkKICAgICAgfSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1jb25maWctc2VjdGlvbi1oZWFkZXIiIH0sCiAgICAgICAgaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLWNvbmZpZy1zZWN0aW9uLWljb24iLCAiYXJpYS1oaWRkZW4iOiAidHJ1ZSIgfSwgaWNvbiksCiAgICAgICAgaCgiaDQiLCB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1jb25maWctc2VjdGlvbi10aXRsZSIgfSwgbGFiZWwpCiAgICAgICksCiAgICAgIGl0ZW1zLmxlbmd0aCA9PT0gMCA/IGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtY29uZmlnLWVtcHR5IiB9LAogICAgICAgIHNlY3Rpb25JZCA9PT0gInJlbmRlcmVkIiA/ICJEcmFnIGNvbXBvbmVudHMgaGVyZSB0byBzaG93IHRoZW0gb24gdGhlIGRhc2hib2FyZCIgOiAiQWxsIGNvbXBvbmVudHMgYXJlIGN1cnJlbnRseSBzaG93biIKICAgICAgKSA6IGgoImRpdiIsIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLWNvbmZpZy1saXN0IiB9LCAuLi5pdGVtcy5tYXAoKGlkKSA9PiByZW5kZXJJdGVtKGgsIGlkLCBjdHgpKSkKICAgICk7CiAgfQogIGZ1bmN0aW9uIHVzZUxheW91dFN0YXRlKGN1cnJlbnRMYXlvdXQpIHsKICAgIGNvbnN0IHsgcmVuZGVyZWRJZHM6IGluaXRSZW5kZXJlZCwgaGlkZGVuSWRzOiBpbml0SGlkZGVuIH0gPSBkZXJpdmVJbml0aWFsSWRzKGN1cnJlbnRMYXlvdXQpOwogICAgY29uc3QgW3JlbmRlcmVkSWRzLCBzZXRSZW5kZXJlZElkc10gPSAoMCwgaW1wb3J0X3JlYWN0MTMudXNlU3RhdGUpKGluaXRSZW5kZXJlZCk7CiAgICBjb25zdCBbaGlkZGVuSWRzLCBzZXRIaWRkZW5JZHNdID0gKDAsIGltcG9ydF9yZWFjdDEzLnVzZVN0YXRlKShpbml0SGlkZGVuKTsKICAgIGNvbnN0IFtkcmFnZ2luZ0lkLCBzZXREcmFnZ2luZ0lkXSA9ICgwLCBpbXBvcnRfcmVhY3QxMy51c2VTdGF0ZSkobnVsbCk7CiAgICBjb25zdCBbZHJhZ092ZXJJZCwgc2V0RHJhZ092ZXJJZF0gPSAoMCwgaW1wb3J0X3JlYWN0MTMudXNlU3RhdGUpKG51bGwpOwogICAgY29uc3QgW2RyYWdPdmVyU2VjdGlvbiwgc2V0RHJhZ092ZXJTZWN0aW9uXSA9ICgwLCBpbXBvcnRfcmVhY3QxMy51c2VTdGF0ZSkobnVsbCk7CiAgICBjb25zdCBkcmFnSXRlbVJlZiA9ICgwLCBpbXBvcnRfcmVhY3QxMy51c2VSZWYpKG51bGwpOwogICAgY29uc3QgY2xlYXJEcmFnID0gKCkgPT4gewogICAgICBkcmFnSXRlbVJlZi5jdXJyZW50ID0gbnVsbDsKICAgICAgc2V0RHJhZ2dpbmdJZChudWxsKTsKICAgICAgc2V0RHJhZ092ZXJJZChudWxsKTsKICAgICAgc2V0RHJhZ092ZXJTZWN0aW9uKG51bGwpOwogICAgfTsKICAgIGNvbnN0IG9uTW92ZSA9ICh3aWRnZXRJZCwgZGlyZWN0aW9uKSA9PiB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5TW92ZShyZW5kZXJlZElkcywgaGlkZGVuSWRzLCB3aWRnZXRJZCwgZGlyZWN0aW9uKTsKICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgIHNldFJlbmRlcmVkSWRzKHJlc3VsdC5yZW5kZXJlZElkcyk7CiAgICAgICAgc2V0SGlkZGVuSWRzKHJlc3VsdC5oaWRkZW5JZHMpOwogICAgICB9CiAgICB9OwogICAgY29uc3Qgb25EcmFnU3RhcnQgPSAoZSwgd2lkZ2V0SWQpID0+IHsKICAgICAgZHJhZ0l0ZW1SZWYuY3VycmVudCA9IHdpZGdldElkOwogICAgICBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gIm1vdmUiOwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gc2V0RHJhZ2dpbmdJZCh3aWRnZXRJZCkpOwogICAgfTsKICAgIGNvbnN0IG9uRHJhZ0VuZCA9ICgpID0+IGNsZWFyRHJhZygpOwogICAgY29uc3Qgb25EcmFnT3Zlckl0ZW0gPSAoZSwgdGFyZ2V0SWQpID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gIm1vdmUiOwogICAgICBzZXREcmFnT3ZlcklkKHRhcmdldElkKTsKICAgICAgc2V0RHJhZ092ZXJTZWN0aW9uKG51bGwpOwogICAgfTsKICAgIGNvbnN0IG9uRHJhZ092ZXJTZWN0aW9uID0gKGUsIHNlY3Rpb24pID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gIm1vdmUiOwogICAgICBzZXREcmFnT3ZlclNlY3Rpb24oc2VjdGlvbik7CiAgICAgIHNldERyYWdPdmVySWQobnVsbCk7CiAgICB9OwogICAgY29uc3Qgb25EcmFnTGVhdmVTZWN0aW9uID0gKGUpID0+IHsKICAgICAgaWYgKCFlLmN1cnJlbnRUYXJnZXQuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSkKICAgICAgICBzZXREcmFnT3ZlclNlY3Rpb24obnVsbCk7CiAgICB9OwogICAgY29uc3Qgb25Ecm9wT25JdGVtID0gKGUsIHRhcmdldElkKSA9PiB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgY29uc3QgZHJhZ2dlZElkID0gZHJhZ0l0ZW1SZWYuY3VycmVudDsKICAgICAgY2xlYXJEcmFnKCk7CiAgICAgIGlmICghZHJhZ2dlZElkIHx8IGRyYWdnZWRJZCA9PT0gdGFyZ2V0SWQpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCB7IHJlbmRlcmVkSWRzOiByLCBoaWRkZW5JZHM6IGhpIH0gPSBhcHBseURyb3BPbkl0ZW0ocmVuZGVyZWRJZHMsIGhpZGRlbklkcywgZHJhZ2dlZElkLCB0YXJnZXRJZCk7CiAgICAgIHNldFJlbmRlcmVkSWRzKHIpOwogICAgICBzZXRIaWRkZW5JZHMoaGkpOwogICAgfTsKICAgIGNvbnN0IG9uRHJvcE9uU2VjdGlvbiA9IChlLCBzZWN0aW9uKSA9PiB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY29uc3QgZHJhZ2dlZElkID0gZHJhZ0l0ZW1SZWYuY3VycmVudDsKICAgICAgY2xlYXJEcmFnKCk7CiAgICAgIGlmICghZHJhZ2dlZElkKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3QgeyByZW5kZXJlZElkczogciwgaGlkZGVuSWRzOiBoaSB9ID0gYXBwbHlEcm9wT25TZWN0aW9uKHJlbmRlcmVkSWRzLCBoaWRkZW5JZHMsIGRyYWdnZWRJZCwgc2VjdGlvbik7CiAgICAgIHNldFJlbmRlcmVkSWRzKHIpOwogICAgICBzZXRIaWRkZW5JZHMoaGkpOwogICAgfTsKICAgIGNvbnN0IFtoYXNSZXNldCwgc2V0SGFzUmVzZXRdID0gKDAsIGltcG9ydF9yZWFjdDEzLnVzZVN0YXRlKShmYWxzZSk7CiAgICBjb25zdCBvblJlc2V0ID0gKCkgPT4gewogICAgICBzZXRSZW5kZXJlZElkcyhXSURHRVRfUkVHSVNUUlkubWFwKCh3KSA9PiB3LndpZGdldElkKSk7CiAgICAgIHNldEhpZGRlbklkcyhbXSk7CiAgICAgIHNldEhhc1Jlc2V0KHRydWUpOwogICAgfTsKICAgIHJldHVybiB7CiAgICAgIHJlbmRlcmVkSWRzLAogICAgICBoaWRkZW5JZHMsCiAgICAgIGRyYWdnaW5nSWQsCiAgICAgIGRyYWdPdmVySWQsCiAgICAgIGRyYWdPdmVyU2VjdGlvbiwKICAgICAgaGFzUmVzZXQsCiAgICAgIG9uTW92ZSwKICAgICAgb25EcmFnU3RhcnQsCiAgICAgIG9uRHJhZ0VuZCwKICAgICAgb25EcmFnT3Zlckl0ZW0sCiAgICAgIG9uRHJhZ092ZXJTZWN0aW9uLAogICAgICBvbkRyYWdMZWF2ZVNlY3Rpb24sCiAgICAgIG9uRHJvcE9uSXRlbSwKICAgICAgb25Ecm9wT25TZWN0aW9uLAogICAgICBvblJlc2V0CiAgICB9OwogIH0KICBmdW5jdGlvbiBEYXNoYm9hcmRDb25maWdQb3B1cCh7IGN1cnJlbnRMYXlvdXQsIG9uU2F2ZSwgb25DYW5jZWwgfSkgewogICAgY29uc3QgaCA9IGltcG9ydF9yZWFjdDEzLmNyZWF0ZUVsZW1lbnQ7CiAgICBjb25zdCBjdHggPSB1c2VMYXlvdXRTdGF0ZShjdXJyZW50TGF5b3V0KTsKICAgIGNvbnN0IHsgcmVuZGVyZWRJZHMsIGhpZGRlbklkcywgaGFzUmVzZXQsIG9uUmVzZXQgfSA9IGN0eDsKICAgIHJldHVybiBoKAogICAgICAiZGl2IiwKICAgICAgeyBjbGFzc05hbWU6ICJjb25maWctcG9wdXAtb3ZlcmxheSIsIG9uQ2xpY2s6IChlKSA9PiBlLnRhcmdldCA9PT0gZS5jdXJyZW50VGFyZ2V0ICYmIG9uQ2FuY2VsKCkgfSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC1jb250YWluZXIgZGFzaGJvYXJkLWNvbmZpZy1jb250YWluZXIiIH0sCiAgICAgICAgaCgKICAgICAgICAgICJkaXYiLAogICAgICAgICAgeyBjbGFzc05hbWU6ICJjb25maWctcG9wdXAtaGVhZGVyIiB9LAogICAgICAgICAgaCgiaDMiLCB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC10aXRsZSIgfSwgIlx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgTGF5b3V0IikKICAgICAgICApLAogICAgICAgIGgoCiAgICAgICAgICAiZGl2IiwKICAgICAgICAgIHsgY2xhc3NOYW1lOiAiY29uZmlnLXBvcHVwLWJvZHkgZGFzaGJvYXJkLWNvbmZpZy1ib2R5IiB9LAogICAgICAgICAgcmVuZGVyU2VjdGlvbihoLCAicmVuZGVyZWQiLCAiUmVuZGVyZWQgRGFzaGJvYXJkIEVsZW1lbnRzIiwgIlx1ezFGNDQxfSIsIHJlbmRlcmVkSWRzLCBjdHgpLAogICAgICAgICAgcmVuZGVyU2VjdGlvbihoLCAiaGlkZGVuIiwgIkhpZGRlbiBEYXNoYm9hcmQgRWxlbWVudHMiLCAiXHV7MUY2QUJ9IiwgaGlkZGVuSWRzLCBjdHgpCiAgICAgICAgKSwKICAgICAgICBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC1hY3Rpb25zIiB9LAogICAgICAgICAgaCgiYnV0dG9uIiwgeyBjbGFzc05hbWU6ICJjb25maWctcG9wdXAtbGluayIsIHR5cGU6ICJidXR0b24iLCBvbkNsaWNrOiBvblJlc2V0IH0sICJSZXNldCB0byBkZWZhdWx0cyIpLAogICAgICAgICAgaCgiYnV0dG9uIiwgeyBjbGFzc05hbWU6ICJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsIHR5cGU6ICJidXR0b24iLCBvbkNsaWNrOiBvbkNhbmNlbCB9LCAiQ2FuY2VsIiksCiAgICAgICAgICBoKCJidXR0b24iLCB7IGNsYXNzTmFtZTogImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tc3VibWl0IiwgdHlwZTogImJ1dHRvbiIsIG9uQ2xpY2s6ICgpID0+IG9uU2F2ZShyZW5kZXJlZElkcywgeyBpc1Jlc2V0OiBoYXNSZXNldCB9KSB9LCAiU2F2ZSBMYXlvdXQiKQogICAgICAgICkKICAgICAgKQogICAgKTsKICB9CgogIC8vIGxpYi9kYXNoYm9hcmQvZGFzaGJvYXJkLXNldHRpbmdzLXBvcHVwLmpzCiAgdmFyIGltcG9ydF9yZWFjdDE1ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCkpOwoKICAvLyBsaWIvY29uc3RhbnRzL3VuaXRzLmpzCiAgdmFyIEtJTE9CWVRFID0gMTAyNDsKICB2YXIgVE9LRU5fQ0hBUkFDVEVSUyA9IDQ7CgogIC8vIGxpYi9jb25zdGFudHMvbGxtLXByb3ZpZGVycy5qcwogIHZhciBERUZBVUxUX01PREVMX1RPS0VOX0xJTUlUID0gNTAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlM7CiAgdmFyIFBST1ZJREVSX0FQSV9LRVlfUkVUUklFVkVfVVJMID0gewogICAgYW50aHJvcGljOiAiaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vc2V0dGluZ3Mva2V5cyIsCiAgICBkZWVwc2VlazogImh0dHBzOi8vcGxhdGZvcm0uZGVlcHNlZWsuY29tL2FwaV9rZXlzIiwKICAgIGdlbWluaTogImh0dHBzOi8vYWlzdHVkaW8uZ29vZ2xlLmNvbS9hcHAvYXBpLWtleXMiLAogICAgZ3JvazogImh0dHBzOi8vY29uc29sZS54LmFpL3RlYW0vZGVmYXVsdC9hcGkta2V5cyIsCiAgICAvLyBPcmlnaW5hbGx5IENsYXVkZSB0aG91Z2h0IGl0IGh0dHBzOi8veC5jb20vc2V0dGluZ3MvZ3Jvay9hcGkta2V5cyIKICAgIG9wZW5haTogImh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9hcGkta2V5cyIsCiAgICAvLyBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2F1dGhlbnRpY2F0aW9uCiAgICBwZXJwbGV4aXR5OiAiaHR0cHM6Ly93d3cucGVycGxleGl0eS5haS9hY2NvdW50L2FwaS9rZXlzIgogIH07CiAgdmFyIFBST1ZJREVSX0VORFBPSU5UUyA9IHsKICAgIGFudGhyb3BpYzogImh0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMiLAogICAgZGVlcHNlZWs6ICJodHRwczovL2FwaS5kZWVwc2Vlay5jb20vdjEvY2hhdC9jb21wbGV0aW9ucyIsCiAgICBnZW1pbmk6ICJodHRwczovL2dlbmVyYXRpdmVsYW5ndWFnZS5nb29nbGVhcGlzLmNvbS92MWJldGEvbW9kZWxzL3ttb2RlbC1uYW1lfTpnZW5lcmF0ZUNvbnRlbnQiLAogICAgZ3JvazogImh0dHBzOi8vYXBpLnguYWkvdjEvY2hhdC9jb21wbGV0aW9ucyIsCiAgICBvcGVuYWk6ICJodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL2NoYXQvY29tcGxldGlvbnMiLAogICAgLy8gaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9jaGF0L2NyZWF0ZQogICAgcGVycGxleGl0eTogImh0dHBzOi8vYXBpLnBlcnBsZXhpdHkuYWkvY2hhdC9jb21wbGV0aW9ucyIKICB9OwogIHZhciBSRU1PVEVfQUlfUFJPVklERVJfRU1TID0gT2JqZWN0LmtleXMoUFJPVklERVJfRU5EUE9JTlRTKTsKICB2YXIgQU5USFJPUElDX1RPS0VOX0xJTUlUUyA9IHsKICAgIC8vIExhdGVzdCBtb2RlbHMgKENsYXVkZSA0LjUgZmFtaWx5KQogICAgImNsYXVkZS1zb25uZXQtNC01IjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImNsYXVkZS1zb25uZXQtNC01LTIwMjUwOTI5IjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImNsYXVkZS1oYWlrdS00LTUiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiY2xhdWRlLWhhaWt1LTQtNS0yMDI1MTAwMSI6IDIwMCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJjbGF1ZGUtb3B1cy00LTUiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiY2xhdWRlLW9wdXMtNC01LTIwMjUxMTAxIjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgLy8gTGVnYWN5IG1vZGVscyAoQ2xhdWRlIDQgZmFtaWx5KQogICAgImNsYXVkZS1vcHVzLTQtMSI6IDIwMCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJjbGF1ZGUtb3B1cy00LTEtMjAyNTA4MDUiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiY2xhdWRlLXNvbm5ldC00LTAiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0IjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImNsYXVkZS0zLTctc29ubmV0LWxhdGVzdCI6IDIwMCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJjbGF1ZGUtMy03LXNvbm5ldC0yMDI1MDIxOSI6IDIwMCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJjbGF1ZGUtb3B1cy00LTAiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiY2xhdWRlLW9wdXMtNC0yMDI1MDUxNCI6IDIwMCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgIC8vIExlZ2FjeSBtb2RlbHMgKENsYXVkZSAzLjUgZmFtaWx5KQogICAgImNsYXVkZS0zLTUtaGFpa3UtbGF0ZXN0IjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImNsYXVkZS0zLTUtaGFpa3UtMjAyNDEwMjIiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiY2xhdWRlLTMtNS1zb25uZXQtbGF0ZXN0IjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgLy8gTGVnYWN5IG1vZGVscyAoQ2xhdWRlIDMgZmFtaWx5KQogICAgImNsYXVkZS0zLWhhaWt1LTIwMjQwMzA3IjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTCiAgfTsKICB2YXIgREVFUFNFRUtfVE9LRU5fTElNSVRTID0gewogICAgImRlZXBzZWVrLWNoYXQiOiA2NCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJkZWVwc2Vlay1yZWFzb25lciI6IDY0ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImRlZXBzZWVrLXIxIjogNjQgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiZGVlcHNlZWstcjEtMDUyOCI6IDY0ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTCiAgfTsKICB2YXIgR0VNSU5JX1RPS0VOX0xJTUlUUyA9IHsKICAgIC8vIEdlbWluaSAzIGZhbWlseQogICAgImdlbWluaS0zLWZsYXNoIjogNjQgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiZ2VtaW5pLTMtZmxhc2gtcHJldmlldyI6IDY0ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdlbWluaS0zLXBybyI6IDEwMjQgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiZ2VtaW5pLTMtcHJvLXByZXZpZXciOiAxMDI0ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdlbWluaS0zLXByby1pbWFnZS1wcmV2aWV3IjogNjQgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAvLyBHZW1pbmkgMi41IGZhbWlseQogICAgImdlbWluaS0yLjUtcHJvIjogMTAyNCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJnZW1pbmktMi41LWZsYXNoIjogMTAyNCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJnZW1pbmktMi41LWZsYXNoLWxpdGUiOiAxMDI0ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdlbWluaS0yLjUtZmxhc2gtbGl0ZS1wcmV2aWV3LTA2LTE3IjogMTAyNCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgIC8vIEdlbWluaSAyLjAgZmFtaWx5CiAgICAiZ2VtaW5pLTIuMC1mbGFzaCI6IDEwMjQgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiZ2VtaW5pLTIuMC1mbGFzaC1saXRlIjogMTAyNCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUwogIH07CiAgdmFyIEdST0tfVE9LRU5fTElNSVRTID0gewogICAgImdyb2stNC0xLWZhc3QiOiAyMDQ4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdyb2stNC1mYXN0IjogMjA0OCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJncm9rLTQiOiAyNTYgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiZ3Jvay00LTA3MDkiOiAyNTYgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAvLyBHcm9rIDMgZmFtaWx5CiAgICAiZ3Jvay0zIjogMTI4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdyb2stMy1iZXRhIjogMTI4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdyb2stMy1taW5pIjogMTI4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdyb2stMy1taW5pLWJldGEiOiAxMjggKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAvLyBHcm9rIDIgZmFtaWx5CiAgICAiZ3Jvay0yLXZpc2lvbi0xMjEyIjogOCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJncm9rLTItaW1hZ2UtMTIxMiI6IDEyOCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJncm9rLTItMTIxMiI6IDEyOCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUwogIH07CiAgdmFyIE9QRU5BSV9UT0tFTl9MSU1JVFMgPSB7CiAgICAiZ3B0LTUuMiI6IDQwMCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJncHQtNS4xIjogNDAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdwdC01LjEtY29kZXgtbWF4IjogNDAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdwdC01IjogNDAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdwdC01LWZhc3QiOiA0MDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiZ3B0LTUtdGhpbmtpbmciOiA0MDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAvLyBHUFQtNC4xIGZhbWlseQogICAgImdwdC00LjEiOiAxZTMgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAiZ3B0LTQuMS1taW5pIjogMTI4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgLy8gR1BULTRvIGZhbWlseQogICAgImdwdC00byI6IDEyOCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJncHQtNG8tbWluaSI6IDEyOCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgIC8vIE8tc2VyaWVzIG1vZGVscwogICAgIm8zIjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgIm8zLW1pbmkiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAibzMtcHJvIjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgIm80LW1pbmkiOiAyMDAgKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAvLyBMZWdhY3kgR1BULTQgbW9kZWxzCiAgICAiZ3B0LTQiOiA4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdwdC00LTExMDYtcHJldmlldyI6IDEyOCAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJncHQtNC0zMmsiOiAzMiAqIEtJTE9CWVRFICogVE9LRU5fQ0hBUkFDVEVSUywKICAgICJncHQtNC0zMmstMDYxMyI6IDMyICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgImdwdC00LXZpc2lvbi1wcmV2aWV3IjogMTI4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTCiAgfTsKICB2YXIgUEVSUExFWElUWV9UT0tFTl9MSU1JVFMgPSB7CiAgICAic29uYXItcHJvIjogMjAwICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgInNvbmFyIjogMTI4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgInNvbmFyLXJlYXNvbmluZy1wcm8iOiAxMjggKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMsCiAgICAic29uYXItcmVhc29uaW5nIjogMTI4ICogS0lMT0JZVEUgKiBUT0tFTl9DSEFSQUNURVJTLAogICAgInNvbmFyLWRlZXAtcmVzZWFyY2giOiAxMjggKiBLSUxPQllURSAqIFRPS0VOX0NIQVJBQ1RFUlMKICB9OwogIHZhciBNT0RFTF9UT0tFTl9MSU1JVFMgPSB7CiAgICAuLi5BTlRIUk9QSUNfVE9LRU5fTElNSVRTLAogICAgLi4uREVFUFNFRUtfVE9LRU5fTElNSVRTLAogICAgLi4uR0VNSU5JX1RPS0VOX0xJTUlUUywKICAgIC4uLkdST0tfVE9LRU5fTElNSVRTLAogICAgLi4uT1BFTkFJX1RPS0VOX0xJTUlUUwogICAgLy8gLi4uUEVSUExFWElUWV9UT0tFTl9MSU1JVFMsCiAgfTsKICB2YXIgTU9ERUxTX1BFUl9QUk9WSURFUiA9IHsKICAgIGFudGhyb3BpYzogT2JqZWN0LmtleXMoQU5USFJPUElDX1RPS0VOX0xJTUlUUyksCiAgICBkZWVwc2VlazogT2JqZWN0LmtleXMoREVFUFNFRUtfVE9LRU5fTElNSVRTKSwKICAgIGdlbWluaTogT2JqZWN0LmtleXMoR0VNSU5JX1RPS0VOX0xJTUlUUyksCiAgICBncm9rOiBPYmplY3Qua2V5cyhHUk9LX1RPS0VOX0xJTUlUUyksCiAgICBvcGVuYWk6IE9iamVjdC5rZXlzKE9QRU5BSV9UT0tFTl9MSU1JVFMpCiAgICAvLyBwZXJwbGV4aXR5OiBPYmplY3Qua2V5cyhQRVJQTEVYSVRZX1RPS0VOX0xJTUlUUyksCiAgfTsKCiAgLy8gbGliL2hvb2tzL3VzZS1iYWNrZ3JvdW5kLXVwbG9hZC1maWVsZHMuanMKICB2YXIgaW1wb3J0X3JlYWN0MTQgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSk7CiAgZnVuY3Rpb24gZmlsZVRvRGF0YVVSTChmaWxlKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZSkgPT4gewogICAgICAgIHJlYWRlci5hYm9ydCgpOwogICAgICAgIHJlamVjdChlLnRhcmdldC5lcnJvcik7CiAgICAgIH07CiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIHVzZUJhY2tncm91bmRVcGxvYWRGaWVsZHMoeyBpbml0aWFsSW1hZ2VVcmwgPSAiIiwgaW5pdGlhbE1vZGUgPSAiY292ZXIiIH0gPSB7fSkgewogICAgY29uc3QgW2JhY2tncm91bmRJbWFnZVVybCwgc2V0QmFja2dyb3VuZEltYWdlVXJsXSA9ICgwLCBpbXBvcnRfcmVhY3QxNC51c2VTdGF0ZSkoaW5pdGlhbEltYWdlVXJsKTsKICAgIGNvbnN0IFtiYWNrZ3JvdW5kTW9kZSwgc2V0QmFja2dyb3VuZE1vZGVdID0gKDAsIGltcG9ydF9yZWFjdDE0LnVzZVN0YXRlKShpbml0aWFsTW9kZSk7CiAgICBjb25zdCBbdXBsb2FkaW5nLCBzZXRVcGxvYWRpbmddID0gKDAsIGltcG9ydF9yZWFjdDE0LnVzZVN0YXRlKShmYWxzZSk7CiAgICBjb25zdCBbZHJhZ092ZXIsIHNldERyYWdPdmVyXSA9ICgwLCBpbXBvcnRfcmVhY3QxNC51c2VTdGF0ZSkoZmFsc2UpOwogICAgY29uc3QgZmlsZUlucHV0UmVmID0gKDAsIGltcG9ydF9yZWFjdDE0LnVzZVJlZikobnVsbCk7CiAgICBjb25zdCBoYW5kbGVGaWxlVXBsb2FkID0gKDAsIGltcG9ydF9yZWFjdDE0LnVzZUNhbGxiYWNrKShhc3luYyAoZmlsZSkgPT4gewogICAgICBpZiAoIWZpbGUgfHwgIWZpbGUudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgewogICAgICAgIGNvbnNvbGUud2FybigiW2JnLXVwbG9hZF0gcmVqZWN0ZWQgZmlsZSAobm90IGFuIGltYWdlIG9yIG1pc3NpbmcpOiIsIGZpbGU/LnR5cGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zb2xlLmxvZygiW2JnLXVwbG9hZF0gc3RhcnRpbmcgdXBsb2FkIGZvcjoiLCBmaWxlLm5hbWUsIGZpbGUudHlwZSwgZmlsZS5zaXplLCAiYnl0ZXMiKTsKICAgICAgc2V0VXBsb2FkaW5nKHRydWUpOwogICAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGFVUkwgPSBhd2FpdCBmaWxlVG9EYXRhVVJMKGZpbGUpOwogICAgICAgIGNvbnNvbGUubG9nKCJbYmctdXBsb2FkXSBmaWxlIGNvbnZlcnRlZCB0byBkYXRhIFVSTCwgbGVuZ3RoOiIsIGRhdGFVUkwubGVuZ3RoKTsKICAgICAgICBjb25zdCBmaWxlVVJMID0gYXdhaXQgY2FsbFBsdWdpbigidXBsb2FkQmFja2dyb3VuZEltYWdlIiwgZGF0YVVSTCk7CiAgICAgICAgY29uc29sZS5sb2coIltiZy11cGxvYWRdIGNhbGxQbHVnaW4gcmV0dXJuZWQgVVJMOiIsIGZpbGVVUkwpOwogICAgICAgIGlmIChmaWxlVVJMKSB7CiAgICAgICAgICBzZXRCYWNrZ3JvdW5kSW1hZ2VVcmwoZmlsZVVSTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUud2FybigiW2JnLXVwbG9hZF0gY2FsbFBsdWdpbiByZXR1cm5lZCBmYWxzeSBVUkwgXHUyMDE0IHVwbG9hZCBtYXkgaGF2ZSBmYWlsZWQgc2lsZW50bHkiKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIltiZy11cGxvYWRdIHVwbG9hZCBGQUlMRUQgd2l0aCBleGNlcHRpb246IiwgZXJyKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBzZXRVcGxvYWRpbmcoZmFsc2UpOwogICAgICAgIGNvbnNvbGUubG9nKCJbYmctdXBsb2FkXSB1cGxvYWQgZmxvdyBjb21wbGV0ZSIpOwogICAgICB9CiAgICB9LCBbXSk7CiAgICBjb25zdCBoYW5kbGVEcm9wID0gKDAsIGltcG9ydF9yZWFjdDE0LnVzZUNhbGxiYWNrKSgoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNldERyYWdPdmVyKGZhbHNlKTsKICAgICAgY29uc3QgZmlsZSA9IGUuZGF0YVRyYW5zZmVyPy5maWxlcz8uWzBdOwogICAgICBpZiAoZmlsZSkKICAgICAgICBoYW5kbGVGaWxlVXBsb2FkKGZpbGUpOwogICAgfSwgW2hhbmRsZUZpbGVVcGxvYWRdKTsKICAgIGNvbnN0IGhhbmRsZURyYWdPdmVyID0gKDAsIGltcG9ydF9yZWFjdDE0LnVzZUNhbGxiYWNrKSgoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNldERyYWdPdmVyKHRydWUpOwogICAgfSwgW10pOwogICAgY29uc3QgaGFuZGxlRHJhZ0xlYXZlID0gKDAsIGltcG9ydF9yZWFjdDE0LnVzZUNhbGxiYWNrKSgoZSkgPT4gewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHNldERyYWdPdmVyKGZhbHNlKTsKICAgIH0sIFtdKTsKICAgIGNvbnN0IGhhbmRsZUZpbGVJbnB1dENoYW5nZSA9ICgwLCBpbXBvcnRfcmVhY3QxNC51c2VDYWxsYmFjaykoKGUpID0+IHsKICAgICAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzPy5bMF07CiAgICAgIGlmIChmaWxlKQogICAgICAgIGhhbmRsZUZpbGVVcGxvYWQoZmlsZSk7CiAgICB9LCBbaGFuZGxlRmlsZVVwbG9hZF0pOwogICAgY29uc3QgaGFuZGxlUmVtb3ZlSW1hZ2UgPSAoMCwgaW1wb3J0X3JlYWN0MTQudXNlQ2FsbGJhY2spKGFzeW5jICgpID0+IHsKICAgICAgaWYgKCFjb25maXJtKCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHlvdXIgYmFja2dyb3VuZCBpbWFnZT8iKSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnNvbGUubG9nKCJbYmctdXBsb2FkXSByZW1vdmluZyBiYWNrZ3JvdW5kIGltYWdlIik7CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgY2FsbFBsdWdpbigicmVtb3ZlQmFja2dyb3VuZEltYWdlIik7CiAgICAgICAgc2V0QmFja2dyb3VuZEltYWdlVXJsKCIiKTsKICAgICAgICBjb25zb2xlLmxvZygiW2JnLXVwbG9hZF0gYmFja2dyb3VuZCBpbWFnZSByZW1vdmVkIik7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIltiZy11cGxvYWRdIHJlbW92ZSBGQUlMRUQ6IiwgZXJyKTsKICAgICAgfQogICAgfSwgW10pOwogICAgcmV0dXJuIHsKICAgICAgYmFja2dyb3VuZEltYWdlVXJsLAogICAgICBiYWNrZ3JvdW5kTW9kZSwKICAgICAgc2V0QmFja2dyb3VuZE1vZGUsCiAgICAgIHVwbG9hZGluZywKICAgICAgZHJhZ092ZXIsCiAgICAgIGZpbGVJbnB1dFJlZiwKICAgICAgaGFuZGxlRHJvcCwKICAgICAgaGFuZGxlRHJhZ092ZXIsCiAgICAgIGhhbmRsZURyYWdMZWF2ZSwKICAgICAgaGFuZGxlRmlsZUlucHV0Q2hhbmdlLAogICAgICBoYW5kbGVSZW1vdmVJbWFnZQogICAgfTsKICB9CgogIC8vIGxpYi9kYXNoYm9hcmQvZGFzaGJvYXJkLXNldHRpbmdzLXBvcHVwLmpzCiAgdmFyIExMTV9PUFRJT05TID0gWwogICAgeyB2YWx1ZTogIm5vbmUiLCBsYWJlbDogIk5vbmUgKGRpc2FibGUgQUkgZmVhdHVyZXMpIiwgYXBpS2V5UHJvdmlkZXI6IG51bGwgfSwKICAgIHsgdmFsdWU6ICJvcGVuYWkiLCBsYWJlbDogIk9wZW5BSSBDaGF0R1BUIiwgYXBpS2V5UHJvdmlkZXI6ICJvcGVuYWkiIH0sCiAgICB7IHZhbHVlOiAiYW50aHJvcGljIiwgbGFiZWw6ICJBbnRocm9waWMgQ2xhdWRlIiwgYXBpS2V5UHJvdmlkZXI6ICJhbnRocm9waWMiIH0sCiAgICB7IHZhbHVlOiAiYW50aHJvcGljLXNvbm5ldCIsIGxhYmVsOiAiQW50aHJvcGljIFNvbm5ldCIsIGFwaUtleVByb3ZpZGVyOiAiYW50aHJvcGljIiB9LAogICAgeyB2YWx1ZTogImdlbWluaSIsIGxhYmVsOiAiR29vZ2xlIEdlbWluaSIsIGFwaUtleVByb3ZpZGVyOiAiZ2VtaW5pIiB9LAogICAgeyB2YWx1ZTogImdyb2siLCBsYWJlbDogIkdyb2siLCBhcGlLZXlQcm92aWRlcjogImdyb2siIH0KICBdOwogIGZ1bmN0aW9uIERhc2hib2FyZFNldHRpbmdzUG9wdXAoewogICAgY3VycmVudExsbVByb3ZpZGVyLAogICAgY3VycmVudEFwaUtleSwKICAgIGN1cnJlbnRCYWNrZ3JvdW5kSW1hZ2VVcmwsCiAgICBjdXJyZW50QmFja2dyb3VuZE1vZGUsCiAgICBvblNhdmUsCiAgICBvbkNhbmNlbAogIH0pIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3QxNS5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgW3NlbGVjdGVkUHJvdmlkZXIsIHNldFNlbGVjdGVkUHJvdmlkZXJdID0gKDAsIGltcG9ydF9yZWFjdDE1LnVzZVN0YXRlKShjdXJyZW50TGxtUHJvdmlkZXIgfHwgIm9wZW5haSIpOwogICAgY29uc3QgW2FwaUtleSwgc2V0QXBpS2V5XSA9ICgwLCBpbXBvcnRfcmVhY3QxNS51c2VTdGF0ZSkoY3VycmVudEFwaUtleSB8fCAiIik7CiAgICBjb25zdCBbYXBpS2V5VmlzaWJsZSwgc2V0QXBpS2V5VmlzaWJsZV0gPSAoMCwgaW1wb3J0X3JlYWN0MTUudXNlU3RhdGUpKGZhbHNlKTsKICAgIGNvbnNvbGUubG9nKCJbc2V0dGluZ3MtcG9wdXBdIHJlbmRlcmluZyBEYXNoYm9hcmRTZXR0aW5nc1BvcHVwLCBjdXJyZW50QmFja2dyb3VuZEltYWdlVXJsOiIsIGN1cnJlbnRCYWNrZ3JvdW5kSW1hZ2VVcmwpOwogICAgY29uc3QgewogICAgICBiYWNrZ3JvdW5kSW1hZ2VVcmwsCiAgICAgIGJhY2tncm91bmRNb2RlLAogICAgICBzZXRCYWNrZ3JvdW5kTW9kZSwKICAgICAgdXBsb2FkaW5nLAogICAgICBkcmFnT3ZlciwKICAgICAgZmlsZUlucHV0UmVmLAogICAgICBoYW5kbGVEcm9wLAogICAgICBoYW5kbGVEcmFnT3ZlciwKICAgICAgaGFuZGxlRHJhZ0xlYXZlLAogICAgICBoYW5kbGVGaWxlSW5wdXRDaGFuZ2UsCiAgICAgIGhhbmRsZVJlbW92ZUltYWdlCiAgICB9ID0gdXNlQmFja2dyb3VuZFVwbG9hZEZpZWxkcyh7CiAgICAgIGluaXRpYWxJbWFnZVVybDogY3VycmVudEJhY2tncm91bmRJbWFnZVVybCwKICAgICAgaW5pdGlhbE1vZGU6IGN1cnJlbnRCYWNrZ3JvdW5kTW9kZQogICAgfSk7CiAgICBjb25zdCBwcm92aWRlck9wdGlvbiA9IExMTV9PUFRJT05TLmZpbmQoKG8pID0+IG8udmFsdWUgPT09IHNlbGVjdGVkUHJvdmlkZXIpIHx8IExMTV9PUFRJT05TWzBdOwogICAgY29uc3QgYXBpS2V5VXJsID0gUFJPVklERVJfQVBJX0tFWV9SRVRSSUVWRV9VUkxbcHJvdmlkZXJPcHRpb24uYXBpS2V5UHJvdmlkZXJdOwogICAgY29uc3QgcHJvdmlkZXJOYW1lID0gTExNX09QVElPTlMuZmluZCgob3B0KSA9PiBvcHQudmFsdWUgPT09IHNlbGVjdGVkUHJvdmlkZXIpPy5sYWJlbDsKICAgIHJldHVybiBoKAogICAgICBDb25maWdQb3B1cCwKICAgICAgewogICAgICAgIHRpdGxlOiAiXHUyNjk5XHVGRTBGIERhc2hib2FyZCBTZXR0aW5ncyIsCiAgICAgICAgb25TdWJtaXQ6ICgpID0+IG9uU2F2ZSh7IGxsbVByb3ZpZGVyOiBzZWxlY3RlZFByb3ZpZGVyLCBhcGlLZXksIGJhY2tncm91bmRNb2RlIH0pLAogICAgICAgIG9uQ2FuY2VsLAogICAgICAgIHN1Ym1pdExhYmVsOiAiU2F2ZSBTZXR0aW5ncyIKICAgICAgfSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1jb250YWluZXIiIH0sCiAgICAgICAgLy8g4pSA4pSAIEJhY2tncm91bmQgSW1hZ2Ugc2VjdGlvbiDilIDilIAKICAgICAgICBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uIiB9LAogICAgICAgICAgaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24taGVhZGVyIiB9LAogICAgICAgICAgICBoKCJoNCIsIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tdGl0bGUiIH0sICJCYWNrZ3JvdW5kIEltYWdlIiksCiAgICAgICAgICAgIGgoCiAgICAgICAgICAgICAgInAiLAogICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyIgfSwKICAgICAgICAgICAgICAiVXBsb2FkIGFuIGltYWdlIHRvIHVzZSBhcyB5b3VyIGRhc2hib2FyZCBiYWNrZ3JvdW5kLiIKICAgICAgICAgICAgKQogICAgICAgICAgKSwKICAgICAgICAgIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IGNsYXNzTmFtZTogImNvbmZpZy1maWVsZCIgfSwKICAgICAgICAgICAgaCgKICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGBkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUke2RyYWdPdmVyID8gIiBkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtLWFjdGl2ZSIgOiAiIn0ke3VwbG9hZGluZyA/ICIgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLS11cGxvYWRpbmciIDogIiJ9YCwKICAgICAgICAgICAgICAgIG9uRHJvcDogaGFuZGxlRHJvcCwKICAgICAgICAgICAgICAgIG9uRHJhZ092ZXI6IGhhbmRsZURyYWdPdmVyLAogICAgICAgICAgICAgICAgb25EcmFnTGVhdmU6IGhhbmRsZURyYWdMZWF2ZSwKICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+ICF1cGxvYWRpbmcgJiYgZmlsZUlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKCkKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGgoImlucHV0IiwgewogICAgICAgICAgICAgICAgcmVmOiBmaWxlSW5wdXRSZWYsCiAgICAgICAgICAgICAgICB0eXBlOiAiZmlsZSIsCiAgICAgICAgICAgICAgICBhY2NlcHQ6ICJpbWFnZS8qIiwKICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS1pbnB1dCIsCiAgICAgICAgICAgICAgICBvbkNoYW5nZTogaGFuZGxlRmlsZUlucHV0Q2hhbmdlCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgdXBsb2FkaW5nID8gaCgic3BhbiIsIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQiIH0sICJVcGxvYWRpbmcuLi4iKSA6IGJhY2tncm91bmRJbWFnZVVybCA/IGgoCiAgICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXByZXZpZXciIH0sCiAgICAgICAgICAgICAgICBoKCJpbWciLCB7CiAgICAgICAgICAgICAgICAgIHNyYzogYmFja2dyb3VuZEltYWdlVXJsLAogICAgICAgICAgICAgICAgICBhbHQ6ICJCYWNrZ3JvdW5kIHByZXZpZXciLAogICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtcHJldmlldy1pbWciLAogICAgICAgICAgICAgICAgICBvbkxvYWQ6ICgpID0+IGNvbnNvbGUubG9nKCJbc2V0dGluZ3MtcG9wdXBdIGJhY2tncm91bmQgcHJldmlldyBpbWFnZSBsb2FkZWQgT0s6IiwgYmFja2dyb3VuZEltYWdlVXJsKSwKICAgICAgICAgICAgICAgICAgb25FcnJvcjogKGUpID0+IGNvbnNvbGUuZXJyb3IoIltzZXR0aW5ncy1wb3B1cF0gYmFja2dyb3VuZCBwcmV2aWV3IGltYWdlIEZBSUxFRCB0byBsb2FkOiIsIGJhY2tncm91bmRJbWFnZVVybCwgZS50eXBlKQogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICBoKCJzcGFuIiwgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtdGV4dCIgfSwgIkRyb3AgYSBuZXcgaW1hZ2Ugb3IgY2xpY2sgdG8gcmVwbGFjZSIpCiAgICAgICAgICAgICAgKSA6IGgoCiAgICAgICAgICAgICAgICAic3BhbiIsCiAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS10ZXh0IiB9LAogICAgICAgICAgICAgICAgIkRyYWcgJiBkcm9wIGFuIGltYWdlIGhlcmUsIG9yIGNsaWNrIHRvIHVwbG9hZCIKICAgICAgICAgICAgICApCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVVybCAmJiBoKCJhIiwgewogICAgICAgICAgICAgIGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1yZW1vdmUtaW1hZ2UiLAogICAgICAgICAgICAgIGhyZWY6ICIjIiwKICAgICAgICAgICAgICBvbkNsaWNrOiAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgaGFuZGxlUmVtb3ZlSW1hZ2UoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sICJSZW1vdmUgaW1hZ2UiKQogICAgICAgICAgKSwKICAgICAgICAgIGJhY2tncm91bmRJbWFnZVVybCAmJiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJjb25maWctZmllbGQiIH0sCiAgICAgICAgICAgIGgoImRpdiIsIHsgY2xhc3NOYW1lOiAiY29uZmlnLWZpZWxkLWxhYmVsIiB9LCAiRGlzcGxheSBNb2RlIiksCiAgICAgICAgICAgIGgoInNlbGVjdCIsIHsKICAgICAgICAgICAgICBjbGFzc05hbWU6ICJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VsZWN0IiwKICAgICAgICAgICAgICB2YWx1ZTogYmFja2dyb3VuZE1vZGUsCiAgICAgICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRCYWNrZ3JvdW5kTW9kZShlLnRhcmdldC52YWx1ZSkKICAgICAgICAgICAgfSwgLi4uQkFDS0dST1VORF9NT0RFX09QVElPTlMubWFwKAogICAgICAgICAgICAgIChvcHQpID0+IGgoIm9wdGlvbiIsIHsga2V5OiBvcHQudmFsdWUsIHZhbHVlOiBvcHQudmFsdWUgfSwgb3B0LmxhYmVsKQogICAgICAgICAgICApKQogICAgICAgICAgKQogICAgICAgICksCiAgICAgICAgLy8g4pSA4pSAIEFJIFNldHRpbmdzIHNlY3Rpb24g4pSA4pSACiAgICAgICAgaCgKICAgICAgICAgICJkaXYiLAogICAgICAgICAgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiIgfSwKICAgICAgICAgIGgoCiAgICAgICAgICAgICJkaXYiLAogICAgICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWhlYWRlciIgfSwKICAgICAgICAgICAgaCgiaDQiLCB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLXRpdGxlIiB9LCAiQUkgU2V0dGluZ3MiKSwKICAgICAgICAgICAgaCgKICAgICAgICAgICAgICAicCIsCiAgICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1kZXNjIiB9LAogICAgICAgICAgICAgICJDb25uZWN0IHlvdXIgZGFzaGJvYXJkIHRvIGFuIExMTSB0byBoYXZlIHlvdXIgcXVhcnRlcmx5IHBsYW4gaW50ZXJwcmV0ZWQgaW50byBzdWdnZXN0ZWQgdGFza3MuIgogICAgICAgICAgICApCiAgICAgICAgICApLAogICAgICAgICAgaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAiY29uZmlnLWZpZWxkIiB9LAogICAgICAgICAgICBoKCJkaXYiLCB7IGNsYXNzTmFtZTogImNvbmZpZy1maWVsZC1sYWJlbCIgfSwgIkxMTSBQcm92aWRlciIpLAogICAgICAgICAgICBoKCJzZWxlY3QiLCB7CiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXNldHRpbmdzLXNlbGVjdCIsCiAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUHJvdmlkZXIsCiAgICAgICAgICAgICAgb25DaGFuZ2U6IChlKSA9PiBzZXRTZWxlY3RlZFByb3ZpZGVyKGUudGFyZ2V0LnZhbHVlKQogICAgICAgICAgICB9LCAuLi5MTE1fT1BUSU9OUy5tYXAoCiAgICAgICAgICAgICAgKG9wdCkgPT4gaCgib3B0aW9uIiwgeyBrZXk6IG9wdC52YWx1ZSwgdmFsdWU6IG9wdC52YWx1ZSB9LCBvcHQubGFiZWwpCiAgICAgICAgICAgICkpCiAgICAgICAgICApLAogICAgICAgICAgcHJvdmlkZXJPcHRpb24uYXBpS2V5UHJvdmlkZXIgJiYgaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAiY29uZmlnLWZpZWxkIiB9LAogICAgICAgICAgICBoKCJkaXYiLCB7IGNsYXNzTmFtZTogImNvbmZpZy1maWVsZC1sYWJlbCIgfSwgIkFQSSBLZXkiKSwKICAgICAgICAgICAgaCgiYSIsIHsKICAgICAgICAgICAgICBjbGFzc05hbWU6ICJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1saW5rIiwKICAgICAgICAgICAgICBocmVmOiBhcGlLZXlVcmwsCiAgICAgICAgICAgICAgdGFyZ2V0OiAiX2JsYW5rIiwKICAgICAgICAgICAgICByZWw6ICJub29wZW5lciBub3JlZmVycmVyIgogICAgICAgICAgICB9LCBgUmV0cmlldmUgeW91ciAke3Byb3ZpZGVyTmFtZX0gQVBJIGtleSBcdTIxOTJgKSwKICAgICAgICAgICAgaCgKICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWlucHV0LXJvdyIgfSwKICAgICAgICAgICAgICBoKCJpbnB1dCIsIHsKICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWlucHV0IiwKICAgICAgICAgICAgICAgIHR5cGU6IGFwaUtleVZpc2libGUgPyAidGV4dCIgOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgdmFsdWU6IGFwaUtleSwKICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAoZSkgPT4gc2V0QXBpS2V5KGUudGFyZ2V0LnZhbHVlKSwKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAiUGFzdGUgeW91ciBBUEkga2V5IGhlcmUiLAogICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiAib2ZmIiwKICAgICAgICAgICAgICAgIHNwZWxsQ2hlY2s6IGZhbHNlCiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgaCgiYnV0dG9uIiwgewogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLXNldHRpbmdzLWFwaS1rZXktdG9nZ2xlIiwKICAgICAgICAgICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4gc2V0QXBpS2V5VmlzaWJsZSgodikgPT4gIXYpLAogICAgICAgICAgICAgICAgdGl0bGU6IGFwaUtleVZpc2libGUgPyAiSGlkZSBBUEkga2V5IiA6ICJTaG93IEFQSSBrZXkiLAogICAgICAgICAgICAgICAgImFyaWEtbGFiZWwiOiBhcGlLZXlWaXNpYmxlID8gIkhpZGUgQVBJIGtleSIgOiAiU2hvdyBBUEkga2V5IgogICAgICAgICAgICAgIH0sIGFwaUtleVZpc2libGUgPyAiXHV7MUY2NDh9IiA6ICJcdXsxRjQ0MX1cdUZFMEYiKQogICAgICAgICAgICApCiAgICAgICAgICApCiAgICAgICAgKQogICAgICApCiAgICApOwogIH0KCiAgLy8gbGliL2hvb2tzL3VzZS1jb21wbGV0ZWQtdGFza3MuanMKICB2YXIgaW1wb3J0X3JlYWN0MTYgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSk7CiAgZnVuY3Rpb24gZ3JvdXBSZXN1bHRzQnlEYXRlKGZldGNoUmVzdWx0cykgewogICAgY29uc3QgZ3JvdXBlZCA9IHt9OwogICAgZm9yIChjb25zdCB7IGRhdGVLZXksIHRhc2tzIH0gb2YgZmV0Y2hSZXN1bHRzKSB7CiAgICAgIGdyb3VwZWRbZGF0ZUtleV0gPSB0YXNrczsKICAgIH0KICAgIHJldHVybiBncm91cGVkOwogIH0KICBmdW5jdGlvbiB1c2VDb21wbGV0ZWRUYXNrcygpIHsKICAgIGNvbnN0IFtjb21wbGV0ZWRUYXNrc0J5RGF0ZSwgc2V0Q29tcGxldGVkVGFza3NCeURhdGVdID0gKDAsIGltcG9ydF9yZWFjdDE2LnVzZVN0YXRlKSh7fSk7CiAgICBjb25zdCBsb2FkaW5nUmVmID0gKDAsIGltcG9ydF9yZWFjdDE2LnVzZVJlZikoZmFsc2UpOwogICAgY29uc3QgZXJyb3JSZWYgPSAoMCwgaW1wb3J0X3JlYWN0MTYudXNlUmVmKShudWxsKTsKICAgIGNvbnN0IGxhc3RGZXRjaEtleVJlZiA9ICgwLCBpbXBvcnRfcmVhY3QxNi51c2VSZWYpKG51bGwpOwogICAgY29uc3QgY29tcGxldGVkVGFza3NCeURhdGVSZWYgPSAoMCwgaW1wb3J0X3JlYWN0MTYudXNlUmVmKSh7fSk7CiAgICBjb25zdCBmZXRjaENvbXBsZXRlZFRhc2tzID0gKDAsIGltcG9ydF9yZWFjdDE2LnVzZUNhbGxiYWNrKShhc3luYyAocmVmZXJlbmNlRGF0ZSwgYWN0aXZlVGFza0RvbWFpbikgPT4gewogICAgICBjb25zdCB7IGJvdW5kYXJpZXMsIHdlZWtTdGFydEtleSB9ID0gd2Vla0JvdW5kYXJpZXNGcm9tRGF0ZUlucHV0KHJlZmVyZW5jZURhdGUpOwogICAgICBjb25zdCBmZXRjaEtleSA9IGAke3dlZWtTdGFydEtleX06OiR7YWN0aXZlVGFza0RvbWFpbiB8fCAiIn1gOwogICAgICBpZiAobGFzdEZldGNoS2V5UmVmLmN1cnJlbnQgPT09IGZldGNoS2V5KSB7CiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZFRhc2tzQnlEYXRlUmVmLmN1cnJlbnQ7CiAgICAgIH0KICAgICAgbG9hZGluZ1JlZi5jdXJyZW50ID0gdHJ1ZTsKICAgICAgZXJyb3JSZWYuY3VycmVudCA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKAogICAgICAgICAgYm91bmRhcmllcy5tYXAoYXN5bmMgKHsgZnJvbSwgdG8sIGRhdGVLZXkgfSkgPT4gewogICAgICAgICAgICBjb25zdCB0YXNrcyA9IGF3YWl0IGNhbGxQbHVnaW4oImdldENvbXBsZXRlZFRhc2tzIiwgZnJvbSwgdG8pOwogICAgICAgICAgICByZXR1cm4geyBkYXRlS2V5LCB0YXNrczogdGFza3MgfHwgW10gfTsKICAgICAgICAgIH0pCiAgICAgICAgKTsKICAgICAgICBjb25zdCBncm91cGVkID0gZ3JvdXBSZXN1bHRzQnlEYXRlKHJlc3VsdHMpOwogICAgICAgIHNldENvbXBsZXRlZFRhc2tzQnlEYXRlKGdyb3VwZWQpOwogICAgICAgIGNvbXBsZXRlZFRhc2tzQnlEYXRlUmVmLmN1cnJlbnQgPSBncm91cGVkOwogICAgICAgIGxhc3RGZXRjaEtleVJlZi5jdXJyZW50ID0gZmV0Y2hLZXk7CiAgICAgICAgcmV0dXJuIGdyb3VwZWQ7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoInVzZUNvbXBsZXRlZFRhc2tzOiBmYWlsZWQgdG8gZmV0Y2ggY29tcGxldGVkIHRhc2tzIiwgZXJyKTsKICAgICAgICBlcnJvclJlZi5jdXJyZW50ID0gZXJyOwogICAgICAgIHJldHVybiB7fTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBsb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTsKICAgICAgfQogICAgfSwgW10pOwogICAgcmV0dXJuIHsKICAgICAgY29tcGxldGVkVGFza3NCeURhdGUsCiAgICAgIGdldCBsb2FkaW5nKCkgewogICAgICAgIHJldHVybiBsb2FkaW5nUmVmLmN1cnJlbnQ7CiAgICAgIH0sCiAgICAgIGdldCBlcnJvcigpIHsKICAgICAgICByZXR1cm4gZXJyb3JSZWYuY3VycmVudDsKICAgICAgfSwKICAgICAgZmV0Y2hDb21wbGV0ZWRUYXNrcwogICAgfTsKICB9CgogIC8vIGxpYi9ob29rcy91c2UtZG9tYWluLXRhc2tzLmpzCiAgdmFyIGltcG9ydF9yZWFjdDE3ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCkpOwogIGZ1bmN0aW9uIGZvcm1hdERhdGVLZXkyKGRhdGVWYWx1ZSkgewogICAgaWYgKGRhdGVWYWx1ZSBpbnN0YW5jZW9mIERhdGUpCiAgICAgIHJldHVybiBkYXRlVmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgiVCIpWzBdOwogICAgY29uc3QgbXMgPSB0eXBlb2YgZGF0ZVZhbHVlID09PSAibnVtYmVyIiAmJiBkYXRlVmFsdWUgPCAxZTEwID8gZGF0ZVZhbHVlICogMWUzIDogZGF0ZVZhbHVlOwogICAgcmV0dXJuIG5ldyBEYXRlKG1zKS50b0lTT1N0cmluZygpLnNwbGl0KCJUIilbMF07CiAgfQogIGZ1bmN0aW9uIGdldE9wZW5UYXNrRGF0ZSh0YXNrKSB7CiAgICByZXR1cm4gdGFzay5zdGFydEF0IHx8IHRhc2suZGVhZGxpbmU7CiAgfQogIGZ1bmN0aW9uIGdyb3VwVGFza3NCeURhdGUodGFza3MsIGdldERhdGVGbiwgZmlsdGVyRm4gPSAoKSA9PiB0cnVlKSB7CiAgICBjb25zdCBncm91cGVkID0ge307CiAgICB0YXNrcy5mb3JFYWNoKCh0YXNrKSA9PiB7CiAgICAgIGlmICghZmlsdGVyRm4odGFzaykpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBkYXRlVmFsdWUgPSBnZXREYXRlRm4odGFzayk7CiAgICAgIGlmICghZGF0ZVZhbHVlKQogICAgICAgIHJldHVybjsKICAgICAgY29uc3Qga2V5ID0gZm9ybWF0RGF0ZUtleTIoZGF0ZVZhbHVlKTsKICAgICAgaWYgKCFncm91cGVkW2tleV0pCiAgICAgICAgZ3JvdXBlZFtrZXldID0gW107CiAgICAgIGdyb3VwZWRba2V5XS5wdXNoKHRhc2spOwogICAgfSk7CiAgICByZXR1cm4gZ3JvdXBlZDsKICB9CiAgZnVuY3Rpb24gZ3JvdXBPcGVuVGFza3NCeURhdGUodGFza3MpIHsKICAgIHJldHVybiBncm91cFRhc2tzQnlEYXRlKHRhc2tzLCBnZXRPcGVuVGFza0RhdGUsICh0YXNrKSA9PiAhdGFzay5jb21wbGV0ZWRBdCAmJiAhdGFzay5kaXNtaXNzZWRBdCk7CiAgfQogIGZ1bmN0aW9uIGdyb3VwQ29tcGxldGVkVGFza3NCeURhdGUodGFza3MpIHsKICAgIHJldHVybiBncm91cFRhc2tzQnlEYXRlKHRhc2tzLCAodGFzaykgPT4gdGFzay5jb21wbGV0ZWRBdCwgKHRhc2spID0+ICEhdGFzay5jb21wbGV0ZWRBdCk7CiAgfQogIGZ1bmN0aW9uIHBhcnRpdGlvbkRhdGVLZXlzKHNvcnRlZERhdGVLZXlzLCB0b2RheUtleSkgewogICAgY29uc3QgdXBjb21pbmdEYXRlS2V5cyA9IHNvcnRlZERhdGVLZXlzLmZpbHRlcigoZGF0ZUtleSkgPT4gZGF0ZUtleSA+IHRvZGF5S2V5KTsKICAgIGNvbnN0IG9sZGVyRGF0ZUtleXMgPSBzb3J0ZWREYXRlS2V5cy5maWx0ZXIoKGRhdGVLZXkpID0+IGRhdGVLZXkgPCB0b2RheUtleSk7CiAgICByZXR1cm4geyB1cGNvbWluZ0RhdGVLZXlzLCBvbGRlckRhdGVLZXlzIH07CiAgfQogIGZ1bmN0aW9uIHJlb3JkZXJHcm91cGVkVGFza3MoZ3JvdXBlZFRhc2tzLCBvcmRlcmVkS2V5cykgewogICAgY29uc3QgcmVvcmRlcmVkID0ge307CiAgICBvcmRlcmVkS2V5cy5mb3JFYWNoKChkYXRlS2V5KSA9PiB7CiAgICAgIHJlb3JkZXJlZFtkYXRlS2V5XSA9IGdyb3VwZWRUYXNrc1tkYXRlS2V5XSB8fCBbXTsKICAgIH0pOwogICAgcmV0dXJuIHJlb3JkZXJlZDsKICB9CiAgZnVuY3Rpb24gdXNlRG9tYWluVGFza3MoKSB7CiAgICBjb25zdCBbdGFza0RvbWFpbnMsIHNldFRhc2tEb21haW5zXSA9ICgwLCBpbXBvcnRfcmVhY3QxNy51c2VTdGF0ZSkoW10pOwogICAgY29uc3QgW2FjdGl2ZVRhc2tEb21haW4sIHNldEFjdGl2ZVRhc2tEb21haW5dID0gKDAsIGltcG9ydF9yZWFjdDE3LnVzZVN0YXRlKShudWxsKTsKICAgIGNvbnN0IFt0YXNrc0ZldGNoZWRBdCwgc2V0VGFza3NGZXRjaGVkQXRdID0gKDAsIGltcG9ydF9yZWFjdDE3LnVzZVN0YXRlKShudWxsKTsKICAgIGNvbnN0IFtvcGVuVGFza3NCeURhdGUsIHNldE9wZW5UYXNrc0J5RGF0ZV0gPSAoMCwgaW1wb3J0X3JlYWN0MTcudXNlU3RhdGUpKHt9KTsKICAgIGNvbnN0IFtjb21wbGV0ZWRUYXNrc0J5RGF0ZSwgc2V0Q29tcGxldGVkVGFza3NCeURhdGVdID0gKDAsIGltcG9ydF9yZWFjdDE3LnVzZVN0YXRlKSh7fSk7CiAgICBjb25zdCBzdGFydEF0ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICBjb25zdCBpbml0aWFsaXplRG9tYWluVGFza3MgPSAoMCwgaW1wb3J0X3JlYWN0MTcudXNlQ2FsbGJhY2spKChpbml0UmVzdWx0KSA9PiB7CiAgICAgIGlmICghaW5pdFJlc3VsdCkKICAgICAgICByZXR1cm47CiAgICAgIHNldFRhc2tEb21haW5zKGluaXRSZXN1bHQudGFza0RvbWFpbnMgfHwgW10pOwogICAgICBzZXRBY3RpdmVUYXNrRG9tYWluKGluaXRSZXN1bHQuYWN0aXZlVGFza0RvbWFpbiB8fCBudWxsKTsKICAgICAgY29uc3QgdGFza3MgPSBpbml0UmVzdWx0LnRhc2tzIHx8IFtdOwogICAgICBzZXRPcGVuVGFza3NCeURhdGUoZ3JvdXBPcGVuVGFza3NCeURhdGUodGFza3MpKTsKICAgICAgc2V0Q29tcGxldGVkVGFza3NCeURhdGUoZ3JvdXBDb21wbGV0ZWRUYXNrc0J5RGF0ZSh0YXNrcykpOwogICAgICBzZXRUYXNrc0ZldGNoZWRBdChEYXRlLm5vdygpKTsKICAgIH0sIFtdKTsKICAgIGNvbnN0IG9uRG9tYWluQ2hhbmdlID0gKDAsIGltcG9ydF9yZWFjdDE3LnVzZUNhbGxiYWNrKSgobmV3RG9tYWlucywgbmV3QWN0aXZlRG9tYWluLCB0YXNrRGF0YSkgPT4gewogICAgICBpZiAobmV3RG9tYWlucykgewogICAgICAgIHNldFRhc2tEb21haW5zKG5ld0RvbWFpbnMpOwogICAgICB9CiAgICAgIGlmIChuZXdBY3RpdmVEb21haW4pIHsKICAgICAgICBzZXRBY3RpdmVUYXNrRG9tYWluKG5ld0FjdGl2ZURvbWFpbik7CiAgICAgIH0KICAgICAgaWYgKHRhc2tEYXRhKSB7CiAgICAgICAgY29uc3QgdGFza3MgPSB0YXNrRGF0YS50YXNrcyB8fCBbXTsKICAgICAgICBzZXRPcGVuVGFza3NCeURhdGUoZ3JvdXBPcGVuVGFza3NCeURhdGUodGFza3MpKTsKICAgICAgICBzZXRDb21wbGV0ZWRUYXNrc0J5RGF0ZShncm91cENvbXBsZXRlZFRhc2tzQnlEYXRlKHRhc2tzKSk7CiAgICAgICAgc2V0VGFza3NGZXRjaGVkQXQoRGF0ZS5ub3coKSk7CiAgICAgIH0KICAgIH0sIFtdKTsKICAgIGNvbnN0IGJ1aWxkQWdlbmRhVGFza3NCeURhdGUgPSAoMCwgaW1wb3J0X3JlYWN0MTcudXNlQ2FsbGJhY2spKChjdXJyZW50RGF0ZUlzbykgPT4gewogICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlSXNvID8gbmV3IERhdGUoY3VycmVudERhdGVJc28pIDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICAgIGNvbnN0IHRvZGF5S2V5ID0gZm9ybWF0RGF0ZUtleTIoY3VycmVudERhdGUpOwogICAgICBjb25zdCBhbGxPcGVuVGFza3MgPSBPYmplY3QudmFsdWVzKG9wZW5UYXNrc0J5RGF0ZSkuZmxhdCgpOwogICAgICBjb25zdCBwZW5kaW5nVGFza3MgPSBhbGxPcGVuVGFza3MuZmlsdGVyKCh0YXNrKSA9PiAhISh0YXNrLnN0YXJ0QXQgfHwgdGFzay5kZWFkbGluZSkpLnNvcnQoKGEsIGIpID0+IGdldE9wZW5UYXNrRGF0ZShhKSAtIGdldE9wZW5UYXNrRGF0ZShiKSk7CiAgICAgIGNvbnNvbGUubG9nKGBBZ2VuZGEgd2lsbCByZXZpZXdlZCAke2FsbE9wZW5UYXNrcy5sZW5ndGh9IG9wZW4gdGFza3NgLCBhbGxPcGVuVGFza3MubWFwKCh0KSA9PiAoewogICAgICAgIGRlYWRsaW5lVGV4dDogdC5kZWFkbGluZSA/IGZvcm1hdERhdGVLZXkyKHQuZGVhZGxpbmUpIDogIk4vQSIsCiAgICAgICAgc3RhcnRUZXh0OiB0LnN0YXJ0QXQgPyBmb3JtYXREYXRlS2V5Mih0LnN0YXJ0QXQpIDogIk5vbmUiLAogICAgICAgIC4uLnQKICAgICAgfSkpKTsKICAgICAgY29uc29sZS5sb2coYCR7cGVuZGluZ1Rhc2tzLmxlbmd0aH0gcmVsZXZhbnQgKHdpdGggc3RhcnRBdClgLCBwZW5kaW5nVGFza3MpOwogICAgICBjb25zdCBncm91cGVkQnlEYXRlID0gZ3JvdXBUYXNrc0J5RGF0ZShwZW5kaW5nVGFza3MsIGdldE9wZW5UYXNrRGF0ZSk7CiAgICAgIGNvbnN0IHNvcnRlZERhdGVLZXlzID0gT2JqZWN0LmtleXMoZ3JvdXBlZEJ5RGF0ZSkuc29ydCgpOwogICAgICBjb25zdCB7IHVwY29taW5nRGF0ZUtleXMgfSA9IHBhcnRpdGlvbkRhdGVLZXlzKHNvcnRlZERhdGVLZXlzLCB0b2RheUtleSk7CiAgICAgIGNvbnN0IG9yZGVyZWREYXRlS2V5cyA9IFt0b2RheUtleSwgLi4udXBjb21pbmdEYXRlS2V5c107CiAgICAgIHJldHVybiByZW9yZGVyR3JvdXBlZFRhc2tzKGdyb3VwZWRCeURhdGUsIG9yZGVyZWREYXRlS2V5cyk7CiAgICB9LCBbb3BlblRhc2tzQnlEYXRlXSk7CiAgICBjb25zb2xlLmxvZyhgdXNlRG9tYWluVGFza3MgaW5pdGlhbGl6ZWQgd2l0aCBhY3RpdmUgZG9tYWluICR7YWN0aXZlVGFza0RvbWFpbn0gaW4gJHsvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSAtIHN0YXJ0QXR9bXNgKTsKICAgIHJldHVybiB7CiAgICAgIHRhc2tEb21haW5zLAogICAgICBhY3RpdmVUYXNrRG9tYWluLAogICAgICB0YXNrc0ZldGNoZWRBdCwKICAgICAgb3BlblRhc2tzOiBvcGVuVGFza3NCeURhdGUsCiAgICAgIGNvbXBsZXRlZFRhc2tzOiBjb21wbGV0ZWRUYXNrc0J5RGF0ZSwKICAgICAgaW5pdGlhbGl6ZURvbWFpblRhc2tzLAogICAgICBvbkRvbWFpbkNoYW5nZSwKICAgICAgYnVpbGRBZ2VuZGFUYXNrc0J5RGF0ZQogICAgfTsKICB9CgogIC8vIGxpYi9kYXNoYm9hcmQvYXBwLmpzCiAgZnVuY3Rpb24gZ3JpZENlbGxTdHlsZShjb25maWcpIHsKICAgIGNvbnN0IHcgPSBOdW1iZXIoY29uZmlnPy5ncmlkV2lkdGhTaXplKSA+IDAgPyBOdW1iZXIoY29uZmlnLmdyaWRXaWR0aFNpemUpIDogMTsKICAgIGNvbnN0IGggPSBOdW1iZXIoY29uZmlnPy5ncmlkSGVpZ2h0U2l6ZSkgPiAwID8gTnVtYmVyKGNvbmZpZy5ncmlkSGVpZ2h0U2l6ZSkgOiAxOwogICAgcmV0dXJuIHsgZ3JpZENvbHVtbjogYHNwYW4gJHt3fWAsIGdyaWRSb3c6IGBzcGFuICR7aH1gIH07CiAgfQogIHZhciBQbGFubmluZ0NlbGwgPSAoMCwgaW1wb3J0X3JlYWN0MTgubWVtbykoZnVuY3Rpb24gUGxhbm5pbmdDZWxsMih7IGNvbmZpZywgcXVhcnRlcmx5UGxhbnMgfSkgewogICAgY29uc29sZS5sb2coJ1JlbmRlcmVkIHdpZGdldCAicGxhbm5pbmciJyk7CiAgICByZXR1cm4gKDAsIGltcG9ydF9yZWFjdDE4LmNyZWF0ZUVsZW1lbnQpKAogICAgICAiZGl2IiwKICAgICAgeyBjbGFzc05hbWU6ICJncmlkLWNlbGwiLCBzdHlsZTogZ3JpZENlbGxTdHlsZShjb25maWcpIH0sCiAgICAgICgwLCBpbXBvcnRfcmVhY3QxOC5jcmVhdGVFbGVtZW50KShQbGFubmluZ1dpZGdldCwgeyBxdWFydGVybHlQbGFucyB9KQogICAgKTsKICB9KTsKICB2YXIgVmljdG9yeVZhbHVlQ2VsbCA9ICgwLCBpbXBvcnRfcmVhY3QxOC5tZW1vKShmdW5jdGlvbiBWaWN0b3J5VmFsdWVDZWxsMih7CiAgICBjb25maWcsCiAgICBjb21wbGV0ZWRUYXNrc0J5RGF0ZSwKICAgIGRhaWx5VmFsdWVzLAogICAgd2Vla2x5VG90YWwsCiAgICBtb29kUmF0aW5ncywKICAgIHJlZmVyZW5jZURhdGUsCiAgICBvblJlZmVyZW5jZURhdGVDaGFuZ2UsCiAgICBzZXR0aW5ncwogIH0pIHsKICAgIGNvbnNvbGUubG9nKCdSZW5kZXJlZCB3aWRnZXQgInZpY3RvcnktdmFsdWUiJyk7CiAgICByZXR1cm4gKDAsIGltcG9ydF9yZWFjdDE4LmNyZWF0ZUVsZW1lbnQpKAogICAgICAiZGl2IiwKICAgICAgeyBjbGFzc05hbWU6ICJncmlkLWNlbGwiLCBzdHlsZTogZ3JpZENlbGxTdHlsZShjb25maWcpIH0sCiAgICAgICgwLCBpbXBvcnRfcmVhY3QxOC5jcmVhdGVFbGVtZW50KShWaWN0b3J5VmFsdWVXaWRnZXQsIHsKICAgICAgICBjb21wbGV0ZWRUYXNrc0J5RGF0ZSwKICAgICAgICBkYWlseVZhbHVlcywKICAgICAgICB3ZWVrbHlUb3RhbCwKICAgICAgICBtb29kUmF0aW5ncywKICAgICAgICByZWZlcmVuY2VEYXRlLAogICAgICAgIG9uUmVmZXJlbmNlRGF0ZUNoYW5nZSwKICAgICAgICBzZXR0aW5nczogeyAuLi5zZXR0aW5ncywgInZpY3RvcnktdmFsdWUiOiBjb25maWc/LnNldHRpbmdzIHx8IHt9IH0KICAgICAgfSkKICAgICk7CiAgfSk7CiAgdmFyIE1vb2RDZWxsID0gKDAsIGltcG9ydF9yZWFjdDE4Lm1lbW8pKGZ1bmN0aW9uIE1vb2RDZWxsMih7IGNvbmZpZywgbW9vZFJhdGluZ3MgfSkgewogICAgY29uc29sZS5sb2coJ1JlbmRlcmVkIHdpZGdldCAibW9vZCInKTsKICAgIHJldHVybiAoMCwgaW1wb3J0X3JlYWN0MTguY3JlYXRlRWxlbWVudCkoCiAgICAgICJkaXYiLAogICAgICB7IGNsYXNzTmFtZTogImdyaWQtY2VsbCIsIHN0eWxlOiBncmlkQ2VsbFN0eWxlKGNvbmZpZykgfSwKICAgICAgKDAsIGltcG9ydF9yZWFjdDE4LmNyZWF0ZUVsZW1lbnQpKE1vb2RXaWRnZXQsIHsgbW9vZFJhdGluZ3MgfSkKICAgICk7CiAgfSk7CiAgdmFyIENhbGVuZGFyQ2VsbCA9ICgwLCBpbXBvcnRfcmVhY3QxOC5tZW1vKShmdW5jdGlvbiBDYWxlbmRhckNlbGwyKHsKICAgIGNvbmZpZywKICAgIGNvbXBsZXRlZFRhc2tzQnlEYXRlLAogICAgY3VycmVudERhdGUsCiAgICBvcGVuVGFza3MsCiAgICBvbkRhdGVTZWxlY3QsCiAgICBzZXR0aW5ncywKICAgIHNlbGVjdGVkRGF0ZQogIH0pIHsKICAgIGNvbnNvbGUubG9nKCdSZW5kZXJlZCB3aWRnZXQgImNhbGVuZGFyIicpOwogICAgcmV0dXJuICgwLCBpbXBvcnRfcmVhY3QxOC5jcmVhdGVFbGVtZW50KSgKICAgICAgImRpdiIsCiAgICAgIHsgY2xhc3NOYW1lOiAiZ3JpZC1jZWxsIiwgc3R5bGU6IGdyaWRDZWxsU3R5bGUoY29uZmlnKSB9LAogICAgICAoMCwgaW1wb3J0X3JlYWN0MTguY3JlYXRlRWxlbWVudCkoQ2FsZW5kYXJXaWRnZXQsIHsKICAgICAgICBjb21wbGV0ZWRUYXNrc0J5RGF0ZSwKICAgICAgICBjdXJyZW50RGF0ZSwKICAgICAgICBvcGVuVGFza3MsCiAgICAgICAgb25EYXRlU2VsZWN0LAogICAgICAgIHNlbGVjdGVkRGF0ZSwKICAgICAgICBzZXR0aW5nczogeyAuLi5zZXR0aW5ncywgY2FsZW5kYXI6IGNvbmZpZz8uc2V0dGluZ3MgfHwge30gfQogICAgICB9KQogICAgKTsKICB9KTsKICB2YXIgQWdlbmRhQ2VsbCA9ICgwLCBpbXBvcnRfcmVhY3QxOC5tZW1vKShmdW5jdGlvbiBBZ2VuZGFDZWxsMih7IGNvbmZpZywgYWdlbmRhVGFza3MsIGN1cnJlbnREYXRlLCBzZWxlY3RlZERhdGUgfSkgewogICAgY29uc29sZS5sb2coJ1JlbmRlcmVkIHdpZGdldCAiYWdlbmRhIicpOwogICAgcmV0dXJuICgwLCBpbXBvcnRfcmVhY3QxOC5jcmVhdGVFbGVtZW50KSgKICAgICAgImRpdiIsCiAgICAgIHsgY2xhc3NOYW1lOiAiZ3JpZC1jZWxsIiwgc3R5bGU6IGdyaWRDZWxsU3R5bGUoY29uZmlnKSB9LAogICAgICAoMCwgaW1wb3J0X3JlYWN0MTguY3JlYXRlRWxlbWVudCkoQWdlbmRhV2lkZ2V0LCB7IGN1cnJlbnREYXRlLCB0YXNrczogYWdlbmRhVGFza3MsIHNlbGVjdGVkRGF0ZSB9KQogICAgKTsKICB9KTsKICB2YXIgUXVvdGVzQ2VsbCA9ICgwLCBpbXBvcnRfcmVhY3QxOC5tZW1vKShmdW5jdGlvbiBRdW90ZXNDZWxsMih7IGNvbmZpZywgcXVhcnRlcmx5UGxhbnMsIHNldHRpbmdzIH0pIHsKICAgIGNvbnNvbGUubG9nKCdSZW5kZXJlZCB3aWRnZXQgInF1b3RlcyInKTsKICAgIHJldHVybiAoMCwgaW1wb3J0X3JlYWN0MTguY3JlYXRlRWxlbWVudCkoCiAgICAgICJkaXYiLAogICAgICB7IGNsYXNzTmFtZTogImdyaWQtY2VsbCIsIHN0eWxlOiBncmlkQ2VsbFN0eWxlKGNvbmZpZykgfSwKICAgICAgKDAsIGltcG9ydF9yZWFjdDE4LmNyZWF0ZUVsZW1lbnQpKFF1b3Rlc1dpZGdldCwgewogICAgICAgIHF1b3RlczogbnVsbCwKICAgICAgICBwbGFuQ29udGVudDogbnVsbCwKICAgICAgICBzZXR0aW5nczogeyAuLi5zZXR0aW5ncywgcXVvdGVzOiBjb25maWc/LnNldHRpbmdzIHx8IHt9IH0KICAgICAgfSkKICAgICk7CiAgfSk7CiAgdmFyIEFJUGx1Z2luc0NlbGwgPSAoMCwgaW1wb3J0X3JlYWN0MTgubWVtbykoZnVuY3Rpb24gQUlQbHVnaW5zQ2VsbDIoeyBjb25maWcgfSkgewogICAgY29uc29sZS5sb2coJ1JlbmRlcmVkIHdpZGdldCAiYWktcGx1Z2lucyInKTsKICAgIHJldHVybiAoMCwgaW1wb3J0X3JlYWN0MTguY3JlYXRlRWxlbWVudCkoCiAgICAgICJkaXYiLAogICAgICB7IGNsYXNzTmFtZTogImdyaWQtY2VsbCIsIHN0eWxlOiBncmlkQ2VsbFN0eWxlKGNvbmZpZykgfSwKICAgICAgKDAsIGltcG9ydF9yZWFjdDE4LmNyZWF0ZUVsZW1lbnQpKEFJUGx1Z2luc1dpZGdldCwgeyB0YXNrQ291bnQ6IDAsIGZsYXNoY2FyZHNEdWU6IDAgfSkKICAgICk7CiAgfSk7CiAgdmFyIFF1aWNrQWN0aW9uc0NlbGwgPSAoMCwgaW1wb3J0X3JlYWN0MTgubWVtbykoZnVuY3Rpb24gUXVpY2tBY3Rpb25zQ2VsbDIoeyBjb25maWcgfSkgewogICAgY29uc29sZS5sb2coJ1JlbmRlcmVkIHdpZGdldCAicXVpY2stYWN0aW9ucyInKTsKICAgIHJldHVybiAoMCwgaW1wb3J0X3JlYWN0MTguY3JlYXRlRWxlbWVudCkoCiAgICAgICJkaXYiLAogICAgICB7IGNsYXNzTmFtZTogImdyaWQtY2VsbCIsIHN0eWxlOiBncmlkQ2VsbFN0eWxlKGNvbmZpZykgfSwKICAgICAgKDAsIGltcG9ydF9yZWFjdDE4LmNyZWF0ZUVsZW1lbnQpKFF1aWNrQWN0aW9uc1dpZGdldCwge30pCiAgICApOwogIH0pOwogIGZ1bmN0aW9uIERhc2hib2FyZEFwcCgpIHsKICAgIGNvbnN0IGggPSBpbXBvcnRfcmVhY3QxOC5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgewogICAgICBhY3RpdmVUYXNrRG9tYWluLAogICAgICBidWlsZEFnZW5kYVRhc2tzQnlEYXRlLAogICAgICBpbml0aWFsaXplRG9tYWluVGFza3MsCiAgICAgIG9uRG9tYWluQ2hhbmdlLAogICAgICBvcGVuVGFza3MsCiAgICAgIHRhc2tEb21haW5zCiAgICB9ID0gdXNlRG9tYWluVGFza3MoKTsKICAgIGNvbnN0IHsgY29tcGxldGVkVGFza3NCeURhdGUsIGZldGNoQ29tcGxldGVkVGFza3MgfSA9IHVzZUNvbXBsZXRlZFRhc2tzKCk7CiAgICBjb25zdCBbbW9vZFJhdGluZ3MsIHNldE1vb2RSYXRpbmdzXSA9ICgwLCBpbXBvcnRfcmVhY3QxOC51c2VTdGF0ZSkobnVsbCk7CiAgICBjb25zdCBbcXVhcnRlcmx5UGxhbnMsIHNldFF1YXJ0ZXJseVBsYW5zXSA9ICgwLCBpbXBvcnRfcmVhY3QxOC51c2VTdGF0ZSkobnVsbCk7CiAgICBjb25zdCBbc2V0dGluZ3MsIHNldFNldHRpbmdzXSA9ICgwLCBpbXBvcnRfcmVhY3QxOC51c2VTdGF0ZSkobnVsbCk7CiAgICBjb25zdCBbZGFpbHlWaWN0b3J5VmFsdWVzLCBzZXREYWlseVZpY3RvcnlWYWx1ZXNdID0gKDAsIGltcG9ydF9yZWFjdDE4LnVzZVN0YXRlKShudWxsKTsKICAgIGNvbnN0IFt3ZWVrbHlWaWN0b3J5VmFsdWUsIHNldFdlZWtseVZpY3RvcnlWYWx1ZV0gPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlU3RhdGUpKG51bGwpOwogICAgY29uc3QgW2N1cnJlbnREYXRlLCBzZXRDdXJyZW50RGF0ZV0gPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlU3RhdGUpKG51bGwpOwogICAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlU3RhdGUpKG51bGwpOwogICAgY29uc3QgW3NlbGVjdGVkRGF0ZSwgc2V0U2VsZWN0ZWREYXRlXSA9ICgwLCBpbXBvcnRfcmVhY3QxOC51c2VTdGF0ZSkobnVsbCk7CiAgICBjb25zdCBbZm9jdXNTdGF0ZSwgc2V0Rm9jdXNTdGF0ZV0gPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlU3RhdGUpKERBU0hCT0FSRF9GT0NVUy5ERUZBVUxUKTsKICAgIGNvbnN0IGluaXREYXRhRnJlc2hSZWYgPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlUmVmKShmYWxzZSk7CiAgICAoMCwgaW1wb3J0X3JlYWN0MTgudXNlRWZmZWN0KSgoKSA9PiB7CiAgICAgIGNhbGxQbHVnaW4oImluaXQiKS50aGVuKChyZXN1bHQpID0+IHsKICAgICAgICBpZiAocmVzdWx0Py5lcnJvcikgewogICAgICAgICAgc2V0RXJyb3IocmVzdWx0LmVycm9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2coYEluaXQgcmV0dXJuc2AsIHJlc3VsdCwgYGluY2x1ZGluZyBtb29kUmF0aW5zZ3NgLCByZXN1bHQubW9vZFJhdGluZ3MpOwogICAgICAgICAgaW5pdGlhbGl6ZURvbWFpblRhc2tzKHJlc3VsdCk7CiAgICAgICAgICBzZXRNb29kUmF0aW5ncyhyZXN1bHQubW9vZFJhdGluZ3MpOwogICAgICAgICAgc2V0UXVhcnRlcmx5UGxhbnMocmVzdWx0LnF1YXJ0ZXJseVBsYW5zKTsKICAgICAgICAgIHNldFNldHRpbmdzKHJlc3VsdC5zZXR0aW5ncyk7CiAgICAgICAgICBzZXREYWlseVZpY3RvcnlWYWx1ZXMocmVzdWx0LmRhaWx5VmljdG9yeVZhbHVlcyk7CiAgICAgICAgICBzZXRXZWVrbHlWaWN0b3J5VmFsdWUocmVzdWx0LndlZWtseVZpY3RvcnlWYWx1ZSk7CiAgICAgICAgICBzZXRDdXJyZW50RGF0ZShyZXN1bHQuY3VycmVudERhdGUpOwogICAgICAgICAgaW5pdERhdGFGcmVzaFJlZi5jdXJyZW50ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHNldEVycm9yKGVyci5tZXNzYWdlKSk7CiAgICB9LCBbXSk7CiAgICBjb25zdCBmZXRjaE1vb2RSYXRpbmdzID0gKDAsIGltcG9ydF9yZWFjdDE4LnVzZUNhbGxiYWNrKShhc3luYyAocmVmZXJlbmNlRGF0ZSkgPT4gewogICAgICBjb25zdCB3ZWVrU3RhcnQgPSB3ZWVrU3RhcnRGcm9tRGF0ZUlucHV0KHJlZmVyZW5jZURhdGUpOwogICAgICBjb25zdCB3ZWVrRW5kID0gd2Vla0VuZEZyb21EYXRlSW5wdXQocmVmZXJlbmNlRGF0ZSk7CiAgICAgIGNvbnN0IGZyb21Vbml4U2Vjb25kcyA9IE1hdGguZmxvb3Iod2Vla1N0YXJ0LmdldFRpbWUoKSAvIDFlMyk7CiAgICAgIGNvbnN0IHRvVW5peFNlY29uZHMgPSBNYXRoLmZsb29yKHdlZWtFbmQuZ2V0VGltZSgpIC8gMWUzKTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByYXRpbmdzID0gYXdhaXQgY2FsbFBsdWdpbigiZ2V0TW9vZFJhdGluZ3MiLCBmcm9tVW5peFNlY29uZHMsIHRvVW5peFNlY29uZHMpOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhdGluZ3MpKSB7CiAgICAgICAgICBzZXRNb29kUmF0aW5ncyhyYXRpbmdzKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoImZldGNoTW9vZFJhdGluZ3M6IGZhaWxlZCB0byBsb2FkIG1vb2QgcmF0aW5ncyIsIGVycik7CiAgICAgIH0KICAgIH0sIFtdKTsKICAgICgwLCBpbXBvcnRfcmVhY3QxOC51c2VFZmZlY3QpKCgpID0+IHsKICAgICAgY29uc3QgcmVmZXJlbmNlRGF0ZSA9IHNlbGVjdGVkRGF0ZSB8fCBjdXJyZW50RGF0ZTsKICAgICAgaWYgKCFyZWZlcmVuY2VEYXRlKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKGluaXREYXRhRnJlc2hSZWYuY3VycmVudCkgewogICAgICAgIGluaXREYXRhRnJlc2hSZWYuY3VycmVudCA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIGZldGNoTW9vZFJhdGluZ3MocmVmZXJlbmNlRGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKGFjdGl2ZVRhc2tEb21haW4pIHsKICAgICAgICBmZXRjaENvbXBsZXRlZFRhc2tzKHJlZmVyZW5jZURhdGUsIGFjdGl2ZVRhc2tEb21haW4pOwogICAgICB9CiAgICB9LCBbYWN0aXZlVGFza0RvbWFpbiwgY3VycmVudERhdGUsIGZldGNoQ29tcGxldGVkVGFza3MsIGZldGNoTW9vZFJhdGluZ3MsIHNlbGVjdGVkRGF0ZV0pOwogICAgY29uc3QgaGFuZGxlRG9tYWluQ2hhbmdlID0gKDAsIGltcG9ydF9yZWFjdDE4LnVzZUNhbGxiYWNrKSgobmV3RG9tYWlucywgbmV3QWN0aXZlRG9tYWluLCB0YXNrRGF0YSkgPT4gewogICAgICBvbkRvbWFpbkNoYW5nZShuZXdEb21haW5zLCBuZXdBY3RpdmVEb21haW4sIHRhc2tEYXRhKTsKICAgICAgaWYgKHRhc2tEYXRhKSB7CiAgICAgICAgc2V0RGFpbHlWaWN0b3J5VmFsdWVzKHRhc2tEYXRhLmRhaWx5VmljdG9yeVZhbHVlcyk7CiAgICAgICAgc2V0V2Vla2x5VmljdG9yeVZhbHVlKHRhc2tEYXRhLndlZWtseVZpY3RvcnlWYWx1ZSk7CiAgICAgIH0KICAgIH0sIFtvbkRvbWFpbkNoYW5nZV0pOwogICAgY29uc3QgaGFuZGxlTGF5b3V0U2F2ZSA9ICgwLCBpbXBvcnRfcmVhY3QxOC51c2VDYWxsYmFjaykoYXN5bmMgKG5ld1JlbmRlcmVkV2lkZ2V0SWRzLCB7IGlzUmVzZXQgfSA9IHt9KSA9PiB7CiAgICAgIGNvbnN0IGV4aXN0aW5nTGF5b3V0ID0gc2V0dGluZ3M/LltEQVNIQk9BUkRfQ09NUE9ORU5UU10gfHwgREVGQVVMVF9EQVNIQk9BUkRfQ09NUE9ORU5UUzsKICAgICAgY29uc3QgY29uZmlnQnlXaWRnZXRJZCA9IHt9OwogICAgICBpZiAoIWlzUmVzZXQpIHsKICAgICAgICBleGlzdGluZ0xheW91dC5mb3JFYWNoKChjKSA9PiB7CiAgICAgICAgICBjb25maWdCeVdpZGdldElkW2Mud2lkZ2V0SWRdID0gYzsKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBuZXdMYXlvdXQgPSBuZXdSZW5kZXJlZFdpZGdldElkcy5tYXAoKHdpZGdldElkKSA9PiB7CiAgICAgICAgaWYgKGNvbmZpZ0J5V2lkZ2V0SWRbd2lkZ2V0SWRdKQogICAgICAgICAgcmV0dXJuIGNvbmZpZ0J5V2lkZ2V0SWRbd2lkZ2V0SWRdOwogICAgICAgIGNvbnN0IHJlZ2lzdHJ5RW50cnkgPSBXSURHRVRfUkVHSVNUUlkuZmluZCgodykgPT4gdy53aWRnZXRJZCA9PT0gd2lkZ2V0SWQpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB3aWRnZXRJZCwKICAgICAgICAgIGdyaWRXaWR0aFNpemU6IHJlZ2lzdHJ5RW50cnk/LmRlZmF1bHRHcmlkV2lkdGhTaXplID8/IDEsCiAgICAgICAgICBncmlkSGVpZ2h0U2l6ZTogMSwKICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgIH07CiAgICAgIH0pOwogICAgICBhd2FpdCBjYWxsUGx1Z2luKCJzYXZlTGF5b3V0IiwgbmV3TGF5b3V0KTsKICAgICAgc2V0U2V0dGluZ3MoKHByZXYpID0+ICh7IC4uLnByZXYsIFtEQVNIQk9BUkRfQ09NUE9ORU5UU106IG5ld0xheW91dCB9KSk7CiAgICAgIHNldEZvY3VzU3RhdGUoREFTSEJPQVJEX0ZPQ1VTLkRFRkFVTFQpOwogICAgfSwgW3NldHRpbmdzXSk7CiAgICBjb25zdCBoYW5kbGVTZXR0aW5nc1NhdmUgPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlQ2FsbGJhY2spKGFzeW5jICh7IGxsbVByb3ZpZGVyLCBhcGlLZXksIGJhY2tncm91bmRNb2RlOiBiYWNrZ3JvdW5kTW9kZTIgfSkgPT4gewogICAgICBjb25zb2xlLmxvZygiW2Rhc2hib2FyZF0gaGFuZGxlU2V0dGluZ3NTYXZlIGNhbGxlZCB3aXRoOiIsIHsgbGxtUHJvdmlkZXIsIGJhY2tncm91bmRNb2RlOiBiYWNrZ3JvdW5kTW9kZTIgfSk7CiAgICAgIGNvbnN0IHNhdmVzID0gWwogICAgICAgIGNhbGxQbHVnaW4oInNhdmVTZXR0aW5nIiwgU0VUVElOR19LRVlTLkxMTV9QUk9WSURFUiwgbGxtUHJvdmlkZXIpLAogICAgICAgIGNhbGxQbHVnaW4oInNhdmVTZXR0aW5nIiwgU0VUVElOR19LRVlTLkxMTV9BUElfS0VZLCBhcGlLZXkpCiAgICAgIF07CiAgICAgIGlmIChiYWNrZ3JvdW5kTW9kZTIpIHsKICAgICAgICBzYXZlcy5wdXNoKGNhbGxQbHVnaW4oInNhdmVCYWNrZ3JvdW5kTW9kZSIsIGJhY2tncm91bmRNb2RlMikpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc2F2ZXMpOwogICAgICAgIGNvbnNvbGUubG9nKCJbZGFzaGJvYXJkXSBzZXR0aW5ncyBzYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiKTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiW2Rhc2hib2FyZF0gc2V0dGluZ3Mgc2F2ZSBGQUlMRUQ6IiwgZXJyKTsKICAgICAgfQogICAgICBzZXRTZXR0aW5ncygocHJldikgPT4gKHsKICAgICAgICAuLi5wcmV2LAogICAgICAgIFtTRVRUSU5HX0tFWVMuTExNX1BST1ZJREVSXTogbGxtUHJvdmlkZXIsCiAgICAgICAgW1NFVFRJTkdfS0VZUy5MTE1fQVBJX0tFWV06IGFwaUtleSwKICAgICAgICAuLi5iYWNrZ3JvdW5kTW9kZTIgPyB7IFtTRVRUSU5HX0tFWVMuQkFDS0dST1VORF9JTUFHRV9NT0RFXTogYmFja2dyb3VuZE1vZGUyIH0gOiB7fQogICAgICB9KSk7CiAgICAgIHNldEZvY3VzU3RhdGUoREFTSEJPQVJEX0ZPQ1VTLkRFRkFVTFQpOwogICAgfSwgW10pOwogICAgY29uc3QgYWdlbmRhVGFza3MgPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlTWVtbykoCiAgICAgICgpID0+IGN1cnJlbnREYXRlID8gYnVpbGRBZ2VuZGFUYXNrc0J5RGF0ZShjdXJyZW50RGF0ZSkgOiB7fSwKICAgICAgW2J1aWxkQWdlbmRhVGFza3NCeURhdGUsIGN1cnJlbnREYXRlXQogICAgKTsKICAgIGNvbnN0IGFjdGl2ZUNvbXBvbmVudHMgPSAoMCwgaW1wb3J0X3JlYWN0MTgudXNlTWVtbykoKCkgPT4gewogICAgICBjb25zdCBjb25maWd1cmVkID0gc2V0dGluZ3M/LltEQVNIQk9BUkRfQ09NUE9ORU5UU107CiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbmZpZ3VyZWQpICYmIGNvbmZpZ3VyZWQubGVuZ3RoID4gMCA/IGNvbmZpZ3VyZWQgOiBERUZBVUxUX0RBU0hCT0FSRF9DT01QT05FTlRTOwogICAgfSwgW3NldHRpbmdzXSk7CiAgICBpZiAoZXJyb3IpCiAgICAgIHJldHVybiBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLWVycm9yIiB9LAogICAgICAgIGgoImgyIiwgbnVsbCwgIkRhc2hib2FyZCBFcnJvciIpLAogICAgICAgIGgoInAiLCBudWxsLCBlcnJvcikKICAgICAgKTsKICAgIGlmICghc2V0dGluZ3MpCiAgICAgIHJldHVybiBoKAogICAgICAgICJkaXYiLAogICAgICAgIHsgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLWxvYWRpbmciIH0sCiAgICAgICAgaCgiZGl2IiwgeyBjbGFzc05hbWU6ICJzcGlubmVyIiB9KSwKICAgICAgICBoKCJwIiwgbnVsbCwgIkxvYWRpbmcgZGFzaGJvYXJkLi4uIikKICAgICAgKTsKICAgIGNvbnN0IGJhY2tncm91bmRVcmwgPSBzZXR0aW5ncz8uW1NFVFRJTkdfS0VZUy5CQUNLR1JPVU5EX0lNQUdFX1VSTF07CiAgICBjb25zdCBiYWNrZ3JvdW5kTW9kZSA9IHNldHRpbmdzPy5bU0VUVElOR19LRVlTLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERV0gfHwgImNvdmVyIjsKICAgIGlmIChiYWNrZ3JvdW5kVXJsKSB7CiAgICAgIGNvbnNvbGUubG9nKCJbZGFzaGJvYXJkXSBiYWNrZ3JvdW5kIGltYWdlIFVSTCBmcm9tIHNldHRpbmdzOiIsIGJhY2tncm91bmRVcmwsICJtb2RlOiIsIGJhY2tncm91bmRNb2RlKTsKICAgIH0KICAgIGNvbnN0IGJhY2tncm91bmRTdHlsZSA9IGJhY2tncm91bmRVcmwgPyAoKCkgPT4gewogICAgICBjb25zdCBpc1RpbGluZyA9IGJhY2tncm91bmRNb2RlLnN0YXJ0c1dpdGgoInJlcGVhdCIpOwogICAgICByZXR1cm4gewogICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgke2JhY2tncm91bmRVcmx9KWAsCiAgICAgICAgYmFja2dyb3VuZFNpemU6IGlzVGlsaW5nID8gImF1dG8iIDogYmFja2dyb3VuZE1vZGUsCiAgICAgICAgYmFja2dyb3VuZFJlcGVhdDogaXNUaWxpbmcgPyBiYWNrZ3JvdW5kTW9kZSA6ICJuby1yZXBlYXQiLAogICAgICAgIGJhY2tncm91bmRQb3NpdGlvbjogImNlbnRlciIsCiAgICAgICAgYmFja2dyb3VuZEF0dGFjaG1lbnQ6ICJmaXhlZCIKICAgICAgfTsKICAgIH0pKCkgOiB2b2lkIDA7CiAgICBjb25zdCB2aWN0b3J5UmVmZXJlbmNlRGF0ZSA9IHNlbGVjdGVkRGF0ZSB8fCBjdXJyZW50RGF0ZTsKICAgIHJldHVybiBoKAogICAgICAiZGl2IiwKICAgICAgeyBjbGFzc05hbWU6ICJkYXNoYm9hcmQiLCBzdHlsZTogYmFja2dyb3VuZFN0eWxlIH0sCiAgICAgIGZvY3VzU3RhdGUgPT09IERBU0hCT0FSRF9GT0NVUy5MQVlPVVRfQ09ORklHID8gaChEYXNoYm9hcmRDb25maWdQb3B1cCwgewogICAgICAgIGN1cnJlbnRMYXlvdXQ6IHNldHRpbmdzPy5bREFTSEJPQVJEX0NPTVBPTkVOVFNdIHx8IERFRkFVTFRfREFTSEJPQVJEX0NPTVBPTkVOVFMsCiAgICAgICAgb25TYXZlOiBoYW5kbGVMYXlvdXRTYXZlLAogICAgICAgIG9uQ2FuY2VsOiAoKSA9PiBzZXRGb2N1c1N0YXRlKERBU0hCT0FSRF9GT0NVUy5ERUZBVUxUKQogICAgICB9KSA6IG51bGwsCiAgICAgIGZvY3VzU3RhdGUgPT09IERBU0hCT0FSRF9GT0NVUy5TRVRUSU5HU19DT05GSUcgPyAoKCkgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCJbZGFzaGJvYXJkXSByZW5kZXJpbmcgRGFzaGJvYXJkU2V0dGluZ3NQb3B1cCwgYmdVcmw6Iiwgc2V0dGluZ3M/LltTRVRUSU5HX0tFWVMuQkFDS0dST1VORF9JTUFHRV9VUkxdKTsKICAgICAgICByZXR1cm4gaChEYXNoYm9hcmRTZXR0aW5nc1BvcHVwLCB7CiAgICAgICAgICBjdXJyZW50TGxtUHJvdmlkZXI6IHNldHRpbmdzPy5bU0VUVElOR19LRVlTLkxMTV9QUk9WSURFUl0sCiAgICAgICAgICBjdXJyZW50QXBpS2V5OiBzZXR0aW5ncz8uW1NFVFRJTkdfS0VZUy5MTE1fQVBJX0tFWV0sCiAgICAgICAgICBjdXJyZW50QmFja2dyb3VuZEltYWdlVXJsOiBzZXR0aW5ncz8uW1NFVFRJTkdfS0VZUy5CQUNLR1JPVU5EX0lNQUdFX1VSTF0sCiAgICAgICAgICBjdXJyZW50QmFja2dyb3VuZE1vZGU6IHNldHRpbmdzPy5bU0VUVElOR19LRVlTLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERV0sCiAgICAgICAgICBvblNhdmU6IGhhbmRsZVNldHRpbmdzU2F2ZSwKICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiBzZXRGb2N1c1N0YXRlKERBU0hCT0FSRF9GT0NVUy5ERUZBVUxUKQogICAgICAgIH0pOwogICAgICB9KSgpIDogbnVsbCwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC10b29sYmFyIiB9LAogICAgICAgIGgoVGFza0RvbWFpbnMsIHsKICAgICAgICAgIGRvbWFpbnM6IHRhc2tEb21haW5zLAogICAgICAgICAgYWN0aXZlVGFza0RvbWFpbiwKICAgICAgICAgIG9uRG9tYWluQ2hhbmdlOiBoYW5kbGVEb21haW5DaGFuZ2UKICAgICAgICB9KSwKICAgICAgICBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC10b29sYmFyLWFjdGlvbnMiIH0sCiAgICAgICAgICBoKCJidXR0b24iLCB7CiAgICAgICAgICAgIGNsYXNzTmFtZTogImRhc2hib2FyZC1jb25maWd1cmUtYnV0dG9uIiwKICAgICAgICAgICAgdHlwZTogImJ1dHRvbiIsCiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygiW2Rhc2hib2FyZF0gb3BlbmluZyBTZXR0aW5ncyBwb3B1cCIpOwogICAgICAgICAgICAgIHNldEZvY3VzU3RhdGUoREFTSEJPQVJEX0ZPQ1VTLlNFVFRJTkdTX0NPTkZJRyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpdGxlOiAiQ29uZmlndXJlIExMTSBwcm92aWRlciBhbmQgQVBJIGtleSBmb3IgQUktcG93ZXJlZCBmZWF0dXJlcyIKICAgICAgICAgIH0sICJcdTI2OTlcdUZFMEYgU2V0dGluZ3MiKSwKICAgICAgICAgIGgoImJ1dHRvbiIsIHsKICAgICAgICAgICAgY2xhc3NOYW1lOiAiZGFzaGJvYXJkLWNvbmZpZ3VyZS1idXR0b24iLAogICAgICAgICAgICB0eXBlOiAiYnV0dG9uIiwKICAgICAgICAgICAgb25DbGljazogKCkgPT4gc2V0Rm9jdXNTdGF0ZShEQVNIQk9BUkRfRk9DVVMuTEFZT1VUX0NPTkZJRyksCiAgICAgICAgICAgIHRpdGxlOiAiQ29uZmlndXJlIHdoaWNoIHdpZGdldHMgYXJlIHNob3duIGFuZCBpbiB3aGF0IG9yZGVyIgogICAgICAgICAgfSwgIlx1MjYzMCBMYXlvdXQiKQogICAgICAgICkKICAgICAgKSwKICAgICAgaCgKICAgICAgICAiZGl2IiwKICAgICAgICB7IGNsYXNzTmFtZTogImRhc2hib2FyZC1ncmlkIiB9LAogICAgICAgIC4uLmFjdGl2ZUNvbXBvbmVudHMubWFwKChjb25maWcsIGluZGV4KSA9PiB7CiAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IGNvbmZpZz8ud2lkZ2V0SWQgfHwgREVGQVVMVF9EQVNIQk9BUkRfQ09NUE9ORU5UU1tpbmRleF0/LndpZGdldElkOwogICAgICAgICAgc3dpdGNoICh3aWRnZXRJZCkgewogICAgICAgICAgICBjYXNlICJhZ2VuZGEiOgogICAgICAgICAgICAgIHJldHVybiBoKEFnZW5kYUNlbGwsIHsga2V5OiBgYWdlbmRhLSR7aW5kZXh9YCwgY29uZmlnLCBhZ2VuZGFUYXNrcywgY3VycmVudERhdGUsIHNlbGVjdGVkRGF0ZSB9KTsKICAgICAgICAgICAgY2FzZSAiYWktcGx1Z2lucyI6CiAgICAgICAgICAgICAgcmV0dXJuIGgoQUlQbHVnaW5zQ2VsbCwgeyBrZXk6IGBhaS1wbHVnaW5zLSR7aW5kZXh9YCwgY29uZmlnIH0pOwogICAgICAgICAgICBjYXNlICJjYWxlbmRhciI6CiAgICAgICAgICAgICAgcmV0dXJuIGgoQ2FsZW5kYXJDZWxsLCB7CiAgICAgICAgICAgICAgICBrZXk6IGBjYWxlbmRhci0ke2luZGV4fWAsCiAgICAgICAgICAgICAgICBjb25maWcsCiAgICAgICAgICAgICAgICBjb21wbGV0ZWRUYXNrc0J5RGF0ZSwKICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLAogICAgICAgICAgICAgICAgb3BlblRhc2tzLAogICAgICAgICAgICAgICAgb25EYXRlU2VsZWN0OiBzZXRTZWxlY3RlZERhdGUsCiAgICAgICAgICAgICAgICBzZXR0aW5ncywKICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0ZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjYXNlICJtb29kIjoKICAgICAgICAgICAgICByZXR1cm4gaChNb29kQ2VsbCwgeyBrZXk6IGBtb29kLSR7aW5kZXh9YCwgY29uZmlnLCBtb29kUmF0aW5ncyB9KTsKICAgICAgICAgICAgY2FzZSAicGxhbm5pbmciOgogICAgICAgICAgICAgIHJldHVybiBoKFBsYW5uaW5nQ2VsbCwgeyBrZXk6IGBwbGFubmluZy0ke2luZGV4fWAsIGNvbmZpZywgcXVhcnRlcmx5UGxhbnMgfSk7CiAgICAgICAgICAgIGNhc2UgInF1aWNrLWFjdGlvbnMiOgogICAgICAgICAgICAgIHJldHVybiBoKFF1aWNrQWN0aW9uc0NlbGwsIHsga2V5OiBgcXVpY2stYWN0aW9ucy0ke2luZGV4fWAsIGNvbmZpZyB9KTsKICAgICAgICAgICAgY2FzZSAicXVvdGVzIjoKICAgICAgICAgICAgICByZXR1cm4gaChRdW90ZXNDZWxsLCB7IGtleTogYHF1b3Rlcy0ke2luZGV4fWAsIGNvbmZpZywgcXVhcnRlcmx5UGxhbnMsIHNldHRpbmdzIH0pOwogICAgICAgICAgICBjYXNlICJ2aWN0b3J5LXZhbHVlIjoKICAgICAgICAgICAgICByZXR1cm4gaChWaWN0b3J5VmFsdWVDZWxsLCB7CiAgICAgICAgICAgICAgICBrZXk6IGB2aWN0b3J5LXZhbHVlLSR7aW5kZXh9YCwKICAgICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgICAgIGNvbXBsZXRlZFRhc2tzQnlEYXRlLAogICAgICAgICAgICAgICAgZGFpbHlWYWx1ZXM6IGRhaWx5VmljdG9yeVZhbHVlcywKICAgICAgICAgICAgICAgIHdlZWtseVRvdGFsOiB3ZWVrbHlWaWN0b3J5VmFsdWUsCiAgICAgICAgICAgICAgICBtb29kUmF0aW5ncywKICAgICAgICAgICAgICAgIHJlZmVyZW5jZURhdGU6IHZpY3RvcnlSZWZlcmVuY2VEYXRlLAogICAgICAgICAgICAgICAgb25SZWZlcmVuY2VEYXRlQ2hhbmdlOiBzZXRTZWxlY3RlZERhdGUsCiAgICAgICAgICAgICAgICBzZXR0aW5ncwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0pLmZpbHRlcihCb29sZWFuKQogICAgICApCiAgICApOwogIH0KCiAgLy8gbGliL2Rhc2hib2FyZC9jbGllbnQtZW50cnkuanMKICB2YXIgcm9vdCA9IGltcG9ydF9yZWFjdF9kb20uZGVmYXVsdC5jcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkYXNoYm9hcmQtcm9vdCIpKTsKICByb290LnJlbmRlcigoMCwgaW1wb3J0X3JlYWN0MTkuY3JlYXRlRWxlbWVudCkoRGFzaGJvYXJkQXBwKSk7Cn0pKCk7Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246CgpyZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgUmVhY3QKICAgKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpzY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpyZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCiovCg==";
 
// css-content:css-content
var compiledCSS = `:root{--dashboard-color-accent: #e8853d;--dashboard-color-agenda-priority-critical: #e85353;--dashboard-color-agenda-priority-important: #e8853d;--dashboard-color-agenda-priority-normal: #7a8699;--dashboard-color-agenda-priority-urgent: #5b7bbf;--dashboard-color-bg-card: #ffffff;--dashboard-color-bg-page: #eef1f5;--dashboard-color-bg-page-hover: #e6ebf2;--dashboard-color-blue: #5b7bbf;--dashboard-color-blue-light: #e8edf5;--dashboard-color-border: #d8dde6;--dashboard-color-danger: #e85353;--dashboard-color-info: #5b7bbf;--dashboard-color-navy: #2c3e6b;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, 0.4);--dashboard-color-overlay-shadow: rgba(0, 0, 0, 0.15);--dashboard-color-success: #4caf80;--dashboard-color-text: #1e2a3a;--dashboard-color-text-muted: #a3aebb;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, 0.6);--dashboard-color-text-secondary: #7a8699;--dashboard-color-tooltip-accent: #5b7bbf;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, 0.15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, 0.3);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, 0.5);--dashboard-color-warning: #e8853d}@media(prefers-color-scheme: dark){:root{--dashboard-color-accent: #ffb36b;--dashboard-color-agenda-priority-critical: #ff7a7a;--dashboard-color-agenda-priority-important: #ffb36b;--dashboard-color-agenda-priority-normal: #a3b0c4;--dashboard-color-agenda-priority-urgent: #8fb2ff;--dashboard-color-bg-card: #1f2937;--dashboard-color-bg-page: #111827;--dashboard-color-bg-page-hover: #1a2436;--dashboard-color-blue: #8fb2ff;--dashboard-color-blue-light: #253553;--dashboard-color-border: #374151;--dashboard-color-danger: #ff7a7a;--dashboard-color-info: #8fb2ff;--dashboard-color-navy: #c5d8ff;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, 0.5);--dashboard-color-overlay-shadow: rgba(0, 0, 0, 0.4);--dashboard-color-success: #73d4a3;--dashboard-color-text: #e5ecf5;--dashboard-color-text-muted: #95a3b8;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, 0.6);--dashboard-color-text-secondary: #b6c0cf;--dashboard-color-tooltip-accent: #a5b4fc;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, 0.15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, 0.5);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, 0.5);--dashboard-color-warning: #ffb36b}}.dashboard .widget{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;display:flex;flex-direction:column;height:100%}.dashboard .widget-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding:12px 16px}.dashboard .widget-icon{font-size:1rem}.dashboard .widget-title{color:var(--dashboard-color-navy);flex:1;font-size:.85rem;font-weight:700;letter-spacing:.03em;margin:0;text-transform:uppercase}.dashboard .widget-configure{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px}.dashboard .widget-configure:hover{color:var(--dashboard-color-navy)}.dashboard .widget-body{flex:1;padding:16px}.dashboard .task-domains{align-items:center;background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:10px;display:flex;gap:12px;margin-bottom:16px;padding:8px 12px}.dashboard .task-domains-list{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:8px}.dashboard .task-domain-item{align-items:center;border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;display:inline-flex;font-size:.8rem;font-weight:500;gap:4px;padding:4px 12px;transition:all .15s ease}.dashboard .task-domain-item:hover{background:var(--dashboard-color-blue-light);color:var(--dashboard-color-navy)}.dashboard .task-domain-item.active{background:var(--dashboard-color-navy);border-color:var(--dashboard-color-navy);color:var(--dashboard-color-bg-card)}.dashboard .task-domain-item.active .task-domain-settings{color:var(--dashboard-color-text-on-accent-muted)}.dashboard .task-domain-item.active .task-domain-settings:hover{color:var(--dashboard-color-text-on-accent)}.dashboard .task-domain-name{user-select:none}.dashboard .task-domain-settings{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.85rem;line-height:1;padding:0}.dashboard .task-domain-settings:hover{color:var(--dashboard-color-navy)}.dashboard .task-domains-refresh{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;white-space:nowrap}.dashboard .task-domains-refresh:hover{color:var(--dashboard-color-navy)}.dashboard .task-domains-refresh:disabled{cursor:default;opacity:.5}.dashboard .task-domains-empty{color:var(--dashboard-color-text-muted);font-size:.8rem}.widget-planning .planning-quarters{display:flex;gap:16px;margin-bottom:16px}.widget-planning .quarter-card{border:2px dashed var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex:1;flex-direction:column;gap:4px;padding:12px 16px;transition:border-color .15s}.widget-planning .quarter-card:hover{border-color:var(--dashboard-color-blue)}.widget-planning .quarter-card .quarter-label{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700}.widget-planning .quarter-card .quarter-status{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-planning .month-tabs{display:flex;gap:4px}.widget-planning .month-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s,color .15s}.widget-planning .month-tab:hover{background:var(--dashboard-color-blue-light)}.widget-planning .month-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-victory-value .vv-header{align-items:baseline;display:flex;gap:8px;margin-bottom:8px}.widget-victory-value .vv-header .vv-total{color:var(--dashboard-color-navy);font-size:2rem;font-weight:700}.widget-victory-value .vv-header .vv-label{color:var(--dashboard-color-text-secondary);font-size:.8rem}.widget-victory-value .vv-date-range{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:normal}.widget-victory-value .vv-chart-container{align-items:center;display:flex;gap:4px}.widget-victory-value .vv-chart-wrap{flex:1;min-width:0;position:relative}.widget-victory-value .vv-chart{border-radius:6px;display:block;width:100%}.widget-victory-value .vv-nav-arrow{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:1.25rem;line-height:1;padding:4px 8px;transition:background .15s,color .15s}.widget-victory-value .vv-nav-arrow:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);color:var(--dashboard-color-navy)}.widget-victory-value .vv-nav-arrow:disabled{cursor:not-allowed;opacity:.3}.widget-mood .mood-selector{display:flex;gap:8px;justify-content:center;margin-bottom:16px}.widget-mood .mood-btn{align-items:center;background:none;border:2px solid rgba(0,0,0,0);border-radius:50%;cursor:pointer;display:flex;height:44px;justify-content:center;transition:border-color .15s,transform .15s;width:44px}.widget-mood .mood-btn:hover{border-color:var(--dashboard-color-blue);transform:scale(1.15)}.widget-mood .mood-btn .mood-emoji{font-size:1.5rem}.widget-mood .mood-summary{color:var(--dashboard-color-text-secondary);font-size:.8rem;text-align:center}.widget-mood .mood-sparkline{align-items:flex-end;display:flex;gap:3px;height:24px;justify-content:center;margin-top:8px}.widget-mood .mood-dot{background:var(--dashboard-color-blue);border-radius:2px;min-height:4px;position:relative;width:4px}.widget-calendar .cal-nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.widget-calendar .cal-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px}.widget-calendar .cal-arrow:hover{color:var(--dashboard-color-navy)}.widget-calendar .cal-month{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700}.widget-calendar .cal-grid{display:grid;gap:2px;grid-template-columns:repeat(7, 1fr);text-align:center}.widget-calendar .cal-header{color:var(--dashboard-color-text-muted);font-size:.7rem;font-weight:600;padding:4px 0}.widget-calendar .cal-cell{align-items:center;aspect-ratio:1;border-radius:50%;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:4px 0;position:relative;transition:background-color .12s ease}.widget-calendar .cal-cell:not(.empty):hover{background:var(--dashboard-color-blue-light)}.widget-calendar .cal-cell.empty{cursor:default;visibility:hidden}.widget-calendar .cal-cell.today{background:var(--dashboard-color-blue)}.widget-calendar .cal-cell.today .cal-day{color:var(--dashboard-color-text-on-accent);font-weight:700}.widget-calendar .cal-cell.today:hover{background:var(--dashboard-color-navy)}.widget-calendar .cal-cell.selected{outline:2px solid var(--dashboard-color-accent);outline-offset:0}.widget-calendar .cal-cell.today.selected{outline-color:var(--dashboard-color-accent)}.widget-calendar .cal-cell .cal-day{color:var(--dashboard-color-text);font-size:.8rem;position:relative;top:-2px}.widget-calendar .cal-cell .cal-dot{border-radius:50%;bottom:6px;height:4px;position:absolute;width:4px}.widget-agenda a{color:var(--dashboard-color-blue);text-decoration:none}.widget-agenda a:hover{text-decoration:underline}.widget-agenda img{max-width:100%}.widget-agenda .agenda-list{display:flex;flex-direction:column;gap:12px;max-height:280px;overflow-x:hidden;overflow-y:auto;padding-right:4px}.widget-agenda .agenda-day{display:flex;flex-direction:column;gap:4px}.widget-agenda .agenda-date-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.widget-agenda .agenda-empty-day{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:4px 0}.widget-agenda .agenda-item{align-items:center;display:flex;gap:12px;padding:8px 0}.widget-agenda .agenda-item .agenda-indicator{border-radius:2px;flex-shrink:0;height:36px;width:4px}.widget-agenda .agenda-item .agenda-indicator.priority-critical{background-color:var(--dashboard-color-agenda-priority-critical)}.widget-agenda .agenda-item .agenda-indicator.priority-important{background-color:var(--dashboard-color-agenda-priority-important)}.widget-agenda .agenda-item .agenda-indicator.priority-urgent{background-color:var(--dashboard-color-agenda-priority-urgent)}.widget-agenda .agenda-item .agenda-indicator.priority-normal{background-color:var(--dashboard-color-agenda-priority-normal)}.widget-agenda .agenda-item .agenda-content{display:flex;flex:1;flex-direction:column;gap:4px}.widget-agenda .agenda-item .agenda-content .agenda-time{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600}.widget-agenda .agenda-item .agenda-content .agenda-text{color:var(--dashboard-color-text);font-size:.85rem;overflow:hidden;white-space:nowrap}.widget-agenda .agenda-item .agenda-content .agenda-note-link{background:rgba(0,0,0,0);border:0;color:var(--dashboard-color-blue);cursor:pointer;font-size:.72rem;margin:0;padding:0;text-align:left;text-decoration:underline}.widget-agenda .agenda-item .agenda-duration{color:var(--dashboard-color-text-muted);font-size:.7rem}.widget-agenda .agenda-task-row{border-radius:6px;cursor:pointer;padding:8px;transition:background-color .12s ease}.widget-agenda .agenda-task-row:hover{background:var(--dashboard-color-bg-page)}.widget-agenda .agenda-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-agenda .agenda-pagination{align-items:center;display:flex;gap:4px}.widget-agenda .agenda-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.65rem;line-height:1;padding:2px 4px}.widget-agenda .agenda-page-arrow:hover:not(:disabled){color:var(--dashboard-color-navy)}.widget-agenda .agenda-page-arrow:disabled{cursor:default;opacity:.3}.widget-agenda .agenda-page-indicator{color:var(--dashboard-color-text-muted);font-size:.7rem;white-space:nowrap}.widget-quotes .quotes-grid{display:grid;gap:16px;grid-template-columns:1fr 1fr}.widget-quotes .quote-tile{background-position:center;background-size:cover;border-radius:10px;color:var(--dashboard-color-text-on-accent);display:flex;flex-direction:column;justify-content:flex-end;min-height:150px;padding:24px 16px}.widget-quotes .quote-tile .quote-text{font-family:Georgia,"Times New Roman",serif;font-size:.95rem;font-style:italic;line-height:1.5;margin:0 0 8px 0}.widget-quotes .quote-tile .quote-author{font-size:.75rem;opacity:.85}.widget-quotes .quotes-loading{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-quick-actions .qa-grid{display:grid;gap:8px;grid-template-columns:1fr 1fr}.widget-quick-actions .qa-button{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex-direction:column;gap:8px;padding:16px 8px;transition:background .15s}.widget-quick-actions .qa-button:hover{background:var(--dashboard-color-bg-page-hover)}.widget-quick-actions .qa-button .qa-icon{font-size:1.4rem}.widget-quick-actions .qa-button .qa-label{color:var(--dashboard-color-text);font-size:.75rem;font-weight:500}.widget-ai-plugins .aip-list{display:flex;flex-direction:column;gap:8px}.widget-ai-plugins .aip-item{align-items:center;display:flex;gap:12px;padding:8px;border-radius:6px}.widget-ai-plugins .aip-item .aip-icon{font-size:1.2rem}.widget-ai-plugins .aip-item .aip-label{color:var(--dashboard-color-text);flex:1;font-size:.85rem}.widget-ai-plugins .aip-item .aip-badge{align-items:center;background:var(--dashboard-color-blue);border-radius:50%;color:var(--dashboard-color-text-on-accent);display:flex;font-size:.7rem;font-weight:700;height:22px;justify-content:center;width:22px}.config-popup-overlay{align-items:center;background:var(--dashboard-color-overlay-backdrop);display:flex;inset:0;justify-content:center;position:fixed;z-index:1000}.config-popup-container{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;box-shadow:0 8px 32px var(--dashboard-color-overlay-shadow);max-width:440px;min-width:320px;width:90%}.config-popup-container .config-popup-header{border-bottom:1px solid var(--dashboard-color-border);padding:16px}.config-popup-container .config-popup-title{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700;margin:0}.config-popup-container .config-popup-body{padding:16px}.config-popup-container .config-popup-body label{align-items:center;color:var(--dashboard-color-text);cursor:pointer;display:flex;font-size:.85rem;gap:8px;padding:4px 0}.config-popup-container .config-popup-body input[type=radio],.config-popup-container .config-popup-body input[type=checkbox]{accent-color:var(--dashboard-color-accent)}.config-popup-container .config-popup-body .config-field{margin-bottom:12px}.config-popup-container .config-popup-body .config-field:last-child{margin-bottom:0}.config-popup-container .config-popup-body .config-field-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.03em;margin-bottom:4px;text-transform:uppercase}.config-popup-container .config-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.config-popup-container .config-popup-actions>button{padding-left:8px;padding-right:8px}.config-popup-container .config-popup-btn{border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;font-weight:600;padding:8px 16px}.config-popup-container .config-popup-btn--cancel{background:rgba(0,0,0,0);color:var(--dashboard-color-text-secondary)}.config-popup-container .config-popup-btn--cancel:hover{background:var(--dashboard-color-bg-page-hover)}.config-popup-container .config-popup-btn--submit{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent)}.config-popup-container .config-popup-btn--submit:hover{opacity:.9}.dashboard-config-container{display:flex;flex-direction:column;margin:16px;max-height:min(800px,100vh - 32px);max-width:min(800px,100vw - 32px);min-width:0;width:100%}.dashboard-config-container .dashboard-config-body{display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:16px}.dashboard-config-container .dashboard-config-section{border:2px dashed rgba(0,0,0,0);border-radius:10px;padding:4px;transition:border-color .15s ease,background .15s ease}.dashboard-config-container .dashboard-config-section--drag-over{background:var(--dashboard-color-blue-light);border-color:var(--dashboard-color-accent)}.dashboard-config-container .dashboard-config-section-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;margin-bottom:8px;padding-bottom:8px}.dashboard-config-container .dashboard-config-section-icon{flex-shrink:0;font-size:.9rem;line-height:1}.dashboard-config-container .dashboard-config-section-title{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:700;letter-spacing:.05em;margin:0;text-transform:uppercase}.dashboard-config-container .dashboard-config-list{display:flex;flex-direction:column;gap:4px}.dashboard-config-container .dashboard-config-item{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:grab;display:flex;gap:8px;padding:8px 12px;transition:opacity .12s ease,box-shadow .12s ease,background .12s ease;user-select:none}.dashboard-config-container .dashboard-config-item:active{cursor:grabbing}.dashboard-config-container .dashboard-config-item--dragging{opacity:.35}.dashboard-config-container .dashboard-config-item--drag-over{background:var(--dashboard-color-bg-card);box-shadow:0 -2px 0 var(--dashboard-color-accent)}.dashboard-config-container .dashboard-config-item-handle{color:var(--dashboard-color-text-muted);cursor:grab;flex-shrink:0;font-size:1rem;line-height:1}.dashboard-config-container .dashboard-config-item-handle:active{cursor:grabbing}.dashboard-config-container .dashboard-config-item-icon{flex-shrink:0;font-size:1rem;line-height:1}.dashboard-config-container .dashboard-config-item-info{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0;overflow:hidden}.dashboard-config-container .dashboard-config-item-name{color:var(--dashboard-color-text);font-size:.875rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-config-container .dashboard-config-item-description{color:var(--dashboard-color-text-secondary);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-config-container .dashboard-config-item-actions{display:flex;flex-shrink:0;gap:2px}.dashboard-config-container .dashboard-config-arrow-button{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;line-height:1;padding:3px 7px;transition:background .1s ease,color .1s ease}.dashboard-config-container .dashboard-config-arrow-button:hover:not(:disabled){background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-config-container .dashboard-config-arrow-button:disabled{cursor:not-allowed;opacity:.3}.dashboard-config-container .dashboard-config-empty{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px 8px;text-align:center}.dashboard-config-container .config-popup-actions .config-popup-link{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;margin-right:auto;padding:0;text-decoration:underline}.dashboard-config-container .config-popup-actions .config-popup-link:hover{color:var(--dashboard-color-text)}.dashboard-toolbar{align-items:center;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;margin-bottom:16px}.dashboard-toolbar .dashboard-toolbar-actions{align-items:center;display:flex;background-color:var(--dashboard-color-bg-card);border-radius:6px;border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);flex-shrink:0}.dashboard-toolbar .dashboard-configure-button{background-color:var(--dashboard-color-bg-card);border:none;border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;padding:8px 12px;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.dashboard-toolbar .dashboard-configure-button:hover{background:var(--dashboard-color-bg-page);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text)}.dashboard-settings-container .dashboard-settings-section{display:flex;flex-direction:column;gap:16px}.dashboard-settings-container .dashboard-settings-section-header{border-bottom:1px solid var(--dashboard-color-border);display:flex;flex-direction:column;gap:4px;padding-bottom:12px}.dashboard-settings-container .dashboard-settings-section-title{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;letter-spacing:.02em;margin:0}.dashboard-settings-container .dashboard-settings-section-desc{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.5;margin:0}.dashboard-settings-container .dashboard-settings-select{appearance:none;background:var(--dashboard-color-bg-page);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.85rem;padding:8px 24px 8px 8px;transition:border-color .15s ease;width:100%}.dashboard-settings-container .dashboard-settings-select:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-dropzone{align-items:center;background:var(--dashboard-color-bg-page);border:2px dashed var(--dashboard-color-border);border-radius:6px;cursor:pointer;display:flex;flex-direction:column;gap:8px;justify-content:center;min-height:120px;padding:16px;text-align:center;transition:border-color .15s ease,background .15s ease}.dashboard-settings-container .dashboard-settings-dropzone:hover{border-color:var(--dashboard-color-accent)}.dashboard-settings-container .dashboard-settings-dropzone--active{background:rgba(0,0,0,.03);border-color:var(--dashboard-color-accent);border-style:solid}.dashboard-settings-container .dashboard-settings-dropzone--uploading{cursor:wait;opacity:.7}.dashboard-settings-container .dashboard-settings-dropzone-input{display:none}.dashboard-settings-container .dashboard-settings-dropzone-text{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-settings-container .dashboard-settings-dropzone-preview{align-items:center;display:flex;flex-direction:column;gap:8px}.dashboard-settings-container .dashboard-settings-dropzone-preview-img{border-radius:6px;max-height:80px;max-width:100%;object-fit:contain}.dashboard-settings-container .dashboard-settings-remove-image{color:var(--dashboard-color-danger);cursor:pointer;display:inline-block;font-size:.8rem;margin-top:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-remove-image:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-link{color:var(--dashboard-color-accent);display:inline-block;font-size:.8rem;margin-bottom:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-api-key-link:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-input-row{align-items:center;display:flex;gap:4px}.dashboard-settings-container .dashboard-settings-api-key-input{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1;font-family:monospace;font-size:.82rem;min-width:0;padding:8px;transition:border-color .15s ease}.dashboard-settings-container .dashboard-settings-api-key-input::placeholder{color:var(--dashboard-color-text-muted)}.dashboard-settings-container .dashboard-settings-api-key-input:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-api-key-toggle{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:.9rem;line-height:1;padding:8px;transition:background .1s ease,color .1s ease}.dashboard-settings-container .dashboard-settings-api-key-toggle:hover{background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-tooltip{background:var(--dashboard-color-tooltip-bg);border-radius:6px;bottom:calc(100% + 8px);box-shadow:0 4px 12px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);font-size:.75rem;line-height:1.4;max-width:260px;min-width:180px;overflow:hidden;padding:8px 12px;pointer-events:none;position:absolute;transform:translateX(-50%);z-index:10}.dashboard-tooltip-arrow{border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-top:6px solid var(--dashboard-color-tooltip-bg);left:50%;position:absolute;top:100%;transform:translateX(-50%)}.dashboard-tooltip-content{display:flex;flex-direction:column}.dashboard-tooltip-header{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.dashboard-tooltip-section{border-bottom:1px solid var(--dashboard-color-tooltip-border);margin-bottom:4px;padding-bottom:4px}.dashboard-tooltip-row{align-items:baseline;display:flex;gap:8px;justify-content:space-between;padding:2px 0}.dashboard-tooltip-row-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-tooltip-row-value{color:var(--dashboard-color-tooltip-accent);flex-shrink:0;font-weight:600}.dashboard-tooltip-empty{color:var(--dashboard-color-tooltip-text-muted);font-style:italic}*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{overflow-y:scroll}html body{-webkit-font-smoothing:antialiased;background:var(--dashboard-color-bg-page);color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif}.dashboard{margin:0 auto;max-width:1200px;padding:24px}.dashboard .dashboard-grid{display:grid;gap:16px;grid-template-columns:repeat(4, 1fr)}.dashboard .grid-cell{opacity:.95;min-width:0;transition:.3s ease opacity}.dashboard .grid-cell:hover{opacity:1}.dashboard .grid-cell.span-2{grid-column:span 2}.dashboard-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:16px;height:100vh;justify-content:center}.dashboard-loading .spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:32px;width:32px}@keyframes spin{to{transform:rotate(360deg)}}.dashboard-error{color:var(--dashboard-color-danger);padding:40px;text-align:center}.dashboard-error p{color:var(--dashboard-color-text-secondary);margin-top:8px}@media(max-width: 800px){.dashboard .dashboard-grid{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 480px){.dashboard .dashboard-grid{grid-template-columns:1fr}.dashboard .grid-cell.span-2{grid-column:span 1}}`;
 
// lib/embed-html.js
function buildEmbedHTML() {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>${compiledCSS}</style>
</head>
<body>
<div id="dashboard-root"></div>
<script type="text/javascript">
const callPlugin = (action, ...args) => window.callAmplenotePlugin(action, ...args);
</script>
<script type="text/javascript" src="data:text/javascript;base64,${clientBase64}"></script>
</body>
</html>`;
}
 
// lib/constants/quarters.js
function getCurrentQuarter() {
const now = /* @__PURE__ */ new Date();
const year = now.getFullYear();
const month = now.getMonth();
const quarter = Math.floor(month / 3) + 1;
return {
year,
quarter,
label: `Q${quarter} ${year}`
};
}
function getNextQuarter() {
const current = getCurrentQuarter();
let { year, quarter } = current;
quarter++;
if (quarter > 4) {
quarter = 1;
year++;
}
return {
year,
quarter,
label: `Q${quarter} ${year}`
};
}
 
// lib/constants/settings.js
var DASHBOARD_COMPONENTS = "dashboard_elements";
var IS_TEST_ENVIRONMENT = typeof process !== "undefined" && process.env?.NODE_ENV === "test";
var SETTING_KEYS = {
LLM_API_KEY: "LLM API Key",
LLM_PROVIDER: "LLM Provider",
BACKGROUND_IMAGE_URL: "Background Image URL",
BACKGROUND_IMAGE_MODE: "Background Image Mode"
};
var TASK_DOMAIN_SETTING = "dashboard_task_domains";
var TASK_DOMAIN_STALE_MS = 24 * 60 * 60 * 1e3;
var WIDGET_REGISTRY = [
{
widgetId: "planning",
name: "Quarterly Planning",
description: "Plan and track your quarterly goals and priorities",
icon: "\u{1F4CB}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "victory-value",
name: "Victory Value",
description: "Celebrate wins and track high-value task completions",
icon: "\u{1F3C6}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "mood",
name: "Mood Tracker",
description: "Log your daily mood and visualize trends over time",
icon: "\u{1F3AD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "calendar",
name: "Calendar",
description: "See upcoming events and appointments at a glance",
icon: "\u{1F4C5}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "agenda",
name: "Task Agenda",
description: "View and manage your prioritized task list",
icon: "\u{1F4CC}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quotes",
name: "Quotes",
description: "Rotating inspirational quotes to keep you motivated",
icon: "\u{1F4A1}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "ai-plugins",
name: "AI Plugins",
description: "One-tap access to your installed AI-powered note plugins",
icon: "\u{1F916}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "quick-actions",
name: "Quick Actions",
description: "Shortcuts for your most frequently used dashboard actions",
icon: "\u26A1",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
}
];
var DEFAULT_DASHBOARD_COMPONENTS = WIDGET_REGISTRY.map((w) => ({
widgetId: w.widgetId,
gridWidthSize: w.defaultGridWidthSize,
gridHeightSize: 1,
settings: {}
}));
 
// lib/util/date-utility.js
function dateFromDateInput(dateInput) {
if (!dateInput)
return /* @__PURE__ */ new Date();
if (dateInput instanceof Date)
return new Date(dateInput);
if (typeof dateInput === "string" && /^\d{4}-\d{2}-\d{2}$/.test(dateInput)) {
const [year, month, day] = dateInput.split("-").map(Number);
return new Date(year, month - 1, day);
}
const parsed = new Date(dateInput);
if (Number.isNaN(parsed.getTime()))
return /* @__PURE__ */ new Date();
return parsed;
}
function weekStartFromDateInput(dateInput) {
const date = dateFromDateInput(dateInput);
const dayOfWeek = date.getDay();
const mondayDelta = dayOfWeek === 0 ? -6 : 1 - dayOfWeek;
const weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() + mondayDelta);
weekStart.setHours(0, 0, 0, 0);
return weekStart;
}
function weekEndFromDateInput(dateInput) {
const weekStart = weekStartFromDateInput(dateInput);
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekEnd.getDate() + 6);
weekEnd.setHours(23, 59, 59, 999);
return weekEnd;
}
 
// lib/data-service.js
async function fetchDashboardData(app) {
const now = /* @__PURE__ */ new Date();
const weekStart = weekStartFromDateInput(now);
const weekEnd = weekEndFromDateInput(now);
const taskDomainInfo = await _resolveTaskDomains(app);
const twoWeeksAgoUnixSeconds = Math.floor(Date.now() / 1e3) - 60 * 60 * 24 * 14;
const [moodRatings, quarterlyPlans, settings, domainTasks] = await Promise.all([
_safeMoodRatings(app, twoWeeksAgoUnixSeconds),
_findQuarterlyPlans(app),
_readDashboardSettings(app),
_fetchTasksForDomain(app, taskDomainInfo.selectedDomainUuid)
]);
return {
tasks: domainTasks,
todayTasks: _filterTodayTasks(domainTasks, now),
completedThisWeek: _filterCompletedInRange(domainTasks, weekStart, weekEnd),
weeklyVictoryValue: _calculateWeeklyVictoryValue(domainTasks, weekStart, weekEnd),
dailyVictoryValues: _calculateDailyVictoryValues(domainTasks, weekStart),
moodRatings,
quarterlyPlans,
currentDate: now.toISOString(),
settings,
taskDomains: taskDomainInfo.domains,
activeTaskDomain: taskDomainInfo.selectedDomainUuid
};
}
async function switchTaskDomain(app, domainUuid) {
const now = /* @__PURE__ */ new Date();
const weekStart = weekStartFromDateInput(now);
const weekEnd = weekEndFromDateInput(now);
const raw = app.settings[TASK_DOMAIN_SETTING];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
stored.selectedDomainUuid = domainUuid;
await app.setSetting(TASK_DOMAIN_SETTING, JSON.stringify(stored));
const domainTasks = await _fetchTasksForDomain(app, domainUuid);
return {
tasks: domainTasks,
todayTasks: _filterTodayTasks(domainTasks, now),
completedThisWeek: _filterCompletedInRange(domainTasks, weekStart, weekEnd),
weeklyVictoryValue: _calculateWeeklyVictoryValue(domainTasks, weekStart, weekEnd),
dailyVictoryValues: _calculateDailyVictoryValues(domainTasks, weekStart),
activeTaskDomain: domainUuid
};
}
async function refreshTaskDomains(app) {
const domains = await app.getTaskDomains();
const raw = app.settings[TASK_DOMAIN_SETTING];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
stored.domains = domains.map((d) => ({ name: d.name, uuid: d.uuid }));
stored.lastRetrieved = Date.now();
const selectedStillExists = stored.selectedDomainUuid && stored.domains.some((d) => d.uuid === stored.selectedDomainUuid);
if (!selectedStillExists) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
}
await app.setSetting(TASK_DOMAIN_SETTING, JSON.stringify(stored));
return { domains: stored.domains, activeTaskDomain: stored.selectedDomainUuid };
}
async function createQuarterlyPlan(app, quarterInfo) {
const { label, year, quarter } = quarterInfo;
const noteName = `${label} Plan`;
const tags = ["planning/quarterly"];
const existing = await app.filterNotes({ query: noteName });
const match = existing.find((n) => n.name === noteName);
if (match) {
await app.navigate(`https://www.amplenote.com/notes/${match.uuid}`);
return { uuid: match.uuid, existed: true };
}
const prevLabel = _previousQuarterLabel(year, quarter);
const prevNotes = await app.filterNotes({ query: `${prevLabel} Plan` });
let template = _defaultQuarterlyTemplate(label);
if (prevNotes.length > 0) {
const prevContent = await app.getNoteContent({ uuid: prevNotes[0].uuid });
const headings = _extractHeadings(prevContent);
if (headings.length > 0) {
template = `# ${label} Plan
 
` + headings.map((h) => `${h}
 
`).join("");
}
}
const uuid = await app.createNote(noteName, tags);
await app.insertNoteContent({ uuid }, template);
await app.navigate(`https://www.amplenote.com/notes/${uuid}`);
return { uuid, existed: false };
}
async function fetchQuotes(app, planContent) {
const apiKey = app.settings["LLM API Key"];
const provider = app.settings["LLM Provider"] || "openai";
if (!apiKey) {
return [
{ text: "Set an LLM API key in plugin settings to generate personalized quotes.", author: "" },
{ text: "The journey of a thousand miles begins with a single step.", author: "Lao Tzu" }
];
}
const prompt = planContent ? `Based on these quarterly goals, generate 2 short inspirational quotes (1-2 sentences each) that motivate progress toward these goals. Return as JSON array [{text, author}]. Goals: ${planContent.substring(0, 500)}` : `Generate 2 short inspirational quotes about productivity and personal growth. Return as JSON array [{text, author}].`;
const endpoint = provider === "anthropic" ? "https://api.anthropic.com/v1/messages" : "https://api.openai.com/v1/chat/completions";
const headers = provider === "anthropic" ? { "Content-Type": "application/json", "x-api-key": apiKey, "anthropic-version": "2023-06-01" } : { "Content-Type": "application/json", "Authorization": `Bearer ${apiKey}` };
const body = provider === "anthropic" ? { model: "claude-sonnet-4-20250514", max_tokens: 300, messages: [{ role: "user", content: prompt }] } : { model: "gpt-4o-mini", messages: [{ role: "user", content: prompt }], max_tokens: 300 };
try {
const response = await fetch(endpoint, { method: "POST", headers, body: JSON.stringify(body) });
const json = await response.json();
const text = provider === "anthropic" ? json?.content?.[0]?.text : json?.choices?.[0]?.message?.content;
return JSON.parse(text);
} catch (error) {
console.error("Quote fetch error:", error);
return [
{ text: "What gets measured gets managed.", author: "Peter Drucker" },
{ text: "Small daily improvements lead to stunning results.", author: "Robin Sharma" }
];
}
}
async function navigateToNote(app, noteUUID) {
await app.navigate(`https://www.amplenote.com/notes/${noteUUID}`);
}
async function navigateToTask(app, noteUUID, taskUUID) {
if (!noteUUID)
return;
if (!taskUUID) {
await app.navigate(`https://www.amplenote.com/notes/${noteUUID}`);
return;
}
await app.navigate(`https://www.amplenote.com/notes/${noteUUID}?highlightTaskUUID=${taskUUID}`);
}
async function navigateToUrl(app, url) {
if (!url)
return false;
return await app.navigate(url);
}
async function runQuickAction(app, action) {
const actionToUrl = {
dailyJot: "https://www.amplenote.com/notes/jots",
journal: "https://www.amplenote.com/notes/jots",
addPerson: "https://www.amplenote.com/notes?tag=people",
browseCRM: "https://www.amplenote.com/notes?tag=crm"
};
const url = actionToUrl[action] || "https://www.amplenote.com/notes";
return await app.navigate(url);
}
async function _resolveTaskDomains(app) {
const raw = app.settings[TASK_DOMAIN_SETTING];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
const isStale = !stored.lastRetrieved || Date.now() - stored.lastRetrieved > TASK_DOMAIN_STALE_MS;
const hasDomains = Array.isArray(stored.domains) && stored.domains.length > 0;
if (!hasDomains || isStale) {
const freshDomains = await app.getTaskDomains();
stored.domains = freshDomains.map((d) => ({ name: d.name, uuid: d.uuid }));
stored.lastRetrieved = Date.now();
const selectedStillExists = stored.selectedDomainUuid && stored.domains.some((d) => d.uuid === stored.selectedDomainUuid);
if (!selectedStillExists) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
}
await app.setSetting(TASK_DOMAIN_SETTING, JSON.stringify(stored));
}
if (!stored.selectedDomainUuid && stored.domains.length > 0) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
await app.setSetting(TASK_DOMAIN_SETTING, JSON.stringify(stored));
}
return stored;
}
function _pickDefaultDomain(domains) {
if (!domains || domains.length === 0)
return null;
const work = domains.find((d) => d.name === "Work");
return work ? work.uuid : domains[0].uuid;
}
async function _fetchTasksForDomain(app, domainUuid) {
if (!domainUuid)
return [];
return await app.getTaskDomainTasks(domainUuid);
}
function _filterTodayTasks(tasks, now) {
const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
const dayEnd = dayStart + 864e5;
return tasks.filter(
(t) => !t.completedAt && !t.dismissedAt && _millisFromTimestamp(t.startAt) && _millisFromTimestamp(t.startAt) >= dayStart && _millisFromTimestamp(t.startAt) < dayEnd
).sort((a, b) => (_millisFromTimestamp(a.startAt) || 0) - (_millisFromTimestamp(b.startAt) || 0));
}
function _filterCompletedInRange(tasks, start, end) {
const startMs = start.getTime();
const endMs = end.getTime();
return tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= startMs && _millisFromTimestamp(t.completedAt) <= endMs
);
}
function _calculateWeeklyVictoryValue(tasks, weekStart, weekEnd) {
return _filterCompletedInRange(tasks, weekStart, weekEnd).reduce((sum, t) => sum + (t.victoryValue || 0), 0);
}
function _calculateDailyVictoryValues(tasks, weekStart) {
const days = Array.from({ length: 7 }, (_, i) => {
const dayStart = new Date(weekStart);
dayStart.setDate(dayStart.getDate() + i);
const dayEnd = new Date(dayStart);
dayEnd.setDate(dayEnd.getDate() + 1);
const dayTasks = tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= dayStart.getTime() && _millisFromTimestamp(t.completedAt) < dayEnd.getTime()
);
return {
day: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][i],
date: dayStart.toISOString(),
value: dayTasks.reduce((sum, t) => sum + (t.victoryValue || 0), 0),
taskCount: dayTasks.length
};
});
return days;
}
async function _safeMoodRatings(app, fromUnixSeconds) {
const moodRatings = await app.getMoodRatings(fromUnixSeconds);
console.log("Mood ratings", moodRatings, "from", fromUnixSeconds);
return moodRatings;
}
async function _findQuarterlyPlans(app) {
const current = getCurrentQuarter();
const next = getNextQuarter();
const [currentPlans, nextPlans] = await Promise.all([
app.filterNotes({ query: `${current.label} Plan` }),
app.filterNotes({ query: `${next.label} Plan` })
]);
return {
current: { ...current, noteUUID: currentPlans.find((n) => n.name === `${current.label} Plan`)?.uuid },
next: { ...next, noteUUID: nextPlans.find((n) => n.name === `${next.label} Plan`)?.uuid }
};
}
async function _readDashboardSettings(app) {
const keys = ["dashboard_victory-value_config", "dashboard_calendar_config", "dashboard_quotes_config"];
const settings = {};
for (const key of keys) {
try {
const val = app.settings[key];
settings[key] = val ? JSON.parse(val) : null;
} catch {
settings[key] = null;
}
}
let componentLayout = null;
try {
componentLayout = app.settings[DASHBOARD_COMPONENTS] ? JSON.parse(app.settings[DASHBOARD_COMPONENTS]) : null;
} catch {
componentLayout = null;
}
if (!Array.isArray(componentLayout) || componentLayout.length === 0) {
componentLayout = DEFAULT_DASHBOARD_COMPONENTS.map((component) => ({ ...component }));
await app.setSetting(DASHBOARD_COMPONENTS, JSON.stringify(componentLayout));
}
settings[DASHBOARD_COMPONENTS] = componentLayout;
return settings;
}
function _millisFromTimestamp(timestamp) {
if (timestamp == null)
return null;
if (typeof timestamp !== "number") {
const parsed = Number(timestamp);
if (!Number.isFinite(parsed))
return null;
return parsed < 1e10 ? parsed * 1e3 : parsed;
}
return timestamp < 1e10 ? timestamp * 1e3 : timestamp;
}
function _previousQuarterLabel(year, quarter) {
if (quarter === 1)
return `Q4 ${year - 1}`;
return `Q${quarter - 1} ${year}`;
}
function _extractHeadings(markdownContent) {
return (markdownContent.match(/^#{1,3}\s+.+$/gm) || []).filter((h) => !h.startsWith("# "));
}
function _defaultQuarterlyTemplate(label) {
return `# ${label} Plan
 
## Goals
 
## Key Results
 
## Projects
 
## Reflections
 
`;
}
 
// lib/plugin.js
var plugin = {
// --------------------------------------------------------------------------------------
// Constants
// --------------------------------------------------------------------------------------
constants: {},
// --------------------------------------------------------------------------------------
// App Options — Quick Open menu entries
// --------------------------------------------------------------------------------------
appOption: {
"Open Dashboard": async function(app) {
await app.openSidebarEmbed(1.5);
},
"Open Dashboard (Full)": async function(app) {
await app.openEmbed();
}
},
// --------------------------------------------------------------------------------------
// Embed Rendering
// --------------------------------------------------------------------------------------
async renderEmbed(app) {
try {
return buildEmbedHTML();
} catch (error) {
console.error("Dashboard renderEmbed error:", error);
return `<div style="padding:20px;color:red;">Dashboard failed to load: ${error.message}</div>`;
}
},
// --------------------------------------------------------------------------------------
// Embed Communication Bridge
// --------------------------------------------------------------------------------------
async onEmbedCall(app, actionType, ...args) {
console.log("Dashboard onEmbedCall:", { actionType, args });
try {
switch (actionType) {
case "init":
return await fetchDashboardData(app);
case "getTaskDomainTasks":
return await app.getTaskDomainTasks(args[0]);
case "getMoodRatings":
return await app.getMoodRatings(args[0], args[1]);
case "getCompletedTasks":
return await app.getCompletedTasks(args[0], args[1]);
case "filterNotes":
return await app.filterNotes(args[0]);
case "createQuarterlyPlan":
return await createQuarterlyPlan(app, args[0]);
case "navigateToNote":
return await navigateToNote(app, args[0]);
case "navigateToTask":
return await navigateToTask(app, args[0], args[1]);
case "navigateToUrl":
return await navigateToUrl(app, args[0]);
case "quickAction":
return await runQuickAction(app, args[0]);
case "configure":
return await this._handleConfigure(app, args[0]);
case "saveSetting":
await app.setSetting(
`dashboard_${args[0]}_config`,
JSON.stringify(Array.isArray(args[1]) ? args[1] : [args[1]])
);
return true;
case "saveLayout":
await app.setSetting(DASHBOARD_COMPONENTS, JSON.stringify(args[0]));
return true;
case "uploadBackgroundImage": {
const dataURL = args[0];
const pluginNoteUUID = app.context.pluginUUID;
const fileURL = await app.attachNoteMedia({ uuid: pluginNoteUUID }, dataURL);
await app.setSetting(SETTING_KEYS.BACKGROUND_IMAGE_URL, fileURL);
return fileURL;
}
case "removeBackgroundImage":
await app.setSetting(SETTING_KEYS.BACKGROUND_IMAGE_URL, "");
await app.setSetting(SETTING_KEYS.BACKGROUND_IMAGE_MODE, "");
return true;
case "saveBackgroundMode":
await app.setSetting(SETTING_KEYS.BACKGROUND_IMAGE_MODE, args[0]);
return true;
case "fetchQuotes":
return await fetchQuotes(app, args[0]);
case "getNoteContent":
return await app.getNoteContent({ uuid: args[0] });
case "setActiveTaskDomain":
return await switchTaskDomain(app, args[0]);
case "refreshTaskDomains":
return await refreshTaskDomains(app);
default:
console.error(`Unknown embed action: ${actionType}`);
return null;
}
} catch (error) {
console.error(`onEmbedCall error (${actionType}):`, error);
return { error: error.message };
}
},
// --------------------------------------------------------------------------------------
// Private Methods
// --------------------------------------------------------------------------------------
async _handleConfigure(app, widgetId) {
const configs = {
"victory-value": {
title: "Configure Victory Value",
inputs: [
{ label: "Time range", type: "radio", options: [
{ label: "This week", value: "week" },
{ label: "This month", value: "month" },
{ label: "Last 30 days", value: "30days" }
] },
{ label: "Show mood overlay", type: "checkbox", value: true }
]
},
"calendar": {
title: "Configure Calendar",
inputs: [
{ label: "Week starts on", type: "radio", options: [
{ label: "Sunday", value: "0" },
{ label: "Monday", value: "1" }
] }
]
},
"quotes": {
title: "Configure Quotes",
inputs: [
{ label: "Quote style", type: "radio", options: [
{ label: "Motivational", value: "motivational" },
{ label: "Philosophical", value: "philosophical" },
{ label: "From quarterly goals", value: "goals" }
] }
]
}
};
const config = configs[widgetId];
if (!config)
return null;
const result = await app.prompt(config.title, { inputs: config.inputs });
if (!result)
return null;
await app.setSetting(`dashboard_${widgetId}_config`, JSON.stringify(
Array.isArray(result) ? result : [result]
));
return result;
}
};
var plugin_default = plugin;
return plugin;
})()