UNPKG

@glimmer/compiler

Version:
331 lines (270 loc) 32.4 kB
import { dict, exhausted } from '@glimmer/util'; import { inflateAttrName, inflateTagName } from './utils'; export default class WireFormatDebugger { constructor([_statements, symbols, _hasEval, upvars]) { this.upvars = upvars; this.symbols = symbols; } format(program) { let out = []; for (let statement of program[0]) { out.push(this.formatOpcode(statement)); } return out; } formatOpcode(opcode) { if (Array.isArray(opcode)) { switch (opcode[0]) { case 1 /* Append */ : return ['append', this.formatOpcode(opcode[1])]; case 2 /* TrustingAppend */ : return ['trusting-append', this.formatOpcode(opcode[1])]; case 6 /* Block */ : return ['block', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])]; case 40 /* InElement */ : return ['in-element', opcode[1], this.formatOpcode(opcode[2]), opcode[3] ? this.formatOpcode(opcode[3]) : undefined]; case 10 /* OpenElement */ : return ['open-element', inflateTagName(opcode[1])]; case 11 /* OpenElementWithSplat */ : return ['open-element-with-splat', inflateTagName(opcode[1])]; case 13 /* CloseElement */ : return ['close-element']; case 12 /* FlushElement */ : return ['flush-element']; case 14 /* StaticAttr */ : return ['static-attr', inflateAttrName(opcode[1]), opcode[2], opcode[3]]; case 24 /* StaticComponentAttr */ : return ['static-component-attr', inflateAttrName(opcode[1]), opcode[2], opcode[3]]; case 15 /* DynamicAttr */ : return ['dynamic-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]]; case 16 /* ComponentAttr */ : return ['component-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]]; case 17 /* AttrSplat */ : return ['attr-splat']; case 18 /* Yield */ : return ['yield', opcode[1], this.formatParams(opcode[2])]; case 20 /* DynamicArg */ : return ['dynamic-arg', opcode[1], this.formatOpcode(opcode[2])]; case 21 /* StaticArg */ : return ['static-arg', opcode[1], this.formatOpcode(opcode[2])]; case 22 /* TrustingDynamicAttr */ : return ['trusting-dynamic-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]]; case 23 /* TrustingComponentAttr */ : return ['trusting-component-attr', inflateAttrName(opcode[1]), this.formatOpcode(opcode[2]), opcode[3]]; case 26 /* Debugger */ : return ['debugger', opcode[1]]; case 3 /* Comment */ : return ['comment', opcode[1]]; case 4 /* Modifier */ : return ['modifier', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3])]; case 8 /* Component */ : return ['component', this.formatOpcode(opcode[1]), this.formatElementParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])]; case 48 /* HasBlock */ : return ['has-block', this.formatOpcode(opcode[1])]; case 49 /* HasBlockParams */ : return ['has-block-params', this.formatOpcode(opcode[1])]; case 50 /* Curry */ : return ['curry', this.formatOpcode(opcode[1]), this.formatCurryType(opcode[2]), this.formatParams(opcode[3]), this.formatHash(opcode[4])]; case 27 /* Undefined */ : return ['undefined']; case 28 /* Call */ : return ['call', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3])]; case 29 /* Concat */ : return ['concat', this.formatParams(opcode[1])]; case 31 /* GetStrictFree */ : return ['get-strict-free', this.upvars[opcode[1]], opcode[2]]; case 34 /* GetFreeAsComponentOrHelperHeadOrThisFallback */ : return ['GetFreeAsComponentOrHelperHeadOrThisFallback', this.upvars[opcode[1]], opcode[2]]; case 35 /* GetFreeAsComponentOrHelperHead */ : return ['GetFreeAsComponentOrHelperHead', this.upvars[opcode[1]], opcode[2]]; case 36 /* GetFreeAsHelperHeadOrThisFallback */ : return ['GetFreeAsHelperHeadOrThisFallback', this.upvars[opcode[1]], opcode[2]]; case 99 /* GetFreeAsDeprecatedHelperHeadOrThisFallback */ : return ['GetFreeAsDeprecatedHelperHeadOrThisFallback', this.upvars[opcode[1]]]; case 37 /* GetFreeAsHelperHead */ : return ['GetFreeAsHelperHead', this.upvars[opcode[1]], opcode[2]]; case 39 /* GetFreeAsComponentHead */ : return ['GetFreeAsComponentHead', this.upvars[opcode[1]], opcode[2]]; case 38 /* GetFreeAsModifierHead */ : return ['GetFreeAsModifierHead', this.upvars[opcode[1]], opcode[2]]; case 30 /* GetSymbol */ : { if (opcode[1] === 0) { return ['get-symbol', 'this', opcode[2]]; } else { return ['get-symbol', this.symbols[opcode[1] - 1], opcode[2]]; } } case 32 /* GetTemplateSymbol */ : { return ['get-template-symbol', opcode[1], opcode[2]]; } case 41 /* If */ : return ['if', this.formatOpcode(opcode[1]), this.formatBlock(opcode[2]), opcode[3] ? this.formatBlock(opcode[3]) : null]; case 52 /* IfInline */ : return ['if-inline']; case 51 /* Not */ : return ['not']; case 42 /* Each */ : return ['each', this.formatOpcode(opcode[1]), opcode[2] ? this.formatOpcode(opcode[2]) : null, this.formatBlock(opcode[3]), opcode[4] ? this.formatBlock(opcode[4]) : null]; case 43 /* With */ : return ['with', this.formatOpcode(opcode[1]), this.formatBlock(opcode[2]), opcode[3] ? this.formatBlock(opcode[3]) : null]; case 44 /* Let */ : return ['let', this.formatParams(opcode[1]), this.formatBlock(opcode[2])]; case 54 /* Log */ : return ['log', this.formatParams(opcode[1])]; case 45 /* WithDynamicVars */ : return ['-with-dynamic-vars', this.formatHash(opcode[1]), this.formatBlock(opcode[2])]; case 53 /* GetDynamicVar */ : return ['-get-dynamic-vars', this.formatOpcode(opcode[1])]; case 46 /* InvokeComponent */ : return ['component', this.formatOpcode(opcode[1]), this.formatParams(opcode[2]), this.formatHash(opcode[3]), this.formatBlocks(opcode[4])]; } } else { return opcode; } } formatCurryType(value) { switch (value) { case 0 /* Component */ : return 'component'; case 1 /* Helper */ : return 'helper'; case 2 /* Modifier */ : return 'modifier'; default: throw exhausted(value); } } formatElementParams(opcodes) { if (opcodes === null) return null; return opcodes.map(o => this.formatOpcode(o)); } formatParams(opcodes) { if (opcodes === null) return null; return opcodes.map(o => this.formatOpcode(o)); } formatHash(hash) { if (hash === null) return null; return hash[0].reduce((accum, key, index) => { accum[key] = this.formatOpcode(hash[1][index]); return accum; }, dict()); } formatBlocks(blocks) { if (blocks === null) return null; return blocks[0].reduce((accum, key, index) => { accum[key] = this.formatBlock(blocks[1][index]); return accum; }, dict()); } formatBlock(block) { return { statements: block[0].map(s => this.formatOpcode(s)), parameters: block[1] }; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi93aXJlLWZvcm1hdC1kZWJ1Zy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxTQUFTLElBQVQsRUFBZSxTQUFmLFFBQWdDLGVBQWhDO0FBRUEsU0FBUyxlQUFULEVBQTBCLGNBQTFCLFFBQWdELFNBQWhEO0FBRUEsZUFBYyxNQUFPLGtCQUFQLENBQXlCO0FBSXJDLEVBQUEsV0FBQSxDQUFZLENBQUMsV0FBRCxFQUFjLE9BQWQsRUFBdUIsUUFBdkIsRUFBaUMsTUFBakMsQ0FBWixFQUE2RTtBQUMzRSxTQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNEOztBQUVELEVBQUEsTUFBTSxDQUFDLE9BQUQsRUFBaUM7QUFDckMsUUFBSSxHQUFHLEdBQUcsRUFBVjs7QUFFQSxTQUFLLElBQUksU0FBVCxJQUFzQixPQUFPLENBQUMsQ0FBRCxDQUE3QixFQUFrQztBQUNoQyxNQUFBLEdBQUcsQ0FBQyxJQUFKLENBQVMsS0FBSyxZQUFMLENBQWtCLFNBQWxCLENBQVQ7QUFDRDs7QUFFRCxXQUFPLEdBQVA7QUFDRDs7QUFFRCxFQUFBLFlBQVksQ0FBQyxNQUFELEVBQTBCO0FBQ3BDLFFBQUksS0FBSyxDQUFDLE9BQU4sQ0FBYyxNQUFkLENBQUosRUFBMkI7QUFDekIsY0FBUSxNQUFNLENBQUMsQ0FBRCxDQUFkO0FBQ0UsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLFFBQUQsRUFBVyxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FBWCxDQUFQOztBQUNGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxpQkFBRCxFQUFvQixLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FBcEIsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQ0wsT0FESyxFQUVMLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUZLLEVBR0wsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBSEssRUFJTCxLQUFLLFVBQUwsQ0FBZ0IsTUFBTSxDQUFDLENBQUQsQ0FBdEIsQ0FKSyxFQUtMLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUxLLENBQVA7O0FBUUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUNMLFlBREssRUFFTCxNQUFNLENBQUMsQ0FBRCxDQUZELEVBR0wsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBSEssRUFJTCxNQUFNLENBQUMsQ0FBRCxDQUFOLEdBQVksS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBQVosR0FBMkMsU0FKdEMsQ0FBUDs7QUFPRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsY0FBRCxFQUFpQixjQUFjLENBQUMsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQUEvQixDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyx5QkFBRCxFQUE0QixjQUFjLENBQUMsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQUExQyxDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxlQUFELENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLGVBQUQsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsYUFBRCxFQUFnQixlQUFlLENBQUMsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQUEvQixFQUE0QyxNQUFNLENBQUMsQ0FBRCxDQUFsRCxFQUF1RCxNQUFNLENBQUMsQ0FBRCxDQUE3RCxDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyx1QkFBRCxFQUEwQixlQUFlLENBQUMsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQUF6QyxFQUFzRCxNQUFNLENBQUMsQ0FBRCxDQUE1RCxFQUFpRSxNQUFNLENBQUMsQ0FBRCxDQUF2RSxDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FDTCxjQURLLEVBRUwsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FGVixFQUdMLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUhLLEVBSUwsTUFBTSxDQUFDLENBQUQsQ0FKRCxDQUFQOztBQU9GLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FDTCxnQkFESyxFQUVMLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBRlYsRUFHTCxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FISyxFQUlMLE1BQU0sQ0FBQyxDQUFELENBSkQsQ0FBUDs7QUFPRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsWUFBRCxDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxPQUFELEVBQVUsTUFBTSxDQUFDLENBQUQsQ0FBaEIsRUFBcUIsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBQXJCLENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLGFBQUQsRUFBZ0IsTUFBTSxDQUFDLENBQUQsQ0FBdEIsRUFBMkIsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBQTNCLENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLFlBQUQsRUFBZSxNQUFNLENBQUMsQ0FBRCxDQUFyQixFQUEwQixLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FBMUIsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQ0wsdUJBREssRUFFTCxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQUZWLEVBR0wsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBSEssRUFJTCxNQUFNLENBQUMsQ0FBRCxDQUpELENBQVA7O0FBT0YsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUNMLHlCQURLLEVBRUwsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FGVixFQUdMLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUhLLEVBSUwsTUFBTSxDQUFDLENBQUQsQ0FKRCxDQUFQOztBQU9GLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxVQUFELEVBQWEsTUFBTSxDQUFDLENBQUQsQ0FBbkIsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsU0FBRCxFQUFZLE1BQU0sQ0FBQyxDQUFELENBQWxCLENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUNMLFVBREssRUFFTCxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FGSyxFQUdMLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUhLLEVBSUwsS0FBSyxVQUFMLENBQWdCLE1BQU0sQ0FBQyxDQUFELENBQXRCLENBSkssQ0FBUDs7QUFPRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQ0wsV0FESyxFQUVMLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUZLLEVBR0wsS0FBSyxtQkFBTCxDQUF5QixNQUFNLENBQUMsQ0FBRCxDQUEvQixDQUhLLEVBSUwsS0FBSyxVQUFMLENBQWdCLE1BQU0sQ0FBQyxDQUFELENBQXRCLENBSkssRUFLTCxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FMSyxDQUFQOztBQVFGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxXQUFELEVBQWMsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBQWQsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsa0JBQUQsRUFBcUIsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBQXJCLENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUNMLE9BREssRUFFTCxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FGSyxFQUdMLEtBQUssZUFBTCxDQUFxQixNQUFNLENBQUMsQ0FBRCxDQUEzQixDQUhLLEVBSUwsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBSkssRUFLTCxLQUFLLFVBQUwsQ0FBZ0IsTUFBTSxDQUFDLENBQUQsQ0FBdEIsQ0FMSyxDQUFQOztBQVFGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxXQUFELENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUNMLE1BREssRUFFTCxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FGSyxFQUdMLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUhLLEVBSUwsS0FBSyxVQUFMLENBQWdCLE1BQU0sQ0FBQyxDQUFELENBQXRCLENBSkssQ0FBUDs7QUFPRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsUUFBRCxFQUFXLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUFYLENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLGlCQUFELEVBQW9CLEtBQUssTUFBTCxDQUFZLE1BQU0sQ0FBQyxDQUFELENBQWxCLENBQXBCLEVBQTRDLE1BQU0sQ0FBQyxDQUFELENBQWxELENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUNMLDhDQURLLEVBRUwsS0FBSyxNQUFMLENBQVksTUFBTSxDQUFDLENBQUQsQ0FBbEIsQ0FGSyxFQUdMLE1BQU0sQ0FBQyxDQUFELENBSEQsQ0FBUDs7QUFNRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsZ0NBQUQsRUFBbUMsS0FBSyxNQUFMLENBQVksTUFBTSxDQUFDLENBQUQsQ0FBbEIsQ0FBbkMsRUFBMkQsTUFBTSxDQUFDLENBQUQsQ0FBakUsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsbUNBQUQsRUFBc0MsS0FBSyxNQUFMLENBQVksTUFBTSxDQUFDLENBQUQsQ0FBbEIsQ0FBdEMsRUFBOEQsTUFBTSxDQUFDLENBQUQsQ0FBcEUsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsNkNBQUQsRUFBZ0QsS0FBSyxNQUFMLENBQVksTUFBTSxDQUFDLENBQUQsQ0FBbEIsQ0FBaEQsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMscUJBQUQsRUFBd0IsS0FBSyxNQUFMLENBQVksTUFBTSxDQUFDLENBQUQsQ0FBbEIsQ0FBeEIsRUFBZ0QsTUFBTSxDQUFDLENBQUQsQ0FBdEQsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsd0JBQUQsRUFBMkIsS0FBSyxNQUFMLENBQVksTUFBTSxDQUFDLENBQUQsQ0FBbEIsQ0FBM0IsRUFBbUQsTUFBTSxDQUFDLENBQUQsQ0FBekQsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsdUJBQUQsRUFBMEIsS0FBSyxNQUFMLENBQVksTUFBTSxDQUFDLENBQUQsQ0FBbEIsQ0FBMUIsRUFBa0QsTUFBTSxDQUFDLENBQUQsQ0FBeEQsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUFtQjtBQUNqQixnQkFBSSxNQUFNLENBQUMsQ0FBRCxDQUFOLEtBQWMsQ0FBbEIsRUFBcUI7QUFDbkIscUJBQU8sQ0FBQyxZQUFELEVBQWUsTUFBZixFQUF1QixNQUFNLENBQUMsQ0FBRCxDQUE3QixDQUFQO0FBQ0QsYUFGRCxNQUVPO0FBQ0wscUJBQU8sQ0FBQyxZQUFELEVBQWUsS0FBSyxPQUFMLENBQWEsTUFBTSxDQUFDLENBQUQsQ0FBTixHQUFZLENBQXpCLENBQWYsRUFBNEMsTUFBTSxDQUFDLENBQUQsQ0FBbEQsQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQsYUFBQTtBQUFBO0FBQUE7QUFBMkI7QUFDekIsbUJBQU8sQ0FBQyxxQkFBRCxFQUF3QixNQUFNLENBQUMsQ0FBRCxDQUE5QixFQUFtQyxNQUFNLENBQUMsQ0FBRCxDQUF6QyxDQUFQO0FBQ0Q7O0FBRUQsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUNMLElBREssRUFFTCxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FGSyxFQUdMLEtBQUssV0FBTCxDQUFpQixNQUFNLENBQUMsQ0FBRCxDQUF2QixDQUhLLEVBSUwsTUFBTSxDQUFDLENBQUQsQ0FBTixHQUFZLEtBQUssV0FBTCxDQUFpQixNQUFNLENBQUMsQ0FBRCxDQUF2QixDQUFaLEdBQTBDLElBSnJDLENBQVA7O0FBT0YsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLFdBQUQsQ0FBUDs7QUFFRixhQUFBO0FBQUE7QUFBQTtBQUNFLGlCQUFPLENBQUMsS0FBRCxDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FDTCxNQURLLEVBRUwsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBRkssRUFHTCxNQUFNLENBQUMsQ0FBRCxDQUFOLEdBQVksS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBQVosR0FBMkMsSUFIdEMsRUFJTCxLQUFLLFdBQUwsQ0FBaUIsTUFBTSxDQUFDLENBQUQsQ0FBdkIsQ0FKSyxFQUtMLE1BQU0sQ0FBQyxDQUFELENBQU4sR0FBWSxLQUFLLFdBQUwsQ0FBaUIsTUFBTSxDQUFDLENBQUQsQ0FBdkIsQ0FBWixHQUEwQyxJQUxyQyxDQUFQOztBQVFGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FDTCxNQURLLEVBRUwsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBRkssRUFHTCxLQUFLLFdBQUwsQ0FBaUIsTUFBTSxDQUFDLENBQUQsQ0FBdkIsQ0FISyxFQUlMLE1BQU0sQ0FBQyxDQUFELENBQU4sR0FBWSxLQUFLLFdBQUwsQ0FBaUIsTUFBTSxDQUFDLENBQUQsQ0FBdkIsQ0FBWixHQUEwQyxJQUpyQyxDQUFQOztBQU9GLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxLQUFELEVBQVEsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBQVIsRUFBc0MsS0FBSyxXQUFMLENBQWlCLE1BQU0sQ0FBQyxDQUFELENBQXZCLENBQXRDLENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLEtBQUQsRUFBUSxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FBUixDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FBQyxvQkFBRCxFQUF1QixLQUFLLFVBQUwsQ0FBZ0IsTUFBTSxDQUFDLENBQUQsQ0FBdEIsQ0FBdkIsRUFBbUQsS0FBSyxXQUFMLENBQWlCLE1BQU0sQ0FBQyxDQUFELENBQXZCLENBQW5ELENBQVA7O0FBRUYsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxDQUFDLG1CQUFELEVBQXNCLEtBQUssWUFBTCxDQUFrQixNQUFNLENBQUMsQ0FBRCxDQUF4QixDQUF0QixDQUFQOztBQUVGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sQ0FDTCxXQURLLEVBRUwsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBRkssRUFHTCxLQUFLLFlBQUwsQ0FBa0IsTUFBTSxDQUFDLENBQUQsQ0FBeEIsQ0FISyxFQUlMLEtBQUssVUFBTCxDQUFnQixNQUFNLENBQUMsQ0FBRCxDQUF0QixDQUpLLEVBS0wsS0FBSyxZQUFMLENBQWtCLE1BQU0sQ0FBQyxDQUFELENBQXhCLENBTEssQ0FBUDtBQTdOSjtBQXFPRCxLQXRPRCxNQXNPTztBQUNMLGFBQU8sTUFBUDtBQUNEO0FBQ0Y7O0FBRU8sRUFBQSxlQUFlLENBQUMsS0FBRCxFQUFtQjtBQUN4QyxZQUFRLEtBQVI7QUFDRSxXQUFBO0FBQUE7QUFBQTtBQUNFLGVBQU8sV0FBUDs7QUFDRixXQUFBO0FBQUE7QUFBQTtBQUNFLGVBQU8sUUFBUDs7QUFDRixXQUFBO0FBQUE7QUFBQTtBQUNFLGVBQU8sVUFBUDs7QUFDRjtBQUNFLGNBQU0sU0FBUyxDQUFDLEtBQUQsQ0FBZjtBQVJKO0FBVUQ7O0FBRU8sRUFBQSxtQkFBbUIsQ0FBQyxPQUFELEVBQStDO0FBQ3hFLFFBQUksT0FBTyxLQUFLLElBQWhCLEVBQXNCLE9BQU8sSUFBUDtBQUN0QixXQUFPLE9BQU8sQ0FBQyxHQUFSLENBQWEsQ0FBRCxJQUFPLEtBQUssWUFBTCxDQUFrQixDQUFsQixDQUFuQixDQUFQO0FBQ0Q7O0FBRU8sRUFBQSxZQUFZLENBQUMsT0FBRCxFQUF5QztBQUMzRCxRQUFJLE9BQU8sS0FBSyxJQUFoQixFQUFzQixPQUFPLElBQVA7QUFDdEIsV0FBTyxPQUFPLENBQUMsR0FBUixDQUFhLENBQUQsSUFBTyxLQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsQ0FBbkIsQ0FBUDtBQUNEOztBQUVPLEVBQUEsVUFBVSxDQUFDLElBQUQsRUFBMkI7QUFDM0MsUUFBSSxJQUFJLEtBQUssSUFBYixFQUFtQixPQUFPLElBQVA7QUFFbkIsV0FBTyxJQUFJLENBQUMsQ0FBRCxDQUFKLENBQVEsTUFBUixDQUFlLENBQUMsS0FBRCxFQUFRLEdBQVIsRUFBYSxLQUFiLEtBQXNCO0FBQzFDLE1BQUEsS0FBSyxDQUFDLEdBQUQsQ0FBTCxHQUFhLEtBQUssWUFBTCxDQUFrQixJQUFJLENBQUMsQ0FBRCxDQUFKLENBQVEsS0FBUixDQUFsQixDQUFiO0FBQ0EsYUFBTyxLQUFQO0FBQ0QsS0FITSxFQUdKLElBQUksRUFIQSxDQUFQO0FBSUQ7O0FBRU8sRUFBQSxZQUFZLENBQUMsTUFBRCxFQUErQjtBQUNqRCxRQUFJLE1BQU0sS0FBSyxJQUFmLEVBQXFCLE9BQU8sSUFBUDtBQUVyQixXQUFPLE1BQU0sQ0FBQyxDQUFELENBQU4sQ0FBVSxNQUFWLENBQWlCLENBQUMsS0FBRCxFQUFRLEdBQVIsRUFBYSxLQUFiLEtBQXNCO0FBQzVDLE1BQUEsS0FBSyxDQUFDLEdBQUQsQ0FBTCxHQUFhLEtBQUssV0FBTCxDQUFpQixNQUFNLENBQUMsQ0FBRCxDQUFOLENBQVUsS0FBVixDQUFqQixDQUFiO0FBQ0EsYUFBTyxLQUFQO0FBQ0QsS0FITSxFQUdKLElBQUksRUFIQSxDQUFQO0FBSUQ7O0FBRU8sRUFBQSxXQUFXLENBQUMsS0FBRCxFQUE2QjtBQUM5QyxXQUFPO0FBQ0wsTUFBQSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTLEdBQVQsQ0FBYyxDQUFELElBQU8sS0FBSyxZQUFMLENBQWtCLENBQWxCLENBQXBCLENBRFA7QUFFTCxNQUFBLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBRDtBQUZaLEtBQVA7QUFJRDs7QUE3U29DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ3VycmllZFR5cGUsXG4gIE9wdGlvbixcbiAgU2VyaWFsaXplZElubGluZUJsb2NrLFxuICBTZXJpYWxpemVkVGVtcGxhdGVCbG9jayxcbiAgU2V4cE9wY29kZXMgYXMgT3AsXG4gIFdpcmVGb3JtYXQsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZGljdCwgZXhoYXVzdGVkIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCB7IGluZmxhdGVBdHRyTmFtZSwgaW5mbGF0ZVRhZ05hbWUgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2lyZUZvcm1hdERlYnVnZ2VyIHtcbiAgcHJpdmF0ZSB1cHZhcnM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHN5bWJvbHM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKFtfc3RhdGVtZW50cywgc3ltYm9scywgX2hhc0V2YWwsIHVwdmFyc106IFNlcmlhbGl6ZWRUZW1wbGF0ZUJsb2NrKSB7XG4gICAgdGhpcy51cHZhcnMgPSB1cHZhcnM7XG4gICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scztcbiAgfVxuXG4gIGZvcm1hdChwcm9ncmFtOiBTZXJpYWxpemVkVGVtcGxhdGVCbG9jayk6IHVua25vd24ge1xuICAgIGxldCBvdXQgPSBbXTtcblxuICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBwcm9ncmFtWzBdKSB7XG4gICAgICBvdXQucHVzaCh0aGlzLmZvcm1hdE9wY29kZShzdGF0ZW1lbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZm9ybWF0T3Bjb2RlKG9wY29kZTogV2lyZUZvcm1hdC5TeW50YXgpOiB1bmtub3duIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcGNvZGUpKSB7XG4gICAgICBzd2l0Y2ggKG9wY29kZVswXSkge1xuICAgICAgICBjYXNlIE9wLkFwcGVuZDpcbiAgICAgICAgICByZXR1cm4gWydhcHBlbmQnLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pXTtcbiAgICAgICAgY2FzZSBPcC5UcnVzdGluZ0FwcGVuZDpcbiAgICAgICAgICByZXR1cm4gWyd0cnVzdGluZy1hcHBlbmQnLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLkJsb2NrOlxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAnYmxvY2snLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsyXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzNdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2tzKG9wY29kZVs0XSksXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkluRWxlbWVudDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2luLWVsZW1lbnQnLFxuICAgICAgICAgICAgb3Bjb2RlWzFdLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIG9wY29kZVszXSA/IHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVszXSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLk9wZW5FbGVtZW50OlxuICAgICAgICAgIHJldHVybiBbJ29wZW4tZWxlbWVudCcsIGluZmxhdGVUYWdOYW1lKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuT3BlbkVsZW1lbnRXaXRoU3BsYXQ6XG4gICAgICAgICAgcmV0dXJuIFsnb3Blbi1lbGVtZW50LXdpdGgtc3BsYXQnLCBpbmZsYXRlVGFnTmFtZShvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLkNsb3NlRWxlbWVudDpcbiAgICAgICAgICByZXR1cm4gWydjbG9zZS1lbGVtZW50J107XG5cbiAgICAgICAgY2FzZSBPcC5GbHVzaEVsZW1lbnQ6XG4gICAgICAgICAgcmV0dXJuIFsnZmx1c2gtZWxlbWVudCddO1xuXG4gICAgICAgIGNhc2UgT3AuU3RhdGljQXR0cjpcbiAgICAgICAgICByZXR1cm4gWydzdGF0aWMtYXR0cicsIGluZmxhdGVBdHRyTmFtZShvcGNvZGVbMV0pLCBvcGNvZGVbMl0sIG9wY29kZVszXV07XG5cbiAgICAgICAgY2FzZSBPcC5TdGF0aWNDb21wb25lbnRBdHRyOlxuICAgICAgICAgIHJldHVybiBbJ3N0YXRpYy1jb21wb25lbnQtYXR0cicsIGluZmxhdGVBdHRyTmFtZShvcGNvZGVbMV0pLCBvcGNvZGVbMl0sIG9wY29kZVszXV07XG5cbiAgICAgICAgY2FzZSBPcC5EeW5hbWljQXR0cjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2R5bmFtaWMtYXR0cicsXG4gICAgICAgICAgICBpbmZsYXRlQXR0ck5hbWUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkNvbXBvbmVudEF0dHI6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdjb21wb25lbnQtYXR0cicsXG4gICAgICAgICAgICBpbmZsYXRlQXR0ck5hbWUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkF0dHJTcGxhdDpcbiAgICAgICAgICByZXR1cm4gWydhdHRyLXNwbGF0J107XG5cbiAgICAgICAgY2FzZSBPcC5ZaWVsZDpcbiAgICAgICAgICByZXR1cm4gWyd5aWVsZCcsIG9wY29kZVsxXSwgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzJdKV07XG5cbiAgICAgICAgY2FzZSBPcC5EeW5hbWljQXJnOlxuICAgICAgICAgIHJldHVybiBbJ2R5bmFtaWMtYXJnJywgb3Bjb2RlWzFdLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLlN0YXRpY0FyZzpcbiAgICAgICAgICByZXR1cm4gWydzdGF0aWMtYXJnJywgb3Bjb2RlWzFdLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLlRydXN0aW5nRHluYW1pY0F0dHI6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd0cnVzdGluZy1keW5hbWljLWF0dHInLFxuICAgICAgICAgICAgaW5mbGF0ZUF0dHJOYW1lKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pLFxuICAgICAgICAgICAgb3Bjb2RlWzNdLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5UcnVzdGluZ0NvbXBvbmVudEF0dHI6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd0cnVzdGluZy1jb21wb25lbnQtYXR0cicsXG4gICAgICAgICAgICBpbmZsYXRlQXR0ck5hbWUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkRlYnVnZ2VyOlxuICAgICAgICAgIHJldHVybiBbJ2RlYnVnZ2VyJywgb3Bjb2RlWzFdXTtcblxuICAgICAgICBjYXNlIE9wLkNvbW1lbnQ6XG4gICAgICAgICAgcmV0dXJuIFsnY29tbWVudCcsIG9wY29kZVsxXV07XG5cbiAgICAgICAgY2FzZSBPcC5Nb2RpZmllcjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ21vZGlmaWVyJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdFBhcmFtcyhvcGNvZGVbMl0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRIYXNoKG9wY29kZVszXSksXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkNvbXBvbmVudDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRFbGVtZW50UGFyYW1zKG9wY29kZVsyXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzNdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2tzKG9wY29kZVs0XSksXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkhhc0Jsb2NrOlxuICAgICAgICAgIHJldHVybiBbJ2hhcy1ibG9jaycsIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuSGFzQmxvY2tQYXJhbXM6XG4gICAgICAgICAgcmV0dXJuIFsnaGFzLWJsb2NrLXBhcmFtcycsIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSldO1xuXG4gICAgICAgIGNhc2UgT3AuQ3Vycnk6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdjdXJyeScsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRDdXJyeVR5cGUob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVszXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzRdKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuVW5kZWZpbmVkOlxuICAgICAgICAgIHJldHVybiBbJ3VuZGVmaW5lZCddO1xuXG4gICAgICAgIGNhc2UgT3AuQ2FsbDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NhbGwnLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRPcGNvZGUob3Bjb2RlWzFdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsyXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzNdKSxcbiAgICAgICAgICBdO1xuXG4gICAgICAgIGNhc2UgT3AuQ29uY2F0OlxuICAgICAgICAgIHJldHVybiBbJ2NvbmNhdCcsIHRoaXMuZm9ybWF0UGFyYW1zKG9wY29kZVsxXSBhcyBXaXJlRm9ybWF0LkNvcmUuUGFyYW1zKV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRTdHJpY3RGcmVlOlxuICAgICAgICAgIHJldHVybiBbJ2dldC1zdHJpY3QtZnJlZScsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNDb21wb25lbnRPckhlbHBlckhlYWRPclRoaXNGYWxsYmFjazpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ0dldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrJyxcbiAgICAgICAgICAgIHRoaXMudXB2YXJzW29wY29kZVsxXV0sXG4gICAgICAgICAgICBvcGNvZGVbMl0sXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLkdldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZDpcbiAgICAgICAgICByZXR1cm4gWydHZXRGcmVlQXNDb21wb25lbnRPckhlbHBlckhlYWQnLCB0aGlzLnVwdmFyc1tvcGNvZGVbMV1dLCBvcGNvZGVbMl1dO1xuXG4gICAgICAgIGNhc2UgT3AuR2V0RnJlZUFzSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc0hlbHBlckhlYWRPclRoaXNGYWxsYmFjaycsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNEZXByZWNhdGVkSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc0RlcHJlY2F0ZWRIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2snLCB0aGlzLnVwdmFyc1tvcGNvZGVbMV1dXTtcblxuICAgICAgICBjYXNlIE9wLkdldEZyZWVBc0hlbHBlckhlYWQ6XG4gICAgICAgICAgcmV0dXJuIFsnR2V0RnJlZUFzSGVscGVySGVhZCcsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRGcmVlQXNDb21wb25lbnRIZWFkOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc0NvbXBvbmVudEhlYWQnLCB0aGlzLnVwdmFyc1tvcGNvZGVbMV1dLCBvcGNvZGVbMl1dO1xuXG4gICAgICAgIGNhc2UgT3AuR2V0RnJlZUFzTW9kaWZpZXJIZWFkOlxuICAgICAgICAgIHJldHVybiBbJ0dldEZyZWVBc01vZGlmaWVySGVhZCcsIHRoaXMudXB2YXJzW29wY29kZVsxXV0sIG9wY29kZVsyXV07XG5cbiAgICAgICAgY2FzZSBPcC5HZXRTeW1ib2w6IHtcbiAgICAgICAgICBpZiAob3Bjb2RlWzFdID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gWydnZXQtc3ltYm9sJywgJ3RoaXMnLCBvcGNvZGVbMl1dO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWydnZXQtc3ltYm9sJywgdGhpcy5zeW1ib2xzW29wY29kZVsxXSAtIDFdLCBvcGNvZGVbMl1dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgT3AuR2V0VGVtcGxhdGVTeW1ib2w6IHtcbiAgICAgICAgICByZXR1cm4gWydnZXQtdGVtcGxhdGUtc3ltYm9sJywgb3Bjb2RlWzFdLCBvcGNvZGVbMl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBPcC5JZjpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2lmJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10gPyB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVszXSkgOiBudWxsLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5JZklubGluZTpcbiAgICAgICAgICByZXR1cm4gWydpZi1pbmxpbmUnXTtcblxuICAgICAgICBjYXNlIE9wLk5vdDpcbiAgICAgICAgICByZXR1cm4gWydub3QnXTtcblxuICAgICAgICBjYXNlIE9wLkVhY2g6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICdlYWNoJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICBvcGNvZGVbMl0gPyB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMl0pIDogbnVsbCxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzNdKSxcbiAgICAgICAgICAgIG9wY29kZVs0XSA/IHRoaXMuZm9ybWF0QmxvY2sob3Bjb2RlWzRdKSA6IG51bGwsXG4gICAgICAgICAgXTtcblxuICAgICAgICBjYXNlIE9wLldpdGg6XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICd3aXRoJyxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0T3Bjb2RlKG9wY29kZVsxXSksXG4gICAgICAgICAgICB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVsyXSksXG4gICAgICAgICAgICBvcGNvZGVbM10gPyB0aGlzLmZvcm1hdEJsb2NrKG9wY29kZVszXSkgOiBudWxsLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgY2FzZSBPcC5MZXQ6XG4gICAgICAgICAgcmV0dXJuIFsnbGV0JywgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzFdKSwgdGhpcy5mb3JtYXRCbG9jayhvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLkxvZzpcbiAgICAgICAgICByZXR1cm4gWydsb2cnLCB0aGlzLmZvcm1hdFBhcmFtcyhvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLldpdGhEeW5hbWljVmFyczpcbiAgICAgICAgICByZXR1cm4gWyctd2l0aC1keW5hbWljLXZhcnMnLCB0aGlzLmZvcm1hdEhhc2gob3Bjb2RlWzFdKSwgdGhpcy5mb3JtYXRCbG9jayhvcGNvZGVbMl0pXTtcblxuICAgICAgICBjYXNlIE9wLkdldER5bmFtaWNWYXI6XG4gICAgICAgICAgcmV0dXJuIFsnLWdldC1keW5hbWljLXZhcnMnLCB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pXTtcblxuICAgICAgICBjYXNlIE9wLkludm9rZUNvbXBvbmVudDpcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICB0aGlzLmZvcm1hdE9wY29kZShvcGNvZGVbMV0pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRQYXJhbXMob3Bjb2RlWzJdKSxcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0SGFzaChvcGNvZGVbM10pLFxuICAgICAgICAgICAgdGhpcy5mb3JtYXRCbG9ja3Mob3Bjb2RlWzRdKSxcbiAgICAgICAgICBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3Bjb2RlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Q3VycnlUeXBlKHZhbHVlOiBDdXJyaWVkVHlwZSkge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgQ3VycmllZFR5cGUuQ29tcG9uZW50OlxuICAgICAgICByZXR1cm4gJ2NvbXBvbmVudCc7XG4gICAgICBjYXNlIEN1cnJpZWRUeXBlLkhlbHBlcjpcbiAgICAgICAgcmV0dXJuICdoZWxwZXInO1xuICAgICAgY2FzZSBDdXJyaWVkVHlwZS5Nb2RpZmllcjpcbiAgICAgICAgcmV0dXJuICdtb2RpZmllcic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBleGhhdXN0ZWQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RWxlbWVudFBhcmFtcyhvcGNvZGVzOiBPcHRpb248V2lyZUZvcm1hdC5FbGVtZW50UGFyYW1ldGVyW10+KTogT3B0aW9uPHVua25vd25bXT4ge1xuICAgIGlmIChvcGNvZGVzID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gb3Bjb2Rlcy5tYXAoKG8pID0+IHRoaXMuZm9ybWF0T3Bjb2RlKG8pKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGFyYW1zKG9wY29kZXM6IE9wdGlvbjxXaXJlRm9ybWF0LkV4cHJlc3Npb25bXT4pOiBPcHRpb248dW5rbm93bltdPiB7XG4gICAgaWYgKG9wY29kZXMgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBvcGNvZGVzLm1hcCgobykgPT4gdGhpcy5mb3JtYXRPcGNvZGUobykpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRIYXNoKGhhc2g6IFdpcmVGb3JtYXQuQ29yZS5IYXNoKTogT3B0aW9uPG9iamVjdD4ge1xuICAgIGlmIChoYXNoID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBoYXNoWzBdLnJlZHVjZSgoYWNjdW0sIGtleSwgaW5kZXgpID0+IHtcbiAgICAgIGFjY3VtW2tleV0gPSB0aGlzLmZvcm1hdE9wY29kZShoYXNoWzFdW2luZGV4XSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgZGljdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QmxvY2tzKGJsb2NrczogV2lyZUZvcm1hdC5Db3JlLkJsb2Nrcyk6IE9wdGlvbjxvYmplY3Q+IHtcbiAgICBpZiAoYmxvY2tzID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBibG9ja3NbMF0ucmVkdWNlKChhY2N1bSwga2V5LCBpbmRleCkgPT4ge1xuICAgICAgYWNjdW1ba2V5XSA9IHRoaXMuZm9ybWF0QmxvY2soYmxvY2tzWzFdW2luZGV4XSk7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgZGljdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QmxvY2soYmxvY2s6IFNlcmlhbGl6ZWRJbmxpbmVCbG9jayk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlbWVudHM6IGJsb2NrWzBdLm1hcCgocykgPT4gdGhpcy5mb3JtYXRPcGNvZGUocykpLFxuICAgICAgcGFyYW1ldGVyczogYmxvY2tbMV0sXG4gICAgfTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==