lotus / node_modules /.cache /ts-loader /3886e06972ee7ecd64df3c3b87647f17.json
k-l-lambda's picture
updated node_modules
4cadbaf
raw
history blame
226 kB
{"remainingRequest":"/home/camus/work/lotus/node_modules/babel-loader/lib/index.js!/home/camus/work/lotus/node_modules/ts-loader/index.js??ref--15-2!/home/camus/work/lotus/node_modules/eslint-loader/index.js??ref--14-0!/home/camus/work/lotus/inc/lilyParser/lilyTerms.ts","dependencies":[{"path":"/home/camus/work/lotus/inc/lilyParser/lilyTerms.ts","mtime":1732184618441},{"path":"/home/camus/work/lotus/node_modules/cache-loader/dist/cjs.js","mtime":1719800821084},{"path":"/home/camus/work/lotus/node_modules/babel-loader/lib/index.js","mtime":1727163989637},{"path":"/home/camus/work/lotus/node_modules/ts-loader/index.js","mtime":1726221607070},{"path":"/home/camus/work/lotus/node_modules/eslint-loader/index.js","mtime":1719800837044}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IHsgV0hPTEVfRFVSQVRJT05fTUFHTklUVURFLCBGcmFjdGlvbk51bWJlciwgbGNtTXVsdGksIGdjZCwgTUFJTl9TQ09SRV9OQU1FIH0gZnJvbSAiLi91dGlscyI7CmltcG9ydCAqIGFzIGlkaW9tcyBmcm9tICIuL2lkaW9tcyI7CmltcG9ydCB7IExJTFlQT05EX1ZFUlNJT04gfSBmcm9tICIuLi9jb25zdGFudHMiOwppbXBvcnQgKiBhcyBtZWFzdXJlTGF5b3V0IGZyb20gIi4uL21lYXN1cmVMYXlvdXQiOwppbXBvcnQgSW1wbGljaXRUeXBlIGZyb20gIi4uL2xpbHlOb3RhdGlvbi9pbXBsaWNpdFR5cGUiOwppbXBvcnQgcGljayBmcm9tICIuLi9waWNrIjsKOwpjbGFzcyBMb2NhdG9yIHsKICBjb25zdHJ1Y3Rvcih0ZXJtKSB7CiAgICB0ZXJtLl9sb2NhdGlvbiA9IHRlcm0uX2xvY2F0aW9uIHx8IHsKICAgICAgbGluZXM6IFswLCAwXSwKICAgICAgY29sdW1uczogWzAsIDBdCiAgICB9OwogICAgdGhpcy5sb2NhdGlvbiA9IHRlcm0uX2xvY2F0aW9uOwogIH0KfQo7CmNsYXNzIE9wZW5Mb2NhdG9yIGV4dGVuZHMgTG9jYXRvciB7CiAgc2V0KGxpbmUsIGNvbHVtbikgewogICAgdGhpcy5sb2NhdGlvbi5saW5lc1swXSA9IGxpbmU7CiAgICB0aGlzLmxvY2F0aW9uLmNvbHVtbnNbMF0gPSBjb2x1bW47CiAgfQp9CjsKY2xhc3MgQ2xvc2VMb2NhdG9yIGV4dGVuZHMgTG9jYXRvciB7CiAgc2V0KGxpbmUsIGNvbHVtbikgewogICAgdGhpcy5sb2NhdGlvbi5saW5lc1sxXSA9IGxpbmU7CiAgICB0aGlzLmxvY2F0aW9uLmNvbHVtbnNbMV0gPSBjb2x1bW47CiAgfQp9CjsKLy8gY29uY2F0IGFycmF5IG9mIGFycmF5CmNvbnN0IGNjID0gYXJyYXlzID0+IFtdLmNvbmNhdCguLi5hcnJheXMpOwpleHBvcnQgY2xhc3MgTXVzaWNDaHVuayB7CiAgY29uc3RydWN0b3IocGFyZW50LCB0ZXJtcyA9IFtdKSB7CiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgIHRoaXMudGVybXMgPSB0ZXJtczsKICB9CiAgc3RhdGljIGpvaW4oY2h1bmtzKSB7CiAgICByZXR1cm4gY2MoY2h1bmtzLm1hcCgoY2h1bmssIGkpID0+IGkgPT09IGNodW5rcy5sZW5ndGggLSAxID8gY2h1bmsudGVybXMgOiBbLi4uY2h1bmsudGVybXMsIG5ldyBEaXZpZGUoe30pXSkpOwogIH0KICBwdXNoKHRlcm0pIHsKICAgIHRoaXMudGVybXMucHVzaCh0ZXJtKTsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy50ZXJtcy5sZW5ndGg7CiAgfQogIGdldCBkdXJhdGlvbk1hZ25pdHVkZSgpIHsKICAgIHJldHVybiB0aGlzLnRlcm1zLnJlZHVjZSgobWFnbml0dWRlLCB0ZXJtKSA9PiBtYWduaXR1ZGUgKyB0ZXJtLmR1cmF0aW9uTWFnbml0dWRlLCAwKTsKICB9Cn0KOwo7CmNvbnN0IGlzTnVsbEl0ZW0gPSBpdGVtID0+IGl0ZW0gPT09ICIiIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCB8fCBpdGVtID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoaXRlbSkgJiYgIWl0ZW0ubGVuZ3RoOwpjb25zdCBjb21wYWN0ID0gaXRlbXMgPT4gY2MoaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gaXNOdWxsSXRlbShpdGVtKSA/IFtdIDogW2luZGV4ID4gMCA/ICJcYiIgOiBudWxsLCBpdGVtXSkpOwpleHBvcnQgY29uc3QgZ2V0RHVyYXRpb25TdWJkaXZpZGVyID0gdGVybSA9PiB7CiAgaWYgKHRlcm0gaW5zdGFuY2VvZiBNdXNpY0V2ZW50KSB7CiAgICBpZiAoISh0ZXJtIGluc3RhbmNlb2YgUmVzdCkgfHwgIXRlcm0uaXNTcGFjZXIpIHJldHVybiB0ZXJtLmR1cmF0aW9uVmFsdWUuc3ViZGl2aWRlcjsKICB9IGVsc2UgaWYgKHRlcm0gaW5zdGFuY2VvZiBNdXNpY0Jsb2NrKSByZXR1cm4gbGNtTXVsdGkoLi4udGVybS5ib2R5Lm1hcChnZXREdXJhdGlvblN1YmRpdmlkZXIpKTtlbHNlIGlmICh0ZXJtIGluc3RhbmNlb2YgTXVzaWNDaHVuaykgcmV0dXJuIGxjbU11bHRpKC4uLnRlcm0udGVybXMubWFwKGdldER1cmF0aW9uU3ViZGl2aWRlcikpO2Vsc2UgaWYgKHRlcm0gaW5zdGFuY2VvZiBUaW1lcyB8fCB0ZXJtIGluc3RhbmNlb2YgVHVwbGV0KSB7CiAgICBjb25zdCBkaXZpZGVyID0gdGVybSBpbnN0YW5jZW9mIFR1cGxldCA/IHRlcm0uZGl2aWRlciA6IHRlcm0uZmFjdG9yLnJlY2lwcm9jYWw7CiAgICBkaXZpZGVyLm51bWVyYXRvciAqPSBnZXREdXJhdGlvblN1YmRpdmlkZXIodGVybS5tdXNpYyk7CiAgICByZXR1cm4gZGl2aWRlci5yZWR1Y2VkLm51bWVyYXRvcjsKICB9IGVsc2UgaWYgKHRlcm0gaW5zdGFuY2VvZiBSZXBlYXQpIHJldHVybiBnZXREdXJhdGlvblN1YmRpdmlkZXIodGVybS5ib2R5QmxvY2spO2Vsc2UgaWYgKHRlcm0gaW5zdGFuY2VvZiBSZWxhdGl2ZSkgcmV0dXJuIGdldER1cmF0aW9uU3ViZGl2aWRlcih0ZXJtLm11c2ljKTtlbHNlIGlmICh0ZXJtLmlzTXVzaWMpIGNvbnNvbGUud2FybigiW2dldER1cmF0aW9uU3ViZGl2aWRlcl0JdW5leHBlY3RlZCBtdXNpYyB0ZXJtOiIsIHRlcm0pOwogIHJldHVybiAxOwp9OwpleHBvcnQgY29uc3QgY29uc3RydWN0TXVzaWNGcm9tTWVhc3VyZUxheW91dCA9IChsYXlvdXQsIGNodW5rcykgPT4gewogIGNvbnN0IGpvaW5NZWFzdXJlU2VxID0gc2VxID0+IE11c2ljQ2h1bmsuam9pbihzZXEubWFwKHN1YmxheW91dCA9PiBjb25zdHJ1Y3RNdXNpY0Zyb21NZWFzdXJlTGF5b3V0KHN1YmxheW91dCwgY2h1bmtzKSkpOwogIGlmIChsYXlvdXQgaW5zdGFuY2VvZiBtZWFzdXJlTGF5b3V0LlNpbmdsZU1MYXlvdXQpIHsKICAgIGNvbnN0IGNodW5rID0gY2h1bmtzLmdldChsYXlvdXQubWVhc3VyZSk7CiAgICBjb25zb2xlLmFzc2VydCghIWNodW5rLCAibm8gY2h1bmsgZm9yIG1lYXN1cmU6IiwgbGF5b3V0Lm1lYXN1cmUpOwogICAgcmV0dXJuIGNodW5rOwogIH0gZWxzZSBpZiAobGF5b3V0IGluc3RhbmNlb2YgbWVhc3VyZUxheW91dC5CbG9ja01MYXlvdXQpIHsKICAgIGNvbnN0IHRlcm1zID0gam9pbk1lYXN1cmVTZXEobGF5b3V0LnNlcSk7CiAgICByZXR1cm4gbmV3IE11c2ljQ2h1bmsobnVsbCwgdGVybXMpOwogIH0gZWxzZSBpZiAobGF5b3V0IGluc3RhbmNlb2YgbWVhc3VyZUxheW91dC5Wb2x0YU1MYXlvdXQpIHsKICAgIGNvbnN0IGJvZHlUZXJtcyA9IGpvaW5NZWFzdXJlU2VxKGxheW91dC5ib2R5KTsKICAgIGNvbnN0IGFsdGVybmF0aXZlID0gbGF5b3V0LmFsdGVybmF0ZXMgJiYgbGF5b3V0LmFsdGVybmF0ZXMubWFwKGFsdGVybmF0ZSA9PiBuZXcgTXVzaWNCbG9jayh7CiAgICAgIGJvZHk6IGpvaW5NZWFzdXJlU2VxKGFsdGVybmF0ZSkKICAgIH0pKTsKICAgIGNvbnN0IHJlcGVhdCA9IFJlcGVhdC5jcmVhdGVWb2x0YShsYXlvdXQudGltZXMudG9TdHJpbmcoKSwgbmV3IE11c2ljQmxvY2soewogICAgICBib2R5OiBib2R5VGVybXMKICAgIH0pLCBhbHRlcm5hdGl2ZSk7CiAgICByZXR1cm4gbmV3IE11c2ljQ2h1bmsobnVsbCwgW3JlcGVhdF0pOwogIH0gZWxzZSBpZiAobGF5b3V0IGluc3RhbmNlb2YgbWVhc3VyZUxheW91dC5BQkFNTGF5b3V0KSB7CiAgICBjb25zdCBtYWluTGlzdCA9IGNvbnN0cnVjdE11c2ljRnJvbU1lYXN1cmVMYXlvdXQobGF5b3V0Lm1haW4sIGNodW5rcyk7CiAgICBjb25zdCBtYWluID0gbWFpbkxpc3QudGVybXMubGVuZ3RoID09PSAxID8gbWFpbkxpc3QudGVybXNbMF0gOiBuZXcgTXVzaWNCbG9jayh7CiAgICAgIGJvZHk6IG1haW5MaXN0LnRlcm1zCiAgICB9KTsKICAgIGNvbnN0IHJlc3RUZXJtcyA9IGpvaW5NZWFzdXJlU2VxKGxheW91dC5yZXN0KTsKICAgIGNvbnN0IGJsb2NrID0gbmV3IE11c2ljQmxvY2soewogICAgICBib2R5OiBbbWFpbiwgLi4ucmVzdFRlcm1zXQogICAgfSk7CiAgICByZXR1cm4gbmV3IE11c2ljQ2h1bmsobnVsbCwgW25ldyBWYXJpYWJsZSh7CiAgICAgIG5hbWU6ICJsb3R1c1JlcGVhdEFCQSIKICAgIH0pLCBibG9ja10pOwogIH0KfTsKZXhwb3J0IGNsYXNzIEJhc2VUZXJtIHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICAvL09iamVjdC5hc3NpZ24odGhpcywgZGF0YSk7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB0aGlzW2tleV0gPSBwYXJzZVJhdyhkYXRhW2tleV0pOwogIH0KICBzZXJpYWxpemUoKSB7CiAgICBjb25zb2xlLndhcm4oInVuaW1wbGVtZW50ZWQgc2VyaWxpemF0aW9uOiIsIHRoaXMpOwogICAgcmV0dXJuIFtdOwogIH0KICBqb2luKCkgewogICAgbGV0IHdvcmRzID0gdGhpcy5zZXJpYWxpemUoKS5maWx0ZXIod29yZCA9PiBbInN0cmluZyIsICJudW1iZXIiXS5pbmNsdWRlcyh0eXBlb2Ygd29yZCkpLm1hcCh3b3JkID0+IHdvcmQudG9TdHJpbmcoKSk7CiAgICB3b3JkcyA9IHdvcmRzLmZpbHRlcigod29yZCwgaSkgPT4gIShpICYmIHdvcmRzW2kgLSAxXSA9PT0gIlxuIiAmJiB3b3JkID09PSAiXG4iKSk7CiAgICBsZXQgaW5kZW50ID0gMDsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgY29uc3QgcG9wID0gY2hhciA9PiB7CiAgICAgIGlmICghY2hhciB8fCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID09PSBjaGFyKSB7CiAgICAgICAgcmVzdWx0LnBvcCgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9OwogICAgZm9yIChjb25zdCB3b3JkIG9mIHdvcmRzKSB7CiAgICAgIHN3aXRjaCAod29yZCkgewogICAgICAgIGNhc2UgIlxiIjoKICAgICAgICAgIC8vIHJlbW92ZSBsYXN0IHNwYWNlCiAgICAgICAgICBwb3AoIiAiKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgIlxiXG4iOgogICAgICAgICAgLy8gcmVtb3ZlIGxhc3QgbmV3bGluZQogICAgICAgICAgd2hpbGUgKHBvcCgiXHQiKSkge30KICAgICAgICAgIHBvcCgiXG4iKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgIlxuIjoKICAgICAgICAgIC8vIG5vIHNwYWNlIGF0IGxpbmUgdGFpbAogICAgICAgICAgcG9wKCIgIik7CiAgICAgIH0KICAgICAgaWYgKC9eKFx9fD4+KS8udGVzdCh3b3JkKSkgcG9wKCJcdCIpOyAvLyByZW1vdmUgdGhlIGxhc3QgdGFiCiAgICAgIHJlc3VsdC5wdXNoKHdvcmQpOwogICAgICBpZiAoL1xuJC8udGVzdCh3b3JkKSkgewogICAgICAgIGlmICgvKFx7fDw8KVxuJC8udGVzdCh3b3JkKSkgKytpbmRlbnQ7ZWxzZSBpZiAoL14oXH18Pj4pLy50ZXN0KHdvcmQpKSAtLWluZGVudDsKICAgICAgICBpZiAoaW5kZW50KSByZXN1bHQucHVzaCguLi5BcnJheShpbmRlbnQpLmZpbGwoIlx0IikpOwogICAgICB9IGVsc2UgcmVzdWx0LnB1c2goIiAiKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQuam9pbigiIik7CiAgfQogIHJlbG9jYXRlKHNvdXJjZSA9IHRoaXMuam9pbigpKSB7CiAgICBjb25zdCB3b3JkcyA9IHRoaXMuc2VyaWFsaXplKCkuZmlsdGVyKHdvcmQgPT4gd29yZCAhPT0gbnVsbCAmJiB3b3JkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB3b3JkICE9PSAic3RyaW5nIiB8fCAvXFMvLnRlc3Qod29yZCkgJiYgIXdvcmQuaW5jbHVkZXMoIlxiIikpKS5tYXAod29yZCA9PiB0eXBlb2Ygd29yZCA9PT0gInN0cmluZyIgPyB3b3JkLnJlcGxhY2UoL1xuL2csICIiKSA6IHdvcmQpOwogICAgY29uc3QgY2hhcnMgPSBzb3VyY2Uuc3BsaXQoIiIpOwogICAgbGV0IGxpbmUgPSAxOwogICAgbGV0IGNvbHVtbiA9IDA7CiAgICBsZXQgd29yZEluZGV4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKHdvcmRJbmRleCA+PSB3b3Jkcy5sZW5ndGgpIGJyZWFrOwogICAgICBjb25zdCBjaGFyID0gY2hhcnNbaV07CiAgICAgIHN3aXRjaCAoY2hhcikgewogICAgICAgIGNhc2UgIlxuIjoKICAgICAgICAgICsrbGluZTsKICAgICAgICAgIGNvbHVtbiA9IDA7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICIgIjoKICAgICAgICBjYXNlICJcdCI6CiAgICAgICAgICArK2NvbHVtbjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBsZXQgd29yZCA9IHdvcmRzW3dvcmRJbmRleF07CiAgICAgICAgICB3aGlsZSAod29yZCBpbnN0YW5jZW9mIExvY2F0b3IpIHsKICAgICAgICAgICAgd29yZC5zZXQobGluZSwgY29sdW1uKTsKICAgICAgICAgICAgKyt3b3JkSW5kZXg7CiAgICAgICAgICAgIHdvcmQgPSB3b3Jkc1t3b3JkSW5kZXhdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHdvcmRJbmRleCA+PSB3b3Jkcy5sZW5ndGgpIGJyZWFrOwogICAgICAgICAgd29yZCA9IHdvcmQudG9TdHJpbmcoKTsKICAgICAgICAgIGlmIChjaGFyID09PSB3b3JkWzBdKSB7CiAgICAgICAgICAgIGkgKz0gd29yZC5sZW5ndGggLSAxOwogICAgICAgICAgICBjb2x1bW4gKz0gd29yZC5sZW5ndGg7CiAgICAgICAgICAgICsrd29yZEluZGV4OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy9kZWJ1Z2dlcjsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGNoYXIgaW4gc291cmNlOiBbJHtpfV0nJHtjaGFyfScsIGV4cGVjdDogJHt3b3JkfWApOwogICAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIHBhcnNlUmF3KEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcykpKTsKICB9CiAgZ2V0IGVudHJpZXMoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0IGlzTXVzaWMoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBtdXNpY0NodW5rcygpIHsKICAgIGlmICghdGhpcy5pc011c2ljIHx8ICF0aGlzLmVudHJpZXMpIHJldHVybiBbXTsKICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5lbnRyaWVzLm1hcChlbnRyeSA9PiBlbnRyeS5tdXNpY0NodW5rcykpOwogIH0KICBnZXQgbWVhc3VyZXMoKSB7CiAgICBjb25zdCBpbmRpY2VzID0gW3RoaXMuX21lYXN1cmVdLmNvbmNhdCguLi4odGhpcy5lbnRyaWVzIHx8IFtdKS5tYXAoZW50cnkgPT4gZW50cnkubWVhc3VyZXMpKS5maWx0ZXIoaW5kZXggPT4gTnVtYmVyLmlzSW50ZWdlcihpbmRleCkpOwogICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChpbmRpY2VzKSk7CiAgfQogIGdldCBkdXJhdGlvbk1hZ25pdHVkZSgpIHsKICAgIHJldHVybiAwOwogIH0KICBnZXQgcHJvdG8oKSB7CiAgICByZXR1cm4gdGVybVByb3RvTWFwLmdldChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpOwogIH0KICBnZXQgaHJlZigpIHsKICAgIGlmICh0aGlzLl9sb2NhdGlvbikgcmV0dXJuIGAke3RoaXMuX2xvY2F0aW9uLmxpbmVzWzBdfToke3RoaXMuX2xvY2F0aW9uLmNvbHVtbnNbMF19OiR7dGhpcy5fbG9jYXRpb24uY29sdW1uc1sxXX1gOwogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBtZWFzdXJlTGF5b3V0KCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldEZpZWxkKGtleSkgewogICAgY29uc29sZS5hc3NlcnQoISF0aGlzLmVudHJpZXMsICJbQmFzZVRlcm0uZ2V0RmllbGRdIHRlcm0ncyBlbnRyaWVzIGlzIG51bGw6IiwgdGhpcyk7CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykgewogICAgICBjb25zdCByZXN1bHQgPSBlbnRyeS5xdWVyeShrZXkpOwogICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0OwogICAgfQogIH0KICBxdWVyeShrZXkpIHsKICAgIHZvaWQga2V5OwogICAgLy9jb25zb2xlLndhcm4oInRlcm0ucXVlcnkgbm90IGltcGxlbWVudGVkOiIsIHRoaXMpOwogIH0KICBhcHBlbmRBc3NpZ25tZW50KGtleSwgdmFsdWUpIHsKICAgIGNvbnNvbGUuYXNzZXJ0KCEhdGhpcy5lbnRyaWVzLCAibm8gZW50cmllcyBvbiB0aGlzIHRlcm0uIik7CiAgICBjb25zdCBhc3NpZ24gPSB0aGlzLmdldEZpZWxkKGtleSk7CiAgICBpZiAoYXNzaWduKSBhc3NpZ24udmFsdWUgPSB2YWx1ZTtlbHNlIHsKICAgICAgdGhpcy5lbnRyaWVzLnB1c2gocGFyc2VSYXcoewogICAgICAgIHByb3RvOiAiQXNzaWdubWVudCIsCiAgICAgICAga2V5LAogICAgICAgIHZhbHVlOiB2YWx1ZQogICAgICB9KSk7CiAgICB9CiAgfQogIGZpbmRGaXJzdChjb25kaXRpb24pIHsKICAgIGlmICghdGhpcy5lbnRyaWVzKSByZXR1cm4gbnVsbDsKICAgIGlmIChCYXNlVGVybS5pc1Byb3RvdHlwZU9mKGNvbmRpdGlvbikpIHsKICAgICAgY29uc3QgdGVybUNsYXNzID0gY29uZGl0aW9uOwogICAgICBjb25kaXRpb24gPSB0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiB0ZXJtQ2xhc3M7CiAgICB9CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykgewogICAgICBpZiAoY29uZGl0aW9uKGVudHJ5KSkgcmV0dXJuIGVudHJ5OwogICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBCYXNlVGVybSkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGVudHJ5LmZpbmRGaXJzdChjb25kaXRpb24pOwogICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0KICB9CiAgZmluZExhc3QoY29uZGl0aW9uKSB7CiAgICBpZiAoIXRoaXMuZW50cmllcykgcmV0dXJuIG51bGw7CiAgICBpZiAoQmFzZVRlcm0uaXNQcm90b3R5cGVPZihjb25kaXRpb24pKSB7CiAgICAgIGNvbnN0IHRlcm1DbGFzcyA9IGNvbmRpdGlvbjsKICAgICAgY29uZGl0aW9uID0gdGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgdGVybUNsYXNzOwogICAgfQogICAgY29uc3QgcmV2ZXJzZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllc107CiAgICByZXZlcnNlZEVudHJpZXMucmV2ZXJzZSgpOwogICAgZm9yIChjb25zdCBlbnRyeSBvZiByZXZlcnNlZEVudHJpZXMpIHsKICAgICAgaWYgKGNvbmRpdGlvbihlbnRyeSkpIHJldHVybiBlbnRyeTsKICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgQmFzZVRlcm0pIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBlbnRyeS5maW5kTGFzdChjb25kaXRpb24pOwogICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0KICB9CiAgZmluZEFsbChjb25kaXRpb24pIHsKICAgIGlmICghdGhpcy5lbnRyaWVzKSByZXR1cm4gW107CiAgICBpZiAoQmFzZVRlcm0uaXNQcm90b3R5cGVPZihjb25kaXRpb24pKSB7CiAgICAgIGNvbnN0IHRlcm1DbGFzcyA9IGNvbmRpdGlvbjsKICAgICAgY29uZGl0aW9uID0gdGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgdGVybUNsYXNzOwogICAgfQogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykgewogICAgICBpZiAoY29uZGl0aW9uKGVudHJ5KSkgcmVzdWx0LnB1c2goZW50cnkpOwogICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBCYXNlVGVybSkgcmVzdWx0LnB1c2goLi4uZW50cnkuZmluZEFsbChjb25kaXRpb24pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZvckVhY2hUZXJtKHRlcm1DbGFzcywgaGFuZGxlKSB7CiAgICBpZiAoIXRoaXMuZW50cmllcykgcmV0dXJuOwogICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMpIHsKICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgdGVybUNsYXNzKSBoYW5kbGUoZW50cnkpOwogICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBCYXNlVGVybSkgZW50cnkuZm9yRWFjaFRlcm0odGVybUNsYXNzLCBoYW5kbGUpOwogICAgfQogIH0KICBmb3JFYWNoVG9wVGVybSh0ZXJtQ2xhc3MsIGhhbmRsZSkgewogICAgaWYgKCF0aGlzLmVudHJpZXMpIHJldHVybjsKICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzKSB7CiAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIHRlcm1DbGFzcykgaGFuZGxlKGVudHJ5KTtlbHNlIGlmIChlbnRyeSBpbnN0YW5jZW9mIEJhc2VUZXJtKSBlbnRyeS5mb3JFYWNoVG9wVGVybSh0ZXJtQ2xhc3MsIGhhbmRsZSk7CiAgICB9CiAgfQogIHRvSlNPTigpIHsKICAgIC8vIGV4bHVkZSBtZXRhIGZpZWxkcyBpbiBKU09OCiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyh0aGlzKS5maWx0ZXIoa2V5ID0+ICEvXl8vLnRlc3Qoa2V5KSk7CiAgICBjb25zdCBkYXRhID0gcGljayh0aGlzLCBmaWVsZHMpOwogICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7CiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJvYmplY3QiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmFzZVRlcm0pKSBkYXRhW2tleV0gPSB7CiAgICAgICAgcHJvdG86ICJfUExBSU4iLAogICAgICAgIC4uLnZhbHVlCiAgICAgIH07CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHByb3RvOiB0aGlzLnByb3RvLAogICAgICAuLi5kYXRhCiAgICB9OwogIH0KICBzdGF0aWMgaXNUZXJtKHgpIHsKICAgIHJldHVybiB0eXBlb2YgeCA9PT0gIm9iamVjdCIgJiYgeCBpbnN0YW5jZW9mIEJhc2VUZXJtOwogIH0KICBzdGF0aWMgb3B0aW9uYWxTZXJpYWxpemUoaXRlbSkgewogICAgLy9yZXR1cm4gQmFzZVRlcm0uaXNUZXJtKGl0ZW0pID8gKGl0ZW0gYXMgQmFzZVRlcm0pLnNlcmlhbGl6ZSgpIDogKGl0ZW0gPT09IHVuZGVmaW5lZCA/IFtdIDogW2l0ZW1dKTsKICAgIGlmICghQmFzZVRlcm0uaXNUZXJtKGl0ZW0pKSByZXR1cm4gaXRlbSA9PT0gdW5kZWZpbmVkID8gW10gOiBbaXRlbV07CiAgICByZXR1cm4gWy4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKGl0ZW0uX2hlYWRDb21tZW50KSwgLi4uaXRlbS5zZXJpYWxpemUoKSwgLi4uKGl0ZW0uX3RhaWxDb21tZW50ID8gWyJcYlxuIiwgIlx0Il0gOiBbXSksIC4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKGl0ZW0uX3RhaWxDb21tZW50KV07CiAgfQogIHN0YXRpYyBzZXJpYWxpemVTY2hlbWUoaXRlbSkgewogICAgaWYgKHR5cGVvZiBpdGVtID09PSAiYm9vbGVhbiIpIGl0ZW0gPSBpdGVtID8gIiN0IiA6ICIjZiI7CiAgICByZXR1cm4gQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUoaXRlbSk7CiAgfQp9CmV4cG9ydCBjbGFzcyBSb290IGV4dGVuZHMgQmFzZVRlcm0gewogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBjYyh0aGlzLnNlY3Rpb25zLm1hcChzZWN0aW9uID0+IFsuLi5CYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZShzZWN0aW9uKSwgIlxuXG4iXSkpOwogIH0KICBnZXQgZW50cmllcygpIHsKICAgIHJldHVybiB0aGlzLnNlY3Rpb25zOwogIH0KICBnZXRCbG9jayhoZWFkKSB7CiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbmQoZW50cnkgPT4gZW50cnkuaGVhZCA9PT0gaGVhZCB8fCBlbnRyeS5oZWFkID09PSAiXFwiICsgaGVhZCk7CiAgfQogIGdldCBpbmNsdWRlRmlsZXMoKSB7CiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5maWx0ZXIoc2VjdGlvbiA9PiBzZWN0aW9uIGluc3RhbmNlb2YgSW5jbHVkZSkubWFwKGluY2x1ZGUgPT4gaW5jbHVkZS5maWxlbmFtZSk7CiAgfQogIHN0YXRpYyBwcmlvcml0eUZvclNlY3Rpb24odGVybSkgewogICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBWZXJzaW9uKSByZXR1cm4gMDsKICAgIGlmICh0ZXJtIGluc3RhbmNlb2YgTGFuZ3VhZ2UpIHJldHVybiAxOwogICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBTY2hlbWUpIHJldHVybiAzOwogICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBBc3NpZ25tZW50KSByZXR1cm4gNzsKICAgIGlmICh0ZXJtIGluc3RhbmNlb2YgQmxvY2spIHsKICAgICAgc3dpdGNoICh0ZXJtLmhlYWQpIHsKICAgICAgICBjYXNlICJcXGhlYWRlciI6CiAgICAgICAgICByZXR1cm4gMjsKICAgICAgICBjYXNlICJcXHBhcGVyIjoKICAgICAgICAgIHJldHVybiA0OwogICAgICAgIGNhc2UgIlxcbGF5b3V0IjoKICAgICAgICAgIHJldHVybiA1OwogICAgICAgIGNhc2UgIlxcc2NvcmUiOgogICAgICAgICAgcmV0dXJuIDEwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gSW5maW5pdHk7CiAgfQogIHJlb3JkZXJTZWN0aW9ucygpIHsKICAgIHRoaXMuc2VjdGlvbnMuc29ydCgoczEsIHMyKSA9PiBSb290LnByaW9yaXR5Rm9yU2VjdGlvbihzMSkgLSBSb290LnByaW9yaXR5Rm9yU2VjdGlvbihzMikpOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBQcmltaXRpdmUgZXh0ZW5kcyBCYXNlVGVybSB7CiAgc2VyaWFsaXplKCkgewogICAgcmV0dXJuIFt0aGlzLmV4cF07CiAgfQp9CjsKZXhwb3J0IGNsYXNzIExpdGVyYWxTdHJpbmcgZXh0ZW5kcyBCYXNlVGVybSB7CiAgc3RhdGljIGZyb21TdHJpbmcoY29udGVudCkgewogICAgcmV0dXJuIG5ldyBMaXRlcmFsU3RyaW5nKHsKICAgICAgZXhwOiBKU09OLnN0cmluZ2lmeShjb250ZW50KQogICAgfSk7CiAgfQogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBbdGhpcy5leHBdOwogIH0KICB0b1N0cmluZygpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBldmFsKHRoaXMuZXhwKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBjb25zb2xlLndhcm4oImludmFsaWQgbGlseXBvbmQgc3RyaW5nIGV4cDoiLCB0aGlzLmV4cCk7CiAgICAgIHJldHVybiB0aGlzLmV4cDsKICAgIH0KICB9Cn0KOwpleHBvcnQgY2xhc3MgQ29tbWFuZCBleHRlbmRzIEJhc2VUZXJtIHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICBzdXBlcihkYXRhKTsKICAgIHRoaXMuYXJncy5mb3JFYWNoKHRlcm0gPT4gewogICAgICBpZiAodGVybSBpbnN0YW5jZW9mIE11c2ljQmxvY2sgfHwgdGVybSBpbnN0YW5jZW9mIEJsb2NrKSB0ZXJtLl9wYXJlbnQgPSB0aGlzOwogICAgfSk7CiAgfQogIHN0YXRpYyBjcmVhdGVTZXQoa2V5LCB2YWx1ZSkgewogICAgcmV0dXJuIG5ldyBDb21tYW5kKHsKICAgICAgY21kOiAic2V0IiwKICAgICAgYXJnczogW25ldyBBc3NpZ25tZW50KHsKICAgICAgICBrZXksCiAgICAgICAgdmFsdWUKICAgICAgfSldCiAgICB9KTsKICB9CiAgc2VyaWFsaXplKCkgewogICAgcmV0dXJuIFsiXFwiICsgdGhpcy5jbWQsIC4uLltdLmNvbmNhdCguLi50aGlzLmFyZ3MubWFwKEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKSksIFsiYnJlYWsiLCAicGFnZUJyZWFrIiwgIm92ZXJyaWRlUHJvcGVydHkiXS5pbmNsdWRlcyh0aGlzLmNtZCkgPyAiXG4iIDogbnVsbF07CiAgfQogIGdldCBlbnRyaWVzKCkgewogICAgcmV0dXJuIHRoaXMuYXJncy5maWx0ZXIoYXJnID0+IGFyZyBpbnN0YW5jZW9mIEJhc2VUZXJtKTsKICB9CiAgZ2V0IGlzTXVzaWMoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzLnNvbWUoYXJnID0+IGFyZy5pc011c2ljKTsKICB9CiAgZ2V0IG11c2ljQ2h1bmtzKCkgewogICAgaWYgKHRoaXMuY21kID09PSAiYWx0ZXJuYXRpdmUiKSByZXR1cm4gW10uY29uY2F0KC4uLnRoaXMuYXJnc1swXS5ib2R5Lm1hcCh0ZXJtID0+IHRlcm0ubXVzaWNDaHVua3MpKTsKICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5lbnRyaWVzLm1hcChlbnRyeSA9PiBlbnRyeS5tdXNpY0NodW5rcykpOwogIH0KICBnZXQgaXNSZXBlYXRXaXRoQWx0ZXJuYXRpdmUoKSB7CiAgICByZXR1cm4gdGhpcy5jbWQgPT09ICJyZXBlYXQiICYmIHRoaXMuYXJnc1syXSBpbnN0YW5jZW9mIE11c2ljQmxvY2sgJiYgdGhpcy5hcmdzWzNdICYmIHRoaXMuYXJnc1szXS5jbWQgPT09ICJhbHRlcm5hdGl2ZSI7CiAgfQogIGdldCBkdXJhdGlvbk1hZ25pdHVkZSgpIHsKICAgIHN3aXRjaCAodGhpcy5jbWQpIHsKICAgICAgLy8gVE9ETzogcmVmaW5lIHRoaXMgaW4gVGltZXMKICAgICAgY2FzZSAidGltZXMiOgogICAgICAgIHsKICAgICAgICAgIGNvbnN0IGZhY3RvciA9IGV2YWwodGhpcy5hcmdzWzBdKTsKICAgICAgICAgIHJldHVybiB0aGlzLmFyZ3NbMV0uZHVyYXRpb25NYWduaXR1ZGUgKiBmYWN0b3I7CiAgICAgICAgfQogICAgICAvLyBUT0RPOiByZWZpbmUgdGhpcyBpbiBUdXBsZXQKICAgICAgY2FzZSAidHVwbGV0IjoKICAgICAgICB7CiAgICAgICAgICBjb25zdCBmYWN0b3IgPSAxIC8gZXZhbCh0aGlzLmFyZ3NbMF0pOwogICAgICAgICAgcmV0dXJuIHRoaXMuYXJnc1t0aGlzLmFyZ3MubGVuZ3RoIC0gMV0uZHVyYXRpb25NYWduaXR1ZGUgKiBmYWN0b3I7CiAgICAgICAgfQogICAgICBjYXNlICJhZnRlckdyYWNlIjoKICAgICAgICByZXR1cm4gdGhpcy5hcmdzWzBdLmR1cmF0aW9uTWFnbml0dWRlOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgR3JhY2UpIHJldHVybiAwOwogICAgICAgIHJldHVybiB0aGlzLmFyZ3MuZmlsdGVyKGFyZyA9PiBhcmcgaW5zdGFuY2VvZiBCYXNlVGVybSkucmVkdWNlKChtYWduaXR1ZGUsIHRlcm0pID0+IG1hZ25pdHVkZSArIHRlcm0uZHVyYXRpb25NYWduaXR1ZGUsIDApOwogICAgfQogIH0KICBnZXQgbWVhc3VyZUxheW91dCgpIHsKICAgIGNvbnN0IGFyZ3MgPSBbLi4udGhpcy5hcmdzXS5yZXZlcnNlKCk7CiAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7CiAgICAgIGNvbnN0IGxheW91dCA9IGFyZyBpbnN0YW5jZW9mIEJhc2VUZXJtICYmIGFyZy5tZWFzdXJlTGF5b3V0OwogICAgICBpZiAobGF5b3V0KSByZXR1cm4gbGF5b3V0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldEFzc2lnbm1lbnRQYWlyKCkgewogICAgaWYgKHRoaXMuYXJnc1swXSBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHJldHVybiB7CiAgICAgIGtleTogdGhpcy5hcmdzWzBdLmtleSwKICAgICAgdmFsdWU6IHRoaXMuYXJnc1swXS52YWx1ZQogICAgfTsKICAgIGlmICh0aGlzLmFyZ3NbMV0gaW5zdGFuY2VvZiBBc3NpZ25tZW50KSByZXR1cm4gewogICAgICBrZXk6IHRoaXMuYXJnc1swXSwKICAgICAgdmFsdWU6IHRoaXMuYXJnc1sxXS52YWx1ZQogICAgfTsKICAgIGlmICh0eXBlb2YgdGhpcy5hcmdzWzBdID09PSAic3RyaW5nIikgcmV0dXJuIHsKICAgICAga2V5OiB0aGlzLmFyZ3NbMF0sCiAgICAgIHZhbHVlOiAiIgogICAgfTsKICAgIHJldHVybiBudWxsOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBWYXJpYWJsZSBleHRlbmRzIENvbW1hbmQgewogIGNvbnN0cnVjdG9yKHsKICAgIG5hbWUKICB9KSB7CiAgICBzdXBlcih7CiAgICAgIGNtZDogbmFtZSwKICAgICAgYXJnczogW10KICAgIH0pOwogICAgdGhpcy5uYW1lID0gbmFtZTsKICB9CiAgdG9KU09OKCkgewogICAgcmV0dXJuIHsKICAgICAgcHJvdG86IHRoaXMucHJvdG8sCiAgICAgIG5hbWU6IHRoaXMubmFtZQogICAgfTsKICB9CiAgcXVlcnlWYWx1ZShkaWN0KSB7CiAgICBjb25zdCBmaWVsZCA9IGRpY3QuZ2V0RmllbGQodGhpcy5uYW1lKTsKICAgIHJldHVybiBmaWVsZCAmJiBmaWVsZC52YWx1ZTsKICB9CiAgZ2V0IGlzTXVzaWMoKSB7CiAgICBpZiAoW01BSU5fU0NPUkVfTkFNRV0uaW5jbHVkZXModGhpcy5uYW1lKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CjsKZXhwb3J0IGNsYXNzIE1hcmt1cENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKICB0b1N0cmluZygpIHsKICAgIGNvbnN0IHN0cnMgPSBbXTsKICAgIHRoaXMuZm9yRWFjaFRlcm0oTGl0ZXJhbFN0cmluZywgdGVybSA9PiBzdHJzLnB1c2godGVybS50b1N0cmluZygpKSk7CiAgICByZXR1cm4gc3Rycy5qb2luKCJcbiIpOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBSZXBlYXQgZXh0ZW5kcyBDb21tYW5kIHsKICBzdGF0aWMgY3JlYXRlVm9sdGEodGltZXMsIGJvZHksIGFsdGVybmF0aXZlKSB7CiAgICBjb25zdCBhcmdzID0gWyJ2b2x0YSIsIHRpbWVzLCBib2R5XTsKICAgIGlmIChhbHRlcm5hdGl2ZSkgewogICAgICBhcmdzLnB1c2gobmV3IENvbW1hbmQoewogICAgICAgIGNtZDogImFsdGVybmF0aXZlIiwKICAgICAgICBhcmdzOiBbbmV3IE11c2ljQmxvY2soewogICAgICAgICAgYm9keTogYWx0ZXJuYXRpdmUKICAgICAgICB9KV0KICAgICAgfSkpOwogICAgfQogICAgcmV0dXJuIG5ldyBSZXBlYXQoewogICAgICBjbWQ6ICJyZXBlYXQiLAogICAgICBhcmdzCiAgICB9KTsKICB9CiAgZ2V0IHR5cGUoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzWzBdOwogIH0KICBnZXQgdGltZXMoKSB7CiAgICByZXR1cm4gTnVtYmVyKHRoaXMuYXJnc1sxXSk7CiAgfQogIGdldCBib2R5QmxvY2soKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzWzJdOwogIH0KICBnZXQgYWx0ZXJuYXRpdmVCbG9ja3MoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzWzNdICYmIHRoaXMuYXJnc1szXS5hcmdzWzBdLmJvZHk7CiAgfQogIC8vIHRoaXMgcmVzdWx0IGxlbmd0aCBlcXVhbCB0byB0aW1lcywgaWYgbm90IG51bGwKICBnZXQgY29tcGxldGVBbHRlcm5hdGl2ZUJsb2NrcygpIHsKICAgIGlmICghdGhpcy5hbHRlcm5hdGl2ZUJsb2NrcyB8fCAhdGhpcy5hbHRlcm5hdGl2ZUJsb2Nrcy5sZW5ndGgpIHJldHVybiBudWxsOwogICAgaWYgKHRoaXMuYWx0ZXJuYXRpdmVCbG9ja3MubGVuZ3RoID49IHRoaXMudGltZXMpIHJldHVybiB0aGlzLmFsdGVybmF0aXZlQmxvY2tzLnNsaWNlKDAsIHRoaXMudGltZXMpOwogICAgY29uc3QgbGlzdCA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpbWVzIC0gdGhpcy5hbHRlcm5hdGl2ZUJsb2Nrcy5sZW5ndGg7ICsraSkgbGlzdC5wdXNoKHRoaXMuYWx0ZXJuYXRpdmVCbG9ja3NbMF0pOwogICAgbGlzdC5wdXNoKC4uLnRoaXMuYWx0ZXJuYXRpdmVCbG9ja3MpOwogICAgcmV0dXJuIGxpc3Q7CiAgfQogIGdldCBtZWFzdXJlTGF5b3V0KCkgewogICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKICAgICAgY2FzZSAidm9sdGEiOgogICAgICAgIHsKICAgICAgICAgIGNvbnN0IGxheW91dCA9IG5ldyBtZWFzdXJlTGF5b3V0LlZvbHRhTUxheW91dCgpOwogICAgICAgICAgbGF5b3V0LnRpbWVzID0gdGhpcy50aW1lczsKICAgICAgICAgIGxheW91dC5ib2R5ID0gdGhpcy5ib2R5QmxvY2subWVhc3VyZUxheW91dC5zZXE7CiAgICAgICAgICBsYXlvdXQuYWx0ZXJuYXRlcyA9IHRoaXMuYWx0ZXJuYXRpdmVCbG9ja3MgJiYgdGhpcy5hbHRlcm5hdGl2ZUJsb2Nrcy5tYXAoYmxvY2sgPT4gYmxvY2subWVhc3VyZUxheW91dC5zZXEpOwogICAgICAgICAgcmV0dXJuIGxheW91dDsKICAgICAgICB9CiAgICAgIGNhc2UgInRyZW1vbG8iOgogICAgICAgIHJldHVybiB0aGlzLmJvZHlCbG9jay5tZWFzdXJlTGF5b3V0OwogICAgICBkZWZhdWx0OgogICAgICAgIGNvbnNvbGUud2FybigidW5zdXBwb3J0ZWQgcmVwZWF0IHR5cGU6IiwgdGhpcy50eXBlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICAvLyBmb3IgdHJlbW9sbwogIGdldCBzdW1EdXJhdGlvbigpIHsKICAgIGlmICh0aGlzLmJvZHlCbG9jayBpbnN0YW5jZW9mIE11c2ljRXZlbnQpIHJldHVybiBEdXJhdGlvbi5mcm9tTWFnbml0dWRlKHRoaXMuYXJnc1syXS5kdXJhdGlvbk1hZ25pdHVkZSAqIHRoaXMudGltZXMpO2Vsc2UgaWYgKHRoaXMuYm9keUJsb2NrIGluc3RhbmNlb2YgTXVzaWNCbG9jaykgewogICAgICBjb25zdCBldmVudHMgPSB0aGlzLmJvZHlCbG9jay5ib2R5LmZpbHRlcih0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBNdXNpY0V2ZW50KTsKICAgICAgY29uc3QgbWFnbml0dWRlID0gZXZlbnRzLnJlZHVjZSgobSwgZXZlbnQpID0+IG0gKyBldmVudC5kdXJhdGlvbk1hZ25pdHVkZSwgMCkgKiB0aGlzLnRpbWVzOwogICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1hZ25pdHVkZShtYWduaXR1ZGUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBzaW5nbGVUcmVtb2xvKCkgewogICAgaWYgKHRoaXMudHlwZSA9PT0gInRyZW1vbG8iKSB7CiAgICAgIGlmICh0aGlzLmJvZHlCbG9jayBpbnN0YW5jZW9mIE11c2ljRXZlbnQpIHJldHVybiB0cnVlOwogICAgICBpZiAodGhpcy5ib2R5QmxvY2sgaW5zdGFuY2VvZiBNdXNpY0Jsb2NrKSB7CiAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5ib2R5QmxvY2suYm9keS5maWx0ZXIodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgTXVzaWNFdmVudCk7CiAgICAgICAgcmV0dXJuIGV2ZW50cy5sZW5ndGggPT09IDE7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgLy8gXHJlcGVhdCB7Ym9keX0gXGFsdGVybmF0aXZlIHt7YWx0ZXIxfSB7YWx0ZXIyfX0JCT0+IGJvZHkgYWx0ZXIxIGJvZHkgYWx0ZXIyCiAgZ2V0VW5mb2xkVGVybXMoKSB7CiAgICBjb25zdCBjb21wbGV0ZUFsdGVybmF0aXZlQmxvY2tzID0gdGhpcy5jb21wbGV0ZUFsdGVybmF0aXZlQmxvY2tzOwogICAgY29uc3QgbGlzdCA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRpbWVzOyArK2kpIHsKICAgICAgbGlzdC5wdXNoKC4uLnRoaXMuYm9keUJsb2NrLmNsb25lKCkuYm9keSk7CiAgICAgIGlmIChjb21wbGV0ZUFsdGVybmF0aXZlQmxvY2tzKSBsaXN0LnB1c2goLi4uY29tcGxldGVBbHRlcm5hdGl2ZUJsb2Nrc1tpXS5jbG9uZSgpLmJvZHkpOwogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQogIC8vIFxyZXBlYXQge2JvZHl9IFxhbHRlcm5hdGl2ZSB7e2FsdGVyMX0ge2FsdGVyMn19CQk9PiBib2R5IGFsdGVyMSBhbHRlcjIKICBnZXRQbGFpblRlcm1zKCkgewogICAgY29uc3QgbGlzdCA9IFsuLi50aGlzLmJvZHlCbG9jay5jbG9uZSgpLmJvZHldOwogICAgY29uc3QgYWx0ZXJuYXRpdmVCbG9ja3MgPSB0aGlzLmFsdGVybmF0aXZlQmxvY2tzOwogICAgaWYgKGFsdGVybmF0aXZlQmxvY2tzKSBhbHRlcm5hdGl2ZUJsb2Nrcy5mb3JFYWNoKGJsb2NrID0+IGxpc3QucHVzaCguLi5ibG9jay5jbG9uZSgpLmJvZHkpKTsKICAgIHJldHVybiBsaXN0OwogIH0KICAvLyBccmVwZWF0IHtib2R5fSBcYWx0ZXJuYXRpdmUge3thbHRlcjF9IHthbHRlcjJ9fQkJPT4gYm9keSBhbHRlcjIKICBnZXRUYWlsUGFzc1Rlcm1zKCkgewogICAgY29uc3QgbGlzdCA9IFsuLi50aGlzLmJvZHlCbG9jay5jbG9uZSgpLmJvZHldOwogICAgY29uc3QgYWx0ZXJuYXRpdmVCbG9ja3MgPSB0aGlzLmFsdGVybmF0aXZlQmxvY2tzOwogICAgaWYgKGFsdGVybmF0aXZlQmxvY2tzKSBsaXN0LnB1c2goLi4uYWx0ZXJuYXRpdmVCbG9ja3NbYWx0ZXJuYXRpdmVCbG9ja3MubGVuZ3RoIC0gMV0uY2xvbmUoKS5ib2R5KTsKICAgIHJldHVybiBsaXN0OwogIH0KfQo7CmV4cG9ydCBjbGFzcyBSZWxhdGl2ZSBleHRlbmRzIENvbW1hbmQgewogIHN0YXRpYyBtYWtlQmxvY2soYmxvY2ssIHsKICAgIGFuY2hvcgogIH0gPSB7fSkgewogICAgaWYgKCFhbmNob3IpIHsKICAgICAgY29uc3QgY2hvcmQgPSBibG9jay5maW5kRmlyc3QoQ2hvcmQpOwogICAgICBhbmNob3IgPSBjaG9yZCAmJiBjaG9yZC5hbmNob3JQaXRjaDsKICAgIH0KICAgIHJldHVybiBuZXcgUmVsYXRpdmUoewogICAgICBjbWQ6ICJyZWxhdGl2ZSIsCiAgICAgIGFyZ3M6IFthbmNob3IsIGJsb2NrXS5maWx0ZXIodGVybSA9PiB0ZXJtKQogICAgfSk7CiAgfQogIGdldCBhbmNob3IoKSB7CiAgICBpZiAodGhpcy5hcmdzWzBdIGluc3RhbmNlb2YgQ2hvcmRFbGVtZW50KSByZXR1cm4gdGhpcy5hcmdzWzBdOwogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBtdXNpYygpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbdGhpcy5hcmdzLmxlbmd0aCAtIDFdOwogIH0KICBnZXQgaGVhZENob3JkKCkgewogICAgcmV0dXJuIHRoaXMuZmluZEZpcnN0KENob3JkKTsKICB9CiAgZ2V0IHRhaWxQaXRjaCgpIHsKICAgIGNvbnN0IHRhaWwgPSB0aGlzLmZpbmRMYXN0KENob3JkKTsKICAgIHJldHVybiB0YWlsICYmIHRhaWwuYWJzb2x1dGVQaXRjaDsKICB9CiAgLy8gd2l0aCBzaWRlIGVmZmVjdAogIHNoaWZ0Qm9keShuZXdBbmNob3IpIHsKICAgIGNvbnN0IGhlYWRDaG9yZCA9IHRoaXMuaGVhZENob3JkOwogICAgaWYgKG5ld0FuY2hvciAmJiBoZWFkQ2hvcmQpIHsKICAgICAgaGVhZENob3JkLnNoaWZ0QW5jaG9yKG5ld0FuY2hvcik7CiAgICAgIGhlYWRDaG9yZC5fYW5jaG9yUGl0Y2ggPSBudWxsOwogICAgICAvL2NvbnNvbGUubG9nKCJzaGlmdEFuY2hvci5wb3N0OiIsIGhlYWRDaG9yZC5qb2luKCksIGhlYWRDaG9yZCk7CiAgICB9CiAgICBjb25zdCBtdXNpYyA9IHRoaXMubXVzaWM7CiAgICBpZiAobXVzaWMgaW5zdGFuY2VvZiBNdXNpY0Jsb2NrKSB7CiAgICAgIC8vbXVzaWMuY2xlYXJQaXRjaENhY2hlKCk7CiAgICAgIHJldHVybiBtdXNpYy5ib2R5OwogICAgfQogICAgcmV0dXJuIFttdXNpY107CiAgfQp9CmV4cG9ydCBjbGFzcyBQYXJhbGxlbE11c2ljIGV4dGVuZHMgQ29tbWFuZCB7CiAgZ2V0IHZhck5hbWVzKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc1swXS5leHAudmFsdWUuYXNMaXN0OwogIH0KICBnZXQgYm9keSgpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbMV07CiAgfQogIGdldCB2b2ljZXMoKSB7CiAgICBjb25zdCB2b2ljZU5hbWVzID0gdGhpcy52YXJOYW1lczsKICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuYm9keS5tdXNpY0NodW5rczsKICAgIGNvbnN0IG1lYXN1cmVDb3VudCA9IE1hdGguY2VpbChjaHVua3MubGVuZ3RoIC8gdm9pY2VOYW1lcy5sZW5ndGgpOwogICAgcmV0dXJuIHZvaWNlTmFtZXMubWFwKChuYW1lLCBpbmRleCkgPT4gKHsKICAgICAgbmFtZTogbmFtZS50b1N0cmluZygpLAogICAgICBib2R5OiBBcnJheShtZWFzdXJlQ291bnQpLmZpbGwobnVsbCkubWFwKChfLCBtKSA9PiBjaHVua3NbbSAqIHZvaWNlTmFtZXMubGVuZ3RoICsgaW5kZXhdKS5maWx0ZXIoQm9vbGVhbikKICAgIH0pKTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgVGltZVNpZ25hdHVyZSBleHRlbmRzIENvbW1hbmQgewogIGdldCB2YWx1ZSgpIHsKICAgIHJldHVybiBGcmFjdGlvbk51bWJlci5mcm9tRXhwcmVzc2lvbih0aGlzLmFyZ3NbMF0pOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBQYXJ0aWFsIGV4dGVuZHMgQ29tbWFuZCB7CiAgZ2V0IGR1cmF0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc1swXTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgVGltZXMgZXh0ZW5kcyBDb21tYW5kIHsKICBnZXQgZmFjdG9yKCkgewogICAgcmV0dXJuIEZyYWN0aW9uTnVtYmVyLmZyb21FeHByZXNzaW9uKHRoaXMuYXJnc1swXSk7CiAgfQogIGdldCBtdXNpYygpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbdGhpcy5hcmdzLmxlbmd0aCAtIDFdOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBUdXBsZXQgZXh0ZW5kcyBDb21tYW5kIHsKICBnZXQgZGl2aWRlcigpIHsKICAgIHJldHVybiBGcmFjdGlvbk51bWJlci5mcm9tRXhwcmVzc2lvbih0aGlzLmFyZ3NbMF0pOwogIH0KICBnZXQgbXVzaWMoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzW3RoaXMuYXJncy5sZW5ndGggLSAxXTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgR3JhY2UgZXh0ZW5kcyBDb21tYW5kIHsKICBnZXQgbXVzaWMoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzW3RoaXMuYXJncy5sZW5ndGggLSAxXTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgQWZ0ZXJHcmFjZSBleHRlbmRzIENvbW1hbmQgewogIGdldCBib2R5KCkgewogICAgcmV0dXJuIHRoaXMuYXJnc1swXTsKICB9CiAgZ2V0IGdyYWNlKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc1sxXTsKICB9CiAgZ2V0IG1lYXN1cmVMYXlvdXQoKSB7CiAgICByZXR1cm4gbWVhc3VyZUxheW91dC5CbG9ja01MYXlvdXQuZnJvbVNlcShbdGhpcy5ib2R5Lm1lYXN1cmVMYXlvdXQsIHRoaXMuZ3JhY2UubWVhc3VyZUxheW91dF0pOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBDbGVmIGV4dGVuZHMgQ29tbWFuZCB7CiAgZ2V0IGNsZWZOYW1lKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc1swXS50b1N0cmluZygpOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBLZXlTaWduYXR1cmUgZXh0ZW5kcyBDb21tYW5kIHsKICBnZXQga2V5UGl0Y2goKSB7CiAgICByZXR1cm4gbmV3IENob3JkRWxlbWVudCh7CiAgICAgIHBpdGNoOiB0aGlzLmFyZ3NbMF0sCiAgICAgIG9wdGlvbnM6IHsKICAgICAgICBwcm90bzogIl9QTEFJTiIKICAgICAgfQogICAgfSk7CiAgfQogIGdldCBrZXkoKSB7CiAgICBjb25zdCBrZXlQaXRjaCA9IHRoaXMua2V5UGl0Y2g7CiAgICBjb25zdCBtaW5vciA9IHRoaXMuYXJnc1sxXSA9PT0gIlxcbWlub3IiOwogICAgY29uc3QgcGhvbmV0T3JkZXIgPSBpZGlvbXMuRklGVEhfUEhPTkVUUy5pbmRleE9mKGtleVBpdGNoLnBob25ldCk7CiAgICByZXR1cm4gcGhvbmV0T3JkZXIgKyAobWlub3IgPyAtNCA6IC0xKSArIGtleVBpdGNoLmFsdGVyVmFsdWUgKiA3OwogIH0KfQo7CmV4cG9ydCBjbGFzcyBPY3RhdmVTaGlmdCBleHRlbmRzIENvbW1hbmQgewogIGdldCB2YWx1ZSgpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbMF0uZXhwOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBJbmNsdWRlIGV4dGVuZHMgQ29tbWFuZCB7CiAgc3RhdGljIGNyZWF0ZShmaWxlbmFtZSkgewogICAgcmV0dXJuIG5ldyBJbmNsdWRlKHsKICAgICAgY21kOiAiaW5jbHVkZSIsCiAgICAgIGFyZ3M6IFtMaXRlcmFsU3RyaW5nLmZyb21TdHJpbmcoZmlsZW5hbWUpXQogICAgfSk7CiAgfQogIGdldCBmaWxlbmFtZSgpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbMF0udG9TdHJpbmcoKTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgVmVyc2lvbiBleHRlbmRzIENvbW1hbmQgewogIHN0YXRpYyBnZXQgZGVmYXVsdCgpIHsKICAgIHJldHVybiBuZXcgVmVyc2lvbih7CiAgICAgIGNtZDogInZlcnNpb24iLAogICAgICBhcmdzOiBbTGl0ZXJhbFN0cmluZy5mcm9tU3RyaW5nKExJTFlQT05EX1ZFUlNJT04pXQogICAgfSk7CiAgfQogIGdldCB2ZXJzaW9uKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc1swXS50b1N0cmluZygpOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBMYW5ndWFnZSBleHRlbmRzIENvbW1hbmQgewogIHN0YXRpYyBtYWtlKGxhbmd1YWdlKSB7CiAgICByZXR1cm4gbmV3IExhbmd1YWdlKHsKICAgICAgY21kOiAibGFuZ3VhZ2UiLAogICAgICBhcmdzOiBbTGl0ZXJhbFN0cmluZy5mcm9tU3RyaW5nKGxhbmd1YWdlKV0KICAgIH0pOwogIH0KICBnZXQgbGFuZ3VhZ2UoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzWzBdLnRvU3RyaW5nKCk7CiAgfQp9CjsKZXhwb3J0IGNsYXNzIEx5cmljTW9kZSBleHRlbmRzIENvbW1hbmQgewogIGdldCBibG9jaygpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbMF07CiAgfQp9CjsKZXhwb3J0IGNsYXNzIENob3JkTW9kZSBleHRlbmRzIENvbW1hbmQgewogIGdldCBibG9jaygpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbMF07CiAgfQp9CjsKZXhwb3J0IGNsYXNzIFRyYW5zcG9zaXRpb24gZXh0ZW5kcyBDb21tYW5kIHsKICBnZXQgdHJhbnNwb3NpdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbMF0ucGl0Y2hWYWx1ZSAtIDYwOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBTdGVtRGlyZWN0aW9uIGV4dGVuZHMgQ29tbWFuZCB7CiAgZ2V0IGRpcmVjdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmNtZC5zdWJzdHIoNCk7CiAgfQp9CjsKZXhwb3J0IGNsYXNzIENoYW5nZSBleHRlbmRzIENvbW1hbmQgewogIGdldCBrZXkoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzWzBdLnRvU3RyaW5nKCk7CiAgfQogIGdldCB2YWx1ZSgpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NbMV0udG9TdHJpbmcoKTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgQmxvY2sgZXh0ZW5kcyBCYXNlVGVybSB7CiAgY29uc3RydWN0b3IoZGF0YSkgewogICAgc3VwZXIoZGF0YSk7CiAgICB0aGlzLmJvZHkgPSB0aGlzLmJvZHkubWFwKHBhcnNlUmF3RW5mb3JjZSk7CiAgfQogIHNlcmlhbGl6ZSgpIHsKICAgIGNvbnN0IGhlYWRzID0gQXJyYXkuaXNBcnJheSh0aGlzLmhlYWQpID8gdGhpcy5oZWFkIDogdGhpcy5oZWFkID8gW3RoaXMuaGVhZF0gOiBbXTsKICAgIHJldHVybiBbLi4uaGVhZHMsICJ7XG4iLCAuLi5jYyh0aGlzLmJvZHkubWFwKHNlY3Rpb24gPT4gWy4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKHNlY3Rpb24pLCAiXG4iXSkpLCAifVxuIl07CiAgfQogIGdldCBlbnRyaWVzKCkgewogICAgcmV0dXJuIHRoaXMuYm9keTsKICB9CiAgZ2V0IGlzTUlESURlZGljYXRlZCgpIHsKICAgIGNvbnN0IHN1YkJsb2NrcyA9IHRoaXMuYm9keS5maWx0ZXIodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQmxvY2spOwogICAgcmV0dXJuIHN1YkJsb2Nrcy5zb21lKHRlcm0gPT4gdGVybS5oZWFkID09PSAiXFxtaWRpIikgJiYgIXN1YkJsb2Nrcy5zb21lKHRlcm0gPT4gdGVybS5oZWFkID09PSAiXFxsYXlvdXQiKTsKICB9CiAgZ2V0IGFzc2lnbm1lbnREaWN0KCkgewogICAgY29uc3QgYXNzaWdubWVudHMgPSB0aGlzLmJvZHkuZmlsdGVyKHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpOwogICAgcmV0dXJuIGFzc2lnbm1lbnRzLnJlZHVjZSgoZGljdCwgYXNzaWdubWVudCkgPT4gKGRpY3RbYXNzaWdubWVudC5rZXkudG9TdHJpbmcoKV0gPSBhc3NpZ25tZW50LnZhbHVlLnRvU3RyaW5nKCksIGRpY3QpLCB7fSk7CiAgfQp9CjsKZXhwb3J0IGNsYXNzIElubGluZUJsb2NrIGV4dGVuZHMgQmxvY2sgewogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBbInsiLCAuLi5jYyh0aGlzLmJvZHkubWFwKEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKSksICJ9Il07CiAgfQp9CjsKZXhwb3J0IGNsYXNzIE11c2ljQmxvY2sgZXh0ZW5kcyBCYXNlVGVybSB7CiAgY29uc3RydWN0b3IoZGF0YSkgewogICAgc3VwZXIoZGF0YSk7CiAgICB0aGlzLmJvZHkgPSB0aGlzLmJvZHkubWFwKHBhcnNlUmF3RW5mb3JjZSk7CiAgfQogIHN0YXRpYyBmcm9tVGVybXModGVybXMpIHsKICAgIGNvbnN0IGJsb2NrID0gbmV3IE11c2ljQmxvY2soewogICAgICBib2R5OiBbLi4udGVybXNdCiAgICB9KTsKICAgIGJsb2NrLmNsYXJpZnlIZWFkKCk7CiAgICByZXR1cm4gYmxvY2s7CiAgfQogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBbIntcbiIsIC4uLmNjKHRoaXMuYm9keS5tYXAoQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUpKSwgIlxuIiwgIn1cbiJdOwogIH0KICBjbG9uZSgpIHsKICAgIGlmICh0aGlzLl9wYXJlbnQpIHsKICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50LmNsb25lKCk7CiAgICAgIGNvbnN0IGJsb2NrID0gcGFyZW50LmZpbmRGaXJzdChNdXNpY0Jsb2NrKTsKICAgICAgY29uc29sZS5hc3NlcnQoYmxvY2sgJiYgYmxvY2suX3BhcmVudCA9PT0gcGFyZW50LCAiaW52YWxpZCBibG9jay1wYXJlbnQgcmVsYXRpb24iLCBwYXJlbnQsIGJsb2NrKTsKICAgICAgcmV0dXJuIGJsb2NrOwogICAgfQogICAgcmV0dXJuIEJhc2VUZXJtLnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpOwogIH0KICBnZXQgZW50cmllcygpIHsKICAgIHJldHVybiB0aGlzLmJvZHk7CiAgfQogIGdldCBpc011c2ljKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGdldCBtdXNpY0NodW5rcygpIHsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgbGV0IGN1cnJlbnRDaHVuayA9IG5ldyBNdXNpY0NodW5rKHRoaXMpOwogICAgY29uc3QgZHVtcENodW5rID0gKCkgPT4gewogICAgICBpZiAoY3VycmVudENodW5rLnNpemUpIGNodW5rcy5wdXNoKGN1cnJlbnRDaHVuayk7CiAgICAgIGN1cnJlbnRDaHVuayA9IG5ldyBNdXNpY0NodW5rKHRoaXMpOwogICAgfTsKICAgIGZvciAoY29uc3QgdGVybSBvZiB0aGlzLmVudHJpZXMpIHsKICAgICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBSZXBlYXQpIHsKICAgICAgICBkdW1wQ2h1bmsoKTsKICAgICAgICBjaHVua3MucHVzaCguLi50ZXJtLm11c2ljQ2h1bmtzKTsKICAgICAgfSBlbHNlIGlmICh0ZXJtIGluc3RhbmNlb2YgRGl2aWRlKSBkdW1wQ2h1bmsoKTtlbHNlIGN1cnJlbnRDaHVuay5wdXNoKHRlcm0pOwogICAgfQogICAgZHVtcENodW5rKCk7CiAgICByZXR1cm4gY2h1bmtzOwogIH0KICAvLyBbZGVwcmVjYXRlZF0KICAvLyBmb3IgcGFyYWxsZWxNdXNpYyBvbmx5CiAgZ2V0IHZvaWNlTmFtZXMoKSB7CiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl9wYXJlbnQ7CiAgICBpZiAoaGVhZGVyICYmIGhlYWRlci5jbWQgPT09ICJwYXJhbGxlbE11c2ljIikgewogICAgICBpZiAoaGVhZGVyLmFyZ3NbMF0gaW5zdGFuY2VvZiBTY2hlbWUgJiYgaGVhZGVyLmFyZ3NbMF0uZXhwIGluc3RhbmNlb2YgU2NoZW1lUG9pbnRlciAmJiBoZWFkZXIuYXJnc1swXS5leHAudmFsdWUgaW5zdGFuY2VvZiBTY2hlbWVGdW5jdGlvbikgewogICAgICAgIGNvbnN0IHZvaWNlcyA9IGhlYWRlci5hcmdzWzBdLmV4cC52YWx1ZS5hc0xpc3Q7CiAgICAgICAgcmV0dXJuIHZvaWNlczsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIC8vIFtkZXByZWNhdGVkXQogIGdldCB2b2ljZXMoKSB7CiAgICBjb25zdCB2b2ljZU5hbWVzID0gdGhpcy52b2ljZU5hbWVzOwogICAgaWYgKCF2b2ljZU5hbWVzKSByZXR1cm4gW3sKICAgICAgYm9keTogdGhpcy5tdXNpY0NodW5rcwogICAgfV07CiAgICBjb25zdCBjaHVua3MgPSB0aGlzLm11c2ljQ2h1bmtzOwogICAgY29uc3QgbWVhc3VyZUNvdW50ID0gTWF0aC5jZWlsKGNodW5rcy5sZW5ndGggLyB2b2ljZU5hbWVzLmxlbmd0aCk7CiAgICByZXR1cm4gdm9pY2VOYW1lcy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoewogICAgICBuYW1lOiBuYW1lLnRvU3RyaW5nKCksCiAgICAgIGJvZHk6IEFycmF5KG1lYXN1cmVDb3VudCkuZmlsbChudWxsKS5tYXAoKF8sIG0pID0+IGNodW5rc1ttICogdm9pY2VOYW1lcy5sZW5ndGggKyBpbmRleF0pLmZpbHRlcihjaHVuayA9PiBjaHVuaykKICAgIH0pKTsKICB9CiAgZ2V0IGR1cmF0aW9uTWFnbml0dWRlKCkgewogICAgcmV0dXJuIHRoaXMuYm9keS5yZWR1Y2UoKG1hZ25pdHVkZSwgdGVybSkgPT4gbWFnbml0dWRlICsgdGVybS5kdXJhdGlvbk1hZ25pdHVkZSwgMCk7CiAgfQogIGdldCBpc1JlbGF0aXZlKCkgewogICAgcmV0dXJuIHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIFJlbGF0aXZlOwogIH0KICBnZXQgYW5jaG9yUGl0Y2goKSB7CiAgICBpZiAodGhpcy5pc1JlbGF0aXZlKSByZXR1cm4gdGhpcy5fcGFyZW50LmFuY2hvcjsKICAgIHJldHVybiBudWxsOwogIH0KICBnZXQgbWVhc3VyZXMoKSB7CiAgICAvLyBtYWtlIGEgY29udGlub3VzZSBpbmRpY2VzIGxpc3QKICAgIGNvbnN0IHN1YnRlcm1zID0gdGhpcy5maW5kQWxsKHRlcm0gPT4gdGVybS5pc011c2ljKTsKICAgIGNvbnN0IHN1YkluZGljZXMgPSBbXS5jb25jYXQoLi4uc3VidGVybXMubWFwKHRlcm0gPT4gdGVybS5tZWFzdXJlcykpLmZpbHRlcihpbmRleCA9PiBOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSk7CiAgICBpZiAoIXN1YkluZGljZXMubGVuZ3RoKSByZXR1cm4gW107CiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbiguLi5zdWJJbmRpY2VzKTsKICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLnN1YkluZGljZXMpOwogICAgcmV0dXJuIEFycmF5KG1heCArIDEgLSBtaW4pLmZpbGwobnVsbCkubWFwKChfLCBpKSA9PiBpICsgbWluKTsKICB9CiAgZ2V0IG5vdGVzKCkgewogICAgY29uc3Qgbm90ZXMgPSB0aGlzLmJvZHkuZmlsdGVyKHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIENob3JkICYmICF0ZXJtLmlzUmVzdCk7CiAgICB0aGlzLmZvckVhY2hUb3BUZXJtKE11c2ljQmxvY2ssIGJsb2NrID0+IG5vdGVzLnB1c2goLi4uYmxvY2subm90ZXMpKTsKICAgIHJldHVybiBub3RlczsKICB9CiAgZ2V0IHNvbmljTm90ZXMoKSB7CiAgICByZXR1cm4gdGhpcy5ub3Rlcy5maWx0ZXIobm90ZSA9PiAhbm90ZS5jb21wbGV0ZVRpZWQpOwogIH0KICBnZXQgbm90ZVRpY2tzKCkgewogICAgY29uc3QgdGlja3MgPSB0aGlzLnNvbmljTm90ZXMubWFwKG5vdGUgPT4gbm90ZS5fdGljayk7CiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHRpY2tzKSkuc29ydCgodDEsIHQyKSA9PiB0MSAtIHQyKTsKICB9CiAgZ2V0IG1lYXN1cmVUaWNrcygpIHsKICAgIGNvbnN0IHRpY2tUYWJsZSA9IHt9OwogICAgdGhpcy5ib2R5LmZvckVhY2godGVybSA9PiB7CiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUodGVybS5fbWVhc3VyZSkgJiYgTnVtYmVyLmlzRmluaXRlKHRlcm0uX3RpY2spKSB7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGlja1RhYmxlW3Rlcm0uX21lYXN1cmVdKSkgdGlja1RhYmxlW3Rlcm0uX21lYXN1cmVdID0gdGVybS5fdGljazsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGlja1RhYmxlKS5tYXAoKFttZWFzdXJlLCB0aWNrXSkgPT4gW051bWJlcihtZWFzdXJlKSwgdGlja10pOwogIH0KICBnZXQgbWVhc3VyZUxheW91dCgpIHsKICAgIGNvbnN0IHNlcSA9IHRoaXMuYm9keS5maWx0ZXIodGVybSA9PiB0ZXJtLmlzTXVzaWMpLm1hcCh0ZXJtID0+IHRlcm0ubWVhc3VyZUxheW91dCkuZmlsdGVyKEJvb2xlYW4pOwogICAgaWYgKHRoaXMuX2Z1bmN0aW9uYWwgPT09ICJsb3R1c1JlcGVhdEFCQSIpIHsKICAgICAgY29uc3QgW21haW4sIC4uLnJlc3RdID0gc2VxOwogICAgICBjb25zdCBsYXlvdXQgPSBuZXcgbWVhc3VyZUxheW91dC5BQkFNTGF5b3V0KCk7CiAgICAgIGxheW91dC5tYWluID0gbWFpbjsKICAgICAgbGF5b3V0LnJlc3QgPSBtZWFzdXJlTGF5b3V0LkJsb2NrTUxheW91dC50cmltU2VxKHJlc3QpOwogICAgICByZXR1cm4gbGF5b3V0OwogICAgfQogICAgcmV0dXJuIG1lYXN1cmVMYXlvdXQuQmxvY2tNTGF5b3V0LmZyb21TZXEoc2VxKTsKICB9CiAgZ2V0IG1lYXN1cmVDaHVua01hcCgpIHsKICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICAgIHRoaXMuYm9keS5mb3JFYWNoKHRlcm0gPT4gewogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih0ZXJtLl9tZWFzdXJlKSAmJiAhKHRlcm0gaW5zdGFuY2VvZiBEaXZpZGUpKSB7CiAgICAgICAgaWYgKCFtYXAuZ2V0KHRlcm0uX21lYXN1cmUpKSBtYXAuc2V0KHRlcm0uX21lYXN1cmUsIG5ldyBNdXNpY0NodW5rKHRoaXMpKTsKICAgICAgICBjb25zdCBjaHVuayA9IG1hcC5nZXQodGVybS5fbWVhc3VyZSk7CiAgICAgICAgY2h1bmsudGVybXMucHVzaCh0ZXJtKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbWFwOwogIH0KICBjbGVhclBpdGNoQ2FjaGUoKSB7CiAgICB0aGlzLmZvckVhY2hUZXJtKENob3JkRWxlbWVudCwgcGl0Y2ggPT4gewogICAgICBwaXRjaC5fYWJzb2x1dGVQaXRjaCA9IG51bGw7CiAgICAgIC8vcGl0Y2guX3ByZXZpb3VzID0gbnVsbDsKICAgIH0pOwogIH0KICB1cGRhdGVDaG9yZEFuY2hvcnMoKSB7CiAgICBjb25zdCBjaG9yZCA9IHRoaXMuZmluZEZpcnN0KENob3JkKTsKICAgIGlmIChjaG9yZCkgY2hvcmQuX2FuY2hvclBpdGNoID0gY2hvcmQuX2FuY2hvclBpdGNoIHx8IHRoaXMuYW5jaG9yUGl0Y2g7CiAgICB0aGlzLmNsZWFyUGl0Y2hDYWNoZSgpOwogIH0KICAvLyBkZXByZWNhdGVkCiAgdXBkYXRlQ2hvcmRDaGFpbnMoKSB7CiAgICBsZXQgcHJldmlvdXMgPSBudWxsOwogICAgdGhpcy51cGRhdGVDaG9yZEFuY2hvcnMoKTsKICAgIHRoaXMuZm9yRWFjaFRlcm0oTXVzaWNCbG9jaywgYmxvY2sgPT4gYmxvY2sudXBkYXRlQ2hvcmRBbmNob3JzKCkpOwogICAgdGhpcy5mb3JFYWNoVGVybShNdXNpY0V2ZW50LCBldmVudCA9PiB7CiAgICAgIGV2ZW50Ll9wcmV2aW91cyA9IHByZXZpb3VzOwogICAgICBwcmV2aW91cyA9IGV2ZW50OwogICAgfSk7CiAgfQogIC8vIHdpdGggc2lkZSBlZmZlY3QKICBzcHJlYWRSZXBlYXRCbG9ja3MoewogICAgaWdub3JlUmVwZWF0ID0gdHJ1ZSwKICAgIGtlZXBUYWlsUGFzcyA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICB0aGlzLmZvckVhY2hUZXJtKE11c2ljQmxvY2ssIGJsb2NrID0+IGJsb2NrLnNwcmVhZFJlcGVhdEJsb2NrcygpKTsKICAgIHRoaXMuYm9keSA9IGNjKHRoaXMuYm9keS5tYXAodGVybSA9PiB7CiAgICAgIGlmICh0ZXJtIGluc3RhbmNlb2YgUmVwZWF0KSB7CiAgICAgICAgaWYgKCFpZ25vcmVSZXBlYXQpIHJldHVybiB0ZXJtLmdldFVuZm9sZFRlcm1zKCk7ZWxzZSBpZiAoa2VlcFRhaWxQYXNzKSByZXR1cm4gdGVybS5nZXRUYWlsUGFzc1Rlcm1zKCk7ZWxzZSByZXR1cm4gdGVybS5nZXRQbGFpblRlcm1zKCk7CiAgICAgIH0gZWxzZSByZXR1cm4gW3Rlcm1dOwogICAgfSkpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIC8qLy8gd2l0aCBzaWRlIGVmZmVjdAogIHNwcmVhZFJlbGF0aXZlQmxvY2tzICgpOiB0aGlzIHsKICAgICAgdGhpcy5mb3JFYWNoVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiBibG9jay5zcHJlYWRSZWxhdGl2ZUJsb2NrcygpKTsKICAgICAgIGxldCBhbmNob3JQaXRjaCA9IG51bGw7CiAgICAgICB0aGlzLmJvZHkgPSBjYyh0aGlzLmJvZHkubWFwKHRlcm0gPT4gewogICAgICAgICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBSZWxhdGl2ZSkgewogICAgICAgICAgICAgIGNvbnN0IGxpc3QgPSB0ZXJtLnNoaWZ0Qm9keShhbmNob3JQaXRjaCk7CiAgICAgICAgICAgICAgIGFuY2hvclBpdGNoID0gdGVybS50YWlsUGl0Y2ggfHwgYW5jaG9yUGl0Y2g7CiAgICAgICAgICAgICAgIHJldHVybiBsaXN0OwogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHJldHVybiBbdGVybV07CiAgICAgIH0pKTsKICAgICAgIHJldHVybiB0aGlzOwogIH0qLwogIC8vIHdpdGggc2lkZSBlZmZlY3QKICB1bmZvbGREdXJhdGlvbk11bHRpcGxpZXJzKCkgewogICAgbGV0IHRpbWVEZW5vbWluYXRvciA9IDQ7CiAgICBjb25zdCB1bmZvbGRNdWx0aXBsaWVycyA9IHRlcm0gPT4gewogICAgICBpZiAodGVybSBpbnN0YW5jZW9mIFRpbWVTaWduYXR1cmUpIHRpbWVEZW5vbWluYXRvciA9IHRlcm0udmFsdWUuZGVub21pbmF0b3I7CiAgICAgIGlmICghKHRlcm0gaW5zdGFuY2VvZiBNdXNpY0V2ZW50KSB8fCAhdGVybS5kdXJhdGlvbiB8fCAhdGVybS5kdXJhdGlvbi5tdWx0aXBsaWVycyB8fCAhdGVybS5kdXJhdGlvbi5tdWx0aXBsaWVycy5sZW5ndGgpIHJldHVybiBbdGVybV07CiAgICAgIGNvbnN0IGZhY3RvciA9IHRlcm0uZHVyYXRpb24ubXVsdGlwbGllcnMucmVkdWNlKChmYWN0b3IsIG11bHRpcGxpZXIpID0+IGZhY3RvciAqIE51bWJlcihtdWx0aXBsaWVyKSwgMSk7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmYWN0b3IpIHx8IGZhY3RvciA8PSAwKSByZXR1cm4gW3Rlcm1dOwogICAgICBjb25zdCBkZW5vbWluYXRvciA9IE1hdGgubWF4KHRlcm0uZHVyYXRpb24uZGVub21pbmF0b3IsIHRpbWVEZW5vbWluYXRvcik7CiAgICAgIGNvbnN0IGV2ZW50ID0gdGVybS5jbG9uZSgpOwogICAgICBldmVudC5kdXJhdGlvbi5tdWx0aXBsaWVycyA9IFtdOwogICAgICAvLyBicmVhayBkdXJhdGlvbiBpbnRvIG11bHRpcGxlIHJlc3QgZXZlbnRzCiAgICAgIGNvbnN0IHJlc3RDb3VudCA9IGV2ZW50LmR1cmF0aW9uLm1hZ25pdHVkZSAvIFdIT0xFX0RVUkFUSU9OX01BR05JVFVERSAqIChmYWN0b3IgLSAxKSAqIGRlbm9taW5hdG9yOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocmVzdENvdW50KSkgY29uc29sZS53YXJuKCJSZXN0IGNvdW50IGlzIG5vdCBpbnRlZ2VhcjoiLCByZXN0Q291bnQsIGRlbm9taW5hdG9yLCBldmVudC5kdXJhdGlvbi5tYWduaXR1ZGUsIGZhY3Rvcik7CiAgICAgIGNvbnN0IHJlc3RzID0gQXJyYXkoTWF0aC5mbG9vcihyZXN0Q291bnQpKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgUmVzdCh7CiAgICAgICAgbmFtZTogInMiLAogICAgICAgIGR1cmF0aW9uOiBuZXcgRHVyYXRpb24oewogICAgICAgICAgbnVtYmVyOiBkZW5vbWluYXRvciwKICAgICAgICAgIGRvdHM6IDAKICAgICAgICB9KQogICAgICB9KSk7CiAgICAgIHJldHVybiBbZXZlbnQsIC4uLnJlc3RzXTsKICAgIH07CiAgICB0aGlzLmJvZHkgPSBjYyh0aGlzLmJvZHkubWFwKHVuZm9sZE11bHRpcGxpZXJzKSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgLyovLyBwdXJlCiAgZmxhdHRlbiAoe3NwcmVhZFJlcGVhdHMgPSBmYWxzZX0gPSB7fSk6IFJlbGF0aXZlIHsKICAgICAgdGhpcy51cGRhdGVDaG9yZENoYWlucygpOwogICAgICAgY29uc3QgY2hvcmQgPSB0aGlzLmZpbmRGaXJzdChDaG9yZCkgYXMgQ2hvcmQ7CiAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMuYW5jaG9yUGl0Y2ggfHwgKGNob3JkICYmIGNob3JkLmFuY2hvclBpdGNoKTsKICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5jbG9uZSgpOwogICAgICBpZiAoc3ByZWFkUmVwZWF0cykKICAgICAgICAgIGJsb2NrLnNwcmVhZFJlcGVhdEJsb2NrcygpOwogICAgICBibG9jay5zcHJlYWRSZWxhdGl2ZUJsb2NrcygpOwogICAgICBibG9jay51bmZvbGREdXJhdGlvbk11bHRpcGxpZXJzKCk7CiAgICAgICByZXR1cm4gUmVsYXRpdmUubWFrZUJsb2NrKGJsb2NrLCB7YW5jaG9yOiBhbmNob3IgJiYgYW5jaG9yLmNsb25lKCl9KTsKICB9Ki8KICAvLyB3aXRoIHNpZGUgZWZmZWN0CiAgZXhwYW5kVmFyaWFibGVzKGRpY3QpIHsKICAgIHRoaXMuYm9keSA9IHRoaXMuYm9keS5tYXAodGVybSA9PiB7CiAgICAgIGlmICh0ZXJtIGluc3RhbmNlb2YgVmFyaWFibGUpIHsKICAgICAgICBjb25zdCB2YWx1ZSA9IHRlcm0ucXVlcnlWYWx1ZShkaWN0KTsKICAgICAgICBjb25zdCBjbG9uZWRWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQmFzZVRlcm0gPyB2YWx1ZS5jbG9uZSgpIDogdmFsdWU7CiAgICAgICAgaWYgKGNsb25lZFZhbHVlIGluc3RhbmNlb2YgQmFzZVRlcm0pIHsKICAgICAgICAgIGNsb25lZFZhbHVlLmZvckVhY2hUZXJtKE11c2ljQmxvY2ssIGJsb2NrID0+IGJsb2NrLmV4cGFuZFZhcmlhYmxlcyhkaWN0KSk7CiAgICAgICAgICBpZiAoY2xvbmVkVmFsdWUgaW5zdGFuY2VvZiBNdXNpY0Jsb2NrKSBjbG9uZWRWYWx1ZS5leHBhbmRWYXJpYWJsZXMoZGljdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjbG9uZWRWYWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gdGVybTsKICAgIH0pOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIC8vIHdpdGggc2lkZSBlZmZlY3RzCiAgcmVkaXZpZGUoewogICAgcmVjdXJzaXZlID0gdHJ1ZSwKICAgIG1lYXN1cmVIZWFkcyA9IG51bGwKICB9ID0ge30pIHsKICAgIGlmIChyZWN1cnNpdmUpIHsKICAgICAgdGhpcy5mb3JFYWNoVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiB7CiAgICAgICAgaWYgKCFibG9jay5fcGFyZW50IHx8IGJsb2NrLl9wYXJlbnQuY21kICE9PSAiYWx0ZXJuYXRpdmUiKSBibG9jay5yZWRpdmlkZSh7CiAgICAgICAgICByZWN1cnNpdmUsCiAgICAgICAgICBtZWFzdXJlSGVhZHMKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICAvLyBzcGxpdCByZXN0cwogICAgaWYgKG1lYXN1cmVIZWFkcykgewogICAgICB0aGlzLmJvZHkgPSBbXS5jb25jYXQoLi4udGhpcy5ib2R5Lm1hcCh0ZXJtID0+IHsKICAgICAgICBpZiAoISh0ZXJtIGluc3RhbmNlb2YgUmVzdCkgfHwgdGVybS5uYW1lICE9PSAicyIgfHwgIU51bWJlci5pc0ludGVnZXIodGVybS5fbWVhc3VyZSkpIHJldHVybiBbdGVybV07CiAgICAgICAgY29uc3QgbmV4dEhlYWQgPSBtZWFzdXJlSGVhZHNbdGVybS5fbWVhc3VyZV07CiAgICAgICAgY29uc3QgZW5kVGljayA9IHRlcm0uX3RpY2sgKyB0ZXJtLmR1cmF0aW9uTWFnbml0dWRlOwogICAgICAgIGlmIChuZXh0SGVhZCA+IDAgJiYgZW5kVGljayA+IG5leHRIZWFkKSB7CiAgICAgICAgICBjb25zdCBwb3N0X2V2ZW50cyA9IHRlcm0ucG9zdF9ldmVudHM7CiAgICAgICAgICBsZXQgc3RhcnRUaWNrID0gdGVybS5fdGljazsKICAgICAgICAgIGNvbnN0IHJlc3RzID0gW107CiAgICAgICAgICBsZXQgbmV4dE1lYXN1cmU7CiAgICAgICAgICBmb3IgKG5leHRNZWFzdXJlID0gdGVybS5fbWVhc3VyZTsgbmV4dE1lYXN1cmUgPCBtZWFzdXJlSGVhZHMubGVuZ3RoICYmIGVuZFRpY2sgPiBtZWFzdXJlSGVhZHNbbmV4dE1lYXN1cmVdOyArK25leHRNZWFzdXJlKSB7CiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU1hZ25pdHVkZShtZWFzdXJlSGVhZHNbbmV4dE1lYXN1cmVdIC0gc3RhcnRUaWNrKTsKICAgICAgICAgICAgaWYgKCFkdXJhdGlvbikgewogICAgICAgICAgICAgIGNvbnNvbGUud2FybigiaW52YWxpZCBtaWRkbGUgcmVzdCBkdXJhdGlvbiwgc3BsaXR0aW5nIGdhdmUgdXA6IiwgbWVhc3VyZUhlYWRzW25leHRNZWFzdXJlXSAtIHN0YXJ0VGljaywgdGVybSk7CiAgICAgICAgICAgICAgcmV0dXJuIFt0ZXJtXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZXN0ID0gbmV3IFJlc3QoewogICAgICAgICAgICAgIG5hbWU6ICJzIiwKICAgICAgICAgICAgICBkdXJhdGlvbiwKICAgICAgICAgICAgICBwb3N0X2V2ZW50czogW10KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJlc3QuX21lYXN1cmUgPSBuZXh0TWVhc3VyZTsKICAgICAgICAgICAgcmVzdC5fbGFzdE1lYXN1cmUgPSBuZXh0TWVhc3VyZTsKICAgICAgICAgICAgcmVzdHMucHVzaChyZXN0KTsKICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoISFyZXN0LmR1cmF0aW9uLCAibWlkZGxlIHNwbGl0dGVkIHJlc3QgZHVyYXRpb24gaW52YWxpZDoiLCBtZWFzdXJlSGVhZHNbbmV4dE1lYXN1cmVdIC0gc3RhcnRUaWNrKTsKICAgICAgICAgICAgc3RhcnRUaWNrID0gbWVhc3VyZUhlYWRzW25leHRNZWFzdXJlXTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU1hZ25pdHVkZShlbmRUaWNrIC0gc3RhcnRUaWNrKTsKICAgICAgICAgIGlmICghZHVyYXRpb24pIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJpbnZhbGlkIHRhaWwgcmVzdCBkdXJhdGlvbiwgc3BsaXR0aW5nIGdhdmUgdXA6IiwgZW5kVGljayAtIHN0YXJ0VGljaywgdGVybSk7CiAgICAgICAgICAgIHJldHVybiBbdGVybV07CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZXN0ID0gbmV3IFJlc3QoewogICAgICAgICAgICBuYW1lOiAicyIsCiAgICAgICAgICAgIGR1cmF0aW9uLAogICAgICAgICAgICBwb3N0X2V2ZW50czogcG9zdF9ldmVudHMgJiYgWy4uLnBvc3RfZXZlbnRzXQogICAgICAgICAgfSk7CiAgICAgICAgICByZXN0Ll9tZWFzdXJlID0gbmV4dE1lYXN1cmU7CiAgICAgICAgICByZXN0Ll9sYXN0TWVhc3VyZSA9IG5leHRNZWFzdXJlOwogICAgICAgICAgcmVzdHMucHVzaChyZXN0KTsKICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHJlc3RzLnJlZHVjZSgoc3VtLCByZXN0KSA9PiBzdW0gKyByZXN0LmR1cmF0aW9uTWFnbml0dWRlLCAwKSA9PT0gdGVybS5kdXJhdGlvbk1hZ25pdHVkZSwgImR1cmF0aW9uIHNwbGl0dGluZyBlcnJvcjoiLCByZXN0cywgdGVybSk7CiAgICAgICAgICAvL2lmIChyZXN0cy5yZWR1Y2UoKHN1bSwgcmVzdCkgPT4gc3VtICsgcmVzdC5kdXJhdGlvbk1hZ25pdHVkZSwgMCkgIT09IHRlcm0uZHVyYXRpb25NYWduaXR1ZGUpCiAgICAgICAgICAvLwlkZWJ1Z2dlcjsKICAgICAgICAgIHJldHVybiByZXN0czsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFt0ZXJtXTsKICAgICAgfSkpOwogICAgfQogICAgY29uc3QgaXNQb3N0VGVybSA9IHRlcm0gPT4gIXRlcm0gfHwgdGVybSBpbnN0YW5jZW9mIFBvc3RFdmVudCB8fCB0ZXJtLmV4cCA9PT0gIn4iIHx8IFsiYmFyIiwgImFycGVnZ2lvIiwgImdsaXNzYW5kbyIsICJzdXN0YWluT2ZmIiwgInN1c3RhaW5PbiJdLmluY2x1ZGVzKHRlcm0uY21kKTsKICAgIGNvbnN0IGxpc3QgPSB0aGlzLmJvZHkuZmlsdGVyKHRlcm0gPT4gISh0ZXJtIGluc3RhbmNlb2YgRGl2aWRlKSk7CiAgICBsZXQgbWVhc3VyZSA9IG51bGw7CiAgICBmb3IgKGNvbnN0IHRlcm0gb2YgbGlzdCkgewogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihtZWFzdXJlKSAmJiBpc1Bvc3RUZXJtKHRlcm0pKSB0ZXJtLl9tZWFzdXJlID0gbWVhc3VyZTtlbHNlIG1lYXN1cmUgPSB0ZXJtLl9tZWFzdXJlOwogICAgfQogICAgY29uc3QgYm9keSA9IFtdOwogICAgY29uc3QgbWVhc3VyZXMgPSBuZXcgU2V0KCk7CiAgICBsaXN0LnJldmVyc2UoKS5mb3JFYWNoKHRlcm0gPT4gewogICAgICBpZiAodGVybSBpbnN0YW5jZW9mIEJhc2VUZXJtKSB7CiAgICAgICAgY29uc3QgbmV3TWVhc3VyZXMgPSB0ZXJtLm1lYXN1cmVzLmZpbHRlcihtID0+ICFtZWFzdXJlcy5oYXMobSkpOwogICAgICAgIGlmIChuZXdNZWFzdXJlcy5sZW5ndGgpIHsKICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSAiICIgKyBuZXdNZWFzdXJlc1swXSArIChuZXdNZWFzdXJlcy5sZW5ndGggPiAxID8gIi0iICsgTWF0aC5tYXgoLi4ubmV3TWVhc3VyZXMpIDogIiIpOwogICAgICAgICAgaWYgKGJvZHkubGVuZ3RoKSBib2R5LnB1c2gobmV3IERpdmlkZSh7CiAgICAgICAgICAgIF90YWlsQ29tbWVudDogQ29tbWVudC5jcmVhdGVTaW5nbGUoY29tbWVudCkKICAgICAgICAgIH0pKTsKICAgICAgICAgIG5ld01lYXN1cmVzLmZvckVhY2gobSA9PiBtZWFzdXJlcy5hZGQobSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBib2R5LnB1c2godGVybSk7CiAgICB9KTsKICAgIHRoaXMuYm9keSA9IGJvZHkucmV2ZXJzZSgpOwogIH0KICBjbGFyaWZ5SGVhZCgpIHsKICAgIGNvbnN0IHRlcm1zID0gdGhpcy5ib2R5OwogICAgY29uc3QgaGVhZCA9IHRlcm1zLmZpbmQodGVybSA9PiB0ZXJtLmlzTXVzaWMpOwogICAgaWYgKGhlYWQgaW5zdGFuY2VvZiBNdXNpY0V2ZW50KSB7CiAgICAgIC8vIGNsYXJpZnkgdGhlIGZpcnN0IG11c2ljIGV2ZW50IGNvbnRlbnQKICAgICAgY29uc3QgZmlyc3RFdmVudEluZGV4ID0gdGVybXMuaW5kZXhPZihoZWFkKTsKICAgICAgaWYgKGZpcnN0RXZlbnRJbmRleCA+PSAwKSB7CiAgICAgICAgY29uc3QgZmlyc3RFdmVudCA9IHRlcm1zW2ZpcnN0RXZlbnRJbmRleF07CiAgICAgICAgLy9jb25zb2xlLmxvZygiZmlyc3RFdmVudDoiLCBmaXJzdEV2ZW50KTsKICAgICAgICBpZiAoZmlyc3RFdmVudC5fcHJldmlvdXMpIHsKICAgICAgICAgIGNvbnN0IGNsYXJpZmllZCA9IGZpcnN0RXZlbnQuY2xhcmlmaWVkOwogICAgICAgICAgdGVybXMuc3BsaWNlKGZpcnN0RXZlbnRJbmRleCwgMSwgY2xhcmlmaWVkKTsKICAgICAgICAgIC8vY29uc29sZS5sb2coInRlcm1zOiIsIGZpcnN0RXZlbnRJbmRleCwgdGVybXMsIGNsYXJpZmllZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGhlYWQpIHsKICAgICAgY29uc3QgYmxvY2sgPSBoZWFkLmZpbmRGaXJzdChNdXNpY0Jsb2NrKTsKICAgICAgaWYgKGJsb2NrKSBibG9jay5jbGFyaWZ5SGVhZCgpO2Vsc2UgY29uc29sZS53YXJuKCJbTXVzaWNCbG9jay5jbGFyaWZ5SGVhZF0gdW5leHBlY3RlZCBtdXNpYyBoZWFkOiIsIGhlYWQpOwogICAgfQogIH0KICBhYnNvbHV0ZVRvUmVsYXRpdmUoKSB7CiAgICBjb25zdCBhbmNob3IgPSB0aGlzLmZpbmRGaXJzdChDaG9yZCk7CiAgICBpZiAoIWFuY2hvcikgcmV0dXJuIG51bGw7CiAgICBjb25zdCBhbmNob3JQaXRjaCA9IGFuY2hvci5hYnNvbHV0ZVBpdGNoOwogICAgbGV0IHBpdGNoID0gYW5jaG9yUGl0Y2g7CiAgICBjb25zdCBuZXdCb2R5ID0gdGhpcy5jbG9uZSgpOwogICAgbmV3Qm9keS5mb3JFYWNoVGVybShDaG9yZCwgY2hvcmQgPT4gewogICAgICBjb25zdCBuZXdQaXRjaCA9IGNob3JkLmFic29sdXRlUGl0Y2g7CiAgICAgIGNob3JkLm1ha2VSZWxhdGl2ZVRvKHBpdGNoKTsKICAgICAgcGl0Y2ggPSBuZXdQaXRjaDsKICAgIH0pOwogICAgcmV0dXJuIFJlbGF0aXZlLm1ha2VCbG9jayhuZXdCb2R5LCB7CiAgICAgIGFuY2hvcjogYW5jaG9yUGl0Y2gKICAgIH0pOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBTaW11bHRhbmVvdXNMaXN0IGV4dGVuZHMgQmFzZVRlcm0gewogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBbIjw8XG4iLCAuLi5jYyh0aGlzLmxpc3QubWFwKGl0ZW0gPT4gWy4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKGl0ZW0pLCAiXG4iXSkpLCAiPj5cbiJdOwogIH0KICByZW1vdmVTdGFmZkdyb3VwKCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpc3QubGVuZ3RoOyArK2kpIHsKICAgICAgY29uc3QgaXRlbSA9IHRoaXMubGlzdFtpXTsKICAgICAgaWYgKGl0ZW0uaGVhZCBpbnN0YW5jZW9mIENvbW1hbmQgJiYgaXRlbS5oZWFkLmFyZ3MgJiYgaXRlbS5oZWFkLmFyZ3NbMF0gPT09ICJTdGFmZkdyb3VwIikgdGhpcy5saXN0W2ldID0gaXRlbS5ib2R5OwogICAgfQogICAgdGhpcy5saXN0LmZvckVhY2goaXRlbSA9PiB7CiAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgU2ltdWx0YW5lb3VzTGlzdCkgaXRlbS5yZW1vdmVTdGFmZkdyb3VwKCk7CiAgICB9KTsKICB9CiAgZ2V0IGlzTXVzaWMoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZ2V0IGVudHJpZXMoKSB7CiAgICByZXR1cm4gdGhpcy5saXN0OwogIH0KICBnZXQgZHVyYXRpb25NYWduaXR1ZGUoKSB7CiAgICByZXR1cm4gTWF0aC5tYXgoLi4udGhpcy5saXN0LmZpbHRlcih0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBCYXNlVGVybSkubWFwKHRlcm0gPT4gdGVybS5kdXJhdGlvbk1hZ25pdHVkZSkpOwogIH0KICBnZXQgbWVhc3VyZUxheW91dCgpIHsKICAgIGNvbnN0IHRyYWNrID0gdGhpcy5saXN0LmZpbmQodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQmFzZVRlcm0gJiYgdGVybS5tZWFzdXJlTGF5b3V0KTsKICAgIHJldHVybiB0cmFjayAmJiB0cmFjay5tZWFzdXJlTGF5b3V0OwogIH0KfQo7CmV4cG9ydCBjbGFzcyBDb250ZXh0ZWRNdXNpYyBleHRlbmRzIEJhc2VUZXJtIHsKICBzZXJpYWxpemUoKSB7CiAgICByZXR1cm4gWy4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKHRoaXMuaGVhZCksIC4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKHRoaXMuYm9keSksIC4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKHRoaXMubHlyaWNzKV07CiAgfQogIGdldCBpc011c2ljKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGdldCBlbnRyaWVzKCkgewogICAgcmV0dXJuIFt0aGlzLmhlYWQsIHRoaXMuYm9keV07CiAgfQogIGdldCB0eXBlKCkgewogICAgcmV0dXJuIHRoaXMuaGVhZC5hcmdzWzBdOwogIH0KICBnZXQgZHVyYXRpb25NYWduaXR1ZGUoKSB7CiAgICByZXR1cm4gdGhpcy5ib2R5LmR1cmF0aW9uTWFnbml0dWRlOwogIH0KICBnZXQgd2l0aENsYXVzZSgpIHsKICAgIGlmICh0aGlzLmhlYWQuYXJnc1syXSAmJiB0aGlzLmhlYWQuYXJnc1syXSBpbnN0YW5jZW9mIENvbW1hbmQgJiYgdGhpcy5oZWFkLmFyZ3NbMl0uY21kID09PSAid2l0aCIpIHJldHVybiB0aGlzLmhlYWQuYXJnc1syXTsKICB9CiAgZ2V0IGNvbnRleHREaWN0KCkgewogICAgY29uc3Qgd2l0aEVudHJpZXMgPSB0aGlzLndpdGhDbGF1c2UgPyBPYmplY3QuZW50cmllcyh0aGlzLndpdGhDbGF1c2UuYXJnc1swXS5hc3NpZ25tZW50RGljdCkgOiBbXTsKICAgIGNvbnN0IGVudHJpZXMgPSB3aXRoRW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2Ake3RoaXMudHlwZX0uJHtrZXl9YCwgdmFsdWVdKTsKICAgIGNvbnN0IHBhaXIgPSB0aGlzLmhlYWQuZ2V0QXNzaWdubWVudFBhaXIoKTsKICAgIGlmIChwYWlyKSBlbnRyaWVzLnB1c2goW3BhaXIua2V5LnRvU3RyaW5nKCksIHBhaXIudmFsdWUudG9TdHJpbmcoKV0pOwogICAgcmV0dXJuIGVudHJpZXMucmVkdWNlKChkaWN0LCBba2V5LCB2YWx1ZV0pID0+IChkaWN0W2tleV0gPSB2YWx1ZSwgZGljdCksIHt9KTsKICB9CiAgZ2V0IGxpc3QoKSB7CiAgICBpZiAodGhpcy5ib2R5IGluc3RhbmNlb2YgU2ltdWx0YW5lb3VzTGlzdCkgcmV0dXJuIHRoaXMuYm9keS5saXN0OwogICAgcmV0dXJuIG51bGw7CiAgfQogIHNldCBsaXN0KHZhbHVlKSB7CiAgICBpZiAodGhpcy5ib2R5IGluc3RhbmNlb2YgU2ltdWx0YW5lb3VzTGlzdCkgdGhpcy5ib2R5Lmxpc3QgPSB2YWx1ZTsKICB9CiAgZ2V0IG1lYXN1cmVMYXlvdXQoKSB7CiAgICByZXR1cm4gdGhpcy5ib2R5Lm1lYXN1cmVMYXlvdXQ7CiAgfQp9CjsKZXhwb3J0IGNsYXNzIERpdmlkZSBleHRlbmRzIEJhc2VUZXJtIHsKICBzZXJpYWxpemUoKSB7CiAgICByZXR1cm4gWyJ8IiwgIlxuIl07CiAgfQp9CmV4cG9ydCBjbGFzcyBTY2hlbWUgZXh0ZW5kcyBCYXNlVGVybSB7CiAgc2VyaWFsaXplKCkgewogICAgaWYgKEJhc2VUZXJtLmlzVGVybSh0aGlzLmV4cCkpIHJldHVybiBbIiMiLCAiXGIiLCAuLi50aGlzLmV4cC5zZXJpYWxpemUoKV07ZWxzZSBpZiAodHlwZW9mIHRoaXMuZXhwID09PSAiYm9vbGVhbiIpIHJldHVybiBbIiMiLCAiXGIiLCB0aGlzLmV4cCA/ICIjdCIgOiAiI2YiXTsKICAgIC8vIFRPRE86IGVuaGFuY2UgZ3JhbW1hciB0byBwYXJzZSBlbXB0eSBzY2hlbWUgbGlzdAogICAgLy9lbHNlIGlmICh0aGlzLmV4cCA9PT0gbnVsbCkKICAgIC8vCXJldHVybiBbIiMiLCAiXGIiLCAiJygpIl07CiAgICBlbHNlIHJldHVybiBbIiMiLCAiXGIiLCB0aGlzLmV4cF07CiAgfQogIHF1ZXJ5KGtleSkgewogICAgaWYgKHRoaXMuZXhwIGluc3RhbmNlb2YgU2NoZW1lRnVuY3Rpb24pIHJldHVybiB0aGlzLmV4cC5xdWVyeShrZXkpOwogIH0KICBnZXQgZW50cmllcygpIHsKICAgIGlmICh0aGlzLmV4cCBpbnN0YW5jZW9mIEJhc2VUZXJtKSByZXR1cm4gW3RoaXMuZXhwXTsKICAgIHJldHVybiBbXTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgU2NoZW1lRnVuY3Rpb24gZXh0ZW5kcyBCYXNlVGVybSB7CiAgc2VyaWFsaXplKCkgewogICAgcmV0dXJuIFsiKCIsICJcYiIsIC4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKHRoaXMuZnVuYyksIC4uLmNjKHRoaXMuYXJncy5tYXAoQmFzZVRlcm0uc2VyaWFsaXplU2NoZW1lKSksICJcYiIsICIpIl07CiAgfQogIHF1ZXJ5KGtleSkgewogICAgaWYgKGtleSA9PT0gdGhpcy5mdW5jKSB7CiAgICAgIGNvbnN0IHRlcm0gPSB0aGlzOwogICAgICByZXR1cm4gewogICAgICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICAgIHJldHVybiB0ZXJtLmFyZ3MubGVuZ3RoID09PSAxID8gdGVybS5hcmdzWzBdIDogdGVybS5hcmdzOwogICAgICAgIH0sCiAgICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7CiAgICAgICAgICBpZiAodGVybS5hcmdzLmxlbmd0aCA9PT0gMSkgdGVybS5hcmdzWzBdID0gdmFsdWU7ZWxzZSB0ZXJtLmFyZ3MgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgfQogIGdldCBhc0xpc3QoKSB7CiAgICByZXR1cm4gW3RoaXMuZnVuYywgLi4udGhpcy5hcmdzXTsKICB9CiAgZ2V0IGVudHJpZXMoKSB7CiAgICByZXR1cm4gdGhpcy5hc0xpc3QuZmlsdGVyKHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIEJhc2VUZXJtKTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgU2NoZW1lUGFpciBleHRlbmRzIEJhc2VUZXJtIHsKICBzZXJpYWxpemUoKSB7CiAgICByZXR1cm4gWyIoIiwgIlxiIiwgLi4uQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUodGhpcy5sZWZ0KSwgIi4iLCAuLi5CYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZSh0aGlzLnJpZ2h0KSwgIlxiIiwgIikiXTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgU2NoZW1lUG9pbnRlciBleHRlbmRzIEJhc2VUZXJtIHsKICBzZXJpYWxpemUoKSB7CiAgICBjb25zdCBjb250ZW50ID0gdGhpcy52YWx1ZSA9PT0gbnVsbCA/IFsiKCkiXSA6IEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKHRoaXMudmFsdWUpOwogICAgcmV0dXJuIFsiJyIsICJcYiIsIC4uLmNvbnRlbnRdOwogIH0KICBnZXQgZW50cmllcygpIHsKICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQmFzZVRlcm0pIHJldHVybiBbdGhpcy52YWx1ZV07CiAgICByZXR1cm4gW107CiAgfQp9CjsKZXhwb3J0IGNsYXNzIFNjaGVtZUVtYmVkIGV4dGVuZHMgQmFzZVRlcm0gewogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBbIiN7IiwgLi4uQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUodGhpcy52YWx1ZSksICIjfSJdOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgQmFzZVRlcm0gewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHN1cGVyKGRhdGEpOwogICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBCYXNlVGVybSkgdGhpcy52YWx1ZS5fcGFyZW50ID0gdGhpczsKICB9CiAgc2VyaWFsaXplKCkgewogICAgY29uc3Qga2V5cyA9IChBcnJheS5pc0FycmF5KHRoaXMua2V5KSA/IHRoaXMua2V5IDogW3RoaXMua2V5XSkubWFwKEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKTsKICAgIGNvbnN0IHZhbHVlcyA9IChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZSA6IFt0aGlzLnZhbHVlXSkubWFwKEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKTsKICAgIHJldHVybiBbLi4uY2Moa2V5cyksICI9IiwgLi4uY2ModmFsdWVzKV07CiAgfQogIGdldCBlbnRyaWVzKCkgewogICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBCYXNlVGVybSkgcmV0dXJuIFt0aGlzLnZhbHVlXTsKICAgIHJldHVybiBudWxsOwogIH0KICBxdWVyeShrZXkpIHsKICAgIGlmICh0aGlzLmtleSA9PT0ga2V5KSB7CiAgICAgIGNvbnN0IHRlcm0gPSB0aGlzOwogICAgICByZXR1cm4gewogICAgICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICAgIHJldHVybiB0ZXJtLnZhbHVlOwogICAgICAgIH0sCiAgICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7CiAgICAgICAgICB0ZXJtLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9OwogICAgfQogIH0KfQo7CmV4cG9ydCBjbGFzcyBNdXNpY0V2ZW50IGV4dGVuZHMgQmFzZVRlcm0gewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHN1cGVyKGRhdGEpOwogICAgaWYgKHRoaXMucG9zdF9ldmVudHMpIHRoaXMucG9zdF9ldmVudHMgPSB0aGlzLnBvc3RfZXZlbnRzLm1hcChwYXJzZVJhdyk7CiAgfQogIGdldFByZXZpb3VzVChUKSB7CiAgICBpZiAodGhpcy5fcHJldmlvdXMgaW5zdGFuY2VvZiBUKSByZXR1cm4gdGhpcy5fcHJldmlvdXM7CiAgICBpZiAodGhpcy5fcHJldmlvdXMpIHJldHVybiB0aGlzLl9wcmV2aW91cy5nZXRQcmV2aW91c1QoVCk7CiAgfQogIGdldCBkdXJhdGlvblZhbHVlKCkgewogICAgcmV0dXJuIHRoaXMuZHVyYXRpb24gfHwgKHRoaXMuX3ByZXZpb3VzID8gdGhpcy5fcHJldmlvdXMuZHVyYXRpb25WYWx1ZSA6IER1cmF0aW9uLmRlZmF1bHQpOwogIH0KICBnZXQgZHVyYXRpb25NYWduaXR1ZGUoKSB7CiAgICByZXR1cm4gdGhpcy5kdXJhdGlvblZhbHVlLm1hZ25pdHVkZTsKICB9CiAgZ2V0IGRpdmlzaW9uKCkgewogICAgcmV0dXJuIHRoaXMuZHVyYXRpb25WYWx1ZS5kaXZpc2lvbjsKICB9CiAgZ2V0IHdpdGhNdWx0aXBsaWVyKCkgewogICAgcmV0dXJuIHRoaXMuZHVyYXRpb24gJiYgdGhpcy5kdXJhdGlvbi53aXRoTXVsdGlwbGllcjsKICB9CiAgZ2V0IGlzTXVzaWMoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZ2V0IGlzVHlpbmcoKSB7CiAgICByZXR1cm4gdGhpcy5wb3N0X2V2ZW50cyAmJiB0aGlzLnBvc3RfZXZlbnRzLnNvbWUoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBQb3N0RXZlbnQgJiYgZXZlbnQuaXNUeWluZyk7CiAgfQogIGdldCBpc1N0YWNjYXRvKCkgewogICAgcmV0dXJuIHRoaXMucG9zdF9ldmVudHMgJiYgdGhpcy5wb3N0X2V2ZW50cy5zb21lKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgUG9zdEV2ZW50ICYmIGV2ZW50LmlzU3RhY2NhdG8pOwogIH0KICAvLyB0byBiZSBpbXBsZW1lbnQgaW4gZGVyaXZlZCBjbGFzc2VzCiAgZ2V0IGlzUmVzdCgpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBnZXQgYmVhbU9uKCkgewogICAgcmV0dXJuIHRoaXMucG9zdF9ldmVudHMgJiYgdGhpcy5wb3N0X2V2ZW50cy5pbmNsdWRlcygiWyIpOwogIH0KICBnZXQgYmVhbU9mZigpIHsKICAgIHJldHVybiB0aGlzLnBvc3RfZXZlbnRzICYmIHRoaXMucG9zdF9ldmVudHMuaW5jbHVkZXMoIl0iKTsKICB9CiAgZ2V0IG1lYXN1cmVzKCkgewogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5fbWVhc3VyZSkgfHwgIU51bWJlci5pc0Zpbml0ZSh0aGlzLl9sYXN0TWVhc3VyZSkpIHJldHVybiBbXTsKICAgIHJldHVybiBBcnJheSh0aGlzLl9sYXN0TWVhc3VyZSArIDEgLSB0aGlzLl9tZWFzdXJlKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gdGhpcy5fbWVhc3VyZSArIGkpOwogIH0KICBnZXQgbWVhc3VyZUxheW91dCgpIHsKICAgIGlmICh0aGlzLm1lYXN1cmVzLmxlbmd0aCA+IDEpIHJldHVybiBtZWFzdXJlTGF5b3V0LkJsb2NrTUxheW91dC5mcm9tU2VxKHRoaXMubWVhc3VyZXMubWFwKG1lYXN1cmUgPT4gbWVhc3VyZUxheW91dC5TaW5nbGVNTGF5b3V0LmZyb20obWVhc3VyZSkpKTsKICAgIGlmICh0aGlzLm1lYXN1cmVzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIG1lYXN1cmVMYXlvdXQuU2luZ2xlTUxheW91dC5mcm9tKHRoaXMuX21lYXN1cmUpOwogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBpbXBsaWNpdFR5cGUoKSB7CiAgICBpZiAodGhpcy5wb3N0X2V2ZW50cykgewogICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHRoaXMucG9zdF9ldmVudHMpIHsKICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBQb3N0RXZlbnQgJiYgZXZlbnQuYXJnIGluc3RhbmNlb2YgQ29tbWFuZCkgewogICAgICAgICAgc3dpdGNoIChldmVudC5hcmcuY21kKSB7CiAgICAgICAgICAgIGNhc2UgInN0YXJ0VHJpbGxTcGFuIjoKICAgICAgICAgICAgY2FzZSAidHJpbGwiOgogICAgICAgICAgICAgIHJldHVybiBJbXBsaWNpdFR5cGUuVHJpbGw7CiAgICAgICAgICAgIGNhc2UgInR1cm4iOgogICAgICAgICAgICAgIHJldHVybiBJbXBsaWNpdFR5cGUuVHVybjsKICAgICAgICAgICAgY2FzZSAibW9yZGVudCI6CiAgICAgICAgICAgICAgcmV0dXJuIEltcGxpY2l0VHlwZS5Nb3JkZW50OwogICAgICAgICAgICBjYXNlICJwcmFsbCI6CiAgICAgICAgICAgICAgcmV0dXJuIEltcGxpY2l0VHlwZS5QcmFsbDsKICAgICAgICAgICAgLy8gQXJwZWdnaW8gaXMgbm90IGltcGxlbWVudGVkIGluICdhcnRpY3VsYXRlLmx5JyB5ZXQKICAgICAgICAgICAgY2FzZSAiYXJwZWdnaW8iOgogICAgICAgICAgICAgIHJldHVybiBJbXBsaWNpdFR5cGUuQXJwZWdnaW87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gSW1wbGljaXRUeXBlLk5vbmU7CiAgfQogIGdldCBjbGFyaWZpZWQoKSB7CiAgICBjb25zdCBjbGFyaWZpZWQgPSB0aGlzIGluc3RhbmNlb2YgQ2hvcmQgPyB0aGlzLmNsYXJpZmllZENob3JkIDogdGhpcy5jbG9uZSgpOwogICAgY2xhcmlmaWVkLmR1cmF0aW9uID0gdGhpcy5kdXJhdGlvblZhbHVlICYmIHRoaXMuZHVyYXRpb25WYWx1ZS5jbG9uZSgpOwogICAgcmV0dXJuIGNsYXJpZmllZDsKICB9Cn0KOwpleHBvcnQgY2xhc3MgQ2hvcmQgZXh0ZW5kcyBNdXNpY0V2ZW50IHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICBzdXBlcihkYXRhKTsKICAgIHRoaXMuY29ubmVjdFBpdGNoZXMoKTsKICB9CiAgY29ubmVjdFBpdGNoZXMoKSB7CiAgICBpZiAodGhpcy5iYXNlUGl0Y2gpIHRoaXMuYmFzZVBpdGNoLl9wYXJlbnQgPSB0aGlzOwogICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnBpdGNoRWxlbWVudHMubGVuZ3RoOyArK2kpIHRoaXMucGl0Y2hFbGVtZW50c1tpXS5fcHJldmlvdXMgPSB0aGlzLnBpdGNoRWxlbWVudHNbaSAtIDFdOwogIH0KICBnZXQgc2luZ2xlKCkgewogICAgcmV0dXJuIHRoaXMucGl0Y2hlcy5sZW5ndGggPT09IDE7CiAgfQogIGdldCBlbnRyaWVzKCkgewogICAgY29uc3QgbGlzdCA9IFsuLi50aGlzLnBpdGNoZXNdOwogICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wb3N0X2V2ZW50cykpIGxpc3QucHVzaCguLi50aGlzLnBvc3RfZXZlbnRzKTsKICAgIHJldHVybiBsaXN0OwogIH0KICBzZXJpYWxpemUoKSB7CiAgICBjb25zdCBpbm5lclBpdGNoZXMgPSB0aGlzLnBpdGNoZXMubWFwKEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKTsKICAgIGNvbnN0IHBpdGNoZXMgPSB0aGlzLnNpbmdsZSAmJiAhdGhpcy5vcHRpb25zLndpdGhBbmdsZSA/IGNjKGlubmVyUGl0Y2hlcykgOiBbIjwiLCAiXGIiLCAuLi5jYyhpbm5lclBpdGNoZXMpLCAiXGIiLCAiPiJdOwogICAgY29uc3QgewogICAgICBleGNsYW1hdGlvbnMsCiAgICAgIHF1ZXN0aW9ucywKICAgICAgcmVzdAogICAgfSA9IHRoaXMub3B0aW9uczsKICAgIGNvbnN0IHBvc3RmaXggPSBjYyhbLi4uKGV4Y2xhbWF0aW9ucyB8fCBbXSksIC4uLihxdWVzdGlvbnMgfHwgW10pLCAuLi5CYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZSh0aGlzLmR1cmF0aW9uKSwgcmVzdF0uZmlsdGVyKGl0ZW0gPT4gaXRlbSkubWFwKGl0ZW0gPT4gWyJcYiIsIGl0ZW1dKSkuY29uY2F0KC4uLih0aGlzLnBvc3RfZXZlbnRzIHx8IFtdKS5tYXAoQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUpKTsKICAgIHJldHVybiBbbmV3IE9wZW5Mb2NhdG9yKHRoaXMpLCAuLi5waXRjaGVzLCAuLi5wb3N0Zml4LCBuZXcgQ2xvc2VMb2NhdG9yKHRoaXMpXTsKICB9CiAgZ2V0IHBpdGNoRWxlbWVudHMoKSB7CiAgICByZXR1cm4gdGhpcy5waXRjaGVzLmZpbHRlcihwaXRjaCA9PiBwaXRjaCBpbnN0YW5jZW9mIENob3JkRWxlbWVudCk7CiAgfQogIGdldCBwaXRjaE5hbWVzKCkgewogICAgcmV0dXJuIHRoaXMucGl0Y2hFbGVtZW50cy5tYXAoZWxlbSA9PiBlbGVtLnBpdGNoLnJlcGxhY2UoLyd8LC9nLCAiIikpOwogIH0KICBnZXQgYmFzZVBpdGNoKCkgewogICAgcmV0dXJuIHRoaXMucGl0Y2hFbGVtZW50c1swXTsKICB9CiAgZ2V0IGFic29sdXRlUGl0Y2goKSB7CiAgICBjb25zb2xlLmFzc2VydCghIXRoaXMuYmFzZVBpdGNoLCAiYWJzb2x1dGVQaXRjaCBvbiBub24gcGl0Y2g6IiwgdGhpcy5qb2luKCkpOwogICAgcmV0dXJuIHRoaXMuYmFzZVBpdGNoLmFic29sdXRlUGl0Y2g7CiAgfQogIGdldCBhbmNob3JQaXRjaCgpIHsKICAgIGlmICh0aGlzLl9hbmNob3JQaXRjaCkgcmV0dXJuIHRoaXMuX2FuY2hvclBpdGNoOwogICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmdldFByZXZpb3VzVChDaG9yZCk7CiAgICBpZiAocHJldmlvdXMpIHJldHVybiBwcmV2aW91cy5hYnNvbHV0ZVBpdGNoOwogICAgcmV0dXJuIHRoaXMuYmFzZVBpdGNoOwogIH0KICBnZXQgaXNSZXN0KCkgewogICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLnJlc3Q7CiAgfQogIGdldCBjb21wbGV0ZVRpZWQoKSB7CiAgICByZXR1cm4gdGhpcy5waXRjaEVsZW1lbnRzLmZpbHRlcihwaXRjaCA9PiAhcGl0Y2guX3RpZWQpLmxlbmd0aCA9PT0gMDsKICB9CiAgZ2V0IHBpdGNoZXNWYWx1ZSgpIHsKICAgIGlmICh0aGlzLl9wcmV2aW91cyBpbnN0YW5jZW9mIENob3JkICYmIHRoaXMuYmFzZVBpdGNoLnBpdGNoID09PSAicSIpIHsKICAgICAgY29uc3QgcGl0Y2hlcyA9IHRoaXMuX3ByZXZpb3VzLnBpdGNoZXNWYWx1ZS5tYXAocGl0Y2ggPT4gewogICAgICAgIGNvbnN0IG5ld1BpdGNoID0gcGl0Y2guY2xvbmUoKTsKICAgICAgICBpZiAobmV3UGl0Y2ggaW5zdGFuY2VvZiBDaG9yZEVsZW1lbnQpIHsKICAgICAgICAgIG5ld1BpdGNoLl9sb2NhdGlvbiA9IHRoaXMuYmFzZVBpdGNoLl9sb2NhdGlvbjsKICAgICAgICAgIG5ld1BpdGNoLl90aWVkID0gdGhpcy5iYXNlUGl0Y2guX3RpZWQ7CiAgICAgICAgICBuZXdQaXRjaC5fcGFyZW50ID0gcGl0Y2guX3BhcmVudCAmJiB0aGlzOwogICAgICAgICAgbmV3UGl0Y2guX3ByZXZpb3VzID0gcGl0Y2guX3ByZXZpb3VzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3UGl0Y2g7CiAgICAgIH0pOwogICAgICBjb25zdCBiYXNlID0gcGl0Y2hlcy5maW5kKHBpdGNoID0+IHBpdGNoIGluc3RhbmNlb2YgQ2hvcmRFbGVtZW50KTsKICAgICAgaWYgKGJhc2UpIGJhc2UucGl0Y2ggPSBiYXNlLnBpdGNoLnJlcGxhY2UoL1ssJ10vZywgIiIpOwogICAgICByZXR1cm4gcGl0Y2hlczsKICAgIH0KICAgIHJldHVybiB0aGlzLnBpdGNoZXM7CiAgfQogIGdldCBjbGFyaWZpZWRDaG9yZCgpIHsKICAgIGNvbnN0IGNsYXJpZmllZCA9IHRoaXMuY2xvbmUoKTsKICAgIGNsYXJpZmllZC5waXRjaGVzID0gdGhpcy5waXRjaGVzVmFsdWUuZmlsdGVyKHBpdGNoID0+ICFwaXRjaC5fdGllZCkubWFwKHBpdGNoID0+IHBpdGNoLmNsb25lKCkpOwogICAgY2xhcmlmaWVkLmNvbm5lY3RQaXRjaGVzKCk7CiAgICAvLyByZXBsYWNlIGJ5IHJlc3QgaWYgYWxsIHBpdGNoZXMgdGllZAogICAgaWYgKCFjbGFyaWZpZWQucGl0Y2hlcy5sZW5ndGgpIHJldHVybiBuZXcgUmVzdCh7CiAgICAgIG5hbWU6ICJyIiwKICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24KICAgIH0pOwogICAgcmV0dXJuIGNsYXJpZmllZDsKICB9CiAgc2hpZnRBbmNob3IobmV3QW5jaG9yKSB7CiAgICAvL2NvbnNvbGUud2Fybigic2hpZnRBbmNob3I6IiwgdGhpcy5qb2luKCksIG5ld0FuY2hvci5qb2luKCksIHRoaXMuYWJzb2x1dGVQaXRjaC5waXRjaFZhbHVlLCBuZXdBbmNob3IucGl0Y2hWYWx1ZSwgdGhpcy5hbmNob3JQaXRjaC5waXRjaFZhbHVlKTsKICAgIGNvbnN0IF9sb2NhdGlvbiA9IHRoaXMuYmFzZVBpdGNoLl9sb2NhdGlvbjsKICAgIGNvbnN0IHNoaWZ0ID0gaWRpb21zLnBob25ldERpZmZlclRvU2hpZnQodGhpcy5iYXNlUGl0Y2gucGhvbmV0U3RlcCAtIG5ld0FuY2hvci5waG9uZXRTdGVwKTsKICAgIGNvbnN0IHJlbGF0aXZlT2N0YXZlID0gdGhpcy5iYXNlUGl0Y2guYWJzb2x1dGVPY3RhdmUodGhpcy5hbmNob3JQaXRjaCkgLSBuZXdBbmNob3Iub2N0YXZlIC0gc2hpZnQ7CiAgICAvL2NvbnNvbGUubG9nKCJfbG9jYXRpb246IiwgX2xvY2F0aW9uKTsKICAgIHRoaXMucGl0Y2hlc1swXSA9IENob3JkRWxlbWVudC5mcm9tKHsKICAgICAgcGhvbmV0OiB0aGlzLmJhc2VQaXRjaC5waG9uZXQsCiAgICAgIGFsdGVyczogdGhpcy5iYXNlUGl0Y2guYWx0ZXJzLAogICAgICBvY3RhdmU6IHJlbGF0aXZlT2N0YXZlCiAgICB9KTsKICAgIHRoaXMucGl0Y2hlc1swXS5fbG9jYXRpb24gPSBfbG9jYXRpb247CiAgICB0aGlzLnBpdGNoZXNbMF0uX3BhcmVudCA9IHRoaXM7CiAgICB0aGlzLmNvbm5lY3RQaXRjaGVzKCk7CiAgICAvL2NvbnNvbGUubG9nKCJzaGlmdEFuY2hvci4xOiIsIHRoaXMuam9pbigpLCB0aGlzLmFic29sdXRlUGl0Y2gucGl0Y2hWYWx1ZSwge3JlbGF0aXZlT2N0YXZlLCBzaGlmdCwgIm5ld0FuY2hvci5vY3RhdmUiOiBuZXdBbmNob3Iub2N0YXZlfSk7CiAgfQogIG1ha2VSZWxhdGl2ZVRvKGZyb20pIHsKICAgIGNvbnN0IF9sb2NhdGlvbiA9IHRoaXMuYmFzZVBpdGNoLl9sb2NhdGlvbjsKICAgIGNvbnN0IG9jdGF2ZSA9IHRoaXMuYmFzZVBpdGNoLnJlbGF0aXZlT2N0YXZlKGZyb20pOwogICAgdGhpcy5waXRjaGVzWzBdID0gQ2hvcmRFbGVtZW50LmZyb20oewogICAgICBwaG9uZXQ6IHRoaXMuYmFzZVBpdGNoLnBob25ldCwKICAgICAgYWx0ZXJzOiB0aGlzLmJhc2VQaXRjaC5hbHRlcnMsCiAgICAgIG9jdGF2ZQogICAgfSk7CiAgICB0aGlzLnBpdGNoZXNbMF0uX2xvY2F0aW9uID0gX2xvY2F0aW9uOwogICAgdGhpcy5waXRjaGVzWzBdLl9wYXJlbnQgPSB0aGlzOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBSZXN0IGV4dGVuZHMgTXVzaWNFdmVudCB7CiAgc2VyaWFsaXplKCkgewogICAgcmV0dXJuIFtuZXcgT3BlbkxvY2F0b3IodGhpcyksIC4uLmNvbXBhY3QoW3RoaXMubmFtZSwgLi4uQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUodGhpcy5kdXJhdGlvbildKSwgLi4uY2MoKHRoaXMucG9zdF9ldmVudHMgfHwgW10pLm1hcChCYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZSkpLCBuZXcgQ2xvc2VMb2NhdG9yKHRoaXMpXTsKICB9CiAgZ2V0IGlzU3BhY2VyKCkgewogICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gInMiOwogIH0KICBnZXQgaXNSZXN0KCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CjsKZXhwb3J0IGNsYXNzIENob3JkRWxlbWVudCBleHRlbmRzIEJhc2VUZXJtIHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICBzdXBlcihkYXRhKTsKICAgIGlmICh0aGlzLm9wdGlvbnMucG9zdF9ldmVudHMpIHRoaXMub3B0aW9ucy5wb3N0X2V2ZW50cyA9IHRoaXMub3B0aW9ucy5wb3N0X2V2ZW50cy5tYXAocGFyc2VSYXcpOwogICAgaWYgKCF0aGlzLnBpdGNoKSBjb25zb2xlLmxvZygibnVsbCBwaXRjaDoiLCB0aGlzKTsKICB9CiAgc3RhdGljIGZyb20oewogICAgcGhvbmV0LAogICAgYWx0ZXJzID0gIiIsCiAgICBvY3RhdmUsCiAgICBvcHRpb25zID0ge30KICB9KSB7CiAgICBjb25zdCBvY3RhdmVTdHJpbmcgPSBvY3RhdmUgPyBBcnJheShNYXRoLmFicyhvY3RhdmUpKS5maWxsKG9jdGF2ZSA+IDAgPyAiJyIgOiAiLCIpLmpvaW4oIiIpIDogIiI7CiAgICBjb25zdCBwaXRjaCA9IHBob25ldCArIChhbHRlcnMgfHwgIiIpICsgb2N0YXZlU3RyaW5nOwogICAgcmV0dXJuIG5ldyBDaG9yZEVsZW1lbnQoewogICAgICBwaXRjaCwKICAgICAgb3B0aW9uczogewogICAgICAgIC4uLm9wdGlvbnMsCiAgICAgICAgcHJvdG86ICJfUExBSU4iCiAgICAgIH0KICAgIH0pOwogIH0KICBzdGF0aWMgZ2V0IGRlZmF1bHQoKSB7CiAgICByZXR1cm4gQ2hvcmRFbGVtZW50LmZyb20oewogICAgICBwaG9uZXQ6ICJjIiwKICAgICAgb2N0YXZlOiAwCiAgICB9KTsKICB9CiAgc2VyaWFsaXplKCkgewogICAgY29uc3QgewogICAgICBleGNsYW1hdGlvbnMsCiAgICAgIHF1ZXN0aW9ucywKICAgICAgcG9zdF9ldmVudHMKICAgIH0gPSB0aGlzLm9wdGlvbnM7CiAgICBjb25zdCBwb3N0Zml4ID0gW10uY29uY2F0KC4uLlsuLi4oZXhjbGFtYXRpb25zIHx8IFtdKSwgLi4uKHF1ZXN0aW9ucyB8fCBbXSldLmZpbHRlcihpdGVtID0+IGl0ZW0pLm1hcChpdGVtID0+IFsiXGIiLCBpdGVtXSkpLmNvbmNhdCguLi4ocG9zdF9ldmVudHMgfHwgW10pLm1hcChpdGVtID0+IFsiXGIiLCAuLi5CYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZShpdGVtKV0pKTsKICAgIHJldHVybiBbbmV3IE9wZW5Mb2NhdG9yKHRoaXMpLCB0aGlzLnBpdGNoLCAuLi5wb3N0Zml4LCBuZXcgQ2xvc2VMb2NhdG9yKHRoaXMpXTsKICB9CiAgZ2V0IG9jdGF2ZSgpIHsKICAgIGNvbnN0IHBvc2l0aXZlID0gKHRoaXMucGl0Y2gubWF0Y2goLycvZykgfHwgW10pLmxlbmd0aDsKICAgIGNvbnN0IG5lZ2F0aXZlID0gKHRoaXMucGl0Y2gubWF0Y2goLywvZykgfHwgW10pLmxlbmd0aDsKICAgIHJldHVybiBwb3NpdGl2ZSAtIG5lZ2F0aXZlOwogIH0KICBnZXQgcGhvbmV0KCkgewogICAgY29uc3QgcGggPSB0aGlzLnBpdGNoLnN1YnN0cigwLCAxKTsKICAgIHJldHVybiBpZGlvbXMuUEhPTkVUU19BTElBU1twaF0gfHwgcGg7CiAgfQogIGdldCBwaG9uZXRTdGVwKCkgewogICAgcmV0dXJuIGlkaW9tcy5QSE9ORVRTLmluZGV4T2YodGhpcy5waG9uZXQpOwogIH0KICBnZXQgYWx0ZXJzKCkgewogICAgY29uc3QgY2FwdHVyZXMgPSB0aGlzLnBpdGNoLnN1YnN0cigxKS5tYXRjaCgvXlx3Ky8pOwogICAgcmV0dXJuIGNhcHR1cmVzICYmIGNhcHR1cmVzWzBdOwogIH0KICBnZXQgYWx0ZXJlZFBob25ldCgpIHsKICAgIGNvbnN0IGNhcHR1cmVzID0gdGhpcy5waXRjaC5tYXRjaCgvXlx3Ky8pOwogICAgcmV0dXJuIGNhcHR1cmVzICYmIGNhcHR1cmVzWzBdOwogIH0KICBnZXQgYW5jaG9yUGl0Y2goKSB7CiAgICBpZiAodGhpcy5fcHJldmlvdXMpIHJldHVybiB0aGlzLl9wcmV2aW91cy5hYnNvbHV0ZVBpdGNoOwogICAgaWYgKHRoaXMuX3BhcmVudCkgcmV0dXJuIHRoaXMuX3BhcmVudC5hbmNob3JQaXRjaDsKICAgIHJldHVybiBDaG9yZEVsZW1lbnQuZnJvbSh7CiAgICAgIHBob25ldDogdGhpcy5waG9uZXQsCiAgICAgIG9jdGF2ZTogMAogICAgfSk7CiAgfQogIGdldEFic29sdXRlUGl0Y2goKSB7CiAgICBpZiAodGhpcy5waG9uZXQgPT09ICJxIikgcmV0dXJuIHRoaXMuYW5jaG9yUGl0Y2g7CiAgICBpZiAodGhpcy5hbmNob3JQaXRjaCA9PT0gdGhpcykgcmV0dXJuIHRoaXM7CiAgICBjb25zdCBvY3RhdmUgPSB0aGlzLmFic29sdXRlT2N0YXZlKHRoaXMuYW5jaG9yUGl0Y2gpOwogICAgcmV0dXJuIENob3JkRWxlbWVudC5mcm9tKHsKICAgICAgcGhvbmV0OiB0aGlzLnBob25ldCwKICAgICAgYWx0ZXJzOiB0aGlzLmFsdGVycywKICAgICAgb2N0YXZlCiAgICB9KTsKICB9CiAgZ2V0IGFic29sdXRlUGl0Y2goKSB7CiAgICBpZiAoIXRoaXMuX2Fic29sdXRlUGl0Y2gpIHRoaXMuX2Fic29sdXRlUGl0Y2ggPSB0aGlzLmdldEFic29sdXRlUGl0Y2goKTsKICAgIHJldHVybiB0aGlzLl9hYnNvbHV0ZVBpdGNoOwogIH0KICBhYnNvbHV0ZU9jdGF2ZShhbmNob3IpIHsKICAgIGlmICh0aGlzLnBob25ldCA9PT0gInEiKSByZXR1cm4gYW5jaG9yLm9jdGF2ZTsKICAgIGNvbnN0IHBob25ldERpZmZlciA9IHRoaXMucGhvbmV0U3RlcCAtIGFuY2hvci5waG9uZXRTdGVwOwogICAgY29uc3Qgc2hpZnQgPSBpZGlvbXMucGhvbmV0RGlmZmVyVG9TaGlmdChwaG9uZXREaWZmZXIpOwogICAgcmV0dXJuIGFuY2hvci5vY3RhdmUgKyBzaGlmdCArIHRoaXMub2N0YXZlOwogIH0KICByZWxhdGl2ZU9jdGF2ZShmcm9tKSB7CiAgICBpZiAodGhpcy5waG9uZXQgPT09ICJxIikgewogICAgICBpZiAodGhpcy5hbmNob3JQaXRjaCkgcmV0dXJuIHRoaXMuYW5jaG9yUGl0Y2gucmVsYXRpdmVPY3RhdmUoZnJvbSk7ZWxzZSByZXR1cm4gMDsKICAgIH0KICAgIGNvbnN0IHBob25ldERpZmZlciA9IHRoaXMucGhvbmV0U3RlcCAtIGZyb20ucGhvbmV0U3RlcDsKICAgIGNvbnN0IHNoaWZ0ID0gaWRpb21zLnBob25ldERpZmZlclRvU2hpZnQocGhvbmV0RGlmZmVyKTsKICAgIHJldHVybiB0aGlzLm9jdGF2ZSAtIHNoaWZ0IC0gZnJvbS5vY3RhdmU7CiAgfQogIGdldCBhbHRlclZhbHVlKCkgewogICAgcmV0dXJuIGlkaW9tcy5BTFRFUl9WQUxVRVNbdGhpcy5hbHRlcnNdIHx8IDA7CiAgfQogIGdldCBwaXRjaFZhbHVlKCkgewogICAgY29uc3QgcGhvbmV0VmFsdWUgPSBpZGlvbXMuUEhPTkVUX1ZBTFVFU1t0aGlzLnBob25ldF07CiAgICBjb25zb2xlLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHBob25ldFZhbHVlKSwgImludmFsaWQgcGhvbmV0OiIsIHRoaXMucGhvbmV0KTsKICAgIGNvbnNvbGUuYXNzZXJ0KCF0aGlzLmFsdGVycyB8fCBpZGlvbXMuQUxURVJfVkFMVUVTW3RoaXMuYWx0ZXJzXSwgImludmFsaWQgYWx0ZXJzOiIsIHRoaXMuYWx0ZXJzKTsKICAgIHJldHVybiA0OCArIHRoaXMub2N0YXZlICogMTIgKyBwaG9uZXRWYWx1ZSArIHRoaXMuYWx0ZXJWYWx1ZTsKICB9CiAgZ2V0IGFic29sdXRlUGl0Y2hWYWx1ZSgpIHsKICAgIHJldHVybiB0aGlzLmFic29sdXRlUGl0Y2gucGl0Y2hWYWx1ZTsKICB9CiAgLy8gbWlkZGxlIEMgaXMgemVybwogIGdldCBub3RlUG9zaXRpb24oKSB7CiAgICBjb25zdCBwaG9uZXQgPSBpZGlvbXMuUEhPTkVUUy5pbmRleE9mKHRoaXMucGhvbmV0KTsKICAgIHJldHVybiAodGhpcy5vY3RhdmUgLSAxKSAqIDcgKyBwaG9uZXQ7CiAgfQogIGdldCBhYnNvbHV0ZU5vdGVQb3NpdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmFic29sdXRlUGl0Y2gubm90ZVBvc2l0aW9uOwogIH0KICBnZXQgdGllZFBhcmVudCgpIHsKICAgIGlmICghdGhpcy5fdGllZCB8fCAhKHRoaXMuX3RpZWQgaW5zdGFuY2VvZiBDaG9yZCkpIHJldHVybiBudWxsOwogICAgY29uc3QgcGl0Y2ggPSB0aGlzLl90aWVkLnBpdGNoRWxlbWVudHMuZmluZChwID0+IHAuYWJzb2x1dGVQaXRjaFZhbHVlID09PSB0aGlzLmFic29sdXRlUGl0Y2hWYWx1ZSk7CiAgICBpZiAoIXBpdGNoKSByZXR1cm4gbnVsbDsKICAgIGlmIChwaXRjaC5fdGllZCkgcmV0dXJuIHBpdGNoLnRpZWRQYXJlbnQ7CiAgICByZXR1cm4gcGl0Y2g7CiAgfQp9CjsKZXhwb3J0IGNsYXNzIER1cmF0aW9uIGV4dGVuZHMgQmFzZVRlcm0gewogIHN0YXRpYyBnZXQgZGVmYXVsdCgpIHsKICAgIGlmICghRHVyYXRpb24uX2RlZmF1bHQpIER1cmF0aW9uLl9kZWZhdWx0ID0gbmV3IER1cmF0aW9uKHsKICAgICAgbnVtYmVyOiA0LAogICAgICBkb3RzOiAwCiAgICB9KTsKICAgIHJldHVybiBEdXJhdGlvbi5fZGVmYXVsdDsKICB9CiAgc3RhdGljIGZyb21NYWduaXR1ZGUobWFnbml0dWRlKSB7CiAgICBjb25zdCBNVUxUSSA9IDEwMjQ7CiAgICBjb25zdCBNVUxUSV9EVVJBVElPTl9NQUdOSVRVREUgPSBXSE9MRV9EVVJBVElPTl9NQUdOSVRVREUgKiBNVUxUSTsKICAgIGNvbnN0IG11bHRpTWFnID0gbWFnbml0dWRlICogTVVMVEk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobXVsdGlNYWcpKSB7CiAgICAgIGNvbnNvbGUud2FybigibWFnbml0dWRlIG11c3QgYmUgaW50ZWdlcjoiLCBtYWduaXR1ZGUpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGRpID0gZ2NkKG11bHRpTWFnLCBNVUxUSV9EVVJBVElPTl9NQUdOSVRVREUpOwogICAgY29uc3QgZGVub21pbmF0b3IgPSBNVUxUSV9EVVJBVElPTl9NQUdOSVRVREUgLyBkaTsKICAgIGNvbnN0IG51bWVyYXRvciA9IG11bHRpTWFnIC8gZGk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoTWF0aC5sb2cyKGRlbm9taW5hdG9yKSkpIHJldHVybiBuZXcgRHVyYXRpb24oewogICAgICBudW1iZXI6IDEsCiAgICAgIGRvdHM6IDAsCiAgICAgIG11bHRpcGxpZXJzOiBbYCR7bnVtZXJhdG9yfS8ke2Rlbm9taW5hdG9yfWBdCiAgICB9KTsKICAgIHN3aXRjaCAobnVtZXJhdG9yKSB7CiAgICAgIGNhc2UgMToKICAgICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHsKICAgICAgICAgIG51bWJlcjogZGVub21pbmF0b3IsCiAgICAgICAgICBkb3RzOiAwCiAgICAgICAgfSk7CiAgICAgIGNhc2UgMzoKICAgICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHsKICAgICAgICAgIG51bWJlcjogZGVub21pbmF0b3IgLyAyLAogICAgICAgICAgZG90czogMQogICAgICAgIH0pOwogICAgICBjYXNlIDc6CiAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbih7CiAgICAgICAgICBudW1iZXI6IGRlbm9taW5hdG9yIC8gNCwKICAgICAgICAgIGRvdHM6IDIKICAgICAgICB9KTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHsKICAgICAgICAgIG51bWJlcjogZGVub21pbmF0b3IsCiAgICAgICAgICBkb3RzOiAwLAogICAgICAgICAgbXVsdGlwbGllcnM6IFtudW1lcmF0b3IudG9TdHJpbmcoKV0KICAgICAgICB9KTsKICAgIH0KICB9CiAgc2VyaWFsaXplKCkgewogICAgY29uc3QgZG90cyA9IEFycmF5KHRoaXMuZG90cykuZmlsbCgiLiIpLmpvaW4oIiIpOwogICAgY29uc3QgbXVsdGlwbGllcnMgPSB0aGlzLm11bHRpcGxpZXJzICYmIHRoaXMubXVsdGlwbGllcnMubWFwKG11bHRpcGxpZXIgPT4gYCoke211bHRpcGxpZXJ9YCkuam9pbigiIik7CiAgICByZXR1cm4gY29tcGFjdChbdGhpcy5udW1iZXIsIGRvdHMsIG11bHRpcGxpZXJzXSk7CiAgfQogIGdldCB3aXRoTXVsdGlwbGllcigpIHsKICAgIHJldHVybiB0aGlzLm11bHRpcGxpZXJzICYmIHRoaXMubXVsdGlwbGllcnMubGVuZ3RoID4gMDsKICB9CiAgZ2V0IGRlbm9taW5hdG9yKCkgewogICAgc3dpdGNoICh0aGlzLm51bWJlcikgewogICAgICBjYXNlICJcXGJyZXZlIjoKICAgICAgICByZXR1cm4gMC41OwogICAgICBjYXNlICJcXGxvbmdhIjoKICAgICAgICByZXR1cm4gMC4yNTsKICAgIH0KICAgIHJldHVybiBOdW1iZXIodGhpcy5udW1iZXIpOwogIH0KICBnZXQgZGl2aXNpb24oKSB7CiAgICByZXR1cm4gTWF0aC5sb2cyKHRoaXMuZGVub21pbmF0b3IpOwogIH0KICAvLyBob3cgbWFueSBzbWFsbGVzdCByaHl0aG0gdW5pdCBpbiBhIHdob2xlIG5vdGUKICBnZXQgc3ViZGl2aWRlcigpIHsKICAgIHJldHVybiB0aGlzLmRlbm9taW5hdG9yICogMiAqKiB0aGlzLmRvdHM7CiAgfQogIGdldCBtYWduaXR1ZGUoKSB7CiAgICBsZXQgdmFsdWUgPSBXSE9MRV9EVVJBVElPTl9NQUdOSVRVREUgLyB0aGlzLmRlbm9taW5hdG9yOwogICAgaWYgKHRoaXMuZG90cykgdmFsdWUgKj0gMiAtIDAuNSAqKiB0aGlzLmRvdHM7CiAgICBpZiAodGhpcy5tdWx0aXBsaWVycykgdGhpcy5tdWx0aXBsaWVycy5mb3JFYWNoKG11bHRpcGxpZXIgPT4gdmFsdWUgKj0gZXZhbChtdWx0aXBsaWVyKSk7CiAgICByZXR1cm4gdmFsdWU7CiAgfQp9CjsKOwpleHBvcnQgY2xhc3MgQnJpZWZDaG9yZCBleHRlbmRzIEJhc2VUZXJtIHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICBzdXBlcihkYXRhKTsKICAgIGlmICh0aGlzLmJvZHkpIHRoaXMuYm9keS5kdXJhdGlvbiA9IHBhcnNlUmF3KHRoaXMuYm9keS5kdXJhdGlvbik7CiAgfQogIHNlcmlhbGl6ZSgpIHsKICAgIGNvbnN0IHsKICAgICAgcGl0Y2gsCiAgICAgIGR1cmF0aW9uLAogICAgICBzZXBhcmF0b3IsCiAgICAgIGl0ZW1zCiAgICB9ID0gdGhpcy5ib2R5OwogICAgcmV0dXJuIFsuLi5jb21wYWN0KGNjKFtwaXRjaCwgZHVyYXRpb24sIHNlcGFyYXRvciwgLi4uKGl0ZW1zIHx8IFtdKV0ubWFwKEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKSkpLCAuLi5jYygodGhpcy5wb3N0X2V2ZW50cyB8fCBbXSkubWFwKEJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKSldOwogIH0KICBnZXQgaXNNdXNpYygpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXQgZHVyYXRpb25NYWduaXR1ZGUoKSB7CiAgICBpZiAodGhpcy5ib2R5LmR1cmF0aW9uKSByZXR1cm4gdGhpcy5ib2R5LmR1cmF0aW9uLm1hZ25pdHVkZTsKICAgIHJldHVybiAwOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBOdW1iZXJVbml0IGV4dGVuZHMgQmFzZVRlcm0gewogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBbdGhpcy5udW1iZXIsICJcYiIsIHRoaXMudW5pdF07CiAgfQogIHNldCh7CiAgICBudW1iZXIsCiAgICB1bml0CiAgfSkgewogICAgdGhpcy5udW1iZXIgPSBOdW1iZXIobnVtYmVyLnRvRml4ZWQoMikpOwogICAgaWYgKHVuaXQgIT09IHVuZGVmaW5lZCkgdGhpcy51bml0ID0gdW5pdDsKICB9Cn0KZXhwb3J0IGNsYXNzIFRlbXBvIGV4dGVuZHMgQmFzZVRlcm0gewogIHN0YXRpYyBmcm9tTm90ZUJwbShub3RlLCBicG0pIHsKICAgIHJldHVybiBuZXcgVGVtcG8oewogICAgICB1bml0OiBuZXcgRHVyYXRpb24oewogICAgICAgIG51bWJlcjogbm90ZS50b1N0cmluZygpLAogICAgICAgIGRvdHM6IDAKICAgICAgfSksCiAgICAgIGJlYXRzUGVyTWludXRlOiBicG0KICAgIH0pOwogIH0KICBzZXJpYWxpemUoKSB7CiAgICBjb25zdCBhc3NpZ25tZW50ID0gTnVtYmVyLmlzRmluaXRlKHRoaXMuYmVhdHNQZXJNaW51dGUpID8gWy4uLkJhc2VUZXJtLm9wdGlvbmFsU2VyaWFsaXplKHRoaXMudW5pdCksICI9IiwgdGhpcy5iZWF0c1Blck1pbnV0ZV0gOiBbXTsKICAgIHJldHVybiBbIlxcdGVtcG8iLCAuLi5CYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZSh0aGlzLnRleHQpLCAuLi5hc3NpZ25tZW50XTsKICB9Cn0KY29uc3QgRElSRUNUSU9OX0NIQVIgPSB7CiAgdXA6ICJeIiwKICBkb3duOiAiXyIsCiAgbWlkZGxlOiAiLSIKfTsKZXhwb3J0IGNsYXNzIFBvc3RFdmVudCBleHRlbmRzIEJhc2VUZXJtIHsKICBzZXJpYWxpemUoKSB7CiAgICBjb25zdCBkaXIgPSBESVJFQ1RJT05fQ0hBUlt0aGlzLmRpcmVjdGlvbl07CiAgICBjb25zdCBwcmVmaXggPSBkaXIgPyBbZGlyLCAiXGIiXSA6IFtdOwogICAgcmV0dXJuIHByZWZpeC5jb25jYXQoQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUodGhpcy5hcmcpKTsKICB9CiAgZ2V0IGVudHJpZXMoKSB7CiAgICBpZiAodGhpcy5hcmcgaW5zdGFuY2VvZiBCYXNlVGVybSkgcmV0dXJuIFt0aGlzLmFyZ107CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0IGlzVHlpbmcoKSB7CiAgICByZXR1cm4gdGhpcy5hcmcgPT09ICJ+IjsKICB9CiAgZ2V0IGlzU3RhY2NhdG8oKSB7CiAgICBpZiAodGhpcy5hcmcgaW5zdGFuY2VvZiBDb21tYW5kKSByZXR1cm4gWyJzdGFjY2F0byIsICJzdGFjY2F0aXNzaW1vIiwgInBvcnRhdG8iXS5pbmNsdWRlcyh0aGlzLmFyZy5jbWQpOwogICAgaWYgKFsiLiIsICIhIl0uaW5jbHVkZXModGhpcy5hcmcpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgRmluZ2VyaW5nIGV4dGVuZHMgQmFzZVRlcm0gewogIHNlcmlhbGl6ZSgpIHsKICAgIHJldHVybiBbdGhpcy52YWx1ZV07CiAgfQp9CjsKZXhwb3J0IGNsYXNzIE1hcmt1cCBleHRlbmRzIEJhc2VUZXJtIHsKICBzZXJpYWxpemUoKSB7CiAgICByZXR1cm4gWy4uLmNjKHRoaXMuaGVhZC5tYXAoQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUpKSwgLi4uQmFzZVRlcm0ub3B0aW9uYWxTZXJpYWxpemUodGhpcy5ib2R5KV07CiAgfQp9CjsKZXhwb3J0IGNsYXNzIEx5cmljIGV4dGVuZHMgTXVzaWNFdmVudCB7CiAgc2VyaWFsaXplKCkgewogICAgcmV0dXJuIFsuLi5CYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZSh0aGlzLmNvbnRlbnQpLCAuLi5CYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZSh0aGlzLmR1cmF0aW9uKSwgLi4uY2MoKHRoaXMucG9zdF9ldmVudHMgfHwgW10pLm1hcChCYXNlVGVybS5vcHRpb25hbFNlcmlhbGl6ZSkpXTsKICB9Cn0KOwpleHBvcnQgY2xhc3MgQ29tbWVudCBleHRlbmRzIEJhc2VUZXJtIHsKICBzZXJpYWxpemUoKSB7CiAgICByZXR1cm4gW3RoaXMudGV4dCwgIlxuIl07CiAgfQogIHN0YXRpYyBjcmVhdGVTaW5nbGUodGV4dCkgewogICAgcmV0dXJuIG5ldyBDb21tZW50KHsKICAgICAgdGV4dDogIiUiICsgdGV4dAogICAgfSk7CiAgfQogIHN0YXRpYyBjcmVhdGVTY29wZWQodGV4dCkgewogICAgY29uc29sZS5hc3NlcnQoIS8lXH0vLnRlc3QodGV4dCksICJpbnZhbGlkIHNjb3BlZCBjb21tZW50IHRleHQ6IiwgdGV4dCk7CiAgICByZXR1cm4gbmV3IENvbW1lbnQoewogICAgICB0ZXh0OiBgJXske3RleHR9JX1gLAogICAgICBzY29wZWQ6IHRydWUKICAgIH0pOwogIH0KfQo7CmV4cG9ydCBjbGFzcyBVbmV4cGVjdCBleHRlbmRzIEJhc2VUZXJtIHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICBzdXBlcihkYXRhKTsKICAgIGNvbnNvbGUud2FybigidW5leHBlY3RlZCB0ZXJtIiwgZGF0YSk7CiAgfQp9CjsKZXhwb3J0IGNvbnN0IHRlcm1EaWN0aW9uYXJ5ID0gewogIFJvb3QsCiAgTGl0ZXJhbFN0cmluZywKICBDb21tYW5kLAogIFZhcmlhYmxlLAogIE1hcmt1cENvbW1hbmQsCiAgUmVwZWF0LAogIFJlbGF0aXZlLAogIFBhcmFsbGVsTXVzaWMsCiAgVGltZVNpZ25hdHVyZSwKICBQYXJ0aWFsLAogIFRpbWVzLAogIFR1cGxldCwKICBHcmFjZSwKICBBZnRlckdyYWNlLAogIENsZWYsCiAgS2V5U2lnbmF0dXJlLAogIE9jdGF2ZVNoaWZ0LAogIEluY2x1ZGUsCiAgVmVyc2lvbiwKICBMYW5ndWFnZSwKICBMeXJpY01vZGUsCiAgQ2hvcmRNb2RlLAogIFRyYW5zcG9zaXRpb24sCiAgU3RlbURpcmVjdGlvbiwKICBDaGFuZ2UsCiAgQmxvY2ssCiAgSW5saW5lQmxvY2ssCiAgU2NoZW1lLAogIFNjaGVtZUZ1bmN0aW9uLAogIFNjaGVtZVBhaXIsCiAgU2NoZW1lUG9pbnRlciwKICBTY2hlbWVFbWJlZCwKICBBc3NpZ25tZW50LAogIER1cmF0aW9uLAogIENob3JkRWxlbWVudCwKICBDaG9yZCwKICBSZXN0LAogIEJyaWVmQ2hvcmQsCiAgTnVtYmVyVW5pdCwKICBNdXNpY0Jsb2NrLAogIFNpbXVsdGFuZW91c0xpc3QsCiAgQ29udGV4dGVkTXVzaWMsCiAgRGl2aWRlLAogIFRlbXBvLAogIFBvc3RFdmVudCwKICBGaW5nZXJpbmcsCiAgTWFya3VwLAogIEx5cmljLAogIFByaW1pdGl2ZSwKICBDb21tZW50Cn07CmNvbnN0IHRlcm1Qcm90b01hcCA9IE9iamVjdC5lbnRyaWVzKHRlcm1EaWN0aW9uYXJ5KS5yZWR1Y2UoKG1hcCwgW25hbWUsIGNsc10pID0+IChtYXAuc2V0KGNscy5wcm90b3R5cGUsIG5hbWUpLCBtYXApLCBuZXcgTWFwKCkpOwpjb25zdCBwYXJzZVJhd0VuZm9yY2UgPSBkYXRhID0+IHsKICBzd2l0Y2ggKHR5cGVvZiBkYXRhKSB7CiAgICBjYXNlICJzdHJpbmciOgogICAgY2FzZSAibnVtYmVyIjoKICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUoewogICAgICAgIGV4cDogZGF0YQogICAgICB9KTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBwYXJzZVJhdyhkYXRhKTsKICB9Cn07CmV4cG9ydCBjb25zdCBwYXJzZVJhdyA9IGRhdGEgPT4gewogIGlmIChkYXRhIGluc3RhbmNlb2YgQmFzZVRlcm0pIHJldHVybiBkYXRhOwogIGlmICghZGF0YSkgcmV0dXJuIGRhdGE7CiAgc3dpdGNoICh0eXBlb2YgZGF0YSkgewogICAgY2FzZSAib2JqZWN0IjoKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBkYXRhLm1hcChpdGVtID0+IHBhcnNlUmF3KGl0ZW0pKTsKICAgICAgY29uc3QgewogICAgICAgIHByb3RvLAogICAgICAgIC4uLmZpZWxkcwogICAgICB9ID0gZGF0YTsKICAgICAgaWYgKHByb3RvKSB7CiAgICAgICAgaWYgKHByb3RvID09PSAiX1BMQUlOIikgcmV0dXJuIGZpZWxkczsKICAgICAgICBjb25zdCB0ZXJtQ2xhc3MgPSB0ZXJtRGljdGlvbmFyeVtwcm90b107CiAgICAgICAgaWYgKCF0ZXJtQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0ZXJtIGNsYXNzOiAke2RhdGEucHJvdG99YCk7CiAgICAgICAgcmV0dXJuIG5ldyB0ZXJtQ2xhc3MoZmllbGRzKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFVuZXhwZWN0KGRhdGEpOwogIH0KICByZXR1cm4gZGF0YTsKfTs="},{"version":3,"names":["WHOLE_DURATION_MAGNITUDE","FractionNumber","lcmMulti","gcd","MAIN_SCORE_NAME","idioms","LILYPOND_VERSION","measureLayout","ImplicitType","pick","Locator","constructor","term","_location","lines","columns","location","OpenLocator","set","line","column","CloseLocator","cc","arrays","concat","MusicChunk","parent","terms","join","chunks","map","chunk","i","length","Divide","push","size","durationMagnitude","reduce","magnitude","isNullItem","item","undefined","Array","isArray","compact","items","index","getDurationSubdivider","MusicEvent","Rest","isSpacer","durationValue","subdivider","MusicBlock","body","Times","Tuplet","divider","factor","reciprocal","numerator","music","reduced","Repeat","bodyBlock","Relative","isMusic","console","warn","constructMusicFromMeasureLayout","layout","joinMeasureSeq","seq","sublayout","SingleMLayout","get","measure","assert","BlockMLayout","VoltaMLayout","bodyTerms","alternative","alternates","alternate","repeat","createVolta","times","toString","ABAMLayout","mainList","main","restTerms","rest","block","Variable","name","BaseTerm","data","key","parseRaw","serialize","words","filter","word","includes","indent","result","pop","char","test","fill","relocate","source","replace","chars","split","wordIndex","Error","clone","JSON","parse","stringify","entries","musicChunks","entry","measures","indices","_measure","Number","isInteger","from","Set","proto","termProtoMap","Object","getPrototypeOf","href","getField","query","appendAssignment","value","assign","findFirst","condition","isPrototypeOf","termClass","findLast","reversedEntries","reverse","findAll","forEachTerm","handle","forEachTopTerm","toJSON","fields","keys","forEach","isTerm","x","optionalSerialize","_headComment","_tailComment","serializeScheme","Root","sections","section","getBlock","head","find","includeFiles","Include","include","filename","priorityForSection","Version","Language","Scheme","Assignment","Block","Infinity","reorderSections","sort","s1","s2","Primitive","exp","LiteralString","fromString","content","eval","err","Command","args","_parent","createSet","cmd","arg","some","isRepeatWithAlternative","Grace","getAssignmentPair","queryValue","dict","field","MarkupCommand","strs","type","alternativeBlocks","completeAlternativeBlocks","slice","list","sumDuration","Duration","fromMagnitude","events","m","event","singleTremolo","getUnfoldTerms","getPlainTerms","getTailPassTerms","makeBlock","anchor","chord","Chord","anchorPitch","ChordElement","headChord","tailPitch","tail","absolutePitch","shiftBody","newAnchor","shiftAnchor","_anchorPitch","ParallelMusic","varNames","asList","voices","voiceNames","measureCount","Math","ceil","_","Boolean","TimeSignature","fromExpression","Partial","duration","AfterGrace","grace","fromSeq","Clef","clefName","KeySignature","keyPitch","pitch","options","minor","phonetOrder","FIFTH_PHONETS","indexOf","phonet","alterValue","OctaveShift","create","default","version","make","language","LyricMode","ChordMode","Transposition","transposition","pitchValue","StemDirection","direction","substr","Change","parseRawEnforce","heads","isMIDIDedicated","subBlocks","assignmentDict","assignments","assignment","InlineBlock","fromTerms","clarifyHead","prototype","call","currentChunk","dumpChunk","header","SchemePointer","SchemeFunction","isRelative","subterms","subIndices","min","max","notes","isRest","sonicNotes","note","completeTied","noteTicks","ticks","_tick","t1","t2","measureTicks","tickTable","isFinite","tick","_functional","trimSeq","measureChunkMap","Map","clearPitchCache","_absolutePitch","updateChordAnchors","updateChordChains","previous","_previous","spreadRepeatBlocks","ignoreRepeat","keepTailPass","unfoldDurationMultipliers","timeDenominator","unfoldMultipliers","denominator","multipliers","multiplier","restCount","rests","floor","number","dots","expandVariables","clonedValue","redivide","recursive","measureHeads","nextHead","endTick","post_events","startTick","nextMeasure","_lastMeasure","sum","isPostTerm","PostEvent","newMeasures","has","comment","Comment","createSingle","add","firstEventIndex","firstEvent","clarified","splice","absoluteToRelative","newBody","newPitch","makeRelativeTo","SimultaneousList","removeStaffGroup","track","ContextedMusic","lyrics","withClause","contextDict","withEntries","pair","func","SchemePair","left","right","SchemeEmbed","values","getPreviousT","T","division","withMultiplier","isTying","isStaccato","beamOn","beamOff","implicitType","Trill","Turn","Mordent","Prall","Arpeggio","None","clarifiedChord","connectPitches","basePitch","pitchElements","single","pitches","innerPitches","withAngle","exclamations","questions","postfix","pitchNames","elem","_tied","pitchesValue","base","shift","phonetDifferToShift","phonetStep","relativeOctave","absoluteOctave","octave","alters","log","octaveString","abs","positive","match","negative","ph","PHONETS_ALIAS","PHONETS","captures","alteredPhonet","getAbsolutePitch","phonetDiffer","ALTER_VALUES","phonetValue","PHONET_VALUES","absolutePitchValue","notePosition","absoluteNotePosition","tiedParent","p","_default","MULTI","MULTI_DURATION_MAGNITUDE","multiMag","di","log2","BriefChord","separator","NumberUnit","unit","toFixed","Tempo","fromNoteBpm","bpm","beatsPerMinute","text","DIRECTION_CHAR","up","down","middle","dir","prefix","Fingering","Markup","Lyric","createScoped","scoped","Unexpect","termDictionary","cls"],"sources":["/home/camus/work/lotus/node_modules/eslint-loader/index.js??ref--14-0!/home/camus/work/lotus/inc/lilyParser/lilyTerms.ts"],"sourcesContent":["\nimport {WHOLE_DURATION_MAGNITUDE, FractionNumber, lcmMulti, gcd, MAIN_SCORE_NAME} from \"./utils\";\nimport * as idioms from \"./idioms\";\nimport {LILYPOND_VERSION} from \"../constants\";\nimport * as measureLayout from \"../measureLayout\";\nimport ImplicitType from \"../lilyNotation/implicitType\";\nimport pick from \"../pick\";\n\n\n\ninterface Location {\n\tlines: [number, number];\n\tcolumns: [number, number];\n};\n\n\nabstract class Locator {\n\tlocation: Location;\n\n\n\tconstructor (term: BaseTerm) {\n\t\tterm._location = term._location || {lines: [0, 0], columns: [0, 0]};\n\t\tthis.location = term._location;\n\t}\n\n\tabstract set (line: number, column: number): void;\n};\n\n\nclass OpenLocator extends Locator {\n\tset (line: number, column: number) {\n\t\tthis.location.lines[0] = line;\n\t\tthis.location.columns[0] = column;\n\t}\n};\n\n\nclass CloseLocator extends Locator {\n\tset (line: number, column: number) {\n\t\tthis.location.lines[1] = line;\n\t\tthis.location.columns[1] = column;\n\t}\n};\n\n\n// concat array of array\nconst cc = <T>(arrays: T[][]): T[] => [].concat(...arrays);\n\n\nexport class MusicChunk {\n\tparent: MusicBlock;\n\tterms: BaseTerm[];\n\n\n\tstatic join (chunks: MusicChunk[]): BaseTerm[] {\n\t\treturn cc(chunks.map((chunk, i) => i === chunks.length - 1 ? chunk.terms : [...chunk.terms, new Divide({})]));\n\t}\n\n\n\tconstructor (parent: MusicBlock, terms: BaseTerm[] = []) {\n\t\tthis.parent = parent;\n\t\tthis.terms = terms;\n\t}\n\n\n\tpush (term: BaseTerm) {\n\t\tthis.terms.push(term);\n\t}\n\n\n\tget size () {\n\t\treturn this.terms.length;\n\t}\n\n\n\tget durationMagnitude () {\n\t\treturn this.terms.reduce((magnitude, term) => magnitude + term.durationMagnitude, 0);\n\t}\n};\n\n\ninterface MusicVoice {\n\tname?: string;\n\tbody: MusicChunk[];\n};\n\n\ntype MusicChunkMap = Map<number, MusicChunk>;\n\n\nconst isNullItem = item => item === \"\" || item === undefined || item === null || (Array.isArray(item) && !item.length);\nconst compact = items => cc(items.map((item, index) => isNullItem(item) ? [] : [index > 0 ? \"\\b\" : null, item]));\n\n\nexport const getDurationSubdivider = (term: BaseTerm): number => {\n\tif (term instanceof MusicEvent) {\n\t\tif (!(term instanceof Rest) || !term.isSpacer)\n\t\t\treturn term.durationValue.subdivider;\n\t}\n\telse if (term instanceof MusicBlock)\n\t\treturn lcmMulti(...term.body.map(getDurationSubdivider));\n\telse if (term instanceof MusicChunk)\n\t\treturn lcmMulti(...term.terms.map(getDurationSubdivider));\n\telse if ((term instanceof Times) || (term instanceof Tuplet)) {\n\t\tconst divider = term instanceof Tuplet ? term.divider : term.factor.reciprocal;\n\t\tdivider.numerator *= getDurationSubdivider(term.music);\n\n\t\treturn divider.reduced.numerator;\n\t}\n\telse if (term instanceof Repeat)\n\t\treturn getDurationSubdivider(term.bodyBlock);\n\telse if (term instanceof Relative)\n\t\treturn getDurationSubdivider(term.music);\n\telse if (term.isMusic)\n\t\tconsole.warn(\"[getDurationSubdivider]\tunexpected music term:\", term);\n\n\treturn 1;\n};\n\n\nexport const constructMusicFromMeasureLayout = (layout: measureLayout.MeasureLayout, chunks: MusicChunkMap): MusicChunk => {\n\tconst joinMeasureSeq = (seq: measureLayout.MeasureSeq): BaseTerm[] => MusicChunk.join(seq.map(sublayout => constructMusicFromMeasureLayout(sublayout, chunks)));\n\n\tif (layout instanceof measureLayout.SingleMLayout) {\n\t\tconst chunk = chunks.get(layout.measure);\n\t\tconsole.assert(!!chunk, \"no chunk for measure:\", layout.measure);\n\n\t\treturn chunk;\n\t}\n\telse if (layout instanceof measureLayout.BlockMLayout) {\n\t\tconst terms = joinMeasureSeq(layout.seq);\n\n\t\treturn new MusicChunk(null, terms);\n\t}\n\telse if (layout instanceof measureLayout.VoltaMLayout) {\n\t\tconst bodyTerms = joinMeasureSeq(layout.body);\n\t\tconst alternative = layout.alternates && layout.alternates.map(alternate => new MusicBlock({body: joinMeasureSeq(alternate)}));\n\n\t\tconst repeat = Repeat.createVolta(layout.times.toString(), new MusicBlock({body: bodyTerms}), alternative);\n\n\t\treturn new MusicChunk(null, [repeat]);\n\t}\n\telse if (layout instanceof measureLayout.ABAMLayout) {\n\t\tconst mainList = constructMusicFromMeasureLayout(layout.main, chunks);\n\t\tconst main = mainList.terms.length === 1 ? mainList.terms[0] : new MusicBlock({body: mainList.terms});\n\t\tconst restTerms = joinMeasureSeq(layout.rest);\n\n\t\tconst block = new MusicBlock({body: [main, ...restTerms]});\n\n\t\treturn new MusicChunk(null, [new Variable({name: \"lotusRepeatABA\"}), block]);\n\t}\n};\n\n\nexport class BaseTerm {\n\t_location?: Location;\n\t_measure?: number;\n\t_tick?: number;\n\t_previous?: BaseTerm;\n\t_anchorPitch?: ChordElement;\n\t_parent?: BaseTerm;\n\n\t_headComment: Comment;\n\t_tailComment: Comment;\n\n\t// lotus extensional function modifier\n\t_functional: string;\n\n\n\tconstructor (data: object) {\n\t\t//Object.assign(this, data);\n\t\tfor (const key in data) \n\t\t\tthis[key] = parseRaw(data[key]);\n\t}\n\n\n\tserialize (): any[] {\n\t\tconsole.warn(\"unimplemented serilization:\", this);\n\t\treturn [];\n\t}\n\n\n\tjoin (): string {\n\t\tlet words = this.serialize().filter(word => [\"string\", \"number\"].includes(typeof word)).map(word => word.toString()) as string[];\n\t\twords = words.filter((word, i) => !(i && words[i - 1] === \"\\n\" && word === \"\\n\"));\n\n\t\tlet indent = 0;\n\t\tconst result: string[] = [];\n\n\t\tconst pop = char => {\n\t\t\tif (!char || result[result.length - 1] === char) {\n\t\t\t\tresult.pop();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\n\t\tfor (const word of words) {\n\t\t\tswitch (word) {\n\t\t\tcase \"\\b\":\n\t\t\t\t// remove last space\n\t\t\t\tpop(\" \");\n\t\t\t\tcontinue;\n\n\t\t\tcase \"\\b\\n\":\n\t\t\t\t// remove last newline\n\t\t\t\twhile (pop(\"\\t\")) {}\n\t\t\t\tpop(\"\\n\");\n\t\t\t\tcontinue;\n\n\t\t\tcase \"\\n\":\n\t\t\t\t// no space at line tail\n\t\t\t\tpop(\" \");\n\t\t\t}\n\n\t\t\tif (/^(\\}|>>)/.test(word))\n\t\t\t\tpop(\"\\t\"); // remove the last tab\n\n\t\t\tresult.push(word);\n\n\t\t\tif (/\\n$/.test(word)) {\n\t\t\t\tif (/(\\{|<<)\\n$/.test(word))\n\t\t\t\t\t++indent;\n\t\t\t\telse if (/^(\\}|>>)/.test(word)) \n\t\t\t\t\t--indent;\n\n\t\t\t\tif (indent)\n\t\t\t\t\tresult.push(...Array(indent).fill(\"\\t\"));\n\t\t\t}\n\t\t\telse\n\t\t\t\tresult.push(\" \");\n\t\t}\n\n\t\treturn result.join(\"\");\n\t}\n\n\n\trelocate (source: string = this.join()) {\n\t\tconst words = this.serialize()\n\t\t\t.filter(word => word !== null && word !== undefined\n\t\t\t\t&& (typeof word !== \"string\" || (/\\S/.test(word) && !word.includes(\"\\b\"))))\n\t\t\t.map(word => typeof word === \"string\" ? word.replace(/\\n/g, \"\") : word);\n\n\t\tconst chars = source.split(\"\");\n\t\tlet line = 1;\n\t\tlet column = 0;\n\n\t\tlet wordIndex = 0;\n\n\t\tfor (let i = 0; i < chars.length; ++i) {\n\t\t\tif (wordIndex >= words.length)\n\t\t\t\tbreak;\n\n\t\t\tconst char = chars[i];\n\n\t\t\tswitch (char) {\n\t\t\tcase \"\\n\":\n\t\t\t\t++line;\n\t\t\t\tcolumn = 0;\n\n\t\t\t\tbreak;\n\t\t\tcase \" \":\n\t\t\tcase \"\\t\":\n\t\t\t\t++column;\n\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlet word = words[wordIndex];\n\t\t\t\twhile (word instanceof Locator) {\n\t\t\t\t\tword.set(line, column);\n\n\t\t\t\t\t++wordIndex;\n\t\t\t\t\tword = words[wordIndex];\n\t\t\t\t}\n\n\t\t\t\tif (wordIndex >= words.length)\n\t\t\t\t\tbreak;\n\n\t\t\t\tword = word.toString();\n\t\t\t\tif (char === word[0]) {\n\t\t\t\t\ti += word.length - 1;\n\t\t\t\t\tcolumn += word.length;\n\t\t\t\t\t++wordIndex;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t//debugger;\n\t\t\t\t\tthrow new Error(`unexpected char in source: [${i}]'${char}', expect: ${word}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tclone (): this {\n\t\treturn parseRaw(JSON.parse(JSON.stringify(this)));\n\t}\n\n\n\tget entries (): BaseTerm[] {\n\t\treturn null;\n\t}\n\n\n\tget isMusic (): boolean {\n\t\treturn false;\n\t}\n\n\n\tget musicChunks (): MusicChunk[] {\n\t\tif (!this.isMusic || !this.entries)\n\t\t\treturn [];\n\n\t\treturn [].concat(...this.entries.map(entry => entry.musicChunks));\n\t}\n\n\n\tget measures (): number[] {\n\t\tconst indices = [this._measure].concat(...(this.entries || []).map(entry => entry.measures)).filter(index => Number.isInteger(index));\n\n\t\treturn Array.from(new Set(indices));\n\t}\n\n\n\tget durationMagnitude (): number {\n\t\treturn 0;\n\t}\n\n\n\tget proto () {\n\t\treturn termProtoMap.get(Object.getPrototypeOf(this));\n\t}\n\n\n\tget href (): string {\n\t\tif (this._location)\n\t\t\treturn `${this._location.lines[0]}:${this._location.columns[0]}:${this._location.columns[1]}`;\n\n\t\treturn null;\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\treturn null;\n\t}\n\n\n\tgetField (key): any {\n\t\tconsole.assert(!!this.entries, \"[BaseTerm.getField] term's entries is null:\", this);\n\n\t\tfor (const entry of this.entries) {\n\t\t\tconst result = entry.query(key);\n\t\t\tif (result)\n\t\t\t\treturn result;\n\t\t}\n\t}\n\n\n\tquery (key: string): any {\n\t\tvoid(key);\n\t\t//console.warn(\"term.query not implemented:\", this);\n\t}\n\n\n\tappendAssignment (key, value) {\n\t\tconsole.assert(!!this.entries, \"no entries on this term.\");\n\n\t\tconst assign = this.getField(key);\n\t\tif (assign)\n\t\t\tassign.value = value;\n\t\telse {\n\t\t\tthis.entries.push(parseRaw({\n\t\t\t\tproto: \"Assignment\",\n\t\t\t\tkey,\n\t\t\t\tvalue: value,\n\t\t\t}));\n\t\t}\n\t}\n\n\n\tfindFirst (condition: Function): BaseTerm {\n\t\tif (!this.entries)\n\t\t\treturn null;\n\n\t\tif (BaseTerm.isPrototypeOf(condition)) {\n\t\t\tconst termClass = condition;\n\t\t\tcondition = term => term instanceof termClass;\n\t\t}\n\t\n\t\tfor (const entry of this.entries) {\n\t\t\tif (condition(entry))\n\t\t\t\treturn entry;\n\t\n\t\t\tif (entry instanceof BaseTerm) {\n\t\t\t\tconst result = entry.findFirst(condition);\n\t\t\t\tif (result)\n\t\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tfindLast (condition: any): BaseTerm {\n\t\tif (!this.entries)\n\t\t\treturn null;\n\n\t\tif (BaseTerm.isPrototypeOf(condition)) {\n\t\t\tconst termClass = condition;\n\t\t\tcondition = term => term instanceof termClass;\n\t\t}\n\t\n\t\tconst reversedEntries = [...this.entries];\n\t\treversedEntries.reverse();\n\n\t\tfor (const entry of reversedEntries) {\n\t\t\tif (condition(entry))\n\t\t\t\treturn entry;\n\t\n\t\t\tif (entry instanceof BaseTerm) {\n\t\t\t\tconst result = entry.findLast(condition);\n\t\t\t\tif (result)\n\t\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\n\n\tfindAll (condition: any): any[] {\n\t\tif (!this.entries)\n\t\t\treturn [];\n\n\t\tif (BaseTerm.isPrototypeOf(condition)) {\n\t\t\tconst termClass = condition;\n\t\t\tcondition = term => term instanceof termClass;\n\t\t}\n\n\t\tconst result = [];\n\n\t\tfor (const entry of this.entries) {\n\t\t\tif (condition(entry))\n\t\t\t\tresult.push(entry);\n\t\n\t\t\tif (entry instanceof BaseTerm)\n\t\t\t\tresult.push(...entry.findAll(condition));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\n\tforEachTerm (termClass, handle) {\n\t\tif (!this.entries)\n\t\t\treturn;\n\n\t\tfor (const entry of this.entries) {\n\t\t\tif (entry instanceof termClass)\n\t\t\t\thandle(entry);\n\n\t\t\tif (entry instanceof BaseTerm)\n\t\t\t\tentry.forEachTerm(termClass, handle);\n\t\t}\n\t}\n\n\n\tforEachTopTerm (termClass, handle) {\n\t\tif (!this.entries)\n\t\t\treturn;\n\n\t\tfor (const entry of this.entries) {\n\t\t\tif (entry instanceof termClass)\n\t\t\t\thandle(entry);\n\t\t\telse if (entry instanceof BaseTerm)\n\t\t\t\tentry.forEachTopTerm(termClass, handle);\n\t\t}\n\t}\n\n\n\ttoJSON () {\n\t\t// exlude meta fields in JSON\n\t\tconst fields = Object.keys(this).filter(key => !/^_/.test(key));\n\t\tconst data = pick(this, fields);\n\n\t\tObject.entries(data).forEach(([key, value]) => {\n\t\t\tif (value && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof BaseTerm))\n\t\t\t\tdata[key] = {proto: \"_PLAIN\", ...value};\n\t\t});\n\n\t\treturn {\n\t\t\tproto: this.proto,\n\t\t\t...data,\n\t\t};\n\t}\n\n\n\tstatic isTerm (x): boolean {\n\t\treturn typeof x === \"object\" && x instanceof BaseTerm;\n\t}\n\n\n\tstatic optionalSerialize (item: any): any[] {\n\t\t//return BaseTerm.isTerm(item) ? (item as BaseTerm).serialize() : (item === undefined ? [] : [item]);\n\t\tif (!BaseTerm.isTerm(item))\n\t\t\treturn item === undefined ? [] : [item];\n\n\t\treturn [\n\t\t\t...BaseTerm.optionalSerialize(item._headComment),\n\t\t\t...item.serialize(),\n\t\t\t...(item._tailComment ? [\"\\b\\n\", \"\\t\"] : []),\n\t\t\t...BaseTerm.optionalSerialize(item._tailComment),\n\t\t];\n\t}\n\n\n\tstatic serializeScheme (item: any): any[] {\n\t\tif (typeof item === \"boolean\")\n\t\t\titem = item ? \"#t\" : \"#f\";\n\n\t\treturn BaseTerm.optionalSerialize(item);\n\t}\n}\n\n\nexport class Root extends BaseTerm {\n\tsections: BaseTerm[];\n\n\n\tserialize () {\n\t\treturn cc(this.sections.map(section => [...BaseTerm.optionalSerialize(section), \"\\n\\n\"]));\n\t}\n\n\n\tget entries (): BaseTerm[] {\n\t\treturn this.sections;\n\t}\n\n\n\tgetBlock (head): Block {\n\t\treturn this.entries.find((entry: any) => entry.head === head || (entry.head === \"\\\\\" + head)) as Block;\n\t}\n\n\n\tget includeFiles (): string[] {\n\t\treturn this.sections.filter(section => section instanceof Include).map((include: Include) => include.filename);\n\t}\n\n\n\tstatic priorityForSection (term: BaseTerm): number {\n\t\tif (term instanceof Version)\n\t\t\treturn 0;\n\n\t\tif (term instanceof Language)\n\t\t\treturn 1;\n\n\t\tif (term instanceof Scheme)\n\t\t\treturn 3;\n\n\t\tif (term instanceof Assignment)\n\t\t\treturn 7;\n\n\t\tif (term instanceof Block) {\n\t\t\tswitch (term.head) {\n\t\t\tcase \"\\\\header\":\n\t\t\t\treturn 2;\n\n\t\t\tcase \"\\\\paper\":\n\t\t\t\treturn 4;\n\n\t\t\tcase \"\\\\layout\":\n\t\t\t\treturn 5;\n\n\t\t\tcase \"\\\\score\":\n\t\t\t\treturn 10;\n\t\t\t}\n\t\t}\n\n\t\treturn Infinity;\n\t}\n\n\n\treorderSections () {\n\t\tthis.sections.sort((s1, s2) => Root.priorityForSection(s1) - Root.priorityForSection(s2));\n\t}\n};\n\n\nexport class Primitive extends BaseTerm {\n\texp: string | number;\n\n\n\tserialize () {\n\t\treturn [this.exp];\n\t}\n};\n\n\nexport class LiteralString extends BaseTerm {\n\texp: string\n\n\n\tstatic fromString (content: string): LiteralString {\n\t\treturn new LiteralString({exp: JSON.stringify(content)});\n\t}\n\n\n\tserialize () {\n\t\treturn [this.exp];\n\t}\n\n\n\ttoString () {\n\t\ttry {\n\t\t\treturn eval(this.exp);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.warn(\"invalid lilypond string exp:\", this.exp);\n\t\t\treturn this.exp;\n\t\t}\n\t}\n};\n\n\nexport class Command extends BaseTerm {\n\tcmd: string;\n\targs: any[];\n\n\n\tstatic createSet (key: string|BaseTerm, value: BaseTerm): Command {\n\t\treturn new Command({cmd: \"set\", args: [new Assignment({key, value})]});\n\t}\n\n\n\tconstructor (data) {\n\t\tsuper(data);\n\n\t\tthis.args.forEach(term => {\n\t\t\tif (term instanceof MusicBlock || term instanceof Block)\n\t\t\t\tterm._parent = this;\n\t\t});\n\t}\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t\"\\\\\" + this.cmd,\n\t\t\t...[].concat(...this.args.map(BaseTerm.optionalSerialize)),\n\t\t\t[\"break\", \"pageBreak\", \"overrideProperty\"].includes(this.cmd) ? \"\\n\" : null,\n\t\t];\n\t}\n\n\n\tget entries () {\n\t\treturn this.args.filter(arg => arg instanceof BaseTerm);\n\t}\n\n\n\tget isMusic (): boolean {\n\t\treturn this.args.some(arg => arg.isMusic);\n\t}\n\n\n\tget musicChunks (): MusicChunk[] {\n\t\tif (this.cmd === \"alternative\")\n\t\t\treturn [].concat(...this.args[0].body.map(term => term.musicChunks));\n\n\t\treturn [].concat(...this.entries.map(entry => entry.musicChunks));\n\t}\n\n\n\tget isRepeatWithAlternative () {\n\t\treturn this.cmd === \"repeat\"\n\t\t\t&& this.args[2] instanceof MusicBlock\n\t\t\t&& this.args[3]\n\t\t\t&& this.args[3].cmd === \"alternative\";\n\t}\n\n\n\tget durationMagnitude (): number {\n\t\tswitch (this.cmd) {\n\t\t// TODO: refine this in Times\n\t\tcase \"times\": {\n\t\t\tconst factor = eval(this.args[0]);\n\t\t\treturn this.args[1].durationMagnitude * factor;\n\t\t}\n\n\t\t// TODO: refine this in Tuplet\n\t\tcase \"tuplet\": {\n\t\t\tconst factor = 1 / eval(this.args[0]);\n\t\t\treturn this.args[this.args.length - 1].durationMagnitude * factor;\n\t\t}\n\n\t\tcase \"afterGrace\":\n\t\t\treturn this.args[0].durationMagnitude;\n\n\t\tdefault:\n\t\t\tif (this instanceof Grace)\n\t\t\t\treturn 0;\n\n\t\t\treturn this.args.filter(arg => arg instanceof BaseTerm).reduce((magnitude, term) => magnitude + term.durationMagnitude, 0);\n\t\t}\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\tconst args = [...this.args].reverse();\n\t\tfor (const arg of args) {\n\t\t\tconst layout = arg instanceof BaseTerm && arg.measureLayout;\n\t\t\tif (layout)\n\t\t\t\treturn layout;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\n\tgetAssignmentPair (): {key: any, value: any} {\n\t\tif (this.args[0] instanceof Assignment)\n\t\t\treturn {key: this.args[0].key, value: this.args[0].value};\n\n\t\tif (this.args[1] instanceof Assignment)\n\t\t\treturn {key: this.args[0], value: this.args[1].value};\n\n\t\tif (typeof this.args[0] === \"string\")\n\t\t\treturn {key: this.args[0], value: \"\"};\n\n\t\treturn null;\n\t}\n};\n\n\nexport class Variable extends Command {\n\tname: string\n\n\n\tconstructor ({name}) {\n\t\tsuper({cmd: name, args: []});\n\n\t\tthis.name = name;\n\t}\n\n\n\ttoJSON (): any {\n\t\treturn {\n\t\t\tproto: this.proto,\n\t\t\tname: this.name,\n\t\t};\n\t}\n\n\n\tqueryValue (dict: BaseTerm): any {\n\t\tconst field = dict.getField(this.name);\n\n\t\treturn field && field.value;\n\t}\n\n\n\tget isMusic (): boolean {\n\t\tif ([MAIN_SCORE_NAME].includes(this.name))\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n};\n\n\nexport class MarkupCommand extends Command {\n\ttoString () {\n\t\tconst strs = [];\n\t\tthis.forEachTerm(LiteralString, term => strs.push(term.toString()));\n\n\t\treturn strs.join(\"\\n\");\n\t}\n};\n\n\nexport class Repeat extends Command {\n\tstatic createVolta (times: string, body: MusicBlock, alternative?: MusicBlock[]): Repeat {\n\t\tconst args: any[] = [\n\t\t\t\"volta\",\n\t\t\ttimes,\n\t\t\tbody,\n\t\t];\n\n\t\tif (alternative) {\n\t\t\targs.push(new Command({\n\t\t\t\tcmd: \"alternative\",\n\t\t\t\targs: [new MusicBlock({body: alternative})],\n\t\t\t}));\n\t\t}\n\n\t\treturn new Repeat({cmd: \"repeat\", args});\n\t}\n\n\n\tget type (): string {\n\t\treturn this.args[0];\n\t}\n\n\n\tget times () {\n\t\treturn Number(this.args[1]);\n\t}\n\n\n\tget bodyBlock (): MusicBlock {\n\t\treturn this.args[2];\n\t}\n\n\n\tget alternativeBlocks (): MusicBlock[] {\n\t\treturn this.args[3] && this.args[3].args[0].body;\n\t}\n\n\n\t// this result length equal to times, if not null\n\tget completeAlternativeBlocks (): MusicBlock[] {\n\t\tif (!this.alternativeBlocks || !this.alternativeBlocks.length)\n\t\t\treturn null;\n\n\t\tif (this.alternativeBlocks.length >= this.times)\n\t\t\treturn this.alternativeBlocks.slice(0, this.times);\n\n\t\tconst list = [];\n\t\tfor (let i = 0; i < this.times - this.alternativeBlocks.length; ++ i)\n\t\t\tlist.push(this.alternativeBlocks[0]);\n\t\tlist.push(...this.alternativeBlocks);\n\n\t\treturn list;\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\tswitch (this.type) {\n\t\tcase \"volta\": {\n\t\t\tconst layout = new measureLayout.VoltaMLayout();\n\t\t\tlayout.times = this.times;\n\t\t\tlayout.body = this.bodyBlock.measureLayout.seq;\n\t\t\tlayout.alternates = this.alternativeBlocks && this.alternativeBlocks.map(block => block.measureLayout.seq);\n\n\t\t\treturn layout;\n\t\t}\n\n\t\tcase \"tremolo\":\n\t\t\treturn this.bodyBlock.measureLayout;\n\n\t\tdefault:\n\t\t\tconsole.warn(\"unsupported repeat type:\", this.type);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\n\t// for tremolo\n\tget sumDuration (): Duration {\n\t\tif (this.bodyBlock instanceof MusicEvent)\n\t\t\treturn Duration.fromMagnitude(this.args[2].durationMagnitude * this.times);\n\t\telse if (this.bodyBlock instanceof MusicBlock) {\n\t\t\tconst events = this.bodyBlock.body.filter(term => term instanceof MusicEvent);\n\t\t\tconst magnitude = events.reduce((m, event) => m + event.durationMagnitude, 0) * this.times;\n\n\t\t\treturn Duration.fromMagnitude(magnitude);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\n\tget singleTremolo (): boolean {\n\t\tif (this.type === \"tremolo\") {\n\t\t\tif (this.bodyBlock instanceof MusicEvent)\n\t\t\t\treturn true;\n\n\t\t\tif (this.bodyBlock instanceof MusicBlock) {\n\t\t\t\tconst events = this.bodyBlock.body.filter(term => term instanceof MusicEvent);\n\t\t\t\treturn events.length === 1;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\t// \\repeat {body} \\alternative {{alter1} {alter2}}\t\t=> body alter1 body alter2\n\tgetUnfoldTerms (): BaseTerm[] {\n\t\tconst completeAlternativeBlocks = this.completeAlternativeBlocks;\n\n\t\tconst list = [];\n\t\tfor (let i = 0; i < this.times; ++i) {\n\t\t\tlist.push(...this.bodyBlock.clone().body);\n\n\t\t\tif (completeAlternativeBlocks)\n\t\t\t\tlist.push(...completeAlternativeBlocks[i].clone().body);\n\t\t}\n\n\t\treturn list;\n\t}\n\n\n\t// \\repeat {body} \\alternative {{alter1} {alter2}}\t\t=> body alter1 alter2\n\tgetPlainTerms (): BaseTerm[] {\n\t\tconst list = [...this.bodyBlock.clone().body];\n\n\t\tconst alternativeBlocks = this.alternativeBlocks;\n\t\tif (alternativeBlocks)\n\t\t\talternativeBlocks.forEach(block => list.push(...block.clone().body));\n\n\t\treturn list;\n\t}\n\n\n\t// \\repeat {body} \\alternative {{alter1} {alter2}}\t\t=> body alter2\n\tgetTailPassTerms (): BaseTerm[] {\n\t\tconst list = [...this.bodyBlock.clone().body];\n\n\t\tconst alternativeBlocks = this.alternativeBlocks;\n\t\tif (alternativeBlocks)\n\t\t\tlist.push(...alternativeBlocks[alternativeBlocks.length - 1].clone().body);\n\n\t\treturn list;\n\t}\n};\n\n\nexport class Relative extends Command {\n\tstatic makeBlock (block: MusicBlock, {anchor}: {anchor?: ChordElement} = {}): Relative {\n\t\tif (!anchor) {\n\t\t\tconst chord = block.findFirst(Chord) as Chord;\n\t\t\tanchor = chord && chord.anchorPitch;\n\t\t}\n\n\t\treturn new Relative({cmd: \"relative\", args: [anchor, block].filter(term => term)});\n\t}\n\n\n\tget anchor (): ChordElement {\n\t\tif (this.args[0] instanceof ChordElement)\n\t\t\treturn this.args[0];\n\n\t\treturn null;\n\t}\n\n\n\tget music (): BaseTerm {\n\t\treturn this.args[this.args.length - 1];\n\t}\n\n\n\tget headChord (): Chord {\n\t\treturn this.findFirst(Chord) as Chord;\n\t}\n\n\n\tget tailPitch (): ChordElement {\n\t\tconst tail = this.findLast(Chord) as Chord;\n\n\t\treturn tail && tail.absolutePitch;\n\t}\n\n\n\t// with side effect\n\tshiftBody (newAnchor?: ChordElement): BaseTerm[] {\n\t\tconst headChord = this.headChord;\n\t\tif (newAnchor && headChord) {\n\t\t\theadChord.shiftAnchor(newAnchor);\n\t\t\theadChord._anchorPitch = null;\n\t\t\t//console.log(\"shiftAnchor.post:\", headChord.join(), headChord);\n\t\t}\n\n\t\tconst music = this.music;\n\t\tif (music instanceof MusicBlock) {\n\t\t\t//music.clearPitchCache();\n\t\t\treturn music.body;\n\t\t}\n\n\t\treturn [music];\n\t}\n}\n\n\nexport class ParallelMusic extends Command {\n\tget varNames (): string[] {\n\t\treturn ((this.args[0].exp as SchemePointer).value as SchemeFunction).asList as string[];\n\t}\n\n\n\tget body (): MusicBlock {\n\t\treturn this.args[1];\n\t}\n\n\n\tget voices (): MusicVoice[] {\n\t\tconst voiceNames = this.varNames;\n\t\tconst chunks = this.body.musicChunks;\n\t\tconst measureCount = Math.ceil(chunks.length / voiceNames.length);\n\n\t\treturn voiceNames.map((name, index) => ({\n\t\t\tname: name.toString(),\n\t\t\tbody: Array(measureCount).fill(null).map((_, m) => chunks[m * voiceNames.length + index]).filter(Boolean),\n\t\t}));\n\t}\n};\n\n\nexport class TimeSignature extends Command {\n\tget value (): FractionNumber {\n\t\treturn FractionNumber.fromExpression(this.args[0]);\n\t}\n};\n\n\nexport class Partial extends Command {\n\tget duration (): Duration {\n\t\treturn this.args[0];\n\t}\n};\n\n\nexport class Times extends Command {\n\tget factor (): FractionNumber {\n\t\treturn FractionNumber.fromExpression(this.args[0]);\n\t}\n\n\n\tget music (): BaseTerm {\n\t\treturn this.args[this.args.length - 1];\n\t}\n};\n\n\nexport class Tuplet extends Command {\n\tget divider (): FractionNumber {\n\t\treturn FractionNumber.fromExpression(this.args[0]);\n\t}\n\n\n\tget music (): BaseTerm {\n\t\treturn this.args[this.args.length - 1];\n\t}\n};\n\n\nexport class Grace extends Command {\n\tget music (): BaseTerm {\n\t\treturn this.args[this.args.length - 1];\n\t}\n};\n\n\nexport class AfterGrace extends Command {\n\tget body (): BaseTerm {\n\t\treturn this.args[0];\n\t}\n\n\tget grace (): BaseTerm {\n\t\treturn this.args[1];\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\treturn measureLayout.BlockMLayout.fromSeq([\n\t\t\tthis.body.measureLayout,\n\t\t\tthis.grace.measureLayout,\n\t\t]);\n\t}\n};\n\n\nexport class Clef extends Command {\n\tget clefName (): string {\n\t\treturn this.args[0].toString();\n\t}\n};\n\n\nexport class KeySignature extends Command {\n\tget keyPitch (): ChordElement {\n\t\treturn new ChordElement({pitch: this.args[0], options: {proto: \"_PLAIN\"}});\n\t}\n\n\n\tget key (): number {\n\t\tconst keyPitch = this.keyPitch;\n\t\tconst minor = this.args[1] === \"\\\\minor\";\n\t\tconst phonetOrder = idioms.FIFTH_PHONETS.indexOf(keyPitch.phonet);\n\n\t\treturn phonetOrder + (minor ? -4 : -1) + keyPitch.alterValue * 7;\n\t}\n};\n\n\nexport class OctaveShift extends Command {\n\tget value (): number {\n\t\treturn this.args[0].exp;\n\t}\n};\n\n\nexport class Include extends Command {\n\tstatic create (filename: string): Include {\n\t\treturn new Include({cmd: \"include\", args: [LiteralString.fromString(filename)]});\n\t}\n\n\n\tget filename (): string {\n\t\treturn this.args[0].toString();\n\t}\n};\n\n\nexport class Version extends Command {\n\tstatic get default (): Version {\n\t\treturn new Version({cmd: \"version\", args: [LiteralString.fromString(LILYPOND_VERSION)]});\n\t}\n\n\n\tget version (): string {\n\t\treturn this.args[0].toString();\n\t}\n};\n\n\nexport class Language extends Command {\n\tstatic make (language: string): Language {\n\t\treturn new Language({cmd: \"language\", args: [LiteralString.fromString(language)]});\n\t}\n\n\n\tget language (): string {\n\t\treturn this.args[0].toString();\n\t}\n};\n\n\nexport class LyricMode extends Command {\n\tget block (): MusicBlock {\n\t\treturn this.args[0];\n\t}\n};\n\n\nexport class ChordMode extends Command {\n\tget block (): MusicBlock {\n\t\treturn this.args[0];\n\t}\n};\n\n\nexport class Transposition extends Command {\n\tget transposition (): number {\n\t\treturn this.args[0].pitchValue - 60;\n\t}\n};\n\n\nexport class StemDirection extends Command {\n\tget direction (): string {\n\t\treturn this.cmd.substr(4);\n\t}\n};\n\n\nexport class Change extends Command {\n\tget key (): string {\n\t\treturn this.args[0].toString();\n\t}\n\n\n\tget value (): string {\n\t\treturn this.args[1].toString();\n\t}\n};\n\n\nexport class Block extends BaseTerm {\n\tblock: string;\n\thead: (string|string[]);\n\tbody: BaseTerm[];\n\n\n\tconstructor (data) {\n\t\tsuper(data);\n\n\t\tthis.body = this.body.map(parseRawEnforce);\n\t}\n\n\n\tserialize () {\n\t\tconst heads = Array.isArray(this.head) ? this.head : (this.head ? [this.head] : []);\n\n\t\treturn [\n\t\t\t...heads,\n\t\t\t\"{\\n\",\n\t\t\t...cc(this.body.map(section => [...BaseTerm.optionalSerialize(section), \"\\n\"])),\n\t\t\t\"}\\n\",\n\t\t];\n\t}\n\n\n\tget entries () {\n\t\treturn this.body;\n\t}\n\n\n\tget isMIDIDedicated () {\n\t\tconst subBlocks = this.body.filter(term => term instanceof Block) as Block[];\n\n\t\treturn subBlocks.some(term => term.head === \"\\\\midi\")\n\t\t\t&& !subBlocks.some(term => term.head === \"\\\\layout\");\n\t}\n\n\n\tget assignmentDict (): {[key: string]: string} {\n\t\tconst assignments = this.body.filter(term => term instanceof Assignment) as Assignment[];\n\n\t\treturn assignments.reduce((dict, assignment) => ((dict[assignment.key.toString()] = assignment.value.toString()), dict), {});\n\t}\n};\n\n\nexport class InlineBlock extends Block {\n\tserialize () {\n\t\treturn [\n\t\t\t\"{\",\n\t\t\t...cc(this.body.map(BaseTerm.optionalSerialize)),\n\t\t\t\"}\",\n\t\t];\n\t}\n};\n\n\nexport class MusicBlock extends BaseTerm {\n\tbody: BaseTerm[];\n\n\n\tstatic fromTerms (terms: BaseTerm[]): MusicBlock {\n\t\tconst block = new MusicBlock({body: [...terms]});\n\t\tblock.clarifyHead();\n\n\t\treturn block;\n\t}\n\n\n\tconstructor (data) {\n\t\tsuper(data);\n\n\t\tthis.body = this.body.map(parseRawEnforce);\n\t}\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t\"{\\n\",\n\t\t\t...cc(this.body.map(BaseTerm.optionalSerialize)),\n\t\t\t\"\\n\",\n\t\t\t\"}\\n\",\n\t\t];\n\t}\n\n\n\tclone (): this {\n\t\tif (this._parent) {\n\t\t\tconst parent = this._parent.clone();\n\t\t\tconst block = parent.findFirst(MusicBlock);\n\t\t\tconsole.assert(block && block._parent === parent, \"invalid block-parent relation\", parent, block);\n\n\t\t\treturn block as this;\n\t\t}\n\n\t\treturn BaseTerm.prototype.clone.call(this) as this;\n\t}\n\n\n\tget entries () {\n\t\treturn this.body;\n\t}\n\n\n\tget isMusic (): boolean {\n\t\treturn true;\n\t}\n\n\n\tget musicChunks (): MusicChunk[] {\n\t\tconst chunks = [];\n\t\tlet currentChunk = new MusicChunk(this);\n\n\t\tconst dumpChunk = () => {\n\t\t\tif (currentChunk.size)\n\t\t\t\tchunks.push(currentChunk);\n\n\t\t\tcurrentChunk = new MusicChunk(this);\n\t\t};\n\n\t\tfor (const term of this.entries) {\n\t\t\tif (term instanceof Repeat) {\n\t\t\t\tdumpChunk();\n\t\t\t\tchunks.push(...term.musicChunks);\n\t\t\t}\n\t\t\telse if (term instanceof Divide)\n\t\t\t\tdumpChunk();\n\t\t\telse\n\t\t\t\tcurrentChunk.push(term);\n\t\t}\n\n\t\tdumpChunk();\n\n\t\treturn chunks;\n\t}\n\n\n\t// [deprecated]\n\t// for parallelMusic only\n\tget voiceNames () {\n\t\tconst header = this._parent as Command;\n\t\tif (header && header.cmd === \"parallelMusic\") {\n\t\t\tif (header.args[0] instanceof Scheme && header.args[0].exp instanceof SchemePointer && header.args[0].exp.value instanceof SchemeFunction) {\n\t\t\t\tconst voices = header.args[0].exp.value.asList;\n\t\t\t\treturn voices;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\n\t// [deprecated]\n\tget voices (): MusicVoice[] {\n\t\tconst voiceNames = this.voiceNames;\n\t\tif (!voiceNames)\n\t\t\treturn [{body: this.musicChunks}];\n\n\t\tconst chunks = this.musicChunks;\n\t\tconst measureCount = Math.ceil(chunks.length / voiceNames.length);\n\n\t\treturn voiceNames.map((name, index) => ({\n\t\t\tname: name.toString(),\n\t\t\tbody: Array(measureCount).fill(null).map((_, m) => chunks[m * voiceNames.length + index]).filter(chunk => chunk),\n\t\t}));\n\t}\n\n\n\tget durationMagnitude (): number {\n\t\treturn this.body.reduce((magnitude, term) => magnitude + term.durationMagnitude, 0);\n\t}\n\n\n\tget isRelative (): boolean {\n\t\treturn this._parent instanceof Relative;\n\t}\n\n\n\tget anchorPitch (): ChordElement {\n\t\tif (this.isRelative) \n\t\t\treturn (this._parent as Relative).anchor;\n\n\t\treturn null;\n\t}\n\n\n\tget measures (): number[] {\n\t\t// make a continouse indices list\n\t\tconst subterms = this.findAll(term => term.isMusic);\n\t\tconst subIndices = [].concat(...subterms.map(term => term.measures)).filter(index => Number.isInteger(index));\n\t\tif (!subIndices.length)\n\t\t\treturn [];\n\n\t\tconst min = Math.min(...subIndices);\n\t\tconst max = Math.max(...subIndices);\n\n\t\treturn Array(max + 1 - min).fill(null).map((_, i) => i + min);\n\t}\n\n\n\tget notes (): Chord[] {\n\t\tconst notes = this.body.filter(term => term instanceof Chord && !term.isRest) as Chord[];\n\t\tthis.forEachTopTerm(MusicBlock, block => notes.push(...block.notes));\n\n\t\treturn notes;\n\t}\n\n\n\tget sonicNotes (): Chord[] {\n\t\treturn this.notes.filter(note => !note.completeTied);\n\t}\n\n\n\tget noteTicks (): number[] {\n\t\tconst ticks = this.sonicNotes.map(note => note._tick);\n\t\treturn Array.from(new Set(ticks)).sort((t1, t2) => t1 - t2);\n\t}\n\n\n\tget measureTicks (): [number, number][] {\n\t\tconst tickTable: {[key: string]: number} = {};\n\n\t\tthis.body.forEach(term => {\n\t\t\tif (Number.isFinite(term._measure) && Number.isFinite(term._tick)) {\n\t\t\t\tif (!Number.isFinite(tickTable[term._measure]))\n\t\t\t\t\ttickTable[term._measure] = term._tick;\n\t\t\t}\n\t\t});\n\n\t\treturn Object.entries(tickTable).map(([measure, tick]) => [Number(measure), tick]);\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\tconst seq = this.body.filter(term => term.isMusic).map(term => term.measureLayout).filter(Boolean);\n\n\t\tif (this._functional === \"lotusRepeatABA\") {\n\t\t\tconst [main, ...rest] = seq;\n\n\t\t\tconst layout = new measureLayout.ABAMLayout();\n\t\t\tlayout.main = main;\n\t\t\tlayout.rest = measureLayout.BlockMLayout.trimSeq(rest);\n\n\t\t\treturn layout;\n\t\t}\n\n\t\treturn measureLayout.BlockMLayout.fromSeq(seq);\n\t}\n\n\n\tget measureChunkMap (): MusicChunkMap {\n\t\tconst map = new Map<number, MusicChunk>();\n\t\tthis.body.forEach(term => {\n\t\t\tif (Number.isInteger(term._measure) && !(term instanceof Divide)) {\n\t\t\t\tif (!map.get(term._measure))\n\t\t\t\t\tmap.set(term._measure, new MusicChunk(this));\n\n\t\t\t\tconst chunk = map.get(term._measure);\n\t\t\t\tchunk.terms.push(term);\n\t\t\t}\n\t\t});\n\n\t\treturn map;\n\t}\n\n\n\tclearPitchCache () {\n\t\tthis.forEachTerm(ChordElement, pitch => {\n\t\t\tpitch._absolutePitch = null;\n\t\t\t//pitch._previous = null;\n\t\t});\n\t}\n\n\n\tupdateChordAnchors () {\n\t\tconst chord = this.findFirst(Chord) as Chord;\n\t\tif (chord)\n\t\t\tchord._anchorPitch = chord._anchorPitch || this.anchorPitch;\n\n\t\tthis.clearPitchCache();\n\t}\n\n\n\t// deprecated\n\tupdateChordChains () {\n\t\tlet previous: MusicEvent = null;\n\n\t\tthis.updateChordAnchors();\n\n\t\tthis.forEachTerm(MusicBlock, block => block.updateChordAnchors());\n\n\t\tthis.forEachTerm(MusicEvent, event => {\n\t\t\tevent._previous = previous;\n\n\t\t\tprevious = event;\n\t\t});\n\t}\n\n\n\t// with side effect\n\tspreadRepeatBlocks ({ignoreRepeat = true, keepTailPass = false} = {}): this {\n\t\tthis.forEachTerm(MusicBlock, block => block.spreadRepeatBlocks());\n\n\t\tthis.body = cc(this.body.map(term => {\n\t\t\tif (term instanceof Repeat) {\n\t\t\t\tif (!ignoreRepeat)\n\t\t\t\t\treturn term.getUnfoldTerms();\n\t\t\t\telse if (keepTailPass)\n\t\t\t\t\treturn term.getTailPassTerms();\n\t\t\t\telse\n\t\t\t\t\treturn term.getPlainTerms();\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn [term];\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\n\t/*// with side effect\n\tspreadRelativeBlocks (): this {\n\t\tthis.forEachTerm(MusicBlock, block => block.spreadRelativeBlocks());\n\n\t\tlet anchorPitch = null;\n\n\t\tthis.body = cc(this.body.map(term => {\n\t\t\tif (term instanceof Relative) {\n\t\t\t\tconst list = term.shiftBody(anchorPitch);\n\n\t\t\t\tanchorPitch = term.tailPitch || anchorPitch;\n\n\t\t\t\treturn list;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn [term];\n\t\t}));\n\n\t\treturn this;\n\t}*/\n\n\n\t// with side effect\n\tunfoldDurationMultipliers (): this {\n\t\tlet timeDenominator = 4;\n\n\t\tconst unfoldMultipliers = (term): BaseTerm[] => {\n\t\t\tif (term instanceof TimeSignature)\n\t\t\t\ttimeDenominator = term.value.denominator;\n\n\t\t\tif (!(term instanceof MusicEvent) || !term.duration || !term.duration.multipliers || !term.duration.multipliers.length)\n\t\t\t\treturn [term];\n\n\t\t\tconst factor = term.duration.multipliers.reduce((factor, multiplier) => factor * Number(multiplier), 1);\n\t\t\tif (!Number.isInteger(factor) || factor <= 0)\n\t\t\t\treturn [term];\n\n\t\t\tconst denominator = Math.max(term.duration.denominator, timeDenominator);\n\n\t\t\tconst event = term.clone() as MusicEvent;\n\t\t\tevent.duration.multipliers = [];\n\n\t\t\t// break duration into multiple rest events\n\t\t\tconst restCount = (event.duration.magnitude / WHOLE_DURATION_MAGNITUDE) * (factor - 1) * denominator;\n\t\t\tif (!Number.isInteger(restCount))\n\t\t\t\tconsole.warn(\"Rest count is not integear:\", restCount, denominator, event.duration.magnitude, factor);\n\n\t\t\tconst rests = Array(Math.floor(restCount)).fill(null).map(() => \n\t\t\t\tnew Rest({name: \"s\", duration: new Duration({number: denominator, dots: 0})}));\n\n\t\t\treturn [event, ...rests];\n\t\t};\n\n\t\tthis.body = cc(this.body.map(unfoldMultipliers));\n\n\t\treturn this;\n\t}\n\n\n\t/*// pure\n\tflatten ({spreadRepeats = false} = {}): Relative {\n\t\tthis.updateChordChains();\n\n\t\tconst chord = this.findFirst(Chord) as Chord;\n\t\tconst anchor = this.anchorPitch || (chord && chord.anchorPitch);\n\n\t\tconst block = this.clone();\n\t\tif (spreadRepeats)\n\t\t\tblock.spreadRepeatBlocks();\n\t\tblock.spreadRelativeBlocks();\n\t\tblock.unfoldDurationMultipliers();\n\n\t\treturn Relative.makeBlock(block, {anchor: anchor && anchor.clone()});\n\t}*/\n\n\n\t// with side effect\n\texpandVariables (dict: BaseTerm): this {\n\t\tthis.body = this.body.map(term => {\n\t\t\tif (term instanceof Variable) {\n\t\t\t\tconst value = term.queryValue(dict);\n\t\t\t\tconst clonedValue = value instanceof BaseTerm ? value.clone() : value;\n\n\t\t\t\tif (clonedValue instanceof BaseTerm) {\n\t\t\t\t\tclonedValue.forEachTerm(MusicBlock, block => block.expandVariables(dict));\n\n\t\t\t\t\tif (clonedValue instanceof MusicBlock)\n\t\t\t\t\t\tclonedValue.expandVariables(dict);\n\t\t\t\t}\n\n\t\t\t\treturn clonedValue;\n\t\t\t}\n\n\t\t\treturn term;\n\t\t});\n\n\t\treturn this;\n\t}\n\n\n\t// with side effects\n\tredivide ({recursive = true, measureHeads = null}: {recursive?: boolean, measureHeads?: number[]} = {}) {\n\t\tif (recursive) {\n\t\t\tthis.forEachTerm(MusicBlock, block => {\n\t\t\t\tif (!block._parent || block._parent.cmd !== \"alternative\")\n\t\t\t\t\tblock.redivide({recursive, measureHeads});\n\t\t\t});\n\t\t}\n\n\t\t// split rests\n\t\tif (measureHeads) {\n\t\t\tthis.body = [].concat(...this.body.map(term => {\n\t\t\t\tif (!(term instanceof Rest) || term.name !== \"s\" || !Number.isInteger(term._measure))\n\t\t\t\t\treturn [term];\n\n\t\t\t\tconst nextHead = measureHeads[term._measure];\n\t\t\t\tconst endTick = term._tick + term.durationMagnitude;\n\t\t\t\tif (nextHead > 0 && endTick > nextHead) {\n\t\t\t\t\tconst post_events = term.post_events;\n\n\t\t\t\t\tlet startTick = term._tick;\n\t\t\t\t\tconst rests = [];\n\t\t\t\t\tlet nextMeasure;\n\t\t\t\t\tfor (nextMeasure = term._measure; nextMeasure < measureHeads.length && endTick > measureHeads[nextMeasure]; ++nextMeasure) {\n\t\t\t\t\t\tconst duration = Duration.fromMagnitude(measureHeads[nextMeasure] - startTick);\n\t\t\t\t\t\tif (!duration) {\n\t\t\t\t\t\t\tconsole.warn(\"invalid middle rest duration, splitting gave up:\", measureHeads[nextMeasure] - startTick, term);\n\t\t\t\t\t\t\treturn [term];\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tconst rest = new Rest({name: \"s\", duration, post_events: []});\n\t\t\t\t\t\trest._measure = nextMeasure;\n\t\t\t\t\t\trest._lastMeasure = nextMeasure;\n\t\t\t\t\t\trests.push(rest);\n\n\t\t\t\t\t\tconsole.assert(!!rest.duration, \"middle splitted rest duration invalid:\", measureHeads[nextMeasure] - startTick);\n\n\t\t\t\t\t\tstartTick = measureHeads[nextMeasure];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst duration = Duration.fromMagnitude(endTick - startTick);\n\t\t\t\t\tif (!duration) {\n\t\t\t\t\t\tconsole.warn(\"invalid tail rest duration, splitting gave up:\", endTick - startTick, term);\n\t\t\t\t\t\treturn [term];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rest = new Rest({name: \"s\", duration, post_events: post_events && [...post_events]});\n\t\t\t\t\trest._measure = nextMeasure;\n\t\t\t\t\trest._lastMeasure = nextMeasure;\n\t\t\t\t\trests.push(rest);\n\n\t\t\t\t\tconsole.assert(rests.reduce((sum, rest) => sum + rest.durationMagnitude, 0) === term.durationMagnitude, \"duration splitting error:\", rests, term);\n\t\t\t\t\t//if (rests.reduce((sum, rest) => sum + rest.durationMagnitude, 0) !== term.durationMagnitude)\n\t\t\t\t\t//\tdebugger;\n\n\t\t\t\t\treturn rests;\n\t\t\t\t}\n\n\t\t\t\treturn [term];\n\t\t\t}));\n\t\t}\n\n\t\tconst isPostTerm = term => !term\n\t\t\t|| term instanceof PostEvent\n\t\t\t|| (term as Primitive).exp === \"~\"\n\t\t\t|| [\"bar\", \"arpeggio\", \"glissando\", \"sustainOff\", \"sustainOn\"].includes((term as Command).cmd)\n\t\t\t;\n\n\t\tconst list = this.body.filter(term => !(term instanceof Divide));\n\t\tlet measure = null;\n\t\tfor (const term of list) {\n\t\t\tif (Number.isInteger(measure) && isPostTerm(term))\n\t\t\t\tterm._measure = measure;\n\t\t\telse\n\t\t\t\tmeasure = term._measure;\n\t\t}\n\n\t\tconst body: BaseTerm[] = [];\n\t\tconst measures = new Set();\n\n\t\tlist.reverse().forEach(term => {\n\t\t\tif (term instanceof BaseTerm) {\n\t\t\t\tconst newMeasures = term.measures.filter(m => !measures.has(m));\n\t\t\t\tif (newMeasures.length) {\n\t\t\t\t\tconst comment = \" \" + newMeasures[0] + (newMeasures.length > 1 ? \"-\" + Math.max(...newMeasures) : \"\");\n\n\t\t\t\t\tif (body.length)\n\t\t\t\t\t\tbody.push(new Divide({_tailComment: Comment.createSingle(comment)}));\n\n\t\t\t\t\tnewMeasures.forEach(m => measures.add(m));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbody.push(term);\n\t\t});\n\n\t\tthis.body = body.reverse();\n\t}\n\n\n\tclarifyHead () {\n\t\tconst terms = this.body;\n\n\t\tconst head = terms.find(term => term.isMusic);\n\t\tif (head instanceof MusicEvent) {\n\t\t\t// clarify the first music event content\n\t\t\tconst firstEventIndex = terms.indexOf(head);\n\t\t\tif (firstEventIndex >= 0) {\n\t\t\t\tconst firstEvent = terms[firstEventIndex] as MusicEvent;\n\t\t\t\t//console.log(\"firstEvent:\", firstEvent);\n\t\t\t\tif (firstEvent._previous) {\n\t\t\t\t\tconst clarified = firstEvent.clarified;\n\t\n\t\t\t\t\tterms.splice(firstEventIndex, 1, clarified);\n\t\t\t\t\t//console.log(\"terms:\", firstEventIndex, terms, clarified);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (head) {\n\t\t\tconst block = head.findFirst(MusicBlock) as MusicBlock;\n\t\t\tif (block)\n\t\t\t\tblock.clarifyHead();\n\t\t\telse\n\t\t\t\tconsole.warn(\"[MusicBlock.clarifyHead] unexpected music head:\", head);\n\t\t}\n\t}\n\n\n\tabsoluteToRelative (): Relative {\n\t\tconst anchor = this.findFirst(Chord) as Chord;\n\t\tif (!anchor)\n\t\t\treturn null;\n\n\t\tconst anchorPitch = anchor.absolutePitch;\n\t\tlet pitch = anchorPitch;\n\n\t\tconst newBody = this.clone();\n\t\tnewBody.forEachTerm(Chord, chord => {\n\t\t\tconst newPitch = chord.absolutePitch;\n\t\t\tchord.makeRelativeTo(pitch);\n\n\t\t\tpitch = newPitch;\n\t\t});\n\n\t\treturn Relative.makeBlock(newBody, {anchor: anchorPitch});\n\t}\n};\n\n\nexport class SimultaneousList extends BaseTerm {\n\tlist: BaseTerm[];\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t\"<<\\n\",\n\t\t\t...cc(this.list.map(item => [...BaseTerm.optionalSerialize(item), \"\\n\"])),\n\t\t\t\">>\\n\",\n\t\t];\n\t}\n\n\n\tremoveStaffGroup () {\n\t\tfor (let i = 0; i < this.list.length; ++i) {\n\t\t\tconst item: any = this.list[i];\n\t\t\tif (item.head instanceof Command && item.head.args && item.head.args[0] === \"StaffGroup\")\n\t\t\t\tthis.list[i] = item.body;\n\t\t}\n\n\t\tthis.list.forEach(item => {\n\t\t\tif (item instanceof SimultaneousList)\n\t\t\t\titem.removeStaffGroup();\n\t\t});\n\t}\n\n\n\tget isMusic (): boolean {\n\t\treturn true;\n\t}\n\n\n\tget entries () {\n\t\treturn this.list;\n\t}\n\n\n\tget durationMagnitude (): number {\n\t\treturn Math.max(...this.list.filter(term => term instanceof BaseTerm).map(term => term.durationMagnitude));\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\tconst track = this.list.find(term => term instanceof BaseTerm && term.measureLayout);\n\t\treturn track && track.measureLayout;\n\t}\n};\n\n\nexport class ContextedMusic extends BaseTerm {\n\thead: Command;\n\tbody: BaseTerm;\n\tlyrics?: BaseTerm;\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t...BaseTerm.optionalSerialize(this.head),\n\t\t\t...BaseTerm.optionalSerialize(this.body),\n\t\t\t...BaseTerm.optionalSerialize(this.lyrics),\n\t\t];\n\t}\n\n\n\tget isMusic (): boolean {\n\t\treturn true;\n\t}\n\n\n\tget entries () {\n\t\treturn [this.head, this.body];\n\t}\n\n\n\tget type (): string {\n\t\treturn this.head.args[0];\n\t}\n\n\n\tget durationMagnitude (): number {\n\t\treturn this.body.durationMagnitude;\n\t}\n\n\n\tget withClause (): Command {\n\t\tif (this.head.args[2] && this.head.args[2] instanceof Command && this.head.args[2].cmd === \"with\")\n\t\t\treturn this.head.args[2];\n\t}\n\n\n\tget contextDict (): {[key: string]: string} {\n\t\tconst withEntries = this.withClause ? Object.entries((this.withClause.args[0] as Block).assignmentDict) : [];\n\t\tconst entries = withEntries.map(([key, value]) => [`${this.type}.${key}`, value]);\n\n\t\tconst pair = this.head.getAssignmentPair();\n\t\tif (pair)\n\t\t\tentries.push([pair.key.toString(), pair.value.toString()]);\n\n\t\treturn entries.reduce((dict, [key, value]) => ((dict[key] = value), dict), {});\n\t}\n\n\n\tget list (): BaseTerm[] {\n\t\tif (this.body instanceof SimultaneousList)\n\t\t\treturn this.body.list;\n\n\t\treturn null;\n\t}\n\n\n\tset list (value: BaseTerm[]) {\n\t\tif (this.body instanceof SimultaneousList)\n\t\t\tthis.body.list = value;\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\treturn this.body.measureLayout;\n\t}\n};\n\n\nexport class Divide extends BaseTerm {\n\tserialize () {\n\t\treturn [\"|\", \"\\n\"];\n\t}\n}\n\n\nexport class Scheme extends BaseTerm {\n\texp: (boolean|BaseTerm);\n\n\n\tserialize () {\n\t\tif (BaseTerm.isTerm(this.exp))\n\t\t\treturn [\"#\", \"\\b\", ...(this.exp as BaseTerm).serialize()];\n\t\telse if (typeof this.exp === \"boolean\")\n\t\t\treturn [\"#\", \"\\b\", this.exp ? \"#t\" : \"#f\"];\n\t\t// TODO: enhance grammar to parse empty scheme list\n\t\t//else if (this.exp === null)\n\t\t//\treturn [\"#\", \"\\b\", \"'()\"];\n\t\telse\n\t\t\treturn [\"#\", \"\\b\", this.exp];\n\t}\n\n\n\tquery (key: string): any {\n\t\tif (this.exp instanceof SchemeFunction)\n\t\t\treturn this.exp.query(key);\n\t}\n\n\n\tget entries () {\n\t\tif (this.exp instanceof BaseTerm)\n\t\t\treturn [this.exp];\n\n\t\treturn [];\n\t}\n};\n\n\nexport class SchemeFunction extends BaseTerm {\n\tfunc: (string | BaseTerm);\n\targs: (boolean | string | BaseTerm)[];\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t\"(\", \"\\b\",\n\t\t\t...BaseTerm.optionalSerialize(this.func),\n\t\t\t...cc(this.args.map(BaseTerm.serializeScheme)),\n\t\t\t\"\\b\", \")\",\n\t\t];\n\t}\n\n\n\tquery (key: string): any {\n\t\tif (key === this.func) {\n\t\t\tconst term = this;\n\n\t\t\treturn {\n\t\t\t\tget value () {\n\t\t\t\t\treturn term.args.length === 1 ? term.args[0] : term.args;\n\t\t\t\t},\n\n\t\t\t\tset value (value) {\n\t\t\t\t\tif (term.args.length === 1)\n\t\t\t\t\t\tterm.args[0] = value as string|BaseTerm;\n\t\t\t\t\telse\n\t\t\t\t\t\tterm.args = value as (string|BaseTerm)[];\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\n\tget asList (): (boolean | string | BaseTerm)[] {\n\t\treturn [this.func, ...this.args];\n\t}\n\n\n\tget entries () {\n\t\treturn this.asList.filter(term => term instanceof BaseTerm) as BaseTerm[];\n\t}\n};\n\n\nexport class SchemePair extends BaseTerm {\n\tleft: any;\n\tright: any;\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t\"(\", \"\\b\",\n\t\t\t...BaseTerm.optionalSerialize(this.left), \".\", ...BaseTerm.optionalSerialize(this.right),\n\t\t\t\"\\b\", \")\",\n\t\t];\n\t}\n};\n\n\nexport class SchemePointer extends BaseTerm {\n\tvalue: any;\n\n\n\tserialize () {\n\t\tconst content = this.value === null ? [\"()\"] : BaseTerm.optionalSerialize(this.value);\n\n\t\treturn [\n\t\t\t\"'\", \"\\b\", ...content,\n\t\t];\n\t}\n\n\n\tget entries () {\n\t\tif (this.value instanceof BaseTerm)\n\t\t\treturn [this.value];\n\n\t\treturn [];\n\t}\n};\n\n\nexport class SchemeEmbed extends BaseTerm {\n\tvalue: Root;\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t\"#{\",\n\t\t\t...BaseTerm.optionalSerialize(this.value),\n\t\t\t\"#}\",\n\t\t];\n\t}\n};\n\n\nexport class Assignment extends BaseTerm {\n\tkey: (string|any[]);\n\tvalue: any;\n\n\n\tconstructor (data) {\n\t\tsuper(data);\n\n\t\tif (this.value instanceof BaseTerm)\n\t\t\tthis.value._parent = this;\n\t}\n\n\n\tserialize () {\n\t\tconst keys = (Array.isArray(this.key) ? this.key : [this.key]).map(BaseTerm.optionalSerialize);\n\t\tconst values = (Array.isArray(this.value) ? this.value : [this.value]).map(BaseTerm.optionalSerialize);\n\n\t\treturn [\n\t\t\t...cc(keys),\n\t\t\t\"=\",\n\t\t\t...cc(values),\n\t\t];\n\t}\n\n\n\tget entries () {\n\t\tif (this.value instanceof BaseTerm)\n\t\t\treturn [this.value];\n\n\t\treturn null;\n\t}\n\n\n\tquery (key) {\n\t\tif (this.key === key) {\n\t\t\tconst term = this;\n\n\t\t\treturn {\n\t\t\t\tget value () {\n\t\t\t\t\treturn term.value;\n\t\t\t\t},\n\n\t\t\t\tset value (value) {\n\t\t\t\t\tterm.value = value;\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n};\n\n\nexport class MusicEvent extends BaseTerm {\n\tduration?: Duration;\n\tpost_events?: (string | PostEvent)[];\n\n\tdeclare _previous?: MusicEvent;\n\t//_anchorPitch?: ChordElement;\n\t_lastMeasure?: number;\n\n\n\tconstructor (data: object) {\n\t\tsuper(data);\n\n\t\tif (this.post_events)\n\t\t\tthis.post_events = this.post_events.map(parseRaw);\n\t}\n\n\n\tgetPreviousT (T) {\n\t\tif (this._previous instanceof T)\n\t\t\treturn this._previous;\n\n\t\tif (this._previous)\n\t\t\treturn this._previous.getPreviousT(T);\n\t}\n\n\n\tget durationValue (): Duration {\n\t\treturn this.duration || (this._previous ? this._previous.durationValue : Duration.default);\n\t}\n\n\n\tget durationMagnitude (): number {\n\t\treturn this.durationValue.magnitude;\n\t}\n\n\n\tget division (): number {\n\t\treturn this.durationValue.division;\n\t}\n\n\n\tget withMultiplier () {\n\t\treturn this.duration && this.duration.withMultiplier;\n\t}\n\n\n\tget isMusic (): boolean {\n\t\treturn true;\n\t}\n\n\n\tget isTying (): boolean {\n\t\treturn this.post_events && this.post_events.some(event => event instanceof PostEvent && event.isTying);\n\t}\n\n\n\tget isStaccato (): boolean {\n\t\treturn this.post_events && this.post_events.some(event => event instanceof PostEvent && event.isStaccato);\n\t}\n\n\n\t// to be implement in derived classes\n\tget isRest (): boolean {\n\t\treturn null;\n\t}\n\n\n\tget beamOn (): boolean {\n\t\treturn this.post_events && this.post_events.includes(\"[\");\n\t}\n\n\n\tget beamOff (): boolean {\n\t\treturn this.post_events && this.post_events.includes(\"]\");\n\t}\n\n\n\tget measures (): number[] {\n\t\tif (!Number.isFinite(this._measure) || !Number.isFinite(this._lastMeasure))\n\t\t\treturn [];\n\n\t\treturn Array(this._lastMeasure + 1 - this._measure).fill(null).map((_, i) => this._measure + i);\n\t}\n\n\n\tget measureLayout (): measureLayout.MeasureLayout {\n\t\tif (this.measures.length > 1)\n\t\t\treturn measureLayout.BlockMLayout.fromSeq(this.measures.map(measure => measureLayout.SingleMLayout.from(measure)));\n\n\t\tif (this.measures.length === 1)\n\t\t\treturn measureLayout.SingleMLayout.from(this._measure);\n\n\t\treturn null;\n\t}\n\n\n\tget implicitType (): ImplicitType {\n\t\tif (this.post_events) {\n\t\t\tfor (const event of this.post_events) {\n\t\t\t\tif (event instanceof PostEvent && event.arg instanceof Command) {\n\t\t\t\t\tswitch (event.arg.cmd) {\n\t\t\t\t\tcase \"startTrillSpan\":\n\t\t\t\t\tcase \"trill\":\n\t\t\t\t\t\treturn ImplicitType.Trill;\n\n\t\t\t\t\tcase \"turn\":\n\t\t\t\t\t\treturn ImplicitType.Turn;\n\n\t\t\t\t\tcase \"mordent\":\n\t\t\t\t\t\treturn ImplicitType.Mordent;\n\n\t\t\t\t\tcase \"prall\":\n\t\t\t\t\t\treturn ImplicitType.Prall;\n\n\t\t\t\t\t// Arpeggio is not implemented in 'articulate.ly' yet\n\t\t\t\t\tcase \"arpeggio\":\n\t\t\t\t\t\treturn ImplicitType.Arpeggio;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ImplicitType.None;\n\t}\n\n\n\tget clarified (): MusicEvent {\n\t\tconst clarified = this instanceof Chord ? this.clarifiedChord : this.clone();\n\t\tclarified.duration = this.durationValue && this.durationValue.clone();\n\n\t\treturn clarified;\n\t}\n};\n\n\nexport class Chord extends MusicEvent {\n\tpitches: (ChordElement | Command)[];\n\toptions: {\n\t\texclamations?: string[],\n\t\tquestions?: string[],\n\t\trest?: string,\n\t\twithAngle?: boolean,\n\t};\n\n\n\tconstructor (data) {\n\t\tsuper(data);\n\n\t\tthis.connectPitches();\n\t}\n\n\n\tconnectPitches () {\n\t\tif (this.basePitch)\n\t\t\tthis.basePitch._parent = this;\n\t\tfor (let i = 1; i < this.pitchElements.length; ++i)\n\t\t\tthis.pitchElements[i]._previous = this.pitchElements[i - 1];\n\t}\n\n\n\tget single (): boolean {\n\t\treturn this.pitches.length === 1;\n\t}\n\n\n\tget entries () {\n\t\tconst list: any[] = [...this.pitches];\n\t\tif (Array.isArray(this.post_events))\n\t\t\tlist.push(...this.post_events);\n\n\t\treturn list;\n\t}\n\n\n\tserialize () {\n\t\tconst innerPitches = this.pitches.map(BaseTerm.optionalSerialize);\n\t\tconst pitches = (this.single && !this.options.withAngle) ? cc(innerPitches) : [\n\t\t\t\"<\", \"\\b\", ...cc(innerPitches), \"\\b\", \">\",\n\t\t];\n\n\t\tconst {exclamations, questions, rest} = this.options;\n\t\tconst postfix = cc([...(exclamations || []), ...(questions || []), ...BaseTerm.optionalSerialize(this.duration), rest]\n\t\t\t.filter(item => item)\n\t\t\t.map(item => [\"\\b\", item]),\n\t\t).concat(...(this.post_events || []).map(BaseTerm.optionalSerialize));\n\n\t\treturn [\n\t\t\tnew OpenLocator(this),\n\t\t\t...pitches,\n\t\t\t...postfix,\n\t\t\tnew CloseLocator(this),\n\t\t];\n\t}\n\n\n\tget pitchElements (): ChordElement[] {\n\t\treturn this.pitches.filter(pitch => pitch instanceof ChordElement) as ChordElement[];\n\t}\n\n\n\tget pitchNames (): string[] {\n\t\treturn this.pitchElements.map((elem: ChordElement) => elem.pitch.replace(/'|,/g, \"\"));\n\t}\n\n\n\tget basePitch (): ChordElement {\n\t\treturn this.pitchElements[0];\n\t}\n\n\n\tget absolutePitch (): ChordElement {\n\t\tconsole.assert(!!this.basePitch, \"absolutePitch on non pitch:\", this.join());\n\t\treturn this.basePitch.absolutePitch;\n\t}\n\n\n\tget anchorPitch (): ChordElement {\n\t\tif (this._anchorPitch)\n\t\t\treturn this._anchorPitch;\n\n\t\tconst previous = this.getPreviousT(Chord);\n\t\tif (previous)\n\t\t\treturn previous.absolutePitch;\n\n\t\treturn this.basePitch;\n\t}\n\n\n\tget isRest (): boolean {\n\t\treturn !!this.options.rest;\n\t}\n\n\n\tget completeTied (): boolean {\n\t\treturn this.pitchElements.filter(pitch => !pitch._tied).length === 0;\n\t}\n\n\n\tget pitchesValue (): (ChordElement | Command)[] {\n\t\tif (this._previous instanceof Chord && this.basePitch.pitch === \"q\") {\n\t\t\tconst pitches = this._previous.pitchesValue.map(pitch => {\n\t\t\t\tconst newPitch = pitch.clone();\n\t\t\t\tif (newPitch instanceof ChordElement) {\n\t\t\t\t\tnewPitch._location = this.basePitch._location;\n\t\t\t\t\tnewPitch._tied = this.basePitch._tied;\n\t\t\t\t\tnewPitch._parent = (pitch as ChordElement)._parent && this;\n\t\t\t\t\tnewPitch._previous = (pitch as ChordElement)._previous;\n\t\t\t\t}\n\n\t\t\t\treturn newPitch;\n\t\t\t});\n\t\t\tconst base = pitches.find(pitch => pitch instanceof ChordElement) as ChordElement;\n\t\t\tif (base)\n\t\t\t\tbase.pitch = base.pitch.replace(/[,']/g, \"\");\n\n\t\t\treturn pitches;\n\t\t}\n\n\t\treturn this.pitches;\n\t}\n\n\n\tget clarifiedChord (): MusicEvent {\n\t\tconst clarified = this.clone();\n\t\tclarified.pitches = this.pitchesValue.filter(pitch => !(pitch as ChordElement)._tied).map(pitch => pitch.clone());\n\t\tclarified.connectPitches();\n\n\t\t// replace by rest if all pitches tied\n\t\tif (!clarified.pitches.length)\n\t\t\treturn new Rest({name: \"r\", duration: this.duration});\n\n\t\treturn clarified;\n\t}\n\n\n\tshiftAnchor (newAnchor: ChordElement) {\n\t\t//console.warn(\"shiftAnchor:\", this.join(), newAnchor.join(), this.absolutePitch.pitchValue, newAnchor.pitchValue, this.anchorPitch.pitchValue);\n\t\tconst _location = this.basePitch._location;\n\t\tconst shift = idioms.phonetDifferToShift(this.basePitch.phonetStep - newAnchor.phonetStep);\n\t\tconst relativeOctave = this.basePitch.absoluteOctave(this.anchorPitch) - newAnchor.octave - shift;\n\t\t//console.log(\"_location:\", _location);\n\n\t\tthis.pitches[0] = ChordElement.from({\n\t\t\tphonet: this.basePitch.phonet,\n\t\t\talters: this.basePitch.alters,\n\t\t\toctave: relativeOctave,\n\t\t});\n\n\t\tthis.pitches[0]._location = _location;\n\t\tthis.pitches[0]._parent = this;\n\n\t\tthis.connectPitches();\n\n\t\t//console.log(\"shiftAnchor.1:\", this.join(), this.absolutePitch.pitchValue, {relativeOctave, shift, \"newAnchor.octave\": newAnchor.octave});\n\t}\n\n\n\tmakeRelativeTo (from: ChordElement) {\n\t\tconst _location = this.basePitch._location;\n\n\t\tconst octave = this.basePitch.relativeOctave(from);\n\t\tthis.pitches[0] = ChordElement.from({\n\t\t\tphonet: this.basePitch.phonet,\n\t\t\talters: this.basePitch.alters,\n\t\t\toctave,\n\t\t});\n\n\t\tthis.pitches[0]._location = _location;\n\t\tthis.pitches[0]._parent = this;\n\t}\n};\n\n\nexport class Rest extends MusicEvent {\n\tname: string;\n\n\n\tserialize () {\n\t\treturn [\n\t\t\tnew OpenLocator(this),\n\t\t\t...compact([\n\t\t\t\tthis.name,\n\t\t\t\t...BaseTerm.optionalSerialize(this.duration),\n\t\t\t]),\n\t\t\t...cc((this.post_events || []).map(BaseTerm.optionalSerialize)),\n\t\t\tnew CloseLocator(this),\n\t\t];\n\t}\n\n\n\tget isSpacer () {\n\t\treturn this.name === \"s\";\n\t}\n\n\n\tget isRest (): boolean {\n\t\treturn true;\n\t}\n};\n\n\nexport class ChordElement extends BaseTerm {\n\tpitch: string;\n\toptions: {\n\t\texclamations?: string[],\n\t\tquestions?: string[],\n\t\tpost_events?: PostEvent[],\n\t};\n\n\tdeclare _parent?: Chord;\n\tdeclare _previous?: ChordElement;\n\t_tied?: MusicEvent;\n\t_transposition?: number;\n\n\t// cache for property of absolutePitch\n\t_absolutePitch?: ChordElement;\n\n\n\tstatic from ({phonet, alters = \"\", octave, options = {}}): ChordElement {\n\t\tconst octaveString = octave ? Array(Math.abs(octave)).fill(octave > 0 ? \"'\" : \",\").join(\"\") : \"\";\n\t\tconst pitch = phonet + (alters || \"\") + octaveString;\n\n\t\treturn new ChordElement({pitch, options: {...options, proto: \"_PLAIN\"}});\n\t}\n\n\n\tstatic get default (): ChordElement {\n\t\treturn ChordElement.from({phonet: \"c\", octave: 0});\n\t}\n\n\n\tconstructor (data: object) {\n\t\tsuper(data);\n\n\t\tif (this.options.post_events)\n\t\t\tthis.options.post_events = this.options.post_events.map(parseRaw);\n\n\t\tif (!this.pitch)\n\t\t\tconsole.log(\"null pitch:\", this);\n\t}\n\n\n\tserialize () {\n\t\tconst {exclamations, questions, post_events} = this.options;\n\t\tconst postfix = [].concat(...[...(exclamations || []), ...(questions || [])]\n\t\t\t.filter(item => item)\n\t\t\t.map(item => [\"\\b\", item]),\n\t\t).concat(...(post_events || []).map(item => [\"\\b\", ...BaseTerm.optionalSerialize(item)]));\n\n\t\treturn [\n\t\t\tnew OpenLocator(this),\n\t\t\tthis.pitch,\n\t\t\t...postfix,\n\t\t\tnew CloseLocator(this),\n\t\t];\n\t}\n\n\n\tget octave (): number {\n\t\tconst positive = (this.pitch.match(/'/g) || []).length;\n\t\tconst negative = (this.pitch.match(/,/g) || []).length;\n\n\t\treturn positive - negative;\n\t}\n\n\n\tget phonet (): string {\n\t\tconst ph = this.pitch.substr(0, 1);\n\n\t\treturn idioms.PHONETS_ALIAS[ph] || ph;\n\t}\n\n\n\tget phonetStep (): number {\n\t\treturn idioms.PHONETS.indexOf(this.phonet);\n\t}\n\n\n\tget alters (): string {\n\t\tconst captures = this.pitch.substr(1).match(/^\\w+/);\n\t\treturn captures && captures[0];\n\t}\n\n\n\tget alteredPhonet (): string {\n\t\tconst captures = this.pitch.match(/^\\w+/);\n\t\treturn captures && captures[0];\n\t}\n\n\n\tget anchorPitch (): ChordElement {\n\t\tif (this._previous)\n\t\t\treturn this._previous.absolutePitch;\n\n\t\tif (this._parent)\n\t\t\treturn this._parent.anchorPitch;\n\n\t\treturn ChordElement.from({phonet: this.phonet, octave: 0});\n\t}\n\n\n\tgetAbsolutePitch (): ChordElement {\n\t\tif (this.phonet === \"q\")\n\t\t\treturn this.anchorPitch;\n\n\t\tif (this.anchorPitch === this)\n\t\t\treturn this;\n\n\t\tconst octave = this.absoluteOctave(this.anchorPitch);\n\n\t\treturn ChordElement.from({phonet: this.phonet, alters: this.alters, octave});\n\t}\n\n\n\tget absolutePitch (): ChordElement {\n\t\tif (!this._absolutePitch)\n\t\t\tthis._absolutePitch = this.getAbsolutePitch();\n\n\t\treturn this._absolutePitch;\n\t}\n\n\n\tabsoluteOctave (anchor: ChordElement): number {\n\t\tif (this.phonet === \"q\")\n\t\t\treturn anchor.octave;\n\n\t\tconst phonetDiffer = this.phonetStep - anchor.phonetStep;\n\t\tconst shift = idioms.phonetDifferToShift(phonetDiffer);\n\n\t\treturn anchor.octave + shift + this.octave;\n\t}\n\n\n\trelativeOctave (from: ChordElement): number {\n\t\tif (this.phonet === \"q\") {\n\t\t\tif (this.anchorPitch)\n\t\t\t\treturn this.anchorPitch.relativeOctave(from);\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\n\t\tconst phonetDiffer = this.phonetStep - from.phonetStep;\n\t\tconst shift = idioms.phonetDifferToShift(phonetDiffer);\n\n\t\treturn this.octave - shift - from.octave;\n\t}\n\n\n\tget alterValue (): number {\n\t\treturn idioms.ALTER_VALUES[this.alters] || 0;\n\t}\n\n\n\tget pitchValue (): number {\n\t\tconst phonetValue = idioms.PHONET_VALUES[this.phonet];\n\t\tconsole.assert(Number.isInteger(phonetValue), \"invalid phonet:\", this.phonet);\n\t\tconsole.assert(!this.alters || idioms.ALTER_VALUES[this.alters], \"invalid alters:\", this.alters);\n\n\t\treturn 48 + this.octave * 12 + phonetValue + this.alterValue;\n\t}\n\n\n\tget absolutePitchValue (): number {\n\t\treturn this.absolutePitch.pitchValue;\n\t}\n\n\n\t// middle C is zero\n\tget notePosition (): number {\n\t\tconst phonet = idioms.PHONETS.indexOf(this.phonet);\n\n\t\treturn (this.octave - 1) * 7 + phonet;\n\t}\n\n\n\tget absoluteNotePosition (): number {\n\t\treturn this.absolutePitch.notePosition;\n\t}\n\n\n\tget tiedParent (): ChordElement {\n\t\tif (!this._tied || !(this._tied instanceof Chord))\n\t\t\treturn null;\n\n\t\tconst pitch = this._tied.pitchElements.find(p => p.absolutePitchValue === this.absolutePitchValue);\n\t\tif (!pitch)\n\t\t\treturn null;\n\n\t\tif (pitch._tied)\n\t\t\treturn pitch.tiedParent;\n\n\t\treturn pitch;\n\t}\n};\n\n\nexport class Duration extends BaseTerm {\n\tnumber: string;\n\tdots: number;\n\tmultipliers?: string[];\n\n\n\tstatic _default: Duration;\n\tstatic get default (): Duration {\n\t\tif (!Duration._default)\n\t\t\tDuration._default = new Duration({number: 4, dots: 0});\n\n\t\treturn Duration._default;\n\t}\n\n\n\tstatic fromMagnitude (magnitude: number): Duration {\n\t\tconst MULTI = 1024;\n\t\tconst MULTI_DURATION_MAGNITUDE = WHOLE_DURATION_MAGNITUDE * MULTI;\n\t\tconst multiMag = magnitude * MULTI;\n\t\tif (!Number.isInteger(multiMag)) {\n\t\t\tconsole.warn(\"magnitude must be integer:\", magnitude);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst di = gcd(multiMag, MULTI_DURATION_MAGNITUDE);\n\t\tconst denominator = MULTI_DURATION_MAGNITUDE / di;\n\t\tconst numerator = multiMag / di;\n\t\tif (!Number.isInteger(Math.log2(denominator)))\n\t\t\treturn new Duration({number: 1, dots: 0, multipliers: [`${numerator}/${denominator}`]});\n\n\t\tswitch (numerator) {\n\t\tcase 1:\n\t\t\treturn new Duration({number: denominator, dots: 0});\n\n\t\tcase 3:\n\t\t\treturn new Duration({number: denominator / 2, dots: 1});\n\n\t\tcase 7:\n\t\t\treturn new Duration({number: denominator / 4, dots: 2});\n\n\t\tdefault:\n\t\t\treturn new Duration({number: denominator, dots: 0, multipliers: [numerator.toString()]});\n\t\t}\n\t}\n\n\n\tserialize () {\n\t\tconst dots = Array(this.dots).fill(\".\").join(\"\");\n\t\tconst multipliers = this.multipliers && this.multipliers.map(multiplier => `*${multiplier}`).join(\"\");\n\n\t\treturn compact([\n\t\t\tthis.number, dots, multipliers,\n\t\t]);\n\t}\n\n\n\tget withMultiplier () {\n\t\treturn this.multipliers && this.multipliers.length > 0;\n\t}\n\n\n\tget denominator (): number {\n\t\tswitch (this.number) {\n\t\tcase \"\\\\breve\":\n\t\t\treturn 0.5;\n\n\t\tcase \"\\\\longa\":\n\t\t\treturn 0.25;\n\t\t}\n\n\t\treturn Number(this.number);\n\t}\n\n\n\tget division (): number {\n\t\treturn Math.log2(this.denominator);\n\t}\n\n\n\t// how many smallest rhythm unit in a whole note\n\tget subdivider (): number {\n\t\treturn this.denominator * (2 ** this.dots);\n\t}\n\n\n\tget magnitude (): number {\n\t\tlet value = WHOLE_DURATION_MAGNITUDE / this.denominator;\n\n\t\tif (this.dots)\n\t\t\tvalue *= 2 - 0.5 ** this.dots;\n\n\t\tif (this.multipliers)\n\t\t\tthis.multipliers.forEach(multiplier => value *= eval(multiplier));\n\n\t\treturn value;\n\t}\n};\n\n\ninterface BriefChordBody {\n\tpitch: string;\n\tduration: Duration;\n\tseparator: string;\n\titems: string[];\n};\n\n\nexport class BriefChord extends BaseTerm {\n\tbody: BriefChordBody;\n\tpost_events: any[];\n\n\n\tconstructor (data: object) {\n\t\tsuper(data);\n\n\t\tif (this.body)\n\t\t\tthis.body.duration = parseRaw(this.body.duration);\n\t}\n\n\n\tserialize () {\n\t\tconst {pitch, duration, separator, items} = this.body;\n\n\t\treturn [\n\t\t\t...compact(cc([pitch, duration, separator, ...(items || [])].map(BaseTerm.optionalSerialize))),\n\t\t\t...cc((this.post_events || []).map(BaseTerm.optionalSerialize)),\n\t\t];\n\t}\n\n\n\tget isMusic (): boolean {\n\t\treturn true;\n\t}\n\n\n\tget durationMagnitude (): number {\n\t\tif (this.body.duration)\n\t\t\treturn this.body.duration.magnitude;\n\n\t\treturn 0;\n\t}\n};\n\n\nexport class NumberUnit extends BaseTerm {\n\tnumber: number;\n\tunit: string;\n\n\n\tserialize () {\n\t\treturn [this.number, \"\\b\", this.unit];\n\t}\n\n\n\tset ({number, unit}) {\n\t\tthis.number = Number(number.toFixed(2));\n\n\t\tif (unit !== undefined)\n\t\t\tthis.unit = unit;\n\t}\n}\n\n\nexport class Tempo extends BaseTerm {\n\tbeatsPerMinute?: number;\n\tunit?: Duration;\n\ttext?: string;\n\n\n\tstatic fromNoteBpm (note: number, bpm: number): Tempo {\n\t\treturn new Tempo ({\n\t\t\tunit: new Duration({number: note.toString(), dots: 0}),\n\t\t\tbeatsPerMinute: bpm,\n\t\t});\n\t}\n\n\n\tserialize () {\n\t\tconst assignment = Number.isFinite(this.beatsPerMinute) ? [...BaseTerm.optionalSerialize(this.unit), \"=\", this.beatsPerMinute] : [];\n\n\t\treturn [\n\t\t\t\"\\\\tempo\",\n\t\t\t...BaseTerm.optionalSerialize(this.text),\n\t\t\t...assignment,\n\t\t];\n\t}\n}\n\n\nconst DIRECTION_CHAR = {\n\tup: \"^\",\n\tdown: \"_\",\n\tmiddle: \"-\",\n};\n\n\nexport class PostEvent extends BaseTerm {\n\tdirection: string;\n\targ: string | BaseTerm;\n\n\n\tserialize () {\n\t\tconst dir = DIRECTION_CHAR[this.direction];\n\t\tconst prefix = dir ? [dir, \"\\b\"] : [];\n\n\t\treturn prefix.concat(BaseTerm.optionalSerialize(this.arg));\n\t}\n\n\n\tget entries () {\n\t\tif (this.arg instanceof BaseTerm)\n\t\t\treturn [this.arg];\n\n\t\treturn null;\n\t}\n\n\n\tget isTying (): boolean {\n\t\treturn this.arg === \"~\";\n\t}\n\n\n\tget isStaccato (): boolean {\n\t\tif (this.arg instanceof Command)\n\t\t\treturn [\"staccato\", \"staccatissimo\", \"portato\"].includes(this.arg.cmd);\n\n\t\tif ([\".\", \"!\"].includes(this.arg as string))\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n};\n\n\nexport class Fingering extends BaseTerm {\n\tvalue: number;\n\n\n\tserialize () {\n\t\treturn [this.value];\n\t}\n};\n\n\nexport class Markup extends BaseTerm {\n\thead: any[];\n\tbody: (string|BaseTerm);\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t...cc(this.head.map(BaseTerm.optionalSerialize)),\n\t\t\t...BaseTerm.optionalSerialize(this.body),\n\t\t];\n\t}\n};\n\n\nexport class Lyric extends MusicEvent {\n\tcontent: string | LiteralString;\n\n\n\tserialize () {\n\t\treturn [\n\t\t\t...BaseTerm.optionalSerialize(this.content),\n\t\t\t...BaseTerm.optionalSerialize(this.duration),\n\t\t\t...cc((this.post_events || []).map(BaseTerm.optionalSerialize)),\n\t\t];\n\t}\n};\n\n\nexport class Comment extends BaseTerm {\n\ttext: string;\n\tscoped: boolean;\n\n\n\tserialize () {\n\t\treturn [\n\t\t\tthis.text,\n\t\t\t\"\\n\",\n\t\t];\n\t}\n\n\n\tstatic createSingle (text): Comment {\n\t\treturn new Comment({text: \"%\" + text});\n\t}\n\n\n\tstatic createScoped (text): Comment {\n\t\tconsole.assert(!/%\\}/.test(text), \"invalid scoped comment text:\", text);\n\n\t\treturn new Comment({text: `%{${text}%}`, scoped: true});\n\t}\n};\n\n\nexport class Unexpect extends BaseTerm {\n\tconstructor (data) {\n\t\tsuper(data);\n\n\t\tconsole.warn(\"unexpected term\", data);\n\t}\n};\n\n\nexport const termDictionary = {\n\tRoot,\n\tLiteralString,\n\tCommand,\n\tVariable,\n\tMarkupCommand,\n\tRepeat,\n\tRelative,\n\tParallelMusic,\n\tTimeSignature,\n\tPartial,\n\tTimes,\n\tTuplet,\n\tGrace,\n\tAfterGrace,\n\tClef,\n\tKeySignature,\n\tOctaveShift,\n\tInclude,\n\tVersion,\n\tLanguage,\n\tLyricMode,\n\tChordMode,\n\tTransposition,\n\tStemDirection,\n\tChange,\n\tBlock,\n\tInlineBlock,\n\tScheme,\n\tSchemeFunction,\n\tSchemePair,\n\tSchemePointer,\n\tSchemeEmbed,\n\tAssignment,\n\tDuration,\n\tChordElement,\n\tChord,\n\tRest,\n\tBriefChord,\n\tNumberUnit,\n\tMusicBlock,\n\tSimultaneousList,\n\tContextedMusic,\n\tDivide,\n\tTempo,\n\tPostEvent,\n\tFingering,\n\tMarkup,\n\tLyric,\n\tPrimitive,\n\tComment,\n};\n\n\nconst termProtoMap: Map<object, string> = Object.entries(termDictionary)\n\t.reduce((map, [name, cls]: [string, {prototype: object}]) => (map.set(cls.prototype, name), map), new Map());\n\n\nconst parseRawEnforce = data => {\n\tswitch (typeof data) {\n\tcase \"string\":\n\tcase \"number\":\n\t\treturn new Primitive({exp: data});\n\n\tdefault:\n\t\treturn parseRaw(data);\n\t}\n};\n\n\nexport const parseRaw = data => {\n\tif (data instanceof BaseTerm)\n\t\treturn data;\n\n\tif (!data)\n\t\treturn data;\n\n\tswitch (typeof data) {\n\tcase \"object\":\n\t\tif (Array.isArray(data))\n\t\t\treturn data.map(item => parseRaw(item));\n\n\t\tconst {proto, ...fields} = data;\n\t\tif (proto) {\n\t\t\tif (proto === \"_PLAIN\")\n\t\t\t\treturn fields;\n\n\t\t\tconst termClass = termDictionary[proto];\n\t\t\tif (!termClass)\n\t\t\t\tthrow new Error(`Unexpected term class: ${data.proto}`);\n\n\t\t\treturn new termClass(fields);\n\t\t}\n\n\t\treturn new Unexpect(data); \n\t}\n\n\treturn data;\n};\n"],"mappings":"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","ignoreList":[]}]}