parser-builders.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. import { assert } from '@glimmer/util';
  2. import { PathExpressionImplV1 } from './legacy-interop';
  3. const DEFAULT_STRIP = {
  4. close: false,
  5. open: false
  6. };
  7. /**
  8. * The Parser Builder differentiates from the public builder API by:
  9. *
  10. * 1. Offering fewer different ways to instantiate nodes
  11. * 2. Mandating source locations
  12. */
  13. class Builders {
  14. pos(line, column) {
  15. return {
  16. line,
  17. column
  18. };
  19. }
  20. blockItself({
  21. body,
  22. blockParams,
  23. chained = false,
  24. loc
  25. }) {
  26. return {
  27. type: 'Block',
  28. body: body || [],
  29. blockParams: blockParams || [],
  30. chained,
  31. loc
  32. };
  33. }
  34. template({
  35. body,
  36. blockParams,
  37. loc
  38. }) {
  39. return {
  40. type: 'Template',
  41. body: body || [],
  42. blockParams: blockParams || [],
  43. loc
  44. };
  45. }
  46. mustache({
  47. path,
  48. params,
  49. hash,
  50. trusting,
  51. loc,
  52. strip = DEFAULT_STRIP
  53. }) {
  54. return {
  55. type: 'MustacheStatement',
  56. path,
  57. params,
  58. hash,
  59. escaped: !trusting,
  60. trusting,
  61. loc,
  62. strip: strip || {
  63. open: false,
  64. close: false
  65. }
  66. };
  67. }
  68. block({
  69. path,
  70. params,
  71. hash,
  72. defaultBlock,
  73. elseBlock = null,
  74. loc,
  75. openStrip = DEFAULT_STRIP,
  76. inverseStrip = DEFAULT_STRIP,
  77. closeStrip = DEFAULT_STRIP
  78. }) {
  79. return {
  80. type: 'BlockStatement',
  81. path: path,
  82. params,
  83. hash,
  84. program: defaultBlock,
  85. inverse: elseBlock,
  86. loc: loc,
  87. openStrip: openStrip,
  88. inverseStrip: inverseStrip,
  89. closeStrip: closeStrip
  90. };
  91. }
  92. comment(value, loc) {
  93. return {
  94. type: 'CommentStatement',
  95. value: value,
  96. loc
  97. };
  98. }
  99. mustacheComment(value, loc) {
  100. return {
  101. type: 'MustacheCommentStatement',
  102. value: value,
  103. loc
  104. };
  105. }
  106. concat(parts, loc) {
  107. return {
  108. type: 'ConcatStatement',
  109. parts,
  110. loc
  111. };
  112. }
  113. element({
  114. tag,
  115. selfClosing,
  116. attrs,
  117. blockParams,
  118. modifiers,
  119. comments,
  120. children,
  121. loc
  122. }) {
  123. return {
  124. type: 'ElementNode',
  125. tag,
  126. selfClosing: selfClosing,
  127. attributes: attrs || [],
  128. blockParams: blockParams || [],
  129. modifiers: modifiers || [],
  130. comments: comments || [],
  131. children: children || [],
  132. loc
  133. };
  134. }
  135. elementModifier({
  136. path,
  137. params,
  138. hash,
  139. loc
  140. }) {
  141. return {
  142. type: 'ElementModifierStatement',
  143. path,
  144. params,
  145. hash,
  146. loc
  147. };
  148. }
  149. attr({
  150. name,
  151. value,
  152. loc
  153. }) {
  154. return {
  155. type: 'AttrNode',
  156. name: name,
  157. value: value,
  158. loc
  159. };
  160. }
  161. text({
  162. chars,
  163. loc
  164. }) {
  165. return {
  166. type: 'TextNode',
  167. chars,
  168. loc
  169. };
  170. }
  171. sexpr({
  172. path,
  173. params,
  174. hash,
  175. loc
  176. }) {
  177. return {
  178. type: 'SubExpression',
  179. path,
  180. params,
  181. hash,
  182. loc
  183. };
  184. }
  185. path({
  186. head,
  187. tail,
  188. loc
  189. }) {
  190. let {
  191. original: originalHead
  192. } = headToString(head);
  193. let original = [...originalHead, ...tail].join('.');
  194. return new PathExpressionImplV1(original, head, tail, loc);
  195. }
  196. head(head, loc) {
  197. if (head[0] === '@') {
  198. return this.atName(head, loc);
  199. } else if (head === 'this') {
  200. return this.this(loc);
  201. } else {
  202. return this.var(head, loc);
  203. }
  204. }
  205. this(loc) {
  206. return {
  207. type: 'ThisHead',
  208. loc
  209. };
  210. }
  211. atName(name, loc) {
  212. // the `@` should be included so we have a complete source range
  213. (false && assert(name[0] === '@', `call builders.at() with a string that starts with '@'`));
  214. return {
  215. type: 'AtHead',
  216. name,
  217. loc
  218. };
  219. }
  220. var(name, loc) {
  221. (false && assert(name !== 'this', `You called builders.var() with 'this'. Call builders.this instead`));
  222. (false && assert(name[0] !== '@', `You called builders.var() with '${name}'. Call builders.at('${name}') instead`));
  223. return {
  224. type: 'VarHead',
  225. name,
  226. loc
  227. };
  228. }
  229. hash(pairs, loc) {
  230. return {
  231. type: 'Hash',
  232. pairs: pairs || [],
  233. loc
  234. };
  235. }
  236. pair({
  237. key,
  238. value,
  239. loc
  240. }) {
  241. return {
  242. type: 'HashPair',
  243. key: key,
  244. value,
  245. loc
  246. };
  247. }
  248. literal({
  249. type,
  250. value,
  251. loc
  252. }) {
  253. return {
  254. type,
  255. value,
  256. original: value,
  257. loc
  258. };
  259. }
  260. undefined() {
  261. return this.literal({
  262. type: 'UndefinedLiteral',
  263. value: undefined
  264. });
  265. }
  266. null() {
  267. return this.literal({
  268. type: 'NullLiteral',
  269. value: null
  270. });
  271. }
  272. string(value, loc) {
  273. return this.literal({
  274. type: 'StringLiteral',
  275. value,
  276. loc
  277. });
  278. }
  279. boolean(value, loc) {
  280. return this.literal({
  281. type: 'BooleanLiteral',
  282. value,
  283. loc
  284. });
  285. }
  286. number(value, loc) {
  287. return this.literal({
  288. type: 'NumberLiteral',
  289. value,
  290. loc
  291. });
  292. }
  293. } // Expressions
  294. function headToString(head) {
  295. switch (head.type) {
  296. case 'AtHead':
  297. return {
  298. original: head.name,
  299. parts: [head.name]
  300. };
  301. case 'ThisHead':
  302. return {
  303. original: `this`,
  304. parts: []
  305. };
  306. case 'VarHead':
  307. return {
  308. original: head.name,
  309. parts: [head.name]
  310. };
  311. }
  312. }
  313. export default new Builders();
  314. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcGFyc2VyLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQVMsTUFBVCxRQUF1QixlQUF2QjtBQU1BLFNBQVMsb0JBQVQsUUFBcUMsa0JBQXJDO0FBRUEsTUFBTSxhQUFhLEdBQUc7QUFDcEIsRUFBQSxLQUFLLEVBQUUsS0FEYTtBQUVwQixFQUFBLElBQUksRUFBRTtBQUZjLENBQXRCO0FBS0E7Ozs7Ozs7QUFNQSxNQUFNLFFBQU4sQ0FBYztBQUNaLEVBQUEsR0FBRyxDQUFDLElBQUQsRUFBZSxNQUFmLEVBQTZCO0FBQzlCLFdBQU87QUFDTCxNQUFBLElBREs7QUFFTCxNQUFBO0FBRkssS0FBUDtBQUlEOztBQUVELEVBQUEsV0FBVyxDQUFDO0FBQ1YsSUFBQSxJQURVO0FBRVYsSUFBQSxXQUZVO0FBR1YsSUFBQSxPQUFPLEdBQUcsS0FIQTtBQUlWLElBQUE7QUFKVSxHQUFELEVBVVY7QUFDQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBQUUsT0FERDtBQUVMLE1BQUEsSUFBSSxFQUFFLElBQUksSUFBSSxFQUZUO0FBR0wsTUFBQSxXQUFXLEVBQUUsV0FBVyxJQUFJLEVBSHZCO0FBSUwsTUFBQSxPQUpLO0FBS0wsTUFBQTtBQUxLLEtBQVA7QUFPRDs7QUFFRCxFQUFBLFFBQVEsQ0FBQztBQUNQLElBQUEsSUFETztBQUVQLElBQUEsV0FGTztBQUdQLElBQUE7QUFITyxHQUFELEVBUVA7QUFDQyxXQUFPO0FBQ0wsTUFBQSxJQUFJLEVBQUUsVUFERDtBQUVMLE1BQUEsSUFBSSxFQUFFLElBQUksSUFBSSxFQUZUO0FBR0wsTUFBQSxXQUFXLEVBQUUsV0FBVyxJQUFJLEVBSHZCO0FBSUwsTUFBQTtBQUpLLEtBQVA7QUFNRDs7QUFFRCxFQUFBLFFBQVEsQ0FBQztBQUNQLElBQUEsSUFETztBQUVQLElBQUEsTUFGTztBQUdQLElBQUEsSUFITztBQUlQLElB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QUFBLElBQUksRUFBRSxlQUFSO0FBQXlCLE1BQUEsS0FBekI7QUFBZ0MsTUFBQTtBQUFoQyxLQUFiLENBQVA7QUFDRDs7QUFuVlcsQyxDQWlZZDs7O0FBRUEsU0FBUyxZQUFULENBQXNCLElBQXRCLEVBQTBDO0FBQ3hDLFVBQVEsSUFBSSxDQUFDLElBQWI7QUFDRSxTQUFLLFFBQUw7QUFDRSxhQUFPO0FBQUUsUUFBQSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQWpCO0FBQXVCLFFBQUEsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQU47QUFBOUIsT0FBUDs7QUFDRixTQUFLLFVBQUw7QUFDRSxhQUFPO0FBQUUsUUFBQSxRQUFRLEVBQUUsTUFBWjtBQUFvQixRQUFBLEtBQUssRUFBRTtBQUEzQixPQUFQOztBQUNGLFNBQUssU0FBTDtBQUNFLGFBQU87QUFBRSxRQUFBLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBakI7QUFBdUIsUUFBQSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBTjtBQUE5QixPQUFQO0FBTko7QUFRRDs7QUFFRCxlQUFlLElBQUksUUFBSixFQUFmIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgT3B0aW9uLCBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBQYXJzZXJOb2RlQnVpbGRlciB9IGZyb20gJy4uL3BhcnNlcic7XG5pbXBvcnQgeyBTb3VyY2VMb2NhdGlvbiB9IGZyb20gJy4uL3NvdXJjZS9sb2NhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2VPZmZzZXQsIFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBQYXRoRXhwcmVzc2lvbkltcGxWMSB9IGZyb20gJy4vbGVnYWN5LWludGVyb3AnO1xuXG5jb25zdCBERUZBVUxUX1NUUklQID0ge1xuICBjbG9zZTogZmFsc2UsXG4gIG9wZW46IGZhbHNlLFxufTtcblxuLyoqXG4gKiBUaGUgUGFyc2VyIEJ1aWxkZXIgZGlmZmVyZW50aWF0ZXMgZnJvbSB0aGUgcHVibGljIGJ1aWxkZXIgQVBJIGJ5OlxuICpcbiAqIDEuIE9mZmVyaW5nIGZld2VyIGRpZmZlcmVudCB3YXlzIHRvIGluc3RhbnRpYXRlIG5vZGVzXG4gKiAyLiBNYW5kYXRpbmcgc291cmNlIGxvY2F0aW9uc1xuICovXG5jbGFzcyBCdWlsZGVycyB7XG4gIHBvcyhsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmUsXG4gICAgICBjb2x1bW4sXG4gICAgfTtcbiAgfVxuXG4gIGJsb2NrSXRzZWxmKHtcbiAgICBib2R5LFxuICAgIGJsb2NrUGFyYW1zLFxuICAgIGNoYWluZWQgPSBmYWxzZSxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBib2R5PzogQVNUdjEuU3RhdGVtZW50W107XG4gICAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXTtcbiAgICBjaGFpbmVkPzogYm9vbGVhbjtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5CbG9jayB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCbG9jaycsXG4gICAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgICAgY2hhaW5lZCxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgdGVtcGxhdGUoe1xuICAgIGJvZHksXG4gICAgYmxvY2tQYXJhbXMsXG4gICAgbG9jLFxuICB9OiB7XG4gICAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdO1xuICAgIGJsb2NrUGFyYW1zPzogc3RyaW5nW107XG4gICAgbG9jOiBTb3VyY2VTcGFuO1xuICB9KTogQVNUdjEuVGVtcGxhdGUge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgICAgYm9keTogYm9keSB8fCBbXSxcbiAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgbXVzdGFjaGUoe1xuICAgIHBhdGgsXG4gICAgcGFyYW1zLFxuICAgIGhhc2gsXG4gICAgdHJ1c3RpbmcsXG4gICAgbG9jLFxuICAgIHN0cmlwID0gREVGQVVMVF9TVFJJUCxcbiAgfToge1xuICAgIHBhdGg6IEFTVHYxLkV4cHJlc3Npb247XG4gICAgcGFyYW1zOiBBU1R2MS5FeHByZXNzaW9uW107XG4gICAgaGFzaDogQVNUdjEuSGFzaDtcbiAgICB0cnVzdGluZzogYm9vbGVhbjtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gICAgc3RyaXA6IEFTVHYxLlN0cmlwRmxhZ3M7XG4gIH0pOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdNdXN0YWNoZVN0YXRlbWVudCcsXG4gICAgICBwYXRoLFxuICAgICAgcGFyYW1zLFxuICAgICAgaGFzaCxcbiAgICAgIGVzY2FwZWQ6ICF0cnVzdGluZyxcbiAgICAgIHRydXN0aW5nLFxuICAgICAgbG9jLFxuICAgICAgc3RyaXA6IHN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIH07XG4gIH1cblxuICBibG9jayh7XG4gICAgcGF0aCxcbiAgICBwYXJhbXMsXG4gICAgaGFzaCxcbiAgICBkZWZhdWx0QmxvY2ssXG4gICAgZWxzZUJsb2NrID0gbnVsbCxcbiAgICBsb2MsXG4gICAgb3BlblN0cmlwID0gREVGQVVMVF9TVFJJUCxcbiAgICBpbnZlcnNlU3RyaXAgPSBERUZBVUxUX1NUUklQLFxuICAgIGNsb3NlU3RyaXAgPSBERUZBVUxUX1NUUklQLFxuICB9OiB7XG4gICAgcGF0aDogQVNUdjEuUGF0aEV4cHJlc3Npb24gfCBBU1R2MS5TdWJFeHByZXNzaW9uO1xuICAgIHBhcmFtczogQVNUdjEuRXhwcmVzc2lvbltdO1xuICAgIGhhc2g6IEFTVHYxLkhhc2g7XG4gICAgZGVmYXVsdEJsb2NrOiBBU1R2MS5CbG9jaztcbiAgICBlbHNlQmxvY2s/OiBPcHRpb248QVNUdjEuQmxvY2s+O1xuICAgIGxvYzogU291cmNlU3BhbjtcbiAgICBvcGVuU3RyaXA6IEFTVHYxLlN0cmlwRmxhZ3M7XG4gICAgaW52ZXJzZVN0cmlwOiBBU1R2MS5TdHJpcEZsYWdzO1xuICAgIGNsb3NlU3RyaXA6IEFTVHYxLlN0cmlwRmxhZ3M7XG4gIH0pOiBBU1R2MS5CbG9ja1N0YXRlbWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCbG9ja1N0YXRlbWVudCcsXG4gICAgICBwYXRoOiBwYXRoLFxuICAgICAgcGFyYW1zLFxuICAgICAgaGFzaCxcbiAgICAgIHByb2dyYW06IGRlZmF1bHRCbG9jayxcbiAgICAgIGludmVyc2U6IGVsc2VCbG9jayxcbiAgICAgIGxvYzogbG9jLFxuICAgICAgb3BlblN0cmlwOiBvcGVuU3RyaXAsXG4gICAgICBpbnZlcnNlU3RyaXA6IGludmVyc2VTdHJpcCxcbiAgICAgIGNsb3NlU3RyaXA6IGNsb3NlU3RyaXAsXG4gICAgfTtcbiAgfVxuXG4gIGNvbW1lbnQodmFsdWU6IHN0cmluZywgbG9jOiBTb3VyY2VPZmZzZXQpOiBQYXJzZXJOb2RlQnVpbGRlcjxBU1R2MS5Db21tZW50U3RhdGVtZW50PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JyxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgbXVzdGFjaGVDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYzogU291cmNlU3Bhbik6IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBjb25jYXQoXG4gICAgcGFydHM6IFByZXNlbnRBcnJheTxBU1R2MS5UZXh0Tm9kZSB8IEFTVHYxLk11c3RhY2hlU3RhdGVtZW50PixcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjEuQ29uY2F0U3RhdGVtZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0NvbmNhdFN0YXRlbWVudCcsXG4gICAgICBwYXJ0cyxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgZWxlbWVudCh7XG4gICAgdGFnLFxuICAgIHNlbGZDbG9zaW5nLFxuICAgIGF0dHJzLFxuICAgIGJsb2NrUGFyYW1zLFxuICAgIG1vZGlmaWVycyxcbiAgICBjb21tZW50cyxcbiAgICBjaGlsZHJlbixcbiAgICBsb2MsXG4gIH06IEJ1aWxkRWxlbWVudE9wdGlvbnMpOiBBU1R2MS5FbGVtZW50Tm9kZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdFbGVtZW50Tm9kZScsXG4gICAgICB0YWcsXG4gICAgICBzZWxmQ2xvc2luZzogc2VsZkNsb3NpbmcsXG4gICAgICBhdHRyaWJ1dGVzOiBhdHRycyB8fCBbXSxcbiAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICAgIG1vZGlmaWVyczogbW9kaWZpZXJzIHx8IFtdLFxuICAgICAgY29tbWVudHM6IChjb21tZW50cyBhcyBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnRbXSkgfHwgW10sXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgW10sXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIGVsZW1lbnRNb2RpZmllcih7XG4gICAgcGF0aCxcbiAgICBwYXJhbXMsXG4gICAgaGFzaCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBwYXRoOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB8IEFTVHYxLlN1YkV4cHJlc3Npb247XG4gICAgcGFyYW1zOiBBU1R2MS5FeHByZXNzaW9uW107XG4gICAgaGFzaDogQVNUdjEuSGFzaDtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50JyxcbiAgICAgIHBhdGgsXG4gICAgICBwYXJhbXMsXG4gICAgICBoYXNoLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBhdHRyKHtcbiAgICBuYW1lLFxuICAgIHZhbHVlLFxuICAgIGxvYyxcbiAgfToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ107XG4gICAgbG9jOiBTb3VyY2VTcGFuO1xuICB9KTogQVNUdjEuQXR0ck5vZGUge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnQXR0ck5vZGUnLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgdGV4dCh7IGNoYXJzLCBsb2MgfTogeyBjaGFyczogc3RyaW5nOyBsb2M6IFNvdXJjZVNwYW4gfSk6IEFTVHYxLlRleHROb2RlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1RleHROb2RlJyxcbiAgICAgIGNoYXJzLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBzZXhwcih7XG4gICAgcGF0aCxcbiAgICBwYXJhbXMsXG4gICAgaGFzaCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBwYXRoOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB8IEFTVHYxLlN1YkV4cHJlc3Npb247XG4gICAgcGFyYW1zOiBBU1R2MS5FeHByZXNzaW9uW107XG4gICAgaGFzaDogQVNUdjEuSGFzaDtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5TdWJFeHByZXNzaW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1N1YkV4cHJlc3Npb24nLFxuICAgICAgcGF0aCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIGhhc2gsXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIHBhdGgoe1xuICAgIGhlYWQsXG4gICAgdGFpbCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBoZWFkOiBBU1R2MS5QYXRoSGVhZDtcbiAgICB0YWlsOiBzdHJpbmdbXTtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB7XG4gICAgbGV0IHsgb3JpZ2luYWw6IG9yaWdpbmFsSGVhZCB9ID0gaGVhZFRvU3RyaW5nKGhlYWQpO1xuICAgIGxldCBvcmlnaW5hbCA9IFsuLi5vcmlnaW5hbEhlYWQsIC4uLnRhaWxdLmpvaW4oJy4nKTtcblxuICAgIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEob3JpZ2luYWwsIGhlYWQsIHRhaWwsIGxvYyk7XG4gIH1cblxuICBoZWFkKGhlYWQ6IHN0cmluZywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuUGF0aEhlYWQge1xuICAgIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0TmFtZShoZWFkLCBsb2MpO1xuICAgIH0gZWxzZSBpZiAoaGVhZCA9PT0gJ3RoaXMnKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGlzKGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnZhcihoZWFkLCBsb2MpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMobG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuUGF0aEhlYWQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBhdE5hbWUobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2MS5QYXRoSGVhZCB7XG4gICAgLy8gdGhlIGBAYCBzaG91bGQgYmUgaW5jbHVkZWQgc28gd2UgaGF2ZSBhIGNvbXBsZXRlIHNvdXJjZSByYW5nZVxuICAgIGFzc2VydChuYW1lWzBdID09PSAnQCcsIGBjYWxsIGJ1aWxkZXJzLmF0KCkgd2l0aCBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdAJ2ApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdBdEhlYWQnLFxuICAgICAgbmFtZSxcbiAgICAgIGxvYyxcbiAgICB9O1xuICB9XG5cbiAgdmFyKG5hbWU6IHN0cmluZywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuUGF0aEhlYWQge1xuICAgIGFzc2VydChuYW1lICE9PSAndGhpcycsIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJ3RoaXMnLiBDYWxsIGJ1aWxkZXJzLnRoaXMgaW5zdGVhZGApO1xuICAgIGFzc2VydChcbiAgICAgIG5hbWVbMF0gIT09ICdAJyxcbiAgICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJyR7bmFtZX0nLiBDYWxsIGJ1aWxkZXJzLmF0KCcke25hbWV9JykgaW5zdGVhZGBcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICAgIG5hbWUsXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIGhhc2gocGFpcnM6IEFTVHYxLkhhc2hQYWlyW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYxLkhhc2gge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnSGFzaCcsXG4gICAgICBwYWlyczogcGFpcnMgfHwgW10sXG4gICAgICBsb2MsXG4gICAgfTtcbiAgfVxuXG4gIHBhaXIoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogQVNUdjEuRXhwcmVzc2lvbjtcbiAgICBsb2M6IFNvdXJjZVNwYW47XG4gIH0pOiBBU1R2MS5IYXNoUGFpciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdIYXNoUGFpcicsXG4gICAgICBrZXk6IGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH07XG4gIH1cblxuICBsaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPih7XG4gICAgdHlwZSxcbiAgICB2YWx1ZSxcbiAgICBsb2MsXG4gIH06IHtcbiAgICB0eXBlOiBUWyd0eXBlJ107XG4gICAgdmFsdWU6IFRbJ3ZhbHVlJ107XG4gICAgbG9jPzogU291cmNlTG9jYXRpb247XG4gIH0pOiBUIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlLFxuICAgICAgb3JpZ2luYWw6IHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH0gYXMgVDtcbiAgfVxuXG4gIHVuZGVmaW5lZCgpOiBBU1R2MS5VbmRlZmluZWRMaXRlcmFsIHtcbiAgICByZXR1cm4gdGhpcy5saXRlcmFsKHsgdHlwZTogJ1VuZGVmaW5lZExpdGVyYWwnLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICB9XG5cbiAgbnVsbCgpOiBBU1R2MS5OdWxsTGl0ZXJhbCB7XG4gICAgcmV0dXJuIHRoaXMubGl0ZXJhbCh7IHR5cGU6ICdOdWxsTGl0ZXJhbCcsIHZhbHVlOiBudWxsIH0pO1xuICB9XG5cbiAgc3RyaW5nKHZhbHVlOiBzdHJpbmcsIGxvYzogU291cmNlU3Bhbik6IEFTVHYxLlN0cmluZ0xpdGVyYWwge1xuICAgIHJldHVybiB0aGlzLmxpdGVyYWwoeyB0eXBlOiAnU3RyaW5nTGl0ZXJhbCcsIHZhbHVlLCBsb2MgfSk7XG4gIH1cblxuICBib29sZWFuKHZhbHVlOiBib29sZWFuLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2MS5Cb29sZWFuTGl0ZXJhbCB7XG4gICAgcmV0dXJuIHRoaXMubGl0ZXJhbCh7IHR5cGU6ICdCb29sZWFuTGl0ZXJhbCcsIHZhbHVlLCBsb2MgfSk7XG4gIH1cblxuICBudW1iZXIodmFsdWU6IG51bWJlciwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjEuTnVtYmVyTGl0ZXJhbCB7XG4gICAgcmV0dXJuIHRoaXMubGl0ZXJhbCh7IHR5cGU6ICdOdW1iZXJMaXRlcmFsJywgdmFsdWUsIGxvYyB9KTtcbiAgfVxufVxuXG4vLyBOb2Rlc1xuXG5leHBvcnQgdHlwZSBFbGVtZW50UGFydHMgPVxuICB8IFsnYXR0cnMnLCAuLi5BdHRyU2V4cFtdXVxuICB8IFsnbW9kaWZpZXJzJywgLi4uTW9kaWZpZXJTZXhwW11dXG4gIHwgWydib2R5JywgLi4uQVNUdjEuU3RhdGVtZW50W11dXG4gIHwgWydjb21tZW50cycsIC4uLkVsZW1lbnRDb21tZW50W11dXG4gIHwgWydhcycsIC4uLnN0cmluZ1tdXVxuICB8IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBQYXRoU2V4cCA9IHN0cmluZyB8IFsncGF0aCcsIHN0cmluZywgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclNleHAgPVxuICB8IHN0cmluZ1xuICB8IFtQYXRoU2V4cCwgTG9jU2V4cD9dXG4gIHwgW1BhdGhTZXhwLCBBU1R2MS5FeHByZXNzaW9uW10sIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+LCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIEF0dHJTZXhwID0gW3N0cmluZywgQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10gfCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTG9jU2V4cCA9IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50Q29tbWVudCA9IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB8IFNvdXJjZUxvY2F0aW9uIHwgc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBTZXhwVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IEFTVHYxLkV4cHJlc3Npb25bXVxuICB8IERpY3Q8QVNUdjEuRXhwcmVzc2lvbj5cbiAgfCBMb2NTZXhwXG4gIHwgUGF0aFNleHBcbiAgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbGVtZW50T3B0aW9ucyB7XG4gIHRhZzogc3RyaW5nO1xuICBzZWxmQ2xvc2luZzogYm9vbGVhbjtcbiAgYXR0cnM6IEFTVHYxLkF0dHJOb2RlW107XG4gIG1vZGlmaWVyczogQVNUdjEuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50W107XG4gIGNoaWxkcmVuOiBBU1R2MS5TdGF0ZW1lbnRbXTtcbiAgY29tbWVudHM6IEVsZW1lbnRDb21tZW50W107XG4gIGJsb2NrUGFyYW1zOiBzdHJpbmdbXTtcbiAgbG9jOiBTb3VyY2VTcGFuO1xufVxuXG4vLyBFeHByZXNzaW9uc1xuXG5mdW5jdGlvbiBoZWFkVG9TdHJpbmcoaGVhZDogQVNUdjEuUGF0aEhlYWQpOiB7IG9yaWdpbmFsOiBzdHJpbmc7IHBhcnRzOiBzdHJpbmdbXSB9IHtcbiAgc3dpdGNoIChoZWFkLnR5cGUpIHtcbiAgICBjYXNlICdBdEhlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGhlYWQubmFtZSwgcGFydHM6IFtoZWFkLm5hbWVdIH07XG4gICAgY2FzZSAnVGhpc0hlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGB0aGlzYCwgcGFydHM6IFtdIH07XG4gICAgY2FzZSAnVmFySGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQnVpbGRlcnMoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=