{"remainingRequest":"/home/camus/work/lotus/node_modules/thread-loader/dist/cjs.js!/home/camus/work/lotus/node_modules/babel-loader/lib/index.js!/home/camus/work/lotus/node_modules/ts-loader/index.js??ref--15-3!/home/camus/work/lotus/node_modules/eslint-loader/index.js??ref--14-0!/home/camus/work/lotus/inc/lilyParser/lilyDocument.ts","dependencies":[{"path":"/home/camus/work/lotus/inc/lilyParser/lilyDocument.ts","mtime":1732184618437},{"path":"/home/camus/work/lotus/node_modules/cache-loader/dist/cjs.js","mtime":1719800821084},{"path":"/home/camus/work/lotus/node_modules/thread-loader/dist/cjs.js","mtime":1719800821095},{"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:aW1wb3J0IFRleHRTb3VyY2UgZnJvbSAiLi4vdGV4dFNvdXJjZSI7CmltcG9ydCB7IExJTFlfU1RBRkZfU0laRV9ERUZBVUxUIH0gZnJvbSAiLi4vY29uc3RhbnRzIjsKaW1wb3J0IHsgcGFyc2VSYXcsIEJhc2VUZXJtLCBBc3NpZ25tZW50LCBMaXRlcmFsU3RyaW5nLCBDb21tYW5kLCBWYXJpYWJsZSwgTWFya3VwQ29tbWFuZCwgR3JhY2UsIEFmdGVyR3JhY2UsIEluY2x1ZGUsIFZlcnNpb24sIEJsb2NrLCBJbmxpbmVCbG9jaywgU2NoZW1lLCBDaG9yZCwgQnJpZWZDaG9yZCwgTHlyaWMsIE11c2ljQmxvY2ssIFNpbXVsdGFuZW91c0xpc3QsIENvbnRleHRlZE11c2ljLCBEaXZpZGUsIFRlbXBvLCBQb3N0RXZlbnQsIFByaW1pdGl2ZSwgQ2hvcmRFbGVtZW50LCBNdXNpY0V2ZW50LCBTY2hlbWVQb2ludGVyLCBDb21tZW50LCBMYW5ndWFnZSwgU3RlbURpcmVjdGlvbiB9IGZyb20gIi4vbGlseVRlcm1zIjsKaW1wb3J0IExpbHlJbnRlcnByZXRlciBmcm9tICIuL2xpbHlJbnRlcnByZXRlciI7CmltcG9ydCB7IE1BSU5fU0NPUkVfTkFNRSB9IGZyb20gIi4vdXRpbHMiOwo7CjsKOwpleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWx5RG9jdW1lbnQgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIC8vY29uc29sZS5sb2coInJhdyBkYXRhOiIsIGRhdGEpOwogICAgdGhpcy5yb290ID0gcGFyc2VSYXcoZGF0YSk7CiAgfQogIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMucm9vdC5qb2luKCk7CiAgICAvL3JldHVybiB0aGlzLnJvb3Quc2VyaWFsaXplKCk7CiAgfQogIGludGVycHJldCh7CiAgICB1c2VDYWNoZWQgPSB0cnVlCiAgfSA9IHt9KSB7CiAgICBpZiAoIXVzZUNhY2hlZCB8fCAhdGhpcy5jYWNoZUludGVycHJldGVyKSB7CiAgICAgIHRoaXMuY2FjaGVJbnRlcnByZXRlciA9IG5ldyBMaWx5SW50ZXJwcmV0ZXIoKTsKICAgICAgdGhpcy5jYWNoZUludGVycHJldGVyLmludGVycHJldERvY3VtZW50KHRoaXMpOwogICAgfQogICAgcmV0dXJuIHRoaXMuY2FjaGVJbnRlcnByZXRlcjsKICB9CiAgZ2xvYmFsQXR0cmlidXRlcyh7CiAgICByZWFkb25seSA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBjb25zdCBnbG9iYWxTdGFmZlNpemUgPSB0aGlzLnJvb3QuZ2V0RmllbGQoInNldC1nbG9iYWwtc3RhZmYtc2l6ZSIpOwogICAgY29uc3QgaGVhZGVyID0gdGhpcy5yb290LmdldEJsb2NrKCJoZWFkZXIiKTsKICAgIGxldCBwYXBlciA9IHRoaXMucm9vdC5nZXRCbG9jaygicGFwZXIiKTsKICAgIGNvbnN0IGxheW91dFN0YWZmU2l6ZSA9IHBhcGVyICYmIHBhcGVyLmdldEZpZWxkKCJsYXlvdXQtc2V0LXN0YWZmLXNpemUiKTsKICAgIGxldCBzdGFmZlNpemUgPSBnbG9iYWxTdGFmZlNpemUgfHwgbGF5b3V0U3RhZmZTaXplOwogICAgaWYgKCFyZWFkb25seSkgewogICAgICBsZXQgc2VjdGlvbnNEaXJ0eSA9IGZhbHNlOwogICAgICBpZiAoIXN0YWZmU2l6ZSkgewogICAgICAgIHRoaXMucm9vdC5zZWN0aW9ucy5wdXNoKG5ldyBTY2hlbWUoewogICAgICAgICAgZXhwOiB7CiAgICAgICAgICAgIHByb3RvOiAiU2NoZW1lRnVuY3Rpb24iLAogICAgICAgICAgICBmdW5jOiAic2V0LWdsb2JhbC1zdGFmZi1zaXplIiwKICAgICAgICAgICAgYXJnczogW0xJTFlfU1RBRkZfU0laRV9ERUZBVUxUXQogICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICBzdGFmZlNpemUgPSB0aGlzLnJvb3QuZ2V0RmllbGQoInNldC1nbG9iYWwtc3RhZmYtc2l6ZSIpOwogICAgICAgIHNlY3Rpb25zRGlydHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIEE0IHBhcGVyIHNpemUKICAgICAgY29uc3QgREVGQVVMVF9QQVBFUl9XSURUSCA9IHsKICAgICAgICBwcm90bzogIkFzc2lnbm1lbnQiLAogICAgICAgIGtleTogInBhcGVyLXdpZHRoIiwKICAgICAgICB2YWx1ZTogewogICAgICAgICAgcHJvdG86ICJOdW1iZXJVbml0IiwKICAgICAgICAgIG51bWJlcjogMjEsCiAgICAgICAgICB1bml0OiAiXFxjbSIKICAgICAgICB9CiAgICAgIH07CiAgICAgIGNvbnN0IERFRkFVTFRfUEFQRVJfSEVJR0hUID0gewogICAgICAgIHByb3RvOiAiQXNzaWdubWVudCIsCiAgICAgICAga2V5OiAicGFwZXItaGVpZ2h0IiwKICAgICAgICB2YWx1ZTogewogICAgICAgICAgcHJvdG86ICJOdW1iZXJVbml0IiwKICAgICAgICAgIG51bWJlcjogMjkuNzEsCiAgICAgICAgICB1bml0OiAiXFxjbSIKICAgICAgICB9CiAgICAgIH07CiAgICAgIGlmICghcGFwZXIpIHsKICAgICAgICBwYXBlciA9IG5ldyBCbG9jayh7CiAgICAgICAgICBibG9jazogInNjb3JlIiwKICAgICAgICAgIGhlYWQ6ICJcXHBhcGVyIiwKICAgICAgICAgIGJvZHk6IFtERUZBVUxUX1BBUEVSX1dJRFRILCBERUZBVUxUX1BBUEVSX0hFSUdIVF0KICAgICAgICB9KTsKICAgICAgICB0aGlzLnJvb3Quc2VjdGlvbnMucHVzaChwYXBlcik7CiAgICAgICAgc2VjdGlvbnNEaXJ0eSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKCFwYXBlci5nZXRGaWVsZCgicGFwZXItd2lkdGgiKSkgcGFwZXIuYm9keS5wdXNoKHBhcnNlUmF3KERFRkFVTFRfUEFQRVJfV0lEVEgpKTsKICAgICAgaWYgKCFwYXBlci5nZXRGaWVsZCgicGFwZXItaGVpZ2h0IikpIHBhcGVyLmJvZHkucHVzaChwYXJzZVJhdyhERUZBVUxUX1BBUEVSX0hFSUdIVCkpOwogICAgICBpZiAoc2VjdGlvbnNEaXJ0eSkgdGhpcy5yb290LnJlb3JkZXJTZWN0aW9ucygpOwogICAgfSBlbHNlIHN0YWZmU2l6ZSA9IHN0YWZmU2l6ZSB8fCB7CiAgICAgIHZhbHVlOiBMSUxZX1NUQUZGX1NJWkVfREVGQVVMVAogICAgfTsKICAgIGNvbnN0IGJsb2NrUHJvcGVydHlDb21tb24gPSAoYmxvY2ssIGtleSkgPT4gKHsKICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgIGlmICghYmxvY2spIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgaXRlbSA9IGJsb2NrLmdldEZpZWxkKGtleSk7CiAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIHJldHVybiBpdGVtLnZhbHVlOwogICAgICB9LAogICAgICBzZXQgdmFsdWUodmFsdWUpIHsKICAgICAgICBjb25zb2xlLmFzc2VydCghIWJsb2NrLCAiYmxvY2sgaXMgbnVsbC4iKTsKICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkKICAgICAgICAgIC8vIGRlbGV0ZSBmaWVsZAogICAgICAgICAgYmxvY2suYm9keSA9IGJsb2NrLmJvZHkuZmlsdGVyKGFzc2lnbiA9PiAhKGFzc2lnbiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpIHx8IGFzc2lnbi5rZXkgIT09IGtleSk7ZWxzZSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gYmxvY2suZ2V0RmllbGQoa2V5KTsKICAgICAgICAgIGlmIChpdGVtKSBpdGVtLnZhbHVlID0gcGFyc2VSYXcodmFsdWUpO2Vsc2UgYmxvY2suYm9keS5wdXNoKG5ldyBBc3NpZ25tZW50KHsKICAgICAgICAgICAga2V5LAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBjb25zdCBwYXBlclByb3BlcnR5Q29tbW9uID0ga2V5ID0+IGJsb2NrUHJvcGVydHlDb21tb24ocGFwZXIsIGtleSk7CiAgICBjb25zdCBwYXBlclByb3BlcnR5U2NoZW1lVG9rZW4gPSBrZXkgPT4gKHsKICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgIGlmICghcGFwZXIpIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgaXRlbSA9IHBhcGVyLmdldEZpZWxkKGtleSk7CiAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIHJldHVybiBpdGVtLnZhbHVlLmV4cDsKICAgICAgfSwKICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7CiAgICAgICAgY29uc29sZS5hc3NlcnQoISFwYXBlciwgInBhcGVyIGlzIG51bGwuIik7CiAgICAgICAgY29uc3QgaXRlbSA9IHBhcGVyLmdldEZpZWxkKGtleSk7CiAgICAgICAgaWYgKGl0ZW0pIGl0ZW0udmFsdWUuZXhwID0gdmFsdWU7ZWxzZSBwYXBlci5ib2R5LnB1c2gobmV3IEFzc2lnbm1lbnQoewogICAgICAgICAga2V5LAogICAgICAgICAgdmFsdWU6IHsKICAgICAgICAgICAgcHJvdG86ICJTY2hlbWUiLAogICAgICAgICAgICBleHA6IHZhbHVlCiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9CiAgICB9KTsKICAgIGxldCBtaWRpQmxvY2sgPSBudWxsOwogICAgY29uc3Qgc2NvcmVzID0gdGhpcy5yb290LnNlY3Rpb25zLmZpbHRlcihzZWN0aW9uID0+IHNlY3Rpb24gaW5zdGFuY2VvZiBCbG9jayAmJiBzZWN0aW9uLmhlYWQgPT09ICJcXHNjb3JlIik7CiAgICBmb3IgKGNvbnN0IHNjb3JlIG9mIHNjb3JlcykgewogICAgICBtaWRpQmxvY2sgPSBzY29yZS5ib2R5LmZpbmQodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQmxvY2sgJiYgdGVybS5oZWFkID09PSAiXFxtaWRpIik7CiAgICAgIGlmIChtaWRpQmxvY2spIGJyZWFrOwogICAgfQogICAgY29uc3QgbWlkaVRlbXBvID0gewogICAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIG1pZGlCbG9jayAmJiBtaWRpQmxvY2suYm9keS5maW5kKHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIFRlbXBvKTsKICAgICAgfSwKICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7CiAgICAgICAgaWYgKCFtaWRpQmxvY2spIHsKICAgICAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5yb290LmdldEJsb2NrKCJzY29yZSIpOwogICAgICAgICAgaWYgKHNjb3JlKSB7CiAgICAgICAgICAgIG1pZGlCbG9jayA9IG5ldyBCbG9jayh7CiAgICAgICAgICAgICAgYmxvY2s6ICJzY29yZSIsCiAgICAgICAgICAgICAgaGVhZDogIlxcbWlkaSIsCiAgICAgICAgICAgICAgYm9keTogW10KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHNjb3JlLmJvZHkucHVzaChtaWRpQmxvY2spOwogICAgICAgICAgfSBlbHNlIGNvbnNvbGUud2Fybigibm8gc2NvcmUgYmxvY2ssIG1pZGlUZW1wbyBhc3NpZ24gZmFpbGVkLiIpOwogICAgICAgIH0KICAgICAgICBpZiAobWlkaUJsb2NrKSB7CiAgICAgICAgICBtaWRpQmxvY2suYm9keSA9IG1pZGlCbG9jay5ib2R5LmZpbHRlcih0ZXJtID0+ICEodGVybSBpbnN0YW5jZW9mIFRlbXBvKSk7CiAgICAgICAgICBtaWRpQmxvY2suYm9keS5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NpZ25tZW50cyA9IHRoaXMucm9vdC5lbnRyaWVzLmZpbHRlcih0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBBc3NpZ25tZW50KTsKICAgIGNvbnN0IGFzc2lnbm1lbnRUYWJsZSA9IGFzc2lnbm1lbnRzLnJlZHVjZSgodGFibGUsIGFzc2lnbikgPT4gKHRhYmxlW2Fzc2lnbi5rZXkudG9TdHJpbmcoKV0gPSBhc3NpZ24ucXVlcnkoYXNzaWduLmtleSksIHRhYmxlKSwge30pOwogICAgY29uc3QgaGVhZGVyRmllbGRzID0gWyJ0aXRsZSIsICJzdWJ0aXRsZSIsICJzdWJzdWJ0aXRsZSIsICJjb21wb3NlciIsICJwb2V0IiwgImFycmFuZ2VyIiwgIm9wdXMiLCAiY29weXJpZ2h0IiwgImluc3RydW1lbnQiLCAiZGVkaWNhdGlvbiIsICJ0YWdsaW5lIl0ucmVkdWNlKChkaWN0LCBmaWVsZCkgPT4gKGRpY3RbZmllbGRdID0gYmxvY2tQcm9wZXJ0eUNvbW1vbihoZWFkZXIsIGZpZWxkKSwgZGljdCksIHt9KTsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7CiAgICAgIHN0YWZmU2l6ZSwKICAgICAgbWlkaVRlbXBvLAogICAgICAuLi5oZWFkZXJGaWVsZHMsCiAgICAgIHBhcGVyV2lkdGg6IHBhcGVyUHJvcGVydHlDb21tb24oInBhcGVyLXdpZHRoIiksCiAgICAgIHBhcGVySGVpZ2h0OiBwYXBlclByb3BlcnR5Q29tbW9uKCJwYXBlci1oZWlnaHQiKSwKICAgICAgdG9wTWFyZ2luOiBwYXBlclByb3BlcnR5Q29tbW9uKCJ0b3AtbWFyZ2luIiksCiAgICAgIGJvdHRvbU1hcmdpbjogcGFwZXJQcm9wZXJ0eUNvbW1vbigiYm90dG9tLW1hcmdpbiIpLAogICAgICBsZWZ0TWFyZ2luOiBwYXBlclByb3BlcnR5Q29tbW9uKCJsZWZ0LW1hcmdpbiIpLAogICAgICByaWdodE1hcmdpbjogcGFwZXJQcm9wZXJ0eUNvbW1vbigicmlnaHQtbWFyZ2luIiksCiAgICAgIHN5c3RlbVNwYWNpbmc6IHBhcGVyUHJvcGVydHlTY2hlbWVUb2tlbigic3lzdGVtLXN5c3RlbS1zcGFjaW5nLmJhc2ljLWRpc3RhbmNlIiksCiAgICAgIHRvcE1hcmt1cFNwYWNpbmc6IHBhcGVyUHJvcGVydHlTY2hlbWVUb2tlbigidG9wLW1hcmt1cC1zcGFjaW5nLmJhc2ljLWRpc3RhbmNlIiksCiAgICAgIHJhZ2dlZExhc3Q6IHBhcGVyUHJvcGVydHlTY2hlbWVUb2tlbigicmFnZ2VkLWxhc3QiKSwKICAgICAgcmFnZ2VkQm90dG9tOiBwYXBlclByb3BlcnR5U2NoZW1lVG9rZW4oInJhZ2dlZC1ib3R0b20iKSwKICAgICAgcmFnZ2VkTGFzdEJvdHRvbTogcGFwZXJQcm9wZXJ0eVNjaGVtZVRva2VuKCJyYWdnZWQtbGFzdC1ib3R0b20iKSwKICAgICAgcHJpbnRQYWdlTnVtYmVyOiBwYXBlclByb3BlcnR5U2NoZW1lVG9rZW4oInByaW50LXBhZ2UtbnVtYmVyIiksCiAgICAgIC4uLmFzc2lnbm1lbnRUYWJsZQogICAgfTsKICAgIGlmIChyZWFkb25seSkgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChrZXkgPT4gYXR0cmlidXRlc1trZXldID0gYXR0cmlidXRlc1trZXldICYmIGF0dHJpYnV0ZXNba2V5XS52YWx1ZSk7CiAgICByZXR1cm4gYXR0cmlidXRlczsKICB9CiAgZ2xvYmFsQXR0cmlidXRlc1JlYWRPbmx5KCkgewogICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuZ2xvYmFsQXR0cmlidXRlcygpOwogICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChrZXkgPT4gYXR0cmlidXRlc1trZXldID0gYXR0cmlidXRlc1trZXldICYmIGF0dHJpYnV0ZXNba2V5XS52YWx1ZSk7CiAgICByZXR1cm4gYXR0cmlidXRlczsKICB9CiAgbWFya3VwKGRvY01hcmt1cCkgewogICAgLy8gY29weSBhdHRyaWJ1dGVzCiAgICBjb25zdCBhdHRyUyA9IHRoaXMuZ2xvYmFsQXR0cmlidXRlcygpOwogICAgY29uc3QgYXR0ck0gPSBkb2NNYXJrdXAuZ2xvYmFsQXR0cmlidXRlc1JlYWRPbmx5KCk7CiAgICBbInN0YWZmU2l6ZSIsICJtaWRpVGVtcG8iLCAicGFwZXJXaWR0aCIsICJwYXBlckhlaWdodCIsICJ0b3BNYXJnaW4iLCAiYm90dG9tTWFyZ2luIiwgImxlZnRNYXJnaW4iLCAicmlnaHRNYXJnaW4iLCAic3lzdGVtU3BhY2luZyIsICJ0b3BNYXJrdXBTcGFjaW5nIiwgInJhZ2dlZExhc3QiLCAicmFnZ2VkQm90dG9tIiwgInJhZ2dlZExhc3RCb3R0b20iLCAicHJpbnRQYWdlTnVtYmVyIl0uZm9yRWFjaChmaWVsZCA9PiB7CiAgICAgIGlmIChhdHRyTVtmaWVsZF0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmICh0eXBlb2YgYXR0clNbZmllbGRdLnZhbHVlID09PSAib2JqZWN0IiAmJiBhdHRyU1tmaWVsZF0udmFsdWUgJiYgYXR0clNbZmllbGRdLnZhbHVlLnNldCkgYXR0clNbZmllbGRdLnZhbHVlLnNldChhdHRyTVtmaWVsZF0pO2Vsc2UgYXR0clNbZmllbGRdLnZhbHVlID0gYXR0ck1bZmllbGRdOwogICAgICB9CiAgICB9KTsKICAgIC8vIGV4ZWN1dGUgY29tbWFuZHMgbGlzdAogICAgY29uc3QgY29tbWFuZHMgPSBkb2NNYXJrdXAucm9vdC5nZXRGaWVsZCgiTG90dXNDb21tYW5kcyIpOwogICAgY29uc3QgY21kTGlzdCA9IGNvbW1hbmRzICYmIGNvbW1hbmRzLnZhbHVlICYmIGNvbW1hbmRzLnZhbHVlLmFyZ3MgJiYgY29tbWFuZHMudmFsdWUuYXJnc1swXS5ib2R5OwogICAgaWYgKGNtZExpc3QgJiYgQXJyYXkuaXNBcnJheShjbWRMaXN0KSkgewogICAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY21kTGlzdCkgewogICAgICAgIGlmIChjb21tYW5kLmV4cCAmJiB0aGlzW2NvbW1hbmQuZXhwXSkgdGhpc1tjb21tYW5kLmV4cF0oKTtlbHNlIGNvbnNvbGUud2FybigidW5leHBlY3RlZCBtYXJrdXAgY29tbWFuZDoiLCBjb21tYW5kKTsKICAgICAgfQogICAgfQogICAgLy8gY29weSBMb3R1c09wdGlvbiBhc3NpZ25tZW50cwogICAgY29uc3QgYXNzaWdubWVudHMgPSBkb2NNYXJrdXAucm9vdC5lbnRyaWVzLmZpbHRlcih0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBBc3NpZ25tZW50ICYmIC9eTG90dXNPcHRpb25cLi4rLy50ZXN0KHRlcm0ua2V5LnRvU3RyaW5nKCkpKTsKICAgIGFzc2lnbm1lbnRzLmZvckVhY2goYXNzaWdubWVudCA9PiB0aGlzLnJvb3Quc2VjdGlvbnMucHVzaChhc3NpZ25tZW50LmNsb25lKCkpKTsKICAgIC8vIGNvcHkgc2NvcmUgYmxvY2tzCiAgICBjb25zdCBsYXlvdXRCb2R5ID0gW107CiAgICBjb25zdCBtaWRpQm9keSA9IFtdOwogICAgY29uc3Qgc2NvcmUgPSBkb2NNYXJrdXAucm9vdC5nZXRCbG9jaygic2NvcmUiKTsKICAgIGlmIChzY29yZSkgewogICAgICBjb25zdCBsYXlvdXQgPSBzY29yZS5ib2R5LmZpbmQodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQmxvY2sgJiYgdGVybS5oZWFkID09PSAiXFxsYXlvdXQiKTsKICAgICAgaWYgKGxheW91dCkgbGF5b3V0LmJvZHkuZm9yRWFjaCh0ZXJtID0+IGxheW91dEJvZHkucHVzaCh0ZXJtLmNsb25lKCkpKTsKICAgICAgY29uc3QgbWlkaSA9IHNjb3JlLmJvZHkuZmluZCh0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBCbG9jayAmJiB0ZXJtLmhlYWQgPT09ICJcXG1pZGkiKTsKICAgICAgaWYgKG1pZGkpIG1pZGkuYm9keS5mb3JFYWNoKHRlcm0gPT4gbWlkaUJvZHkucHVzaCh0ZXJtLmNsb25lKCkpKTsKICAgIH0KICAgIGlmIChsYXlvdXRCb2R5Lmxlbmd0aCB8fCBtaWRpQm9keS5sZW5ndGgpIHsKICAgICAgY29uc3QgdGhpc1Njb3JlID0gdGhpcy5yb290LmdldEJsb2NrKCJzY29yZSIpOwogICAgICBpZiAodGhpc1Njb3JlKSB7CiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpc1Njb3JlLmJvZHkuZmluZCh0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBCbG9jayAmJiB0ZXJtLmhlYWQgPT09ICJcXGxheW91dCIpOwogICAgICAgIGlmIChsYXlvdXQpIGxheW91dC5ib2R5LnB1c2goLi4ubGF5b3V0Qm9keSk7CiAgICAgICAgY29uc3QgbWlkaSA9IHRoaXNTY29yZS5ib2R5LmZpbmQodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQmxvY2sgJiYgdGVybS5oZWFkID09PSAiXFxtaWRpIik7CiAgICAgICAgaWYgKG1pZGkpIG1pZGkuYm9keS5wdXNoKC4uLm1pZGlCb2R5KTsKICAgICAgfQogICAgfQogIH0KICBnZXRWYXJpYWJsZXMoKSB7CiAgICByZXR1cm4gbmV3IFNldCh0aGlzLnJvb3QuZmluZEFsbChWYXJpYWJsZSkubWFwKHZhcmlhYmxlID0+IHZhcmlhYmxlLm5hbWUpKTsKICB9CiAgLy8gZGVwcmVjYXRlZAogIGdldE11c2ljVHJhY2tzKHsKICAgIGV4cGFuZCA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBjb25zdCBzY29yZSA9IHRoaXMucm9vdC5nZXRCbG9jaygic2NvcmUiKTsKICAgIGlmICghc2NvcmUpIHJldHVybiBudWxsOwogICAgbGV0IHRyYWNrcyA9IFtdOwogICAgLy8gZXh0cmFjdCBzZXF1ZW50aWFsIG11c2ljIGJsb2NrcyBmcm9tIHNjb3JlIGJsb2NrCiAgICBzY29yZS5mb3JFYWNoVG9wVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiB7CiAgICAgIHRyYWNrcy5wdXNoKGJsb2NrKTsKICAgIH0pOwogICAgLy8gZXhwYW5kIHZhcmlhYmxlcyBpbiB0cmFja3MKICAgIGlmIChleHBhbmQpIHRyYWNrcyA9IHRyYWNrcy5tYXAodHJhY2sgPT4gdHJhY2suY2xvbmUoKS5leHBhbmRWYXJpYWJsZXModGhpcy5yb290KSk7CiAgICByZXR1cm4gdHJhY2tzOwogIH0KICBnZXRMb2NhdGlvblRpY2tUYWJsZSgpIHsKICAgIGNvbnN0IG5vdGVzID0gdGhpcy5yb290LmZpbmRBbGwodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQ2hvcmRFbGVtZW50IHx8IHRlcm0gaW5zdGFuY2VvZiBNdXNpY0V2ZW50KTsKICAgIHJldHVybiBub3Rlcy5yZWR1Y2UoKHRhYmxlLCBub3RlKSA9PiB7CiAgICAgIGlmIChub3RlLl9sb2NhdGlvbiAmJiBOdW1iZXIuaXNGaW5pdGUobm90ZS5fdGljaykpIHRhYmxlW2Ake25vdGUuX2xvY2F0aW9uLmxpbmVzWzBdfToke25vdGUuX2xvY2F0aW9uLmNvbHVtbnNbMF19YF0gPSBub3RlLl90aWNrOwogICAgICByZXR1cm4gdGFibGU7CiAgICB9LCB7fSk7CiAgfQogIC8vIHVwZGF0ZSB0ZXJtcycgX2xvY2F0aW9uIGRhdGEgYWNjb3JkaW5nIHRvIGEgc2VyaWFsaXplZCBzb3VyY2UKICByZWxvY2F0ZShzb3VyY2UgPSB0aGlzLnRvU3RyaW5nKCkpIHsKICAgIHRoaXMucm9vdC5yZWxvY2F0ZShzb3VyY2UpOwogIH0KICBhcHBlbmRJbmNsdWRlRmlsZShmaWxlbmFtZSkgewogICAgaWYgKCF0aGlzLnJvb3QuaW5jbHVkZUZpbGVzLmluY2x1ZGVzKGZpbGVuYW1lKSkgewogICAgICBjb25zdCB2ZXJzaW9uUG9zID0gdGhpcy5yb290LnNlY3Rpb25zLmZpbmRJbmRleCh0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBWZXJzaW9uKTsKICAgICAgdGhpcy5yb290LnNlY3Rpb25zLnNwbGljZSh2ZXJzaW9uUG9zICsgMSwgMCwgbmV3IEluY2x1ZGUoewogICAgICAgIGNtZDogImluY2x1ZGUiLAogICAgICAgIGFyZ3M6IFtMaXRlcmFsU3RyaW5nLmZyb21TdHJpbmcoZmlsZW5hbWUpXQogICAgICB9KSk7CiAgICB9CiAgfQogIHJlbW92ZVN0YWZmR3JvdXAoKSB7CiAgICBjb25zdCBzY29yZSA9IHRoaXMucm9vdC5nZXRCbG9jaygic2NvcmUiKTsKICAgIGlmIChzY29yZSkgewogICAgICBzY29yZS5ib2R5LmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaW11bHRhbmVvdXNMaXN0KSBpdGVtLnJlbW92ZVN0YWZmR3JvdXAoKTsKICAgICAgfSk7CiAgICB9CiAgfQogIGZpeFRpbnlUcmlsbFNwYW5zKCkgewogICAgLy8gVE9ETzogcmVwbGFjZSBzdWNjZXNzaXZlIFxzdGFydFRyaWxsU3BhbiAmIFxzdG9wVHJpbGxTcGFuIHdpdGggXlx0cmlsbAogIH0KICByZW1vdmVNdXNpY0NvbW1hbmRzKGNtZHMpIHsKICAgIGNtZHMgPSBBcnJheS5pc0FycmF5KGNtZHMpID8gY21kcyA6IFtjbWRzXTsKICAgIGNvbnN0IGlzVG9SZW1vdmVkID0gaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgQ29tbWFuZCAmJiBjbWRzLmluY2x1ZGVzKGl0ZW0uY21kKTsKICAgIHRoaXMucm9vdC5mb3JFYWNoVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiB7CiAgICAgIGJsb2NrLmJvZHkgPSBibG9jay5ib2R5LmZpbHRlcihpdGVtID0+ICFpc1RvUmVtb3ZlZChpdGVtKSk7CiAgICB9KTsKICB9CiAgcmVtb3ZlVHJpbGxTcGFucygpIHsKICAgIHRoaXMucmVtb3ZlTXVzaWNDb21tYW5kcyhbInN0YXJ0VHJpbGxTcGFuIiwgInN0b3BUcmlsbFNwYW4iXSk7CiAgfQogIHJlbW92ZUJyZWFrcygpIHsKICAgIHRoaXMucmVtb3ZlTXVzaWNDb21tYW5kcygiYnJlYWsiKTsKICB9CiAgcmVtb3ZlUGFnZUJyZWFrcygpIHsKICAgIHRoaXMucmVtb3ZlTXVzaWNDb21tYW5kcygicGFnZUJyZWFrIik7CiAgfQogIHNjb3JlQnJlYWtCZWZvcmUoZW5hYmxlZCA9IHRydWUpIHsKICAgIGNvbnN0IHNjb3JlID0gdGhpcy5yb290LmdldEJsb2NrKCJzY29yZSIpOwogICAgaWYgKHNjb3JlKSB7CiAgICAgIGxldCBoZWFkZXIgPSBzY29yZS5lbnRyaWVzLmZpbmQoZW50cnkgPT4gZW50cnkuaGVhZCA9PT0gIlxcaGVhZGVyIik7CiAgICAgIGlmICghaGVhZGVyKSB7CiAgICAgICAgaGVhZGVyID0gbmV3IEJsb2NrKHsKICAgICAgICAgIGhlYWQ6ICJcXGhlYWRlciIsCiAgICAgICAgICBib2R5OiBbXQogICAgICAgIH0pOwogICAgICAgIHNjb3JlLmJvZHkucHVzaChoZWFkZXIpOwogICAgICB9CiAgICAgIGxldCBicmVha2JlZm9yZSA9IGhlYWRlci5nZXRGaWVsZCgiYnJlYWtiZWZvcmUiKTsKICAgICAgaWYgKGJyZWFrYmVmb3JlKSBicmVha2JlZm9yZSA9IGJyZWFrYmVmb3JlLnZhbHVlO2Vsc2UgewogICAgICAgIGJyZWFrYmVmb3JlID0gbmV3IFNjaGVtZSh7CiAgICAgICAgICBleHA6IHRydWUKICAgICAgICB9KTsKICAgICAgICBoZWFkZXIuYm9keS5wdXNoKG5ldyBBc3NpZ25tZW50KHsKICAgICAgICAgIGtleTogImJyZWFrYmVmb3JlIiwKICAgICAgICAgIHZhbHVlOiBicmVha2JlZm9yZQogICAgICAgIH0pKTsKICAgICAgfQogICAgICBicmVha2JlZm9yZS5leHAgPSBlbmFibGVkOwogICAgfSBlbHNlIGNvbnNvbGUud2Fybigibm8gc2NvcmUgYmxvY2siKTsKICB9CiAgdW5mb2xkUmVwZWF0cygpIHsKICAgIGNvbnN0IHNjb3JlID0gdGhpcy5yb290LmdldEJsb2NrKCJzY29yZSIpOwogICAgY29uc3QgbXVzaWNMaXN0ID0gc2NvcmUgPyBzY29yZS5ib2R5IDogdGhpcy5yb290LnNlY3Rpb25zOwogICAgbGV0IGNvdW50ID0gMDsKICAgIG11c2ljTGlzdC5mb3JFYWNoKCh0ZXJtLCBpKSA9PiB7CiAgICAgIGlmICh0ZXJtLmlzTXVzaWMgJiYgdGVybS5jbWQgIT09ICJ1bmZvbGRSZXBlYXRzIikgewogICAgICAgIGNvbnN0IHVuZm9sZCA9IG5ldyBDb21tYW5kKHsKICAgICAgICAgIGNtZDogInVuZm9sZFJlcGVhdHMiLAogICAgICAgICAgYXJnczogW3Rlcm1dCiAgICAgICAgfSk7CiAgICAgICAgbXVzaWNMaXN0LnNwbGljZShpLCAxLCB1bmZvbGQpOwogICAgICAgICsrY291bnQ7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKCFjb3VudCkgY29uc29sZS53YXJuKCJubyBtdXNpYyB0ZXJtIHRvIHVuZm9sZCIpOwogICAgcmV0dXJuIGNvdW50OwogIH0KICBjb250YWluc1JlcGVhdCgpIHsKICAgIGNvbnN0IHRlcm1Db250YWluc1JlcGVhdCA9IHRlcm0gPT4gewogICAgICBpZiAoIXRlcm0uZW50cmllcykgcmV0dXJuIGZhbHNlOwogICAgICBjb25zdCBzdWJUZXJtcyA9IHRlcm0uZW50cmllcy5maWx0ZXIodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQmFzZVRlcm0pOwogICAgICBmb3IgKGNvbnN0IHRlcm0gb2Ygc3ViVGVybXMpIHsKICAgICAgICBpZiAodGVybS5jbWQgPT09ICJyZXBlYXQiKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IHRlcm0gb2Ygc3ViVGVybXMpIHsKICAgICAgICBpZiAodGVybUNvbnRhaW5zUmVwZWF0KHRlcm0pKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgcmV0dXJuIHRlcm1Db250YWluc1JlcGVhdCh0aGlzLnJvb3QpOwogIH0KICByZW1vdmVFbXB0eVN1Yk11c2ljQmxvY2tzKCkgewogICAgdGhpcy5yb290LmZvckVhY2hUZXJtKE11c2ljQmxvY2ssIGJsb2NrID0+IHsKICAgICAgYmxvY2suYm9keSA9IGJsb2NrLmJvZHkuZmlsdGVyKHRlcm0gPT4gISh0ZXJtIGluc3RhbmNlb2YgTXVzaWNCbG9jayAmJiB0ZXJtLmJvZHkubGVuZ3RoID09PSAwKSk7CiAgICB9KTsKICB9CiAgbWVyZ2VDb250aW51b3VzR3JhY2VzKCkgewogICAgdGhpcy5yZW1vdmVFbXB0eVN1Yk11c2ljQmxvY2tzKCk7CiAgICBjb25zdCBpc0dyYWNlQ29tbWFuZCA9IHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIEdyYWNlOwogICAgY29uc3QgaXNHcmFjZUlubmVyVGVybSA9IHRlcm0gPT4gaXNHcmFjZUNvbW1hbmQodGVybSkgfHwgdGVybSBpbnN0YW5jZW9mIERpdmlkZSB8fCB0ZXJtIGluc3RhbmNlb2YgUG9zdEV2ZW50OwogICAgdGhpcy5yb290LmZvckVhY2hUZXJtKE11c2ljQmxvY2ssIGJsb2NrID0+IHsKICAgICAgY29uc3QgZ3JvdXBzID0gW107CiAgICAgIGxldCBjdXJyZW50R3JvdXAgPSBudWxsOwogICAgICBibG9jay5ib2R5LmZvckVhY2goKHRlcm0sIGkpID0+IHsKICAgICAgICBpZiAoY3VycmVudEdyb3VwKSB7CiAgICAgICAgICBpZiAoaXNHcmFjZUlubmVyVGVybSh0ZXJtKSkgewogICAgICAgICAgICBjdXJyZW50R3JvdXAuY291bnQrKzsKICAgICAgICAgICAgaWYgKGN1cnJlbnRHcm91cC5jb3VudCA9PT0gMikgZ3JvdXBzLnB1c2goY3VycmVudEdyb3VwKTsKICAgICAgICAgIH0gZWxzZSBjdXJyZW50R3JvdXAgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaXNHcmFjZUNvbW1hbmQodGVybSkpIGN1cnJlbnRHcm91cCA9IHsKICAgICAgICAgICAgc3RhcnQ6IGksCiAgICAgICAgICAgIGNvdW50OiAxCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICBncm91cHMuZm9yRWFjaChncm91cCA9PiB7CiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGdyb3VwLnN0YXJ0ICsgb2Zmc2V0OwogICAgICAgIGNvbnN0IG1haW5Cb2R5ID0gbmV3IE11c2ljQmxvY2soewogICAgICAgICAgYm9keTogW10KICAgICAgICB9KTsKICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHN0YXJ0SW5kZXggKyBncm91cC5jb3VudDsgKytpKSB7CiAgICAgICAgICBjb25zdCB0ZXJtID0gYmxvY2suYm9keVtpXTsKICAgICAgICAgIGNvbnN0IG11c2ljID0gaXNHcmFjZUNvbW1hbmQodGVybSkgPyB0ZXJtLmFyZ3NbMF0gOiB0ZXJtOwogICAgICAgICAgaWYgKG11c2ljIGluc3RhbmNlb2YgTXVzaWNCbG9jaykgbWFpbkJvZHkuYm9keS5wdXNoKC4uLm11c2ljLmJvZHkpO2Vsc2UgbWFpbkJvZHkuYm9keS5wdXNoKG11c2ljKTsKICAgICAgICB9CiAgICAgICAgYmxvY2suYm9keVtzdGFydEluZGV4XS5hcmdzWzBdID0gbWFpbkJvZHk7CiAgICAgICAgYmxvY2suYm9keS5zcGxpY2Uoc3RhcnRJbmRleCArIDEsIGdyb3VwLmNvdW50IC0gMSk7CiAgICAgICAgb2Zmc2V0IC09IGdyb3VwLmNvdW50IC0gMTsKICAgICAgfSk7CiAgICB9KTsKICB9CiAgbWVyZ2VDb250aW51b3VzRW1wdHlBZnRlckdyYWNlcygpIHsKICAgIGNvbnN0IGlzRW1wdHlBZnRlckdyYWNlID0gdGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQWZ0ZXJHcmFjZSAmJiB0ZXJtLmFyZ3NbMF0gaW5zdGFuY2VvZiBNdXNpY0Jsb2NrICYmIHRlcm0uYXJnc1swXS5ib2R5Lmxlbmd0aCA9PT0gMDsKICAgIGNvbnN0IGlzR3JhY2VJbm5lclRlcm0gPSB0ZXJtID0+IGlzRW1wdHlBZnRlckdyYWNlKHRlcm0pIHx8IHRlcm0gaW5zdGFuY2VvZiBEaXZpZGUgfHwgdGVybSBpbnN0YW5jZW9mIFBvc3RFdmVudDsKICAgIHRoaXMucm9vdC5mb3JFYWNoVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiB7CiAgICAgIGNvbnN0IGdyb3VwcyA9IFtdOwogICAgICBsZXQgY3VycmVudEdyb3VwID0gbnVsbDsKICAgICAgYmxvY2suYm9keS5mb3JFYWNoKCh0ZXJtLCBpKSA9PiB7CiAgICAgICAgaWYgKGN1cnJlbnRHcm91cCkgewogICAgICAgICAgaWYgKGlzR3JhY2VJbm5lclRlcm0odGVybSkpIHsKICAgICAgICAgICAgY3VycmVudEdyb3VwLmNvdW50Kys7CiAgICAgICAgICAgIGlmIChjdXJyZW50R3JvdXAuY291bnQgPT09IDIpIGdyb3Vwcy5wdXNoKGN1cnJlbnRHcm91cCk7CiAgICAgICAgICB9IGVsc2UgY3VycmVudEdyb3VwID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGlzRW1wdHlBZnRlckdyYWNlKHRlcm0pKSBjdXJyZW50R3JvdXAgPSB7CiAgICAgICAgICAgIHN0YXJ0OiBpLAogICAgICAgICAgICBjb3VudDogMQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgZ3JvdXBzLmZvckVhY2goZ3JvdXAgPT4gewogICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBncm91cC5zdGFydCArIG9mZnNldDsKICAgICAgICBjb25zdCBtYWluQm9keSA9IG5ldyBNdXNpY0Jsb2NrKHsKICAgICAgICAgIGJvZHk6IFtdCiAgICAgICAgfSk7CiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBzdGFydEluZGV4ICsgZ3JvdXAuY291bnQ7ICsraSkgewogICAgICAgICAgY29uc3QgdGVybSA9IGJsb2NrLmJvZHlbaV07CiAgICAgICAgICBjb25zdCBtdXNpYyA9IGlzRW1wdHlBZnRlckdyYWNlKHRlcm0pID8gdGVybS5hcmdzWzFdIDogdGVybTsKICAgICAgICAgIGlmIChtdXNpYyBpbnN0YW5jZW9mIE11c2ljQmxvY2spIG1haW5Cb2R5LmJvZHkucHVzaCguLi5tdXNpYy5ib2R5KTtlbHNlIG1haW5Cb2R5LmJvZHkucHVzaChtdXNpYyk7CiAgICAgICAgfQogICAgICAgIGJsb2NrLmJvZHlbc3RhcnRJbmRleF0uYXJnc1sxXSA9IG1haW5Cb2R5OwogICAgICAgIGJsb2NrLmJvZHkuc3BsaWNlKHN0YXJ0SW5kZXggKyAxLCBncm91cC5jb3VudCAtIDEpOwogICAgICAgIG9mZnNldCAtPSBncm91cC5jb3VudCAtIDE7CiAgICAgIH0pOwogICAgfSk7CiAgfQogIGZpeEludmFsaWRLZXlzKG1vZGUgPSAibWFqb3IiKSB7CiAgICB0aGlzLnJvb3QuZm9yRWFjaFRlcm0oQ29tbWFuZCwgY21kID0+IHsKICAgICAgaWYgKGNtZC5jbWQgPT09ICJrZXkiKSB7CiAgICAgICAgaWYgKGNtZC5hcmdzWzFdID09PSAiXFxub25lIikgY21kLmFyZ3NbMV0gPSAiXFwiICsgbW9kZTsKICAgICAgfQogICAgfSk7CiAgfQogIGZpeEludmFsaWRCcmllZkNob3JkcygpIHsKICAgIHRoaXMucm9vdC5mb3JFYWNoVGVybShCcmllZkNob3JkLCBjaG9yZCA9PiB7CiAgICAgIGNvbnN0IGl0ZW1zID0gY2hvcmQuYm9keS5pdGVtczsKICAgICAgaWYgKGl0ZW1zKSB7CiAgICAgICAgLy8gbWVyZ2UgbXVsdGlwbGUgXiBpdGVtcwogICAgICAgIHdoaWxlIChpdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtID09PSAiXiIpLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMubGFzdEluZGV4T2YoIl4iKTsKICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSwgIi4iKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KICBmaXhJbnZhbGlkTWFya3VwV29yZHMoKSB7CiAgICB0aGlzLnJvb3QuZm9yRWFjaFRlcm0oTWFya3VwQ29tbWFuZCwgY21kID0+IHsKICAgICAgLy9jb25zb2xlLmxvZygibWFya3VwOiIsIGNtZCk7CiAgICAgIGNtZC5mb3JFYWNoVGVybShJbmxpbmVCbG9jaywgYmxvY2sgPT4gewogICAgICAgIC8vIHJlcGxhY2Ugc2NoZW1lIGV4cHJlc3Npb24gYnkgbGl0ZXJhbCBzdHJpbmcKICAgICAgICBibG9jay5ib2R5ID0gYmxvY2suYm9keS5tYXAodGVybSA9PiB7CiAgICAgICAgICBpZiAodGVybSBpbnN0YW5jZW9mIFNjaGVtZSkgcmV0dXJuIExpdGVyYWxTdHJpbmcuZnJvbVN0cmluZyh0ZXJtLmpvaW4oKS5yZXBsYWNlKC9ccyskLywgIiIpKTsKICAgICAgICAgIGlmICh0eXBlb2YgdGVybSA9PT0gInN0cmluZyIgJiYgdGVybS5pbmNsdWRlcygiJCIpKSByZXR1cm4gTGl0ZXJhbFN0cmluZy5mcm9tU3RyaW5nKHRlcm0pOwogICAgICAgICAgcmV0dXJuIHRlcm07CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgfQogIGZpeE5lc3RlZFJlcGVhdCgpIHsKICAgIC8vIFxyZXBlYXQgeyBccmVwZWF0IHsgUDEgfSBcYWx0ZXJuYXRpdmUgeyB7UDJ9IH0gfSBcYWx0ZXJuYXRpdmUgeyB7UDN9IH0KICAgIC8vIC0+CiAgICAvLyBccmVwZWF0IHsgUDEgfSBcYWx0ZXJuYXRpdmUgeyB7UDJ9IHtQM30gfQogICAgdGhpcy5yb290LmZvckVhY2hUZXJtKENvbW1hbmQsIGNtZCA9PiB7CiAgICAgIGlmIChjbWQuaXNSZXBlYXRXaXRoQWx0ZXJuYXRpdmUpIHsKICAgICAgICBjb25zdCBibG9jayA9IGNtZC5hcmdzWzJdOwogICAgICAgIGNvbnN0IGFsdGVybmF0aXZlID0gY21kLmFyZ3NbM10uYXJnc1swXTsKICAgICAgICBjb25zdCBsYXN0TXVzaWMgPSBibG9jay5ib2R5W2Jsb2NrLmJvZHkubGVuZ3RoIC0gMV07CiAgICAgICAgaWYgKGxhc3RNdXNpYyAmJiBsYXN0TXVzaWMuaXNSZXBlYXRXaXRoQWx0ZXJuYXRpdmUpIHsKICAgICAgICAgIGJsb2NrLmJvZHkuc3BsaWNlKGJsb2NrLmJvZHkubGVuZ3RoIC0gMSwgMSwgLi4ubGFzdE11c2ljLmFyZ3NbMl0uYm9keSk7CiAgICAgICAgICBhbHRlcm5hdGl2ZS5ib2R5ID0gWy4uLmxhc3RNdXNpYy5hcmdzWzNdLmFyZ3NbMF0uYm9keSwgLi4uYWx0ZXJuYXRpdmUuYm9keV07CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CiAgZml4RW1wdHlDb250ZXh0ZWRTdGFmZigpIHsKICAgIC8vIHN0YWZmLjEgPDwgPj4JCQkJc3RhZmYuMiA8PCB2b2ljZS4xIHt9IHZvaWNlLjIge30gPj4KICAgIC8vIC0+CiAgICAvLyBzdGFmZi4xIDw8IHZvaWNlLjEge30gPj4JCXN0YWZmLjIgPDwgdm9pY2UuMiB7fSA+PgogICAgY29uc3Qgc3ViTXVzaWNzID0gc2ltdWwgPT4gc2ltdWwubGlzdC5maWx0ZXIodGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQ29udGV4dGVkTXVzaWMpOwogICAgY29uc3Qgc2NvcmUgPSB0aGlzLnJvb3QuZ2V0QmxvY2soInNjb3JlIik7CiAgICBzY29yZS5mb3JFYWNoVGVybShTaW11bHRhbmVvdXNMaXN0LCBzaW11bCA9PiB7CiAgICAgIGNvbnN0IHN0YXZlcyA9IHNpbXVsLmxpc3QuZmlsdGVyKHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIENvbnRleHRlZE11c2ljICYmIHRlcm0uYm9keSBpbnN0YW5jZW9mIFNpbXVsdGFuZW91c0xpc3QpOwogICAgICBpZiAoc3RhdmVzLmxlbmd0aCA+IDEpIHsKICAgICAgICBjb25zdCBzdGFmZjEgPSBzdGF2ZXNbMF0uYm9keTsKICAgICAgICBjb25zdCBzdGFmZjIgPSBzdGF2ZXNbMV0uYm9keTsKICAgICAgICBpZiAoc3ViTXVzaWNzKHN0YWZmMSkubGVuZ3RoID09PSAwICYmIHN1Yk11c2ljcyhzdGFmZjIpLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RhZmYyLmxpc3QuZmluZEluZGV4KHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIENvbnRleHRlZE11c2ljKTsKICAgICAgICAgIGNvbnN0IFttdXNpY10gPSBzdGFmZjIubGlzdC5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgc3RhZmYxLmxpc3QucHVzaChtdXNpYyk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CiAgcmVtb3ZlRW1wdHlDb250ZXh0ZWRTdGFmZigpIHsKICAgIGNvbnN0IHN1Yk11c2ljcyA9IHNpbXVsID0+IHNpbXVsLmxpc3QuZmlsdGVyKHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIENvbnRleHRlZE11c2ljKTsKICAgIGNvbnN0IHNjb3JlID0gdGhpcy5yb290LmdldEJsb2NrKCJzY29yZSIpOwogICAgc2NvcmUuZm9yRWFjaFRlcm0oU2ltdWx0YW5lb3VzTGlzdCwgc2ltdWwgPT4gewogICAgICBzaW11bC5saXN0ID0gc2ltdWwubGlzdC5maWx0ZXIodGVybSA9PiAhKHRlcm0gaW5zdGFuY2VvZiBDb250ZXh0ZWRNdXNpYykgfHwgISh0ZXJtLmJvZHkgaW5zdGFuY2VvZiBTaW11bHRhbmVvdXNMaXN0KSB8fCBzdWJNdXNpY3ModGVybS5ib2R5KS5sZW5ndGggPiAwKTsKICAgIH0pOwogIH0KICByZWRpdmlkZSgpIHsKICAgIHRoaXMucm9vdC5mb3JFYWNoVG9wVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiBibG9jay5yZWRpdmlkZSgpKTsKICB9CiAgbWFrZU1JRElEZWRpY2F0ZWRTY29yZSgpIHsKICAgIGNvbnN0IGJsb2NrID0gdGhpcy5yb290LmZpbmRGaXJzdCh0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBCbG9jayAmJiB0ZXJtLmhlYWQgPT09ICJcXHNjb3JlIiAmJiB0ZXJtLmlzTUlESURlZGljYXRlZCk7CiAgICBpZiAoYmxvY2spIHJldHVybiBibG9jazsKICAgIGNvbnN0IHNjb3JlID0gdGhpcy5yb290LmdldEJsb2NrKCJzY29yZSIpOwogICAgY29uc3QgbmV3U2NvcmUgPSBzY29yZS5jbG9uZSgpOwogICAgbmV3U2NvcmUuYm9keSA9IG5ld1Njb3JlLmJvZHkuZmlsdGVyKHRlcm0gPT4gISh0ZXJtIGluc3RhbmNlb2YgQmxvY2sgJiYgdGVybS5oZWFkID09PSAiXFxsYXlvdXQiKSk7CiAgICBzY29yZS5ib2R5ID0gc2NvcmUuYm9keS5maWx0ZXIodGVybSA9PiAhKHRlcm0gaW5zdGFuY2VvZiBCbG9jayAmJiB0ZXJtLmhlYWQgPT09ICJcXG1pZGkiKSk7CiAgICB0aGlzLnJvb3Quc2VjdGlvbnMucHVzaChuZXdTY29yZSk7CiAgICByZXR1cm4gbmV3U2NvcmU7CiAgfQogIGV4Y2x1ZGVDaG9yZFRyYWNrc0Zyb21NSURJKCkgewogICAgLy8gaWYgdGhlcmUgaXMgY2hvcmQgbW9kZSBtdXNpYyBpbiBzY29yZSwgZHVwbGljYXRlIHNjb3JlIGJsb2NrIGFzIGEgZGVkaWNhdGVkIE1JREkgc2NvcmUgd2hpY2ggZXhjbHVkZXMgY2hvcmQgbW9kZSBtdXNpYy4KICAgIGxldCBjb250YWlucyA9IGZhbHNlOwogICAgY29uc3QgaXNDaG9yZE11c2ljID0gdGVybSA9PiB0ZXJtIGluc3RhbmNlb2YgQ29udGV4dGVkTXVzaWMgJiYgdGVybS5oZWFkIGluc3RhbmNlb2YgQ29tbWFuZCAmJiB0ZXJtLmhlYWQuYXJnc1swXSA9PT0gIkNob3JkTmFtZXMiOwogICAgY29uc3QgaXNCbG9jayA9IChoZWFkLCB0ZXJtKSA9PiB0ZXJtIGluc3RhbmNlb2YgQmxvY2sgJiYgdGVybS5oZWFkID09PSBoZWFkOwogICAgLy8gVE9ETzogbWlkaU11c2ljIGZvcmtlZCBpbiBpbnRlcnByZXRlciBpc3N1ZQogICAgLy90aGlzLmFic3RyYWN0TWFpblNjb3JlKCk7CiAgICBjb25zdCBzY29yZSA9IHRoaXMucm9vdC5nZXRCbG9jaygic2NvcmUiKTsKICAgIGNvbnN0IG5ld1Njb3JlID0gc2NvcmUuY2xvbmUoKTsKICAgIG5ld1Njb3JlLmZvckVhY2hUZXJtKFNpbXVsdGFuZW91c0xpc3QsIHNpbXVsID0+IHsKICAgICAgY29uc3QgdHJpbW1lZExpc3QgPSBzaW11bC5saXN0LmZpbHRlcih0ZXJtID0+ICFpc0Nob3JkTXVzaWModGVybSkpOwogICAgICBpZiAodHJpbW1lZExpc3QubGVuZ3RoIDwgc2ltdWwubGlzdC5sZW5ndGgpIHsKICAgICAgICBzaW11bC5saXN0ID0gdHJpbW1lZExpc3Q7CiAgICAgICAgY29udGFpbnMgPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIG5ld1Njb3JlLl9oZWFkQ29tbWVudCA9IENvbW1lbnQuY3JlYXRlU2luZ2xlKCIgbWlkaSBvdXRwdXQiKTsKICAgIGlmIChjb250YWlucykgewogICAgICBjb25zdCB0cmltbWVkQm9keSA9IHNjb3JlLmJvZHkuZmlsdGVyKHRlcm0gPT4gIWlzQmxvY2soIlxcbWlkaSIsIHRlcm0pKTsKICAgICAgaWYgKHRyaW1tZWRCb2R5Lmxlbmd0aCA8IHNjb3JlLmJvZHkubGVuZ3RoKSB7CiAgICAgICAgc2NvcmUuYm9keSA9IHRyaW1tZWRCb2R5OwogICAgICAgIG5ld1Njb3JlLmJvZHkgPSBuZXdTY29yZS5ib2R5LmZpbHRlcih0ZXJtID0+ICFpc0Jsb2NrKCJcXGxheW91dCIsIHRlcm0pKTsKICAgICAgICB0aGlzLnJvb3Quc2VjdGlvbnMucHVzaChuZXdTY29yZSk7CiAgICAgIH0KICAgIH0KICB9CiAgLy8gW2RlcHJlY2F0ZWRdCiAgLy8gZ2VuZXJhdGUgdGllZCBub3RlaGVhZCBsb2NhdGlvbiBjYW5kaWRhdGVzCiAgZ2V0VGllZE5vdGVMb2NhdGlvbnMoc291cmNlKSB7CiAgICBjb25zdCBjaG9yZFBhaXJzID0gW107CiAgICBjb25zdCBoYXNNdXNpY0Jsb2NrID0gdGVybSA9PiB7CiAgICAgIGlmICh0ZXJtIGluc3RhbmNlb2YgTXVzaWNCbG9jaykgcmV0dXJuIHRydWU7CiAgICAgIGlmICh0ZXJtIGluc3RhbmNlb2YgQ29tbWFuZCkgcmV0dXJuIHRlcm0uYXJncy5maWx0ZXIoYXJnID0+IGFyZyBpbnN0YW5jZW9mIE11c2ljQmxvY2spLmxlbmd0aCA+IDA7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICB0aGlzLnJvb3QuZm9yRWFjaFRlcm0oTXVzaWNCbG9jaywgYmxvY2sgPT4gewogICAgICBmb3IgKGNvbnN0IHZvaWNlIG9mIGJsb2NrLnZvaWNlcykgewogICAgICAgIGxldCBsYXN0Q2hvcmQgPSBudWxsOwogICAgICAgIGxldCB0eWluZyA9IGZhbHNlOwogICAgICAgIGxldCBhZnRlckJsb2NrID0gZmFsc2U7CiAgICAgICAgbGV0IGF0SGVhZCA9IHRydWU7CiAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiB2b2ljZS5ib2R5KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IHRlcm0gb2YgY2h1bmsudGVybXMpIHsKICAgICAgICAgICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBQcmltaXRpdmUgJiYgdGVybS5leHAgPT09ICJ+IikgewogICAgICAgICAgICAgIHR5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICBhZnRlckJsb2NrID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzTXVzaWNCbG9jayh0ZXJtKSkgewogICAgICAgICAgICAgIGFmdGVyQmxvY2sgPSB0cnVlOwogICAgICAgICAgICAgIHR5aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiYWZ0ZXJCbG9jazoiLCB0ZXJtKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXJtIGluc3RhbmNlb2YgQ2hvcmQpIHsKICAgICAgICAgICAgICBpZiAodHlpbmcgJiYgbGFzdENob3JkKSBjaG9yZFBhaXJzLnB1c2goW2xhc3RDaG9yZCwgdGVybV0pOwogICAgICAgICAgICAgIC8vIG1heWJlIHRoZXJlIGlzIGEgdGllIGF0IHRhaWwgb2YgdGhlIGxhc3QgYmxvY2sKICAgICAgICAgICAgICBlbHNlIGlmIChhZnRlckJsb2NrKSBjaG9yZFBhaXJzLnB1c2goW251bGwsIHRlcm1dKTsKICAgICAgICAgICAgICAvLyBtYXliZSB0aGVyZSBpcyBhIHRpZSBiZWZvcmUgdGhlIGN1cnJlbnQgYmxvY2sKICAgICAgICAgICAgICBlbHNlIGlmIChhdEhlYWQpIGNob3JkUGFpcnMucHVzaChbbnVsbCwgdGVybV0pOwogICAgICAgICAgICAgIC8vIFBFTkRJTkc6IG1heWJlIHNvbWUgdXNlci1kZWZpbmVkIGNvbW1hbmQgYmxvY2sgY29udGFpbnMgdGllIGF0IHRhaWwuCiAgICAgICAgICAgICAgYXRIZWFkID0gZmFsc2U7CiAgICAgICAgICAgICAgYWZ0ZXJCbG9jayA9IGZhbHNlOwogICAgICAgICAgICAgIHR5aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgbGFzdENob3JkID0gdGVybTsKICAgICAgICAgICAgICBpZiAodGVybS5wb3N0X2V2ZW50cykgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiB0ZXJtLnBvc3RfZXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIFBvc3RFdmVudCAmJiBldmVudC5hcmcgPT09ICJ+IikgdHlpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICAvL2NvbnNvbGUubG9nKCJjaG9yZFBhaXJzOiIsIGNob3JkUGFpcnMpOwogICAgY29uc3QgbG9jYXRpb25zID0gW107CiAgICBjaG9yZFBhaXJzLmZvckVhY2gocGFpciA9PiB7CiAgICAgIGNvbnN0IGZvcmVQaXRjaGVzID0gcGFpclswXSAmJiBuZXcgU2V0KHBhaXJbMF0ucGl0Y2hOYW1lcyk7CiAgICAgIGNvbnN0IGNob3JkU291cmNlID0gc291cmNlLnNsaWNlKHBhaXJbMV0uX2xvY2F0aW9uLmxpbmVzLCBwYWlyWzFdLl9sb2NhdGlvbi5jb2x1bW5zKTsKICAgICAgY29uc3QgcGl0Y2hDb2x1bW5zID0gVGV4dFNvdXJjZS5tYXRjaFBvc2l0aW9ucygvXHcrL2csIGNob3JkU291cmNlKTsKICAgICAgcGFpclsxXS5waXRjaE5hbWVzLm1hcCgocGl0Y2gsIGluZGV4KSA9PiAoewogICAgICAgIHBpdGNoLAogICAgICAgIGluZGV4CiAgICAgIH0pKS5maWx0ZXIoKHsKICAgICAgICBwaXRjaAogICAgICB9KSA9PiAhZm9yZVBpdGNoZXMgfHwgZm9yZVBpdGNoZXMuaGFzKHBpdGNoKSB8fCBwaXRjaCA9PT0gInEiKS5mb3JFYWNoKCh7CiAgICAgICAgaW5kZXgKICAgICAgfSkgPT4gbG9jYXRpb25zLnB1c2goW3BhaXJbMV0uX2xvY2F0aW9uLmxpbmVzWzBdLCBwYWlyWzFdLl9sb2NhdGlvbi5jb2x1bW5zWzBdICsgcGl0Y2hDb2x1bW5zW2luZGV4XV0pKTsKICAgIH0pOwogICAgcmV0dXJuIGxvY2F0aW9uczsKICB9CiAgLy8gZ2VuZXJhdGUgdGllZCBub3RlaGVhZCBsb2NhdGlvbiBjYW5kaWRhdGVzCiAgZ2V0VGllZE5vdGVMb2NhdGlvbnMyKCkgewogICAgY29uc3QgbG9jYXRpb25zID0gW107CiAgICB0aGlzLnJvb3QuZm9yRWFjaFRlcm0oQ2hvcmQsIGNob3JkID0+IGNob3JkLnBpdGNoZXMuZm9yRWFjaChwaXRjaCA9PiB7CiAgICAgIGlmIChwaXRjaC5fdGllZCkgbG9jYXRpb25zLnB1c2goW3BpdGNoLl9sb2NhdGlvbi5saW5lc1swXSwgcGl0Y2guX2xvY2F0aW9uLmNvbHVtbnNbMF1dKTsKICAgIH0pKTsKICAgIHJldHVybiBsb2NhdGlvbnM7CiAgfQogIGdldEJyaWVmQ2hvcmRMb2NhdGlvbnMoKSB7CiAgICBjb25zdCBsb2NhdGlvbnMgPSBbXTsKICAgIHRoaXMucm9vdC5mb3JFYWNoVGVybShCcmllZkNob3JkLCBjaG9yZCA9PiBsb2NhdGlvbnMucHVzaChbY2hvcmQuX2xvY2F0aW9uLmxpbmVzWzBdLCBjaG9yZC5fbG9jYXRpb24uY29sdW1uc1swXV0pKTsKICAgIHJldHVybiBsb2NhdGlvbnM7CiAgfQogIGdldEx5cmljTG9jYXRpb25zKCkgewogICAgY29uc3QgbG9jYXRpb25zID0gW107CiAgICB0aGlzLnJvb3QuZm9yRWFjaFRlcm0oTHlyaWMsIGx5cmljID0+IGxvY2F0aW9ucy5wdXNoKFtseXJpYy5fbG9jYXRpb24ubGluZXNbMF0sIGx5cmljLl9sb2NhdGlvbi5jb2x1bW5zWzBdXSkpOwogICAgcmV0dXJuIGxvY2F0aW9uczsKICB9CiAgLypyZW1vdmVBbG9uZVNwYWNlciAoKSB7CiAgICAgIHRoaXMucm9vdC5mb3JFYWNoVG9wVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiB7CiAgICAgICAgICBjb25zdCBhbG9uZVNwYWNlcnMgPSBjYyhibG9jay5tdXNpY0NodW5rcy5maWx0ZXIoY2h1bmsgPT4gY2h1bmsuc2l6ZSA9PT0gMSAmJiBjaHVuay50ZXJtc1swXS5pc1NwYWNlcikubWFwKGNodW5rID0+IGNodW5rLnRlcm1zKSk7CiAgICAgICAgICAvL2NvbnNvbGUubG9nKCJhbG9uZVNwYWNlcnM6IiwgYWxvbmVTcGFjZXJzLm1hcChzID0+IHMuX2xvY2F0aW9uKSk7CiAgICAgICAgICAgaWYgKGFsb25lU3BhY2Vycy5sZW5ndGgpIHsKICAgICAgICAgICAgICBjb25zdCByZW1vdmVJbkJsb2NrID0gYmxvY2sgPT4gYmxvY2suYm9keSA9IGJsb2NrLmJvZHkuZmlsdGVyKHRlcm0gPT4gIWFsb25lU3BhY2Vycy5pbmNsdWRlcyh0ZXJtKSk7CiAgICAgICAgICAgICAgIHJlbW92ZUluQmxvY2soYmxvY2spOwogICAgICAgICAgICAgIGJsb2NrLmZvckVhY2hUZXJtKE11c2ljQmxvY2ssIHJlbW92ZUluQmxvY2spOwogICAgICAgICAgfQogICAgICB9KTsKICB9Ki8KICB1bmZvbGREdXJhdGlvbk11bHRpcGxpZXJzKCkgewogICAgdGhpcy5yb290LmZvckVhY2hUZXJtKE11c2ljQmxvY2ssIGJsb2NrID0+IHsKICAgICAgYmxvY2sudW5mb2xkRHVyYXRpb25NdWx0aXBsaWVycygpOwogICAgfSk7CiAgfQogIGFwcGVuZE1JRElJbnN0cnVtZW50c0Zyb21OYW1lKCkgewogICAgY29uc3QgaXNTZXQgPSAodGVybSwga2V5UGF0dGVybikgPT4gdGVybSBpbnN0YW5jZW9mIENvbW1hbmQgJiYgdGVybS5jbWQgPT09ICJzZXQiICYmIGtleVBhdHRlcm4udGVzdCh0ZXJtLmFyZ3NbMF0ua2V5LnRvU3RyaW5nKCkpOwogICAgY29uc3QgYXBwZW5kID0gYm9keSA9PiB7CiAgICAgIGNvbnN0IG50SW5kZXggPSBib2R5LmZpbmRJbmRleCh0ZXJtID0+IGlzU2V0KHRlcm0sIC9cLmluc3RydW1lbnROYW1lLykpOwogICAgICBpZiAobnRJbmRleCA+PSAwICYmICFib2R5LnNvbWUodGVybSA9PiBpc1NldCh0ZXJtLCAvXC5taWRpSW5zdHJ1bWVudC8pKSkgewogICAgICAgIGNvbnN0IG5hbWVBc3NpZ24gPSBib2R5W250SW5kZXhdLmFyZ3NbMF07CiAgICAgICAgY29uc3Qga2V5ID0gbmFtZUFzc2lnbi5rZXkudG9TdHJpbmcoKS5yZXBsYWNlKC9cLmluc3RydW1lbnROYW1lLywgIi5taWRpSW5zdHJ1bWVudCIpOwogICAgICAgIGJvZHkuc3BsaWNlKG50SW5kZXggKyAxLCAwLCBDb21tYW5kLmNyZWF0ZVNldChrZXksIG5hbWVBc3NpZ24udmFsdWUpKTsKICAgICAgfQogICAgfTsKICAgIHRoaXMucm9vdC5mb3JFYWNoVG9wVGVybShCbG9jaywgYmxvY2sgPT4gewogICAgICBpZiAoYmxvY2suaGVhZCA9PT0gIlxcc2NvcmUiKSB7CiAgICAgICAgYmxvY2suZm9yRWFjaFRlcm0oU2ltdWx0YW5lb3VzTGlzdCwgc2ltdSA9PiBhcHBlbmQoc2ltdS5saXN0KSk7CiAgICAgICAgYmxvY2suZm9yRWFjaFRlcm0oTXVzaWNCbG9jaywgbXVzaWNCbG9jayA9PiBhcHBlbmQobXVzaWNCbG9jay5ib2R5KSk7CiAgICAgIH0KICAgIH0pOwogIH0KICB1c2VNaWRpSW5zdHJ1bWVudENoYW5uZWxNYXBwaW5nKCkgewogICAgdGhpcy5hcHBlbmRNSURJSW5zdHJ1bWVudHNGcm9tTmFtZSgpOwogICAgY29uc3QgbWlkaUJsb2NrID0gdGhpcy5yb290LmZpbmRGaXJzdCh0ZXJtID0+IHRlcm0gaW5zdGFuY2VvZiBCbG9jayAmJiB0ZXJtLmhlYWQgPT09ICJcXG1pZGkiKTsKICAgIGlmICghbWlkaUJsb2NrKSB7CiAgICAgIGNvbnNvbGUud2Fybigibm8gTUlESSBibG9jayBmb3VuZC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY2hhbm5lbE1hcHBpbmcgPSBtaWRpQmxvY2suZmluZEZpcnN0KHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIEFzc2lnbm1lbnQgJiYgdGVybS5rZXkgPT09ICJtaWRpQ2hhbm5lbE1hcHBpbmciKTsKICAgIGlmIChjaGFubmVsTWFwcGluZykgY2hhbm5lbE1hcHBpbmcudmFsdWUgPSBuZXcgU2NoZW1lKHsKICAgICAgZXhwOiBuZXcgU2NoZW1lUG9pbnRlcih7CiAgICAgICAgdmFsdWU6ICJpbnN0cnVtZW50IgogICAgICB9KQogICAgfSk7ZWxzZSB7CiAgICAgIG1pZGlCbG9jay5ib2R5LnB1c2gocGFyc2VSYXcoewogICAgICAgIHByb3RvOiAiQmxvY2siLAogICAgICAgIGJsb2NrOiAiY29udGV4dCIsCiAgICAgICAgaGVhZDogIlxcY29udGV4dCIsCiAgICAgICAgYm9keTogW3sKICAgICAgICAgIHByb3RvOiAiQ29tbWFuZCIsCiAgICAgICAgICBjbWQ6ICJTY29yZSIsCiAgICAgICAgICBhcmdzOiBbXQogICAgICAgIH0sIHsKICAgICAgICAgIHByb3RvOiAiQXNzaWdubWVudCIsCiAgICAgICAgICBrZXk6ICJtaWRpQ2hhbm5lbE1hcHBpbmciLAogICAgICAgICAgdmFsdWU6IHsKICAgICAgICAgICAgcHJvdG86ICJTY2hlbWUiLAogICAgICAgICAgICBleHA6IHsKICAgICAgICAgICAgICBwcm90bzogIlNjaGVtZVBvaW50ZXIiLAogICAgICAgICAgICAgIHZhbHVlOiAiaW5zdHJ1bWVudCIKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH1dCiAgICAgIH0pKTsKICAgIH0KICB9CiAgZm9ybWFsaXplKCkgewogICAgaWYgKCF0aGlzLnJvb3QuZmluZEZpcnN0KFZlcnNpb24pKSB0aGlzLnJvb3Quc2VjdGlvbnMudW5zaGlmdChWZXJzaW9uLmRlZmF1bHQpOwogICAgaWYgKCF0aGlzLnJvb3QuZmluZEZpcnN0KExhbmd1YWdlKSkgdGhpcy5yb290LnNlY3Rpb25zLnNwbGljZSgxLCAwLCBMYW5ndWFnZS5tYWtlKCJlbmdsaXNoIikpOwogICAgaWYgKCF0aGlzLnJvb3QuZ2V0QmxvY2soImhlYWRlciIpKSB0aGlzLnJvb3Quc2VjdGlvbnMuc3BsaWNlKDIsIDAsIG5ldyBCbG9jayh7CiAgICAgIGJsb2NrOiAiaGVhZGVyIiwKICAgICAgaGVhZDogIlxcaGVhZGVyIiwKICAgICAgYm9keTogW10KICAgIH0pKTsKICAgIGlmICghdGhpcy5yb290LmdldEJsb2NrKCJzY29yZSIpKSB7CiAgICAgIGNvbnN0IHRvcE11c2ljcyA9IHRoaXMucm9vdC5zZWN0aW9ucy5maWx0ZXIoc2VjdGlvbiA9PiBzZWN0aW9uLmlzTXVzaWMpOwogICAgICB0aGlzLnJvb3Quc2VjdGlvbnMgPSB0aGlzLnJvb3Quc2VjdGlvbnMuZmlsdGVyKHNlY3Rpb24gPT4gIXNlY3Rpb24uaXNNdXNpYyk7CiAgICAgIGNvbnN0IHNjb3JlID0gbmV3IEJsb2NrKHsKICAgICAgICBibG9jazogInNjb3JlIiwKICAgICAgICBoZWFkOiAiXFxzY29yZSIsCiAgICAgICAgYm9keTogWy4uLnRvcE11c2ljcywgbmV3IEJsb2NrKHsKICAgICAgICAgIGJsb2NrOiAic2NvcmUiLAogICAgICAgICAgaGVhZDogIlxcbGF5b3V0IiwKICAgICAgICAgIGJvZHk6IFtdCiAgICAgICAgfSksIG5ldyBCbG9jayh7CiAgICAgICAgICBibG9jazogInNjb3JlIiwKICAgICAgICAgIGhlYWQ6ICJcXG1pZGkiLAogICAgICAgICAgYm9keTogW10KICAgICAgICB9KV0KICAgICAgfSk7CiAgICAgIHRoaXMucm9vdC5zZWN0aW9ucy5wdXNoKHNjb3JlKTsKICAgIH0KICB9CiAgY29udmVydFN0YWZmVG9QaWFub1N0YWZmKCkgewogICAgY29uc3Qgc2NvcmUgPSB0aGlzLnJvb3QuZ2V0QmxvY2soInNjb3JlIik7CiAgICBpZiAoc2NvcmUpIHsKICAgICAgY29uc3QgcHN0YWZmID0gc2NvcmUuZmluZEZpcnN0KHRlcm0gPT4gdGVybSBpbnN0YW5jZW9mIENvbnRleHRlZE11c2ljICYmIHRlcm0uaGVhZC5jbWQgPT09ICJuZXciICYmIHRlcm0uaGVhZC5hcmdzWzBdID09PSAiU3RhZmYiKTsKICAgICAgaWYgKHBzdGFmZikgewogICAgICAgIHBzdGFmZi5oZWFkLmFyZ3NbMF0gPSAiUGlhbm9TdGFmZiI7CiAgICAgICAgaWYgKHBzdGFmZi5ib2R5IGluc3RhbmNlb2YgU2ltdWx0YW5lb3VzTGlzdCkgewogICAgICAgICAgcHN0YWZmLmJvZHkubGlzdCA9IFtdLmNvbmNhdCguLi5wc3RhZmYuYm9keS5saXN0Lm1hcCh0ZXJtID0+IHsKICAgICAgICAgICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBDb250ZXh0ZWRNdXNpYykgewogICAgICAgICAgICAgIGNvbnN0IHN1Yk11c2ljcyA9IHRlcm0ubGlzdC5maWx0ZXIoc3ViID0+IHN1YiBpbnN0YW5jZW9mIENvbnRleHRlZE11c2ljKTsKICAgICAgICAgICAgICByZXR1cm4gc3ViTXVzaWNzLm1hcChtdXNpYyA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBzdGFmZiA9IHRlcm0uY2xvbmUoKTsKICAgICAgICAgICAgICAgIHN0YWZmLmxpc3QgPSBbLi4udGVybS5saXN0LmZpbHRlcihzdWIgPT4gIShzdWIgaW5zdGFuY2VvZiBDb250ZXh0ZWRNdXNpYykpLCBtdXNpY107CiAgICAgICAgICAgICAgICBzdGFmZi5oZWFkLmNtZCA9ICJuZXciOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWZmOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgcmV0dXJuIFt0ZXJtXTsKICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgcHJ1bmVTdGVtRGlyZWN0aW9ucygpIHsKICAgIHRoaXMucm9vdC5mb3JFYWNoVGVybShNdXNpY0Jsb2NrLCBibG9jayA9PiB7CiAgICAgIGxldCBkaXJlY3Rpb24gPSBudWxsOwogICAgICBjb25zdCByZWR1bmRhbnRzID0gW107CiAgICAgIGJsb2NrLmJvZHkuZm9yRWFjaCh0ZXJtID0+IHsKICAgICAgICBpZiAodGVybSBpbnN0YW5jZW9mIFN0ZW1EaXJlY3Rpb24pIHsKICAgICAgICAgIGlmICh0ZXJtLmRpcmVjdGlvbiA9PT0gZGlyZWN0aW9uKSByZWR1bmRhbnRzLnB1c2godGVybSk7ZWxzZSBkaXJlY3Rpb24gPSB0ZXJtLmRpcmVjdGlvbjsKICAgICAgICB9IGVsc2UgaWYgKHRlcm0gaW5zdGFuY2VvZiBDb21tYW5kICYmIHRlcm0uZmluZEZpcnN0KE11c2ljQmxvY2spKSBkaXJlY3Rpb24gPSBudWxsOwogICAgICB9KTsKICAgICAgYmxvY2suYm9keSA9IGJsb2NrLmJvZHkuZmlsdGVyKHRlcm0gPT4gIXJlZHVuZGFudHMuaW5jbHVkZXModGVybSkpOwogICAgfSk7CiAgfQogIHJlbW92ZVJlcGVhdHMoKSB7CiAgICB0aGlzLnJvb3QuZm9yRWFjaFRlcm0oTXVzaWNCbG9jaywgYmxvY2sgPT4gYmxvY2suc3ByZWFkUmVwZWF0QmxvY2tzKCkpOwogIH0KICBhcnRpY3VsYXRlTUlESU91dHB1dCgpIHsKICAgIGNvbnN0IEFSVElDVUxBVEVfRklMRU5BTUUgPSAiYXJ0aWN1bGF0ZS1sb3R1cy5seSI7CiAgICB0aGlzLmFic3RyYWN0TWFpblNjb3JlKCk7CiAgICBjb25zdCBtaWRpU2NvcmUgPSB0aGlzLm1ha2VNSURJRGVkaWNhdGVkU2NvcmUoKTsKICAgIGlmICghdGhpcy5yb290LmluY2x1ZGVGaWxlcy5pbmNsdWRlcyhBUlRJQ1VMQVRFX0ZJTEVOQU1FKSkgewogICAgICBsZXQgcG9zID0gdGhpcy5yb290LnNlY3Rpb25zLmluZGV4T2YobWlkaVNjb3JlKTsKICAgICAgaWYgKHBvcyA8IDApIHBvcyA9IE1hdGgubWluKHRoaXMucm9vdC5zZWN0aW9ucy5sZW5ndGgsIDMpOwogICAgICB0aGlzLnJvb3Quc2VjdGlvbnMuc3BsaWNlKHBvcywgMCwgSW5jbHVkZS5jcmVhdGUoQVJUSUNVTEFURV9GSUxFTkFNRSkpOwogICAgfQogICAgbWlkaVNjb3JlLmJvZHkgPSBtaWRpU2NvcmUuYm9keS5tYXAodGVybSA9PiB7CiAgICAgIGlmICh0ZXJtLmlzTXVzaWMgJiYgISh0ZXJtIGluc3RhbmNlb2YgQ29tbWFuZCAmJiB0ZXJtLmNtZCA9PT0gImFydGljdWxhdGUiKSkgcmV0dXJuIG5ldyBDb21tYW5kKHsKICAgICAgICBjbWQ6ICJhcnRpY3VsYXRlIiwKICAgICAgICBhcmdzOiBbdGVybV0KICAgICAgfSk7CiAgICAgIHJldHVybiB0ZXJtOwogICAgfSk7CiAgfQogIHJlbW92ZUludmFsaWRFeHByZXNzaW9uc09uUmVzdHMoKSB7CiAgICBjb25zdCBpc0ludmFsaWRQb3N0RXZlbnQgPSBldmVudCA9PiBbIi4iLCAiISIsICJfIl0uaW5jbHVkZXMoZXZlbnQgaW5zdGFuY2VvZiBQb3N0RXZlbnQgPyBldmVudC5hcmcgOiBldmVudCk7CiAgICBsZXQgY291bnQgPSAwOwogICAgdGhpcy5yb290LmZvckVhY2hUZXJtKE11c2ljRXZlbnQsIHRlcm0gPT4gewogICAgICBpZiAodGVybS5pc1Jlc3QpIHsKICAgICAgICBpZiAodGVybS5wb3N0X2V2ZW50cy5zb21lKGlzSW52YWxpZFBvc3RFdmVudCkpIHsKICAgICAgICAgIHRlcm0ucG9zdF9ldmVudHMgPSB0ZXJtLnBvc3RfZXZlbnRzLmZpbHRlcihldmVudCA9PiAhaXNJbnZhbGlkUG9zdEV2ZW50KGV2ZW50KSk7CiAgICAgICAgICArK2NvdW50OwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY291bnQ7CiAgfQogIGFic3RyYWN0TWFpblNjb3JlKCkgewogICAgY29uc3Qgc2NvcmUgPSB0aGlzLnJvb3QuZ2V0QmxvY2soInNjb3JlIik7CiAgICBjb25zdCBtdXNpYyA9IHNjb3JlLmJvZHkuZmluZCh0ZXJtID0+IHRlcm0uaXNNdXNpYyk7CiAgICBpZiAobXVzaWMgJiYgIShtdXNpYyBpbnN0YW5jZW9mIFZhcmlhYmxlKSkgewogICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSB0aGlzLnJvb3Quc2VjdGlvbnMuaW5kZXhPZihzY29yZSk7CiAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBuZXcgQXNzaWdubWVudCh7CiAgICAgICAga2V5OiBNQUlOX1NDT1JFX05BTUUsCiAgICAgICAgdmFsdWU6IG11c2ljCiAgICAgIH0pOwogICAgICB0aGlzLnJvb3Quc2VjdGlvbnMuc3BsaWNlKHNlY3Rpb25JbmRleCwgMCwgYXNzaWdubWVudCk7CiAgICAgIHNjb3JlLmJvZHkgPSBzY29yZS5ib2R5Lm1hcCh0ZXJtID0+IHRlcm0gPT09IG11c2ljID8gbmV3IFZhcmlhYmxlKHsKICAgICAgICBuYW1lOiBNQUlOX1NDT1JFX05BTUUKICAgICAgfSkgOiB0ZXJtKTsKICAgIH0KICB9CiAgYWJzb2x1dGVCbG9ja3NUb1JlbGF0aXZlKCkgewogICAgdGhpcy5yb290LmZvckVhY2hUb3BUZXJtKEFzc2lnbm1lbnQsIGFzc2lnbm1lbnQgPT4gewogICAgICBpZiAoYXNzaWdubWVudC52YWx1ZSBpbnN0YW5jZW9mIE11c2ljQmxvY2spIHsKICAgICAgICBjb25zdCByZWxhdGl2ZSA9IGFzc2lnbm1lbnQudmFsdWUuYWJzb2x1dGVUb1JlbGF0aXZlKCk7CiAgICAgICAgaWYgKHJlbGF0aXZlKSBhc3NpZ25tZW50LnZhbHVlID0gcmVsYXRpdmU7CiAgICAgIH0KICAgIH0pOwogIH0KfQo7"},{"version":3,"names":["TextSource","LILY_STAFF_SIZE_DEFAULT","parseRaw","BaseTerm","Assignment","LiteralString","Command","Variable","MarkupCommand","Grace","AfterGrace","Include","Version","Block","InlineBlock","Scheme","Chord","BriefChord","Lyric","MusicBlock","SimultaneousList","ContextedMusic","Divide","Tempo","PostEvent","Primitive","ChordElement","MusicEvent","SchemePointer","Comment","Language","StemDirection","LilyInterpreter","MAIN_SCORE_NAME","LilyDocument","constructor","data","root","toString","join","interpret","useCached","cacheInterpreter","interpretDocument","globalAttributes","readonly","globalStaffSize","getField","header","getBlock","paper","layoutStaffSize","staffSize","sectionsDirty","sections","push","exp","proto","func","args","DEFAULT_PAPER_WIDTH","key","value","number","unit","DEFAULT_PAPER_HEIGHT","block","head","body","reorderSections","blockPropertyCommon","undefined","item","console","assert","filter","assign","paperPropertyCommon","paperPropertySchemeToken","midiBlock","scores","section","score","find","term","midiTempo","warn","assignments","entries","assignmentTable","reduce","table","query","headerFields","dict","field","attributes","paperWidth","paperHeight","topMargin","bottomMargin","leftMargin","rightMargin","systemSpacing","topMarkupSpacing","raggedLast","raggedBottom","raggedLastBottom","printPageNumber","Object","keys","forEach","globalAttributesReadOnly","markup","docMarkup","attrS","attrM","set","commands","cmdList","Array","isArray","command","test","assignment","clone","layoutBody","midiBody","layout","midi","length","thisScore","getVariables","Set","findAll","map","variable","name","getMusicTracks","expand","tracks","forEachTopTerm","track","expandVariables","getLocationTickTable","notes","note","_location","Number","isFinite","_tick","lines","columns","relocate","source","appendIncludeFile","filename","includeFiles","includes","versionPos","findIndex","splice","cmd","fromString","removeStaffGroup","fixTinyTrillSpans","removeMusicCommands","cmds","isToRemoved","forEachTerm","removeTrillSpans","removeBreaks","removePageBreaks","scoreBreakBefore","enabled","entry","breakbefore","unfoldRepeats","musicList","count","i","isMusic","unfold","containsRepeat","termContainsRepeat","subTerms","removeEmptySubMusicBlocks","mergeContinuousGraces","isGraceCommand","isGraceInnerTerm","groups","currentGroup","start","offset","group","startIndex","mainBody","music","mergeContinuousEmptyAfterGraces","isEmptyAfterGrace","fixInvalidKeys","mode","fixInvalidBriefChords","chord","items","index","lastIndexOf","fixInvalidMarkupWords","replace","fixNestedRepeat","isRepeatWithAlternative","alternative","lastMusic","fixEmptyContextedStaff","subMusics","simul","list","staves","staff1","staff2","removeEmptyContextedStaff","redivide","makeMIDIDedicatedScore","findFirst","isMIDIDedicated","newScore","excludeChordTracksFromMIDI","contains","isChordMusic","isBlock","trimmedList","_headComment","createSingle","trimmedBody","getTiedNoteLocations","chordPairs","hasMusicBlock","arg","voice","voices","lastChord","tying","afterBlock","atHead","chunk","terms","post_events","event","locations","pair","forePitches","pitchNames","chordSource","slice","pitchColumns","matchPositions","pitch","has","getTiedNoteLocations2","pitches","_tied","getBriefChordLocations","getLyricLocations","lyric","unfoldDurationMultipliers","appendMIDIInstrumentsFromName","isSet","keyPattern","append","ntIndex","some","nameAssign","createSet","simu","musicBlock","useMidiInstrumentChannelMapping","channelMapping","formalize","unshift","default","make","topMusics","convertStaffToPianoStaff","pstaff","concat","sub","staff","pruneStemDirections","direction","redundants","removeRepeats","spreadRepeatBlocks","articulateMIDIOutput","ARTICULATE_FILENAME","abstractMainScore","midiScore","pos","indexOf","Math","min","create","removeInvalidExpressionsOnRests","isInvalidPostEvent","isRest","sectionIndex","absoluteBlocksToRelative","relative","absoluteToRelative"],"sources":["/home/camus/work/lotus/node_modules/eslint-loader/index.js??ref--14-0!/home/camus/work/lotus/inc/lilyParser/lilyDocument.ts"],"sourcesContent":["\nimport TextSource from \"../textSource\";\nimport {LILY_STAFF_SIZE_DEFAULT} from \"../constants\";\nimport {\n\tparseRaw,\n\tBaseTerm, Assignment, LiteralString, Command, Variable, MarkupCommand, Grace, AfterGrace, Include, Version, Block, InlineBlock,\n\tScheme, Chord, BriefChord, Lyric, MusicBlock, SimultaneousList, ContextedMusic, Divide, Tempo, PostEvent, Primitive, ChordElement, MusicEvent,\n\tSchemePointer, Comment, Language, StemDirection,\n} from \"./lilyTerms\";\nimport LilyInterpreter from \"./lilyInterpreter\";\nimport {MAIN_SCORE_NAME, DocLocation} from \"./utils\";\n\n// eslint-disable-next-line\nimport {Root} from \"./lilyTerms\";\n\n\n\ntype AttributeValue = number | boolean | string | BaseTerm;\n\ninterface AttributeValueHandle {\n\tvalue: AttributeValue;\n};\n\n\nexport interface LilyDocumentAttribute {\n\t[key: string]: AttributeValueHandle\n};\n\nexport interface LilyDocumentAttributeReadOnly {\n\tstaffSize: number;\n\t[key: string]: AttributeValue\n};\n\n\n\nexport default class LilyDocument {\n\troot: Root;\n\n\tcacheInterpreter?: LilyInterpreter;\n\n\treservedVariables?: Set;\n\n\n\tconstructor (data: object) {\n\t\t//console.log(\"raw data:\", data);\n\t\tthis.root = parseRaw(data);\n\t}\n\n\n\ttoString () {\n\t\treturn this.root.join();\n\t\t//return this.root.serialize();\n\t}\n\n\n\tinterpret ({useCached = true} = {}): LilyInterpreter {\n\t\tif (!useCached || !this.cacheInterpreter) {\n\t\t\tthis.cacheInterpreter = new LilyInterpreter();\n\t\t\tthis.cacheInterpreter.interpretDocument(this);\n\t\t}\n\n\t\treturn this.cacheInterpreter;\n\t}\n\n\n\tglobalAttributes ({readonly = false} = {}): LilyDocumentAttribute | LilyDocumentAttributeReadOnly {\n\t\tconst globalStaffSize = this.root.getField(\"set-global-staff-size\");\n\t\tconst header = this.root.getBlock(\"header\");\n\t\tlet paper = this.root.getBlock(\"paper\");\n\t\tconst layoutStaffSize = paper && paper.getField(\"layout-set-staff-size\");\n\t\tlet staffSize = globalStaffSize || layoutStaffSize;\n\n\t\tif (!readonly) {\n\t\t\tlet sectionsDirty = false;\n\n\t\t\tif (!staffSize) {\n\t\t\t\tthis.root.sections.push(new Scheme({exp: {proto: \"SchemeFunction\", func: \"set-global-staff-size\", args: [LILY_STAFF_SIZE_DEFAULT]}}));\n\t\t\t\tstaffSize = this.root.getField(\"set-global-staff-size\");\n\n\t\t\t\tsectionsDirty = true;\n\t\t\t}\n\n\t\t\t// A4 paper size\n\t\t\tconst DEFAULT_PAPER_WIDTH = {\n\t\t\t\tproto: \"Assignment\",\n\t\t\t\tkey: \"paper-width\",\n\t\t\t\tvalue: {proto: \"NumberUnit\", number: 21, unit: \"\\\\cm\"},\n\t\t\t};\n\t\t\tconst DEFAULT_PAPER_HEIGHT = {\n\t\t\t\tproto: \"Assignment\",\n\t\t\t\tkey: \"paper-height\",\n\t\t\t\tvalue: {proto: \"NumberUnit\", number: 29.71, unit: \"\\\\cm\"},\n\t\t\t};\n\n\t\t\tif (!paper) {\n\t\t\t\tpaper = new Block({\n\t\t\t\t\tblock: \"score\",\n\t\t\t\t\thead: \"\\\\paper\",\n\t\t\t\t\tbody: [DEFAULT_PAPER_WIDTH, DEFAULT_PAPER_HEIGHT],\n\t\t\t\t});\n\t\t\t\tthis.root.sections.push(paper);\n\n\t\t\t\tsectionsDirty = true;\n\t\t\t}\n\n\t\t\tif (!paper.getField(\"paper-width\")) \n\t\t\t\tpaper.body.push(parseRaw(DEFAULT_PAPER_WIDTH));\n\n\t\t\tif (!paper.getField(\"paper-height\")) \n\t\t\t\tpaper.body.push(parseRaw(DEFAULT_PAPER_HEIGHT));\n\n\t\t\tif (sectionsDirty)\n\t\t\t\tthis.root.reorderSections();\n\t\t}\n\t\telse\n\t\t\tstaffSize = staffSize || {value: LILY_STAFF_SIZE_DEFAULT};\n\n\t\tconst blockPropertyCommon = (block: Block, key: string) => ({\n\t\t\tget value () {\n\t\t\t\tif (!block)\n\t\t\t\t\treturn undefined;\n\n\t\t\t\tconst item = block.getField(key);\n\t\t\t\tif (!item)\n\t\t\t\t\treturn undefined;\n\n\t\t\t\treturn item.value;\n\t\t\t},\n\n\t\t\tset value (value) {\n\t\t\t\tconsole.assert(!!block, \"block is null.\");\n\n\t\t\t\tif (value === undefined)\t// delete field\n\t\t\t\t\tblock.body = block.body.filter(assign => !(assign instanceof Assignment) || assign.key !== key);\n\t\t\t\telse {\n\t\t\t\t\tconst item = block.getField(key);\n\t\t\t\t\tif (item)\n\t\t\t\t\t\titem.value = parseRaw(value);\n\t\t\t\t\telse\n\t\t\t\t\t\tblock.body.push(new Assignment({key, value}));\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\tconst paperPropertyCommon = key => blockPropertyCommon(paper, key);\n\n\t\tconst paperPropertySchemeToken = key => ({\n\t\t\tget value () {\n\t\t\t\tif (!paper)\n\t\t\t\t\treturn undefined;\n\n\t\t\t\tconst item = paper.getField(key);\n\t\t\t\tif (!item)\n\t\t\t\t\treturn undefined;\n\n\t\t\t\treturn item.value.exp;\n\t\t\t},\n\n\t\t\tset value (value) {\n\t\t\t\tconsole.assert(!!paper, \"paper is null.\");\n\n\t\t\t\tconst item = paper.getField(key);\n\t\t\t\tif (item)\n\t\t\t\t\titem.value.exp = value;\n\t\t\t\telse\n\t\t\t\t\tpaper.body.push(new Assignment({key, value: {proto: \"Scheme\", exp: value}}));\n\t\t\t},\n\t\t});\n\n\t\tlet midiBlock = null;\n\t\tconst scores = this.root.sections.filter(section => section instanceof Block && section.head === \"\\\\score\") as Block[];\n\t\tfor (const score of scores) {\n\t\t\tmidiBlock = score.body.find(term => term instanceof Block && term.head === \"\\\\midi\");\n\t\t\tif (midiBlock)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tconst midiTempo = {\n\t\t\tget value (): Tempo {\n\t\t\t\treturn midiBlock && midiBlock.body.find(term => term instanceof Tempo);\n\t\t\t},\n\n\t\t\tset value (value: Tempo) {\n\t\t\t\tif (!midiBlock) {\n\t\t\t\t\tconst score = this.root.getBlock(\"score\");\n\t\t\t\t\tif (score) {\n\t\t\t\t\t\tmidiBlock = new Block({block: \"score\", head: \"\\\\midi\", body: []});\n\t\t\t\t\t\tscore.body.push(midiBlock);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tconsole.warn(\"no score block, midiTempo assign failed.\");\n\t\t\t\t}\n\n\t\t\t\tif (midiBlock) {\n\t\t\t\t\tmidiBlock.body = midiBlock.body.filter(term => !(term instanceof Tempo));\n\t\t\t\t\tmidiBlock.body.push(value);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\tconst assignments = this.root.entries.filter(term => term instanceof Assignment) as Assignment[];\n\t\tconst assignmentTable = assignments.reduce((table, assign) => ((table[assign.key.toString()] = assign.query(assign.key)), table), {});\n\n\t\tconst headerFields = [\n\t\t\t\"title\", \"subtitle\", \"subsubtitle\", \"composer\", \"poet\", \"arranger\", \"opus\", \"copyright\", \"instrument\", \"dedication\", \"tagline\",\n\t\t].reduce((dict, field) => ((dict[field] = blockPropertyCommon(header, field)), dict), {});\n\n\t\tconst attributes = {\n\t\t\tstaffSize,\n\t\t\tmidiTempo,\n\t\t\t...headerFields,\n\t\t\tpaperWidth: paperPropertyCommon(\"paper-width\"),\n\t\t\tpaperHeight: paperPropertyCommon(\"paper-height\"),\n\t\t\ttopMargin: paperPropertyCommon(\"top-margin\"),\n\t\t\tbottomMargin: paperPropertyCommon(\"bottom-margin\"),\n\t\t\tleftMargin: paperPropertyCommon(\"left-margin\"),\n\t\t\trightMargin: paperPropertyCommon(\"right-margin\"),\n\t\t\tsystemSpacing: paperPropertySchemeToken(\"system-system-spacing.basic-distance\"),\n\t\t\ttopMarkupSpacing: paperPropertySchemeToken(\"top-markup-spacing.basic-distance\"),\n\t\t\traggedLast: paperPropertySchemeToken(\"ragged-last\"),\n\t\t\traggedBottom: paperPropertySchemeToken(\"ragged-bottom\"),\n\t\t\traggedLastBottom: paperPropertySchemeToken(\"ragged-last-bottom\"),\n\t\t\tprintPageNumber: paperPropertySchemeToken(\"print-page-number\"),\n\t\t\t...assignmentTable,\n\t\t};\n\n\t\tif (readonly)\n\t\t\tObject.keys(attributes).forEach(key => attributes[key] = attributes[key] && attributes[key].value);\n\n\t\treturn attributes;\n\t}\n\n\n\tglobalAttributesReadOnly (): LilyDocumentAttributeReadOnly {\n\t\tconst attributes = this.globalAttributes() as any;\n\t\tObject.keys(attributes).forEach(key => attributes[key] = attributes[key] && attributes[key].value);\n\n\t\treturn attributes;\n\t}\n\n\n\tmarkup (docMarkup: LilyDocument) {\n\t\t// copy attributes\n\t\tconst attrS = this.globalAttributes() as LilyDocumentAttribute;\n\t\tconst attrM = docMarkup.globalAttributesReadOnly();\n\n\t\t[\n\t\t\t\"staffSize\", \"midiTempo\", \"paperWidth\", \"paperHeight\",\n\t\t\t\"topMargin\", \"bottomMargin\", \"leftMargin\", \"rightMargin\",\n\t\t\t\"systemSpacing\", \"topMarkupSpacing\", \"raggedLast\", \"raggedBottom\", \"raggedLastBottom\",\n\t\t\t\"printPageNumber\",\n\t\t].forEach(field => {\n\t\t\tif (attrM[field] !== undefined) {\n\t\t\t\tif (typeof attrS[field].value === \"object\" && attrS[field].value && (attrS[field].value as any).set)\n\t\t\t\t\t(attrS[field].value as any).set(attrM[field]);\n\t\t\t\telse\n\t\t\t\t\tattrS[field].value = attrM[field];\n\t\t\t}\n\t\t});\n\n\t\t// execute commands list\n\t\tconst commands = docMarkup.root.getField(\"LotusCommands\");\n\t\tconst cmdList = commands && commands.value && commands.value.args && commands.value.args[0].body;\n\t\tif (cmdList && Array.isArray(cmdList)) {\n\t\t\tfor (const command of cmdList) {\n\t\t\t\tif (command.exp && this[command.exp])\n\t\t\t\t\tthis[command.exp]();\n\t\t\t\telse\n\t\t\t\t\tconsole.warn(\"unexpected markup command:\", command);\n\t\t\t}\n\t\t}\n\n\t\t// copy LotusOption assignments\n\t\tconst assignments = docMarkup.root.entries.filter(term => term instanceof Assignment && /^LotusOption\\..+/.test(term.key.toString()));\n\t\tassignments.forEach(assignment => this.root.sections.push(assignment.clone()));\n\n\t\t// copy score blocks\n\t\tconst layoutBody = [];\n\t\tconst midiBody = [];\n\t\tconst score = docMarkup.root.getBlock(\"score\");\n\t\tif (score) {\n\t\t\tconst layout = score.body.find(term => term instanceof Block && term.head === \"\\\\layout\") as Block;\n\t\t\tif (layout)\n\t\t\t\tlayout.body.forEach(term => layoutBody.push(term.clone()));\n\n\t\t\tconst midi = score.body.find(term => term instanceof Block && term.head === \"\\\\midi\") as Block;\n\t\t\tif (midi)\n\t\t\t\tmidi.body.forEach(term => midiBody.push(term.clone()));\n\t\t}\n\t\tif (layoutBody.length || midiBody.length) {\n\t\t\tconst thisScore = this.root.getBlock(\"score\");\n\t\t\tif (thisScore) {\n\t\t\t\tconst layout = thisScore.body.find(term => term instanceof Block && term.head === \"\\\\layout\") as Block;\n\t\t\t\tif (layout)\n\t\t\t\t\tlayout.body.push(...layoutBody);\n\n\t\t\t\tconst midi = thisScore.body.find(term => term instanceof Block && term.head === \"\\\\midi\") as Block;\n\t\t\t\tif (midi)\n\t\t\t\t\tmidi.body.push(...midiBody);\n\t\t\t}\n\t\t}\n\t}\n\n\n\tgetVariables (): Set {\n\t\treturn new Set(this.root.findAll(Variable).map(variable => variable.name));\n\t}\n\n\n\t// deprecated\n\tgetMusicTracks ({expand = false} = {}): MusicBlock[] {\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tif (!score)\n\t\t\treturn null;\n\n\t\tlet tracks = [];\n\n\t\t// extract sequential music blocks from score block\n\t\tscore.forEachTopTerm(MusicBlock, block => {\n\t\t\ttracks.push(block);\n\t\t});\n\n\t\t// expand variables in tracks\n\t\tif (expand)\n\t\t\ttracks = tracks.map(track => track.clone().expandVariables(this.root));\n\n\t\treturn tracks;\n\t}\n\n\n\tgetLocationTickTable (): {[key: string]: number} {\n\t\tconst notes = this.root.findAll(term => (term instanceof ChordElement) || (term instanceof MusicEvent));\n\n\t\treturn notes.reduce((table, note) => {\n\t\t\tif (note._location && Number.isFinite(note._tick))\n\t\t\t\ttable[`${note._location.lines[0]}:${note._location.columns[0]}`] = note._tick;\n\n\t\t\treturn table;\n\t\t}, {});\n\t}\n\n\n\t// update terms' _location data according to a serialized source\n\trelocate (source: string = this.toString()) {\n\t\tthis.root.relocate(source);\n\t}\n\n\n\tappendIncludeFile (filename: string) {\n\t\tif (!this.root.includeFiles.includes(filename)) {\n\t\t\tconst versionPos = this.root.sections.findIndex(term => term instanceof Version);\n\t\t\tthis.root.sections.splice(versionPos + 1, 0,\n\t\t\t\tnew Include({cmd: \"include\", args: [LiteralString.fromString(filename)]}));\n\t\t}\n\t}\n\n\n\tremoveStaffGroup () {\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tif (score) {\n\t\t\tscore.body.forEach(item => {\n\t\t\t\tif (item instanceof SimultaneousList)\n\t\t\t\t\titem.removeStaffGroup();\n\t\t\t});\n\t\t}\n\t}\n\n\n\tfixTinyTrillSpans () {\n\t\t// TODO: replace successive \\startTrillSpan & \\stopTrillSpan with ^\\trill\n\t}\n\n\n\tremoveMusicCommands (cmds: string | string[]) {\n\t\tcmds = Array.isArray(cmds) ? cmds : [cmds];\n\n\t\tconst isToRemoved = item => (item instanceof Command) && cmds.includes(item.cmd);\n\n\t\tthis.root.forEachTerm(MusicBlock, block => {\n\t\t\tblock.body = block.body.filter(item => !isToRemoved(item));\n\t\t});\n\t}\n\n\n\tremoveTrillSpans () {\n\t\tthis.removeMusicCommands([\"startTrillSpan\", \"stopTrillSpan\"]);\n\t}\n\n\n\tremoveBreaks () {\n\t\tthis.removeMusicCommands(\"break\");\n\t}\n\n\n\tremovePageBreaks () {\n\t\tthis.removeMusicCommands(\"pageBreak\");\n\t}\n\n\n\tscoreBreakBefore (enabled = true) {\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tif (score) {\n\t\t\tlet header = score.entries.find((entry: any) => entry.head === \"\\\\header\") as Block;\n\t\t\tif (!header) {\n\t\t\t\theader = new Block({head: \"\\\\header\", body: []});\n\t\t\t\tscore.body.push(header);\n\t\t\t}\n\n\t\t\tlet breakbefore = header.getField(\"breakbefore\");\n\t\t\tif (breakbefore) \n\t\t\t\tbreakbefore = breakbefore.value;\n\t\t\t\n\t\t\telse {\n\t\t\t\tbreakbefore = new Scheme({exp: true});\n\t\t\t\theader.body.push(new Assignment({key: \"breakbefore\", value: breakbefore}));\n\t\t\t}\n\n\t\t\tbreakbefore.exp = enabled;\n\t\t}\n\t\telse\n\t\t\tconsole.warn(\"no score block\");\n\t}\n\n\n\tunfoldRepeats () {\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tconst musicList = score ? score.body : this.root.sections;\n\n\t\tlet count = 0;\n\n\t\tmusicList.forEach((term, i) => {\n\t\t\tif (term.isMusic && (term as Command).cmd !== \"unfoldRepeats\") {\n\t\t\t\tconst unfold = new Command({cmd: \"unfoldRepeats\", args: [term]});\n\t\t\t\tmusicList.splice(i, 1, unfold);\n\n\t\t\t\t++count;\n\t\t\t}\n\t\t});\n\n\t\tif (!count)\n\t\t\tconsole.warn(\"no music term to unfold\");\n\n\t\treturn count;\n\t}\n\n\n\tcontainsRepeat (): boolean {\n\t\tconst termContainsRepeat = (term: BaseTerm): boolean => {\n\t\t\tif (!term.entries)\n\t\t\t\treturn false;\n\n\t\t\tconst subTerms = term.entries.filter(term => term instanceof BaseTerm);\n\n\t\t\tfor (const term of subTerms) {\n\t\t\t\tif ((term as Command).cmd === \"repeat\")\n\t\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tfor (const term of subTerms) {\n\t\t\t\tif (termContainsRepeat(term))\n\t\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\treturn termContainsRepeat(this.root);\n\t}\n\n\n\tremoveEmptySubMusicBlocks () {\n\t\tthis.root.forEachTerm(MusicBlock, block => {\n\t\t\tblock.body = block.body.filter(term => !(term instanceof MusicBlock && term.body.length === 0));\n\t\t});\n\t}\n\n\n\tmergeContinuousGraces () {\n\t\tthis.removeEmptySubMusicBlocks();\n\n\t\tconst isGraceCommand = term => term instanceof Grace;\n\t\tconst isGraceInnerTerm = term => isGraceCommand(term) || term instanceof Divide || term instanceof PostEvent;\n\n\t\tthis.root.forEachTerm(MusicBlock, block => {\n\t\t\tconst groups = [];\n\t\t\tlet currentGroup = null;\n\n\t\t\tblock.body.forEach((term, i) => {\n\t\t\t\tif (currentGroup) {\n\t\t\t\t\tif (isGraceInnerTerm(term)) {\n\t\t\t\t\t\tcurrentGroup.count++;\n\n\t\t\t\t\t\tif (currentGroup.count === 2)\n\t\t\t\t\t\t\tgroups.push(currentGroup);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tcurrentGroup = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (isGraceCommand(term))\n\t\t\t\t\t\tcurrentGroup = {start: i, count: 1};\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet offset = 0;\n\t\t\tgroups.forEach(group => {\n\t\t\t\tconst startIndex = group.start + offset;\n\t\t\t\tconst mainBody = new MusicBlock({body: []});\n\n\t\t\t\tfor (let i = startIndex; i < startIndex + group.count; ++ i) {\n\t\t\t\t\tconst term = block.body[i];\n\t\t\t\t\tconst music = isGraceCommand(term) ? term.args[0] : term;\n\t\t\t\t\tif (music instanceof MusicBlock)\n\t\t\t\t\t\tmainBody.body.push(...music.body);\n\t\t\t\t\telse\n\t\t\t\t\t\tmainBody.body.push(music);\n\t\t\t\t}\n\n\t\t\t\tblock.body[startIndex].args[0] = mainBody;\n\t\t\t\tblock.body.splice(startIndex + 1, group.count - 1);\n\n\t\t\t\toffset -= group.count - 1;\n\t\t\t});\n\t\t});\n\t}\n\n\n\tmergeContinuousEmptyAfterGraces () {\n\t\tconst isEmptyAfterGrace = term => term instanceof AfterGrace && term.args[0] instanceof MusicBlock && term.args[0].body.length === 0;\n\t\tconst isGraceInnerTerm = term => isEmptyAfterGrace(term) || term instanceof Divide || term instanceof PostEvent;\n\n\t\tthis.root.forEachTerm(MusicBlock, block => {\n\t\t\tconst groups = [];\n\t\t\tlet currentGroup = null;\n\n\t\t\tblock.body.forEach((term, i) => {\n\t\t\t\tif (currentGroup) {\n\t\t\t\t\tif (isGraceInnerTerm(term)) {\n\t\t\t\t\t\tcurrentGroup.count++;\n\n\t\t\t\t\t\tif (currentGroup.count === 2)\n\t\t\t\t\t\t\tgroups.push(currentGroup);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tcurrentGroup = null;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (isEmptyAfterGrace(term))\n\t\t\t\t\t\tcurrentGroup = {start: i, count: 1};\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet offset = 0;\n\t\t\tgroups.forEach(group => {\n\t\t\t\tconst startIndex = group.start + offset;\n\t\t\t\tconst mainBody = new MusicBlock({body: []});\n\n\t\t\t\tfor (let i = startIndex; i < startIndex + group.count; ++ i) {\n\t\t\t\t\tconst term = block.body[i];\n\t\t\t\t\tconst music = isEmptyAfterGrace(term) ? term.args[1] : term;\n\t\t\t\t\tif (music instanceof MusicBlock)\n\t\t\t\t\t\tmainBody.body.push(...music.body);\n\t\t\t\t\telse\n\t\t\t\t\t\tmainBody.body.push(music);\n\t\t\t\t}\n\n\t\t\t\tblock.body[startIndex].args[1] = mainBody;\n\t\t\t\tblock.body.splice(startIndex + 1, group.count - 1);\n\n\t\t\t\toffset -= group.count - 1;\n\t\t\t});\n\t\t});\n\t}\n\n\n\tfixInvalidKeys (mode = \"major\") {\n\t\tthis.root.forEachTerm(Command, cmd => {\n\t\t\tif (cmd.cmd === \"key\") {\n\t\t\t\tif (cmd.args[1] === \"\\\\none\")\n\t\t\t\t\tcmd.args[1] = \"\\\\\" + mode;\n\t\t\t}\n\t\t});\n\t}\n\n\n\tfixInvalidBriefChords () {\n\t\tthis.root.forEachTerm(BriefChord, chord => {\n\t\t\tconst items = chord.body.items;\n\t\t\tif (items) {\n\t\t\t\t// merge multiple ^ items\n\t\t\t\twhile (items.filter(item => item === \"^\").length > 1) {\n\t\t\t\t\tconst index = items.lastIndexOf(\"^\");\n\t\t\t\t\titems.splice(index, 1, \".\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\n\tfixInvalidMarkupWords () {\n\t\tthis.root.forEachTerm(MarkupCommand, cmd => {\n\t\t\t//console.log(\"markup:\", cmd);\n\t\t\tcmd.forEachTerm(InlineBlock, block => {\n\t\t\t\t// replace scheme expression by literal string\n\t\t\t\tblock.body = block.body.map(term => {\n\t\t\t\t\tif (term instanceof Scheme)\n\t\t\t\t\t\treturn LiteralString.fromString(term.join().replace(/\\s+$/, \"\"));\n\n\t\t\t\t\tif (typeof term === \"string\" && term.includes(\"$\"))\n\t\t\t\t\t\treturn LiteralString.fromString(term);\n\n\t\t\t\t\treturn term;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\n\tfixNestedRepeat () {\n\t\t// \\repeat { \\repeat { P1 } \\alternative { {P2} } } \\alternative { {P3} }\n\t\t// ->\n\t\t// \\repeat { P1 } \\alternative { {P2} {P3} }\n\t\tthis.root.forEachTerm(Command, cmd => {\n\t\t\tif (cmd.isRepeatWithAlternative) {\n\t\t\t\tconst block = cmd.args[2];\n\t\t\t\tconst alternative = cmd.args[3].args[0];\n\t\t\t\tconst lastMusic = block.body[block.body.length - 1];\n\t\t\t\tif (lastMusic && lastMusic.isRepeatWithAlternative) {\n\t\t\t\t\tblock.body.splice(block.body.length - 1, 1, ...lastMusic.args[2].body);\n\t\t\t\t\talternative.body = [...lastMusic.args[3].args[0].body, ...alternative.body];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\n\tfixEmptyContextedStaff () {\n\t\t// staff.1 << >>\t\t\t\tstaff.2 << voice.1 {} voice.2 {} >>\n\t\t// ->\n\t\t// staff.1 << voice.1 {} >>\t\tstaff.2 << voice.2 {} >>\n\t\tconst subMusics = (simul: SimultaneousList) => simul.list.filter(term => term instanceof ContextedMusic);\n\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tscore.forEachTerm(SimultaneousList, simul => {\n\t\t\tconst staves = simul.list.filter(term => term instanceof ContextedMusic && term.body instanceof SimultaneousList);\n\t\t\tif (staves.length > 1) {\n\t\t\t\tconst staff1 = staves[0].body;\n\t\t\t\tconst staff2 = staves[1].body;\n\n\t\t\t\tif (subMusics(staff1).length === 0 && subMusics(staff2).length > 1) {\n\t\t\t\t\tconst index = staff2.list.findIndex(term => term instanceof ContextedMusic);\n\t\t\t\t\tconst [music] = staff2.list.splice(index, 1);\n\t\t\t\t\tstaff1.list.push(music);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\n\tremoveEmptyContextedStaff () {\n\t\tconst subMusics = (simul: SimultaneousList) => simul.list.filter(term => term instanceof ContextedMusic);\n\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tscore.forEachTerm(SimultaneousList, simul => {\n\t\t\tsimul.list = simul.list.filter(term => !(term instanceof ContextedMusic) || !(term.body instanceof SimultaneousList)\n\t\t\t\t|| subMusics(term.body).length > 0);\n\t\t});\n\t}\n\n\n\tredivide () {\n\t\tthis.root.forEachTopTerm(MusicBlock, (block: MusicBlock) => block.redivide());\n\t}\n\n\n\tmakeMIDIDedicatedScore (): Block {\n\t\tconst block = this.root.findFirst(term => term instanceof Block && term.head === \"\\\\score\" && term.isMIDIDedicated) as Block;\n\t\tif (block)\n\t\t\treturn block;\n\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tconst newScore = score.clone();\n\n\t\tnewScore.body = newScore.body.filter(term => !(term instanceof Block && term.head === \"\\\\layout\"));\n\t\tscore.body = score.body.filter(term => !(term instanceof Block && term.head === \"\\\\midi\"));\n\n\t\tthis.root.sections.push(newScore);\n\n\t\treturn newScore;\n\t}\n\n\n\texcludeChordTracksFromMIDI () {\n\t\t// if there is chord mode music in score, duplicate score block as a dedicated MIDI score which excludes chord mode music.\n\t\tlet contains = false;\n\n\t\tconst isChordMusic = term => term instanceof ContextedMusic\n\t\t\t&& term.head instanceof Command && term.head.args[0] === \"ChordNames\";\n\n\t\tconst isBlock = (head, term) => term instanceof Block && term.head === head;\n\n\t\t// TODO: midiMusic forked in interpreter issue\n\t\t//this.abstractMainScore();\n\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tconst newScore = score.clone() as Block;\n\t\tnewScore.forEachTerm(SimultaneousList, simul => {\n\t\t\tconst trimmedList = simul.list.filter(term => !isChordMusic(term));\n\t\t\tif (trimmedList.length < simul.list.length) {\n\t\t\t\tsimul.list = trimmedList;\n\t\t\t\tcontains = true;\n\t\t\t}\n\t\t});\n\t\tnewScore._headComment = Comment.createSingle(\" midi output\");\n\n\t\tif (contains) {\n\t\t\tconst trimmedBody = score.body.filter(term => !isBlock(\"\\\\midi\", term));\n\t\t\tif (trimmedBody.length < score.body.length) {\n\t\t\t\tscore.body = trimmedBody;\n\n\t\t\t\tnewScore.body = newScore.body.filter(term => !isBlock(\"\\\\layout\", term));\n\t\t\t\tthis.root.sections.push(newScore);\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// [deprecated]\n\t// generate tied notehead location candidates\n\tgetTiedNoteLocations (source: TextSource): DocLocation[] {\n\t\tconst chordPairs: [Chord, Chord][] = [];\n\n\t\tconst hasMusicBlock = term => {\n\t\t\tif (term instanceof MusicBlock)\n\t\t\t\treturn true;\n\n\t\t\tif (term instanceof Command)\n\t\t\t\treturn term.args.filter(arg => arg instanceof MusicBlock).length > 0;\n\n\t\t\treturn false;\n\t\t};\n\n\t\tthis.root.forEachTerm(MusicBlock, (block: MusicBlock) => {\n\t\t\tfor (const voice of block.voices) {\n\t\t\t\tlet lastChord: Chord = null;\n\t\t\t\tlet tying = false;\n\t\t\t\tlet afterBlock = false;\n\t\t\t\tlet atHead = true;\n\n\t\t\t\tfor (const chunk of voice.body) {\n\t\t\t\t\tfor (const term of chunk.terms) {\n\t\t\t\t\t\tif (term instanceof Primitive && term.exp === \"~\") {\n\t\t\t\t\t\t\ttying = true;\n\t\t\t\t\t\t\tafterBlock = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (hasMusicBlock(term)) {\n\t\t\t\t\t\t\tafterBlock = true;\n\t\t\t\t\t\t\ttying = false;\n\t\t\t\t\t\t\t//console.log(\"afterBlock:\", term);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (term instanceof Chord) {\n\t\t\t\t\t\t\tif (tying && lastChord) \n\t\t\t\t\t\t\t\tchordPairs.push([lastChord, term]);\n\t\t\t\t\t\t\t// maybe there is a tie at tail of the last block\n\t\t\t\t\t\t\telse if (afterBlock)\n\t\t\t\t\t\t\t\tchordPairs.push([null, term]);\n\t\t\t\t\t\t\t// maybe there is a tie before the current block\n\t\t\t\t\t\t\telse if (atHead)\n\t\t\t\t\t\t\t\tchordPairs.push([null, term]);\n\n\t\t\t\t\t\t\t// PENDING: maybe some user-defined command block contains tie at tail.\n\n\t\t\t\t\t\t\tatHead = false;\n\t\t\t\t\t\t\tafterBlock = false;\n\t\t\t\t\t\t\ttying = false;\n\t\t\t\t\t\t\tlastChord = term;\n\n\t\t\t\t\t\t\tif (term.post_events) {\n\t\t\t\t\t\t\t\tfor (const event of term.post_events) {\n\t\t\t\t\t\t\t\t\tif (event instanceof PostEvent && event.arg === \"~\")\n\t\t\t\t\t\t\t\t\t\ttying = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t//console.log(\"chordPairs:\", chordPairs);\n\n\t\tconst locations = [];\n\n\t\tchordPairs.forEach(pair => {\n\t\t\tconst forePitches = pair[0] && new Set(pair[0].pitchNames);\n\n\t\t\tconst chordSource = source.slice(pair[1]._location.lines, pair[1]._location.columns);\n\t\t\tconst pitchColumns = TextSource.matchPositions(/\\w+/g, chordSource);\n\n\t\t\tpair[1].pitchNames\n\t\t\t\t.map((pitch, index) => ({pitch, index}))\n\t\t\t\t.filter(({pitch}) => !forePitches || forePitches.has(pitch) || pitch === \"q\")\n\t\t\t\t.forEach(({index}) => locations.push([\n\t\t\t\t\tpair[1]._location.lines[0],\t// line\n\t\t\t\t\tpair[1]._location.columns[0] + pitchColumns[index],\t// column\n\t\t\t\t]));\n\t\t});\n\n\t\treturn locations;\n\t}\n\n\n\t// generate tied notehead location candidates\n\tgetTiedNoteLocations2 (): DocLocation[] {\n\t\tconst locations = [];\n\n\t\tthis.root.forEachTerm(Chord, chord => chord.pitches.forEach(pitch => {\n\t\t\tif (pitch._tied)\n\t\t\t\tlocations.push([pitch._location.lines[0], pitch._location.columns[0]]);\n\t\t}));\n\n\t\treturn locations;\n\t}\n\n\n\tgetBriefChordLocations (): DocLocation[] {\n\t\tconst locations = [];\n\n\t\tthis.root.forEachTerm(BriefChord,\n\t\t\tchord => locations.push([chord._location.lines[0], chord._location.columns[0]]));\n\n\t\treturn locations;\n\t}\n\n\n\tgetLyricLocations (): DocLocation[] {\n\t\tconst locations = [];\n\n\t\tthis.root.forEachTerm(Lyric,\n\t\t\tlyric => locations.push([lyric._location.lines[0], lyric._location.columns[0]]));\n\n\t\treturn locations;\n\t}\n\n\n\t/*removeAloneSpacer () {\n\t\tthis.root.forEachTopTerm(MusicBlock, block => {\n\t\t\tconst aloneSpacers = cc(block.musicChunks.filter(chunk => chunk.size === 1 && chunk.terms[0].isSpacer).map(chunk => chunk.terms));\n\t\t\t//console.log(\"aloneSpacers:\", aloneSpacers.map(s => s._location));\n\n\t\t\tif (aloneSpacers.length) {\n\t\t\t\tconst removeInBlock = block => block.body = block.body.filter(term => !aloneSpacers.includes(term));\n\n\t\t\t\tremoveInBlock(block);\n\t\t\t\tblock.forEachTerm(MusicBlock, removeInBlock);\n\t\t\t}\n\t\t});\n\t}*/\n\n\n\tunfoldDurationMultipliers () {\n\t\tthis.root.forEachTerm(MusicBlock, block => {\n\t\t\tblock.unfoldDurationMultipliers();\n\t\t});\n\t}\n\n\n\tappendMIDIInstrumentsFromName () {\n\t\tconst isSet = (term: BaseTerm, keyPattern: RegExp): boolean => term instanceof Command && term.cmd === \"set\" && keyPattern.test((term.args[0] as Assignment).key.toString());\n\t\tconst append = (body: BaseTerm[]) => {\n\t\t\tconst ntIndex = body.findIndex(term => isSet(term, /\\.instrumentName/));\n\t\t\tif (ntIndex >= 0 && !body.some(term => isSet(term, /\\.midiInstrument/))) {\n\t\t\t\tconst nameAssign = (body[ntIndex] as Command).args[0] as Assignment;\n\t\t\t\tconst key = nameAssign.key.toString().replace(/\\.instrumentName/, \".midiInstrument\");\n\t\t\t\tbody.splice(ntIndex + 1, 0, Command.createSet(key, nameAssign.value));\n\t\t\t}\n\t\t};\n\n\t\tthis.root.forEachTopTerm(Block, block => {\n\t\t\tif (block.head === \"\\\\score\") {\n\t\t\t\tblock.forEachTerm(SimultaneousList, simu => append(simu.list));\n\t\t\t\tblock.forEachTerm(MusicBlock, musicBlock => append(musicBlock.body));\n\t\t\t}\n\t\t});\n\t}\n\n\n\tuseMidiInstrumentChannelMapping () {\n\t\tthis.appendMIDIInstrumentsFromName();\n\n\t\tconst midiBlock = this.root.findFirst(term => term instanceof Block && term.head === \"\\\\midi\") as Block;\n\t\tif (!midiBlock) {\n\t\t\tconsole.warn(\"no MIDI block found.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst channelMapping = midiBlock.findFirst(term => term instanceof Assignment && term.key === \"midiChannelMapping\") as Assignment;\n\t\tif (channelMapping)\n\t\t\tchannelMapping.value = new Scheme({exp: new SchemePointer({value: \"instrument\"})});\n\t\telse {\n\t\t\tmidiBlock.body.push(parseRaw({\n\t\t\t\tproto: \"Block\",\n\t\t\t\tblock: \"context\",\n\t\t\t\thead: \"\\\\context\",\n\t\t\t\tbody: [\n\t\t\t\t\t{proto: \"Command\",cmd: \"Score\",args: []},\n\t\t\t\t\t{proto: \"Assignment\", key: \"midiChannelMapping\", value: {proto: \"Scheme\", exp: {proto: \"SchemePointer\", value: \"instrument\"}}},\n\t\t\t\t],\n\t\t\t}));\n\t\t}\n\t}\n\n\n\tformalize () {\n\t\tif (!this.root.findFirst(Version))\n\t\t\tthis.root.sections.unshift(Version.default);\n\n\t\tif (!this.root.findFirst(Language))\n\t\t\tthis.root.sections.splice(1, 0, Language.make(\"english\"));\n\n\t\tif (!this.root.getBlock(\"header\"))\n\t\t\tthis.root.sections.splice(2, 0, new Block({block: \"header\", head: \"\\\\header\", body:[]}));\n\n\t\tif (!this.root.getBlock(\"score\")) {\n\t\t\tconst topMusics = this.root.sections.filter(section => section.isMusic);\n\t\t\tthis.root.sections = this.root.sections.filter(section => !section.isMusic);\n\n\t\t\tconst score = new Block({block: \"score\", head: \"\\\\score\", body: [\n\t\t\t\t...topMusics,\n\t\t\t\tnew Block({block: \"score\", head: \"\\\\layout\", body: []}),\n\t\t\t\tnew Block({block: \"score\", head: \"\\\\midi\", body: []}),\n\t\t\t]});\n\n\t\t\tthis.root.sections.push(score);\n\t\t}\n\t}\n\n\n\tconvertStaffToPianoStaff () {\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tif (score) {\n\t\t\tconst pstaff = score.findFirst(term => term instanceof ContextedMusic && term.head.cmd === \"new\" && term.head.args[0] === \"Staff\") as ContextedMusic;\n\t\t\tif (pstaff) {\n\t\t\t\tpstaff.head.args[0] = \"PianoStaff\";\n\n\t\t\t\tif (pstaff.body instanceof SimultaneousList) {\n\t\t\t\t\tpstaff.body.list = [].concat(...pstaff.body.list.map(term => {\n\t\t\t\t\t\tif (term instanceof ContextedMusic) {\n\t\t\t\t\t\t\tconst subMusics = term.list.filter(sub => sub instanceof ContextedMusic);\n\n\t\t\t\t\t\t\treturn subMusics.map(music => {\n\t\t\t\t\t\t\t\tconst staff = term.clone();\n\t\t\t\t\t\t\t\tstaff.list = [\n\t\t\t\t\t\t\t\t\t...term.list.filter(sub => !(sub instanceof ContextedMusic)),\n\t\t\t\t\t\t\t\t\tmusic,\n\t\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\t\tstaff.head.cmd = \"new\";\n\n\t\t\t\t\t\t\t\treturn staff;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\treturn [term];\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tpruneStemDirections () {\n\t\tthis.root.forEachTerm(MusicBlock, block => {\n\t\t\tlet direction = null;\n\t\t\tconst redundants = [];\n\n\t\t\tblock.body.forEach(term => {\n\t\t\t\tif (term instanceof StemDirection) {\n\t\t\t\t\tif (term.direction === direction)\n\t\t\t\t\t\tredundants.push(term);\n\t\t\t\t\telse\n\t\t\t\t\t\tdirection = term.direction;\n\t\t\t\t}\n\t\t\t\telse if (term instanceof Command && term.findFirst(MusicBlock))\n\t\t\t\t\tdirection = null;\n\t\t\t});\n\n\t\t\tblock.body = block.body.filter(term => !redundants.includes(term));\n\t\t});\n\t}\n\n\n\tremoveRepeats () {\n\t\tthis.root.forEachTerm(MusicBlock, block => block.spreadRepeatBlocks());\n\t}\n\n\n\tarticulateMIDIOutput () {\n\t\tconst ARTICULATE_FILENAME = \"articulate-lotus.ly\";\n\n\t\tthis.abstractMainScore();\n\t\tconst midiScore = this.makeMIDIDedicatedScore();\n\n\t\tif (!this.root.includeFiles.includes(ARTICULATE_FILENAME)) {\n\t\t\tlet pos = this.root.sections.indexOf(midiScore);\n\t\t\tif (pos < 0)\n\t\t\t\tpos = Math.min(this.root.sections.length, 3);\n\t\t\tthis.root.sections.splice(pos, 0, Include.create(ARTICULATE_FILENAME));\n\t\t}\n\n\t\tmidiScore.body = midiScore.body.map(term => {\n\t\t\tif (term.isMusic && !(term instanceof Command && term.cmd === \"articulate\"))\n\t\t\t\treturn new Command({cmd: \"articulate\", args: [term]});\n\n\t\t\treturn term;\n\t\t});\n\t}\n\n\n\tremoveInvalidExpressionsOnRests (): number {\n\t\tconst isInvalidPostEvent = (event: PostEvent | string): boolean =>\n\t\t\t[\".\", \"!\", \"_\"].includes(event instanceof PostEvent ? event.arg as string : event);\n\n\t\tlet count = 0;\n\t\tthis.root.forEachTerm(MusicEvent, (term: MusicEvent) => {\n\t\t\tif (term.isRest) {\n\t\t\t\tif (term.post_events.some(isInvalidPostEvent)) {\n\t\t\t\t\tterm.post_events = term.post_events.filter(event => !isInvalidPostEvent(event));\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn count;\n\t}\n\n\n\tabstractMainScore () {\n\t\tconst score = this.root.getBlock(\"score\");\n\t\tconst music = score.body.find(term => term.isMusic);\n\t\tif (music && !(music instanceof Variable)) {\n\t\t\tconst sectionIndex = this.root.sections.indexOf(score);\n\t\t\tconst assignment = new Assignment({\n\t\t\t\tkey: MAIN_SCORE_NAME,\n\t\t\t\tvalue: music,\n\t\t\t});\n\t\t\tthis.root.sections.splice(sectionIndex, 0, assignment);\n\n\t\t\tscore.body = score.body.map(term => term === music ? new Variable({name: MAIN_SCORE_NAME}) : term);\n\t\t}\n\t}\n\n\n\tabsoluteBlocksToRelative () {\n\t\tthis.root.forEachTopTerm(Assignment, assignment => {\n\t\t\tif (assignment.value instanceof MusicBlock) {\n\t\t\t\tconst relative = assignment.value.absoluteToRelative();\n\t\t\t\tif (relative)\n\t\t\t\t\tassignment.value = relative;\n\t\t\t}\n\t\t});\n\t}\n};\n"],"mappings":"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","ignoreList":[]}]}