UNPKG

@glimmer/compiler

Version:
780 lines (666 loc) 63.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildStatements = buildStatements; exports.buildNormalizedStatements = buildNormalizedStatements; exports.buildStatement = buildStatement; exports.s = s; exports.c = c; exports.unicode = unicode; exports.buildAngleInvocation = buildAngleInvocation; exports.buildElementParams = buildElementParams; exports.extractNamespace = extractNamespace; exports.buildAttributeValue = buildAttributeValue; exports.buildExpression = buildExpression; exports.buildCallHead = buildCallHead; exports.buildGetPath = buildGetPath; exports.buildVar = buildVar; exports.expressionContextOp = expressionContextOp; exports.buildParams = buildParams; exports.buildConcat = buildConcat; exports.buildHash = buildHash; exports.buildBlocks = buildBlocks; exports.NEWLINE = exports.ProgramSymbols = void 0; var _util = require("@glimmer/util"); var _builderInterface = require("./builder-interface"); class ProgramSymbols { constructor() { this._freeVariables = []; this._symbols = ['this']; this.top = this; } toSymbols() { return this._symbols.slice(1); } toUpvars() { return this._freeVariables; } freeVar(name) { return addString(this._freeVariables, name); } block(name) { return this.symbol(name); } arg(name) { return addString(this._symbols, name); } local(name) { throw new Error(`No local ${name} was found. Maybe you meant ^${name} for upvar, or !${name} for keyword?`); } this() { return 0; } hasLocal(_name) { return false; } // any symbol symbol(name) { return addString(this._symbols, name); } child(locals) { return new LocalSymbols(this, locals); } } exports.ProgramSymbols = ProgramSymbols; class LocalSymbols { constructor(parent, locals) { this.parent = parent; this.locals = (0, _util.dict)(); for (let local of locals) { this.locals[local] = parent.top.symbol(local); } } get paramSymbols() { return (0, _util.values)(this.locals); } get top() { return this.parent.top; } freeVar(name) { return this.parent.freeVar(name); } arg(name) { return this.parent.arg(name); } block(name) { return this.parent.block(name); } local(name) { if (name in this.locals) { return this.locals[name]; } else { return this.parent.local(name); } } this() { return this.parent.this(); } hasLocal(name) { if (name in this.locals) { return true; } else { return this.parent.hasLocal(name); } } child(locals) { return new LocalSymbols(this, locals); } } function addString(array, item) { let index = array.indexOf(item); if (index === -1) { index = array.length; array.push(item); return index; } else { return index; } } function unimpl(message) { return new Error(`unimplemented ${message}`); } function buildStatements(statements, symbols) { let out = []; statements.forEach(s => out.push(...buildStatement((0, _builderInterface.normalizeStatement)(s), symbols))); return out; } function buildNormalizedStatements(statements, symbols) { let out = []; statements.forEach(s => out.push(...buildStatement(s, symbols))); return out; } function buildStatement(normalized, symbols = new ProgramSymbols()) { switch (normalized.kind) { case "AppendPath" /* AppendPath */ : { return [[normalized.trusted ? 2 /* TrustingAppend */ : 1 /* Append */ , buildGetPath(normalized.path, symbols)]]; } case "AppendExpr" /* AppendExpr */ : { return [[normalized.trusted ? 2 /* TrustingAppend */ : 1 /* Append */ , buildExpression(normalized.expr, normalized.trusted ? 'TrustedAppend' : 'Append', symbols)]]; } case "Call" /* Call */ : { let { head: path, params, hash, trusted } = normalized; let builtParams = params ? buildParams(params, symbols) : null; let builtHash = hash ? buildHash(hash, symbols) : null; let builtExpr = buildCallHead(path, trusted ? 3 /* AmbiguousInvoke */ : 2 /* AmbiguousAppendInvoke */ , symbols); return [[trusted ? 2 /* TrustingAppend */ : 1 /* Append */ , [28 /* Call */ , builtExpr, builtParams, builtHash]]]; } case "Literal" /* Literal */ : { return [[1 /* Append */ , normalized.value]]; } case "Comment" /* Comment */ : { return [[3 /* Comment */ , normalized.value]]; } case "Block" /* Block */ : { let blocks = buildBlocks(normalized.blocks, normalized.blockParams, symbols); let hash = buildHash(normalized.hash, symbols); let params = buildParams(normalized.params, symbols); let path = buildCallHead(normalized.head, 7 /* ResolveAsComponentHead */ , symbols); return [[6 /* Block */ , path, params, hash, blocks]]; } case "Keyword" /* Keyword */ : { return [buildKeyword(normalized, symbols)]; } case "Element" /* Element */ : return buildElement(normalized, symbols); case "Modifier" /* Modifier */ : throw unimpl('modifier'); case "DynamicComponent" /* DynamicComponent */ : throw unimpl('dynamic component'); default: throw (0, _util.assertNever)(normalized); } } function s(arr, ...interpolated) { let result = arr.reduce((result, string, i) => result + `${string}${interpolated[i] ? String(interpolated[i]) : ''}`, ''); return [0 /* Literal */ , result]; } function c(arr, ...interpolated) { let result = arr.reduce((result, string, i) => result + `${string}${interpolated[i] ? String(interpolated[i]) : ''}`, ''); return [1 /* Comment */ , result]; } function unicode(charCode) { return String.fromCharCode(parseInt(charCode, 16)); } const NEWLINE = '\n'; exports.NEWLINE = NEWLINE; function buildKeyword(normalized, symbols) { let { name } = normalized; let params = buildParams(normalized.params, symbols); let childSymbols = symbols.child(normalized.blockParams || []); let block = buildBlock(normalized.blocks.default, childSymbols, childSymbols.paramSymbols); let inverse = normalized.blocks.else ? buildBlock(normalized.blocks.else, symbols, []) : null; switch (name) { case 'with': return [43 /* With */ , params[0], block, inverse]; case 'if': return [41 /* If */ , params[0], block, inverse]; case 'each': let keyExpr = normalized.hash ? normalized.hash['key'] : null; let key = keyExpr ? buildExpression(keyExpr, 'Strict', symbols) : null; return [42 /* Each */ , params[0], key, block, inverse]; default: throw new Error('unimplemented keyword'); } } function buildElement({ name, attrs, block }, symbols) { let out = [hasSplat(attrs) ? [11 /* OpenElementWithSplat */ , name] : [10 /* OpenElement */ , name]]; if (attrs) { let { params, args } = buildElementParams(attrs, symbols); out.push(...params); false && (0, _util.assert)(args === null, `Can't pass args to a simple element`); } out.push([12 /* FlushElement */ ]); if (Array.isArray(block)) { block.forEach(s => out.push(...buildStatement(s, symbols))); } else if (block === null) {// do nothing } else { throw (0, _util.assertNever)(block); } out.push([13 /* CloseElement */ ]); return out; } function hasSplat(attrs) { if (attrs === null) return false; return Object.keys(attrs).some(a => attrs[a] === "Splat" /* Splat */ ); } function buildAngleInvocation({ attrs, block, head }, symbols) { let paramList = []; let args = null; let blockList = []; if (attrs) { let built = buildElementParams(attrs, symbols); paramList = built.params; args = built.args; } if (block) blockList = buildNormalizedStatements(block, symbols); return [8 /* Component */ , buildExpression(head, 7 /* ResolveAsComponentHead */ , symbols), (0, _util.isPresent)(paramList) ? paramList : null, args, [['default'], [[blockList, []]]]]; } function buildElementParams(attrs, symbols) { let params = []; let keys = []; let values = []; Object.keys(attrs).forEach(key => { let value = attrs[key]; if (value === "Splat" /* Splat */ ) { params.push([17 /* AttrSplat */ , symbols.block('&attrs')]); } else if (key[0] === '@') { keys.push(key); values.push(buildExpression(value, 'Strict', symbols)); } else { params.push(...buildAttributeValue(key, value, // TODO: extract namespace from key extractNamespace(key), symbols)); } }); return { params, args: (0, _util.isPresent)(keys) && (0, _util.isPresent)(values) ? [keys, values] : null }; } function extractNamespace(name) { if (name === 'xmlns') { return "http://www.w3.org/2000/xmlns/" /* XMLNS */ ; } let match = /^([^:]*):([^:]*)$/.exec(name); if (match === null) { return null; } let namespace = match[1]; switch (namespace) { case 'xlink': return "http://www.w3.org/1999/xlink" /* XLink */ ; case 'xml': return "http://www.w3.org/XML/1998/namespace" /* XML */ ; case 'xmlns': return "http://www.w3.org/2000/xmlns/" /* XMLNS */ ; } return null; } function buildAttributeValue(name, value, namespace, symbols) { switch (value.type) { case "Literal" /* Literal */ : { let val = value.value; if (val === false) { return []; } else if (val === true) { return [[14 /* StaticAttr */ , name, '', namespace !== null && namespace !== void 0 ? namespace : undefined]]; } else if (typeof val === 'string') { return [[14 /* StaticAttr */ , name, val, namespace !== null && namespace !== void 0 ? namespace : undefined]]; } else { throw new Error(`Unexpected/unimplemented literal attribute ${JSON.stringify(val)}`); } } default: return [[15 /* DynamicAttr */ , name, buildExpression(value, 'AttrValue', symbols), namespace !== null && namespace !== void 0 ? namespace : undefined]]; } } function varContext(context, bare) { switch (context) { case 'Append': return bare ? 'AppendBare' : 'AppendInvoke'; case 'TrustedAppend': return bare ? 'TrustedAppendBare' : 'TrustedAppendInvoke'; case 'AttrValue': return bare ? 'AttrValueBare' : 'AttrValueInvoke'; default: return context; } } function buildExpression(expr, context, symbols) { switch (expr.type) { case "GetPath" /* GetPath */ : { return buildGetPath(expr, symbols); } case "GetVar" /* GetVar */ : { return buildVar(expr.variable, varContext(context, true), symbols); } case "Concat" /* Concat */ : { return [29 /* Concat */ , buildConcat(expr.params, symbols)]; } case "Call" /* Call */ : { let builtParams = buildParams(expr.params, symbols); let builtHash = buildHash(expr.hash, symbols); let builtExpr = buildCallHead(expr.head, context === 'Strict' ? 'SubExpression' : varContext(context, false), symbols); return [28 /* Call */ , builtExpr, builtParams, builtHash]; } case "HasBlock" /* HasBlock */ : { return [48 /* HasBlock */ , buildVar({ kind: _builderInterface.VariableKind.Block, name: expr.name, mode: 'loose' }, 0 /* Strict */ , symbols)]; } case "HasBlockParams" /* HasBlockParams */ : { return [49 /* HasBlockParams */ , buildVar({ kind: _builderInterface.VariableKind.Block, name: expr.name, mode: 'loose' }, 0 /* Strict */ , symbols)]; } case "Literal" /* Literal */ : { if (expr.value === undefined) { return [27 /* Undefined */ ]; } else { return expr.value; } } default: (0, _util.assertNever)(expr); } } function buildCallHead(callHead, context, symbols) { if (callHead.type === "GetVar" /* GetVar */ ) { return buildVar(callHead.variable, context, symbols); } else { return buildGetPath(callHead, symbols); } } function buildGetPath(head, symbols) { return buildVar(head.path.head, 0 /* Strict */ , symbols, head.path.tail); } function buildVar(head, context, symbols, path) { let op = 30 /* GetSymbol */ ; let sym; switch (head.kind) { case _builderInterface.VariableKind.Free: if (context === 'Strict') { op = 31 /* GetStrictFree */ ; } else if (context === 'AppendBare') { op = 34 /* GetFreeAsComponentOrHelperHeadOrThisFallback */ ; } else if (context === 'AppendInvoke') { op = 35 /* GetFreeAsComponentOrHelperHead */ ; } else if (context === 'TrustedAppendBare') { op = 36 /* GetFreeAsHelperHeadOrThisFallback */ ; } else if (context === 'TrustedAppendInvoke') { op = 37 /* GetFreeAsHelperHead */ ; } else if (context === 'AttrValueBare') { op = 36 /* GetFreeAsHelperHeadOrThisFallback */ ; } else if (context === 'AttrValueInvoke') { op = 37 /* GetFreeAsHelperHead */ ; } else if (context === 'SubExpression') { op = 37 /* GetFreeAsHelperHead */ ; } else { op = expressionContextOp(context); } sym = symbols.freeVar(head.name); break; default: op = 30 /* GetSymbol */ ; sym = getSymbolForVar(head.kind, symbols, head.name); } if (path === undefined || path.length === 0) { return [op, sym]; } else { return [op, sym, path]; } } function getSymbolForVar(kind, symbols, name) { switch (kind) { case _builderInterface.VariableKind.Arg: return symbols.arg(name); case _builderInterface.VariableKind.Block: return symbols.block(name); case _builderInterface.VariableKind.Local: return symbols.local(name); case _builderInterface.VariableKind.This: return symbols.this(); default: return (0, _util.exhausted)(kind); } } function expressionContextOp(context) { switch (context) { case 0 /* Strict */ : return 31 /* GetStrictFree */ ; case 1 /* AmbiguousAppend */ : return 34 /* GetFreeAsComponentOrHelperHeadOrThisFallback */ ; case 2 /* AmbiguousAppendInvoke */ : return 35 /* GetFreeAsComponentOrHelperHead */ ; case 3 /* AmbiguousInvoke */ : return 36 /* GetFreeAsHelperHeadOrThisFallback */ ; case 5 /* ResolveAsCallHead */ : return 37 /* GetFreeAsHelperHead */ ; case 6 /* ResolveAsModifierHead */ : return 38 /* GetFreeAsModifierHead */ ; case 7 /* ResolveAsComponentHead */ : return 39 /* GetFreeAsComponentHead */ ; default: return (0, _util.exhausted)(context); } } function buildParams(exprs, symbols) { if (exprs === null || !(0, _util.isPresent)(exprs)) return null; return exprs.map(e => buildExpression(e, 'Strict', symbols)); } function buildConcat(exprs, symbols) { return exprs.map(e => buildExpression(e, 'AttrValue', symbols)); } function buildHash(exprs, symbols) { if (exprs === null) return null; let out = [[], []]; Object.keys(exprs).forEach(key => { out[0].push(key); out[1].push(buildExpression(exprs[key], 'Strict', symbols)); }); return out; } function buildBlocks(blocks, blockParams, parent) { let keys = []; let values = []; Object.keys(blocks).forEach(name => { keys.push(name); if (name === 'default') { let symbols = parent.child(blockParams || []); values.push(buildBlock(blocks[name], symbols, symbols.paramSymbols)); } else { values.push(buildBlock(blocks[name], parent, [])); } }); return [keys, values]; } function buildBlock(block, symbols, locals = []) { return [buildNormalizedStatements(block, symbols), locals]; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQTs7QUFHQTs7QUFzQ00sTUFBQSxjQUFBLENBQXFCO0FBQTNCLEVBQUEsV0FBQSxHQUFBO0FBQ0UsU0FBQSxjQUFBLEdBQUEsRUFBQTtBQUNBLFNBQUEsUUFBQSxHQUFxQixDQUFyQixNQUFxQixDQUFyQjtBQUVBLFNBQUEsR0FBQSxHQUFBLElBQUE7QUE0Q0Q7O0FBMUNDLEVBQUEsU0FBUyxHQUFBO0FBQ1AsV0FBTyxLQUFBLFFBQUEsQ0FBQSxLQUFBLENBQVAsQ0FBTyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLEdBQUE7QUFDTixXQUFPLEtBQVAsY0FBQTtBQUNEOztBQUVELEVBQUEsT0FBTyxDQUFBLElBQUEsRUFBYTtBQUNsQixXQUFPLFNBQVMsQ0FBQyxLQUFELGNBQUEsRUFBaEIsSUFBZ0IsQ0FBaEI7QUFDRDs7QUFFRCxFQUFBLEtBQUssQ0FBQSxJQUFBLEVBQWE7QUFDaEIsV0FBTyxLQUFBLE1BQUEsQ0FBUCxJQUFPLENBQVA7QUFDRDs7QUFFRCxFQUFBLEdBQUcsQ0FBQSxJQUFBLEVBQWE7QUFDZCxXQUFPLFNBQVMsQ0FBQyxLQUFELFFBQUEsRUFBaEIsSUFBZ0IsQ0FBaEI7QUFDRDs7QUFFRCxFQUFBLEtBQUssQ0FBQSxJQUFBLEVBQWE7QUFDaEIsVUFBTSxJQUFBLEtBQUEsQ0FDSixZQUFZLElBQUksZ0NBQWdDLElBQUksbUJBQW1CLElBRHpFLGVBQU0sQ0FBTjtBQUdEOztBQUVELEVBQUEsSUFBSSxHQUFBO0FBQ0YsV0FBQSxDQUFBO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLENBQUEsS0FBQSxFQUFjO0FBQ3BCLFdBQUEsS0FBQTtBQXJDdUIsR0FBQSxDQXdDekI7OztBQUNBLEVBQUEsTUFBTSxDQUFBLElBQUEsRUFBYTtBQUNq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LEVBQUEsUUFBQSxFQUEzQixPQUEyQixDQUEzQjtBQUZGLEdBQUE7QUFLQSxTQUFBLEdBQUE7QUFDRDs7QUFFSyxTQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQUEsV0FBQSxFQUFBLE1BQUEsRUFHVztBQUVmLE1BQUksSUFBSSxHQUFSLEVBQUE7QUFDQSxNQUFJLE1BQU0sR0FBVixFQUFBO0FBRUEsRUFBQSxNQUFNLENBQU4sSUFBQSxDQUFBLE1BQUEsRUFBQSxPQUFBLENBQTZCLElBQUQsSUFBUztBQUNuQyxJQUFBLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQTs7QUFFQSxRQUFJLElBQUksS0FBUixTQUFBLEVBQXdCO0FBQ3RCLFVBQUksT0FBTyxHQUFHLE1BQU0sQ0FBTixLQUFBLENBQWEsV0FBVyxJQUF0QyxFQUFjLENBQWQ7QUFFQSxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxPQUFBLEVBQXdCLE9BQU8sQ0FBckQsWUFBc0IsQ0FBdEI7QUFIRixLQUFBLE1BSU87QUFDTCxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxNQUFBLEVBQXRCLEVBQXNCLENBQXRCO0FBQ0Q7QUFUSCxHQUFBO0FBWUEsU0FBTyxDQUFBLElBQUEsRUFBUCxNQUFPLENBQVA7QUFDRDs7QUFFRCxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBQUEsT0FBQSxFQUdFLE1BQUEsR0FIRixFQUFBLEVBR3VCO0FBRXJCLFNBQU8sQ0FBQyx5QkFBeUIsQ0FBQSxLQUFBLEVBQTFCLE9BQTBCLENBQTFCLEVBQVAsTUFBTyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaWN0LFxuICBFeHByZXNzaW9ucyxcbiAgR2V0Q29udGV4dHVhbEZyZWVPcCxcbiAgT3B0aW9uLFxuICBQcmVzZW50QXJyYXksXG4gIFNleHBPcGNvZGVzLFxuICBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LFxuICBXaXJlRm9ybWF0LFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0TmV2ZXIsIGRpY3QsIGV4aGF1c3RlZCwgZXhwZWN0LCBpc1ByZXNlbnQsIHZhbHVlcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQXR0ck5hbWVzcGFjZSwgTmFtZXNwYWNlIH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcblxuaW1wb3J0IHtcbiAgQnVpbGRlcixcbiAgQnVpbGRlckNvbW1lbnQsXG4gIEJ1aWxkZXJTdGF0ZW1lbnQsXG4gIEV4cHJlc3Npb25LaW5kLFxuICBIZWFkS2luZCxcbiAgTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbixcbiAgTm9ybWFsaXplZEF0dHJzLFxuICBOb3JtYWxpemVkQmxvY2ssXG4gIE5vcm1hbGl6ZWRCbG9ja3MsXG4gIE5vcm1hbGl6ZWRFbGVtZW50LFxuICBOb3JtYWxpemVkRXhwcmVzc2lvbixcbiAgTm9ybWFsaXplZEhhc2gsXG4gIE5vcm1hbGl6ZWRIZWFkLFxuICBOb3JtYWxpemVkS2V5d29yZFN0YXRlbWVudCxcbiAgTm9ybWFsaXplZFBhcmFtcyxcbiAgTm9ybWFsaXplZFBhdGgsXG4gIE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIG5vcm1hbGl6ZVN0YXRlbWVudCxcbiAgVmFyaWFibGUsXG4gIFZhcmlhYmxlS2luZCxcbn0gZnJvbSAnLi9idWlsZGVyLWludGVyZmFjZSc7XG5cbmltcG9ydCBPcCA9IFdpcmVGb3JtYXQuU2V4cE9wY29kZXM7XG5cbmludGVyZmFjZSBTeW1ib2xzIHtcbiAgdG9wOiBQcm9ncmFtU3ltYm9scztcbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgbG9jYWwobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICB0aGlzKCk6IG51bWJlcjtcblxuICBoYXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIGNoaWxkKHBhcmFtczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHM7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmFtU3ltYm9scyBpbXBsZW1lbnRzIFN5bWJvbHMge1xuICBfZnJlZVZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgX3N5bWJvbHM6IHN0cmluZ1tdID0gWyd0aGlzJ107XG5cbiAgdG9wID0gdGhpcztcblxuICB0b1N5bWJvbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9zeW1ib2xzLnNsaWNlKDEpO1xuICB9XG5cbiAgdG9VcHZhcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcmVlVmFyaWFibGVzO1xuICB9XG5cbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fZnJlZVZhcmlhYmxlcywgbmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbChuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fc3ltYm9scywgbmFtZSk7XG4gIH1cblxuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBuZXZlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIGxvY2FsICR7bmFtZX0gd2FzIGZvdW5kLiBNYXliZSB5b3UgbWVhbnQgXiR7bmFtZX0gZm9yIHVwdmFyLCBvciAhJHtuYW1lfSBmb3Iga2V5d29yZD9gXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGhhc0xvY2FsKF9uYW1lOiBzdHJpbmcpOiBmYWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gYW55IHN5bWJvbFxuICBzeW1ib2wobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYWRkU3RyaW5nKHRoaXMuX3N5bWJvbHMsIG5hbWUpO1xuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5jbGFzcyBMb2NhbFN5bWJvbHMgaW1wbGVtZW50cyBTeW1ib2xzIHtcbiAgcHJpdmF0ZSBsb2NhbHM6IERpY3Q8bnVtYmVyPiA9IGRpY3QoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudDogU3ltYm9scywgbG9jYWxzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGxvY2FsIG9mIGxvY2Fscykge1xuICAgICAgdGhpcy5sb2NhbHNbbG9jYWxdID0gcGFyZW50LnRvcC5zeW1ib2wobG9jYWwpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXJhbVN5bWJvbHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB2YWx1ZXModGhpcy5sb2NhbHMpO1xuICB9XG5cbiAgZ2V0IHRvcCgpOiBQcm9ncmFtU3ltYm9scyB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnRvcDtcbiAgfVxuXG4gIGZyZWVWYXIobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZnJlZVZhcihuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hcmcobmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5ibG9jayhuYW1lKTtcbiAgfVxuXG4gIGxvY2FsKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2Fsc1tuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmxvY2FsKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQudGhpcygpO1xuICB9XG5cbiAgaGFzTG9jYWwobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuaGFzTG9jYWwobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTdHJpbmcoYXJyYXk6IHN0cmluZ1tdLCBpdGVtOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBpbmRleCA9IGFycmF5Lmxlbmd0aDtcbiAgICBhcnJheS5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpbmRleDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyR2V0RnJlZSB7XG4gIHR5cGU6ICdHZXRGcmVlJztcbiAgaGVhZDogc3RyaW5nO1xuICB0YWlsOiBzdHJpbmdbXTtcbn1cblxuZnVuY3Rpb24gdW5pbXBsKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke21lc3NhZ2V9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRlbWVudHMoXG4gIHN0YXRlbWVudHM6IEJ1aWxkZXJTdGF0ZW1lbnRbXSxcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIGxldCBvdXQ6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10gPSBbXTtcblxuICBzdGF0ZW1lbnRzLmZvckVhY2goKHMpID0+IG91dC5wdXNoKC4uLmJ1aWxkU3RhdGVtZW50KG5vcm1hbGl6ZVN0YXRlbWVudChzKSwgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkU3RhdGVtZW50cyhcbiAgc3RhdGVtZW50czogTm9ybWFsaXplZFN0YXRlbWVudFtdLFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtdO1xuXG4gIHN0YXRlbWVudHMuZm9yRWFjaCgocykgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIHN5bWJvbHM6IFN5bWJvbHMgPSBuZXcgUHJvZ3JhbVN5bWJvbHMoKVxuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIHN3aXRjaCAobm9ybWFsaXplZC5raW5kKSB7XG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRQYXRoOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgbm9ybWFsaXplZC50cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsXG4gICAgICAgICAgYnVpbGRHZXRQYXRoKG5vcm1hbGl6ZWQucGF0aCwgc3ltYm9scyksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQXBwZW5kRXhwcjoge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgW1xuICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/IE9wLlRydXN0aW5nQXBwZW5kIDogT3AuQXBwZW5kLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbihcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQuZXhwcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/ICdUcnVzdGVkQXBwZW5kJyA6ICdBcHBlbmQnLFxuICAgICAgICAgICAgc3ltYm9sc1xuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQ2FsbDoge1xuICAgICAgbGV0IHsgaGVhZDogcGF0aCwgcGFyYW1zLCBoYXNoLCB0cnVzdGVkIH0gPSBub3JtYWxpemVkO1xuICAgICAgbGV0IGJ1aWx0UGFyYW1zOiBPcHRpb248V2lyZUZvcm1hdC5Db3JlLlBhcmFtcz4gPSBwYXJhbXNcbiAgICAgICAgPyBidWlsZFBhcmFtcyhwYXJhbXMsIHN5bWJvbHMpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGxldCBidWlsdEhhc2g6IFdpcmVGb3JtYXQuQ29yZS5IYXNoID0gaGFzaCA/IGJ1aWxkSGFzaChoYXNoLCBzeW1ib2xzKSA6IG51bGw7XG4gICAgICBsZXQgYnVpbHRFeHByOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24gPSBidWlsZENhbGxIZWFkKFxuICAgICAgICBwYXRoLFxuICAgICAgICB0cnVzdGVkXG4gICAgICAgICAgPyBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LkFtYmlndW91c0ludm9rZVxuICAgICAgICAgIDogVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5BbWJpZ3VvdXNBcHBlbmRJbnZva2UsXG4gICAgICAgIHN5bWJvbHNcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIFt0cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsIFtPcC5DYWxsLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4gW1tPcC5BcHBlbmQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNvbW1lbnQ6IHtcbiAgICAgIHJldHVybiBbW09wLkNvbW1lbnQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkJsb2NrOiB7XG4gICAgICBsZXQgYmxvY2tzID0gYnVpbGRCbG9ja3Mobm9ybWFsaXplZC5ibG9ja3MsIG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGhhc2ggPSBidWlsZEhhc2gobm9ybWFsaXplZC5oYXNoLCBzeW1ib2xzKTtcbiAgICAgIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gICAgICBsZXQgcGF0aCA9IGJ1aWxkQ2FsbEhlYWQoXG4gICAgICAgIG5vcm1hbGl6ZWQuaGVhZCxcbiAgICAgICAgVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5SZXNvbHZlQXNDb21wb25lbnRIZWFkLFxuICAgICAgICBzeW1ib2xzXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gW1tPcC5CbG9jaywgcGF0aCwgcGFyYW1zLCBoYXNoLCBibG9ja3NdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLktleXdvcmQ6IHtcbiAgICAgIHJldHVybiBbYnVpbGRLZXl3b3JkKG5vcm1hbGl6ZWQsIHN5bWJvbHMpXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkVsZW1lbnQ6XG4gICAgICByZXR1cm4gYnVpbGRFbGVtZW50KG5vcm1hbGl6ZWQsIHN5bWJvbHMpO1xuXG4gICAgY2FzZSBIZWFkS2luZC5Nb2RpZmllcjpcbiAgICAgIHRocm93IHVuaW1wbCgnbW9kaWZpZXInKTtcblxuICAgIGNhc2UgSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudDpcbiAgICAgIHRocm93IHVuaW1wbCgnZHluYW1pYyBjb21wb25lbnQnKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBhc3NlcnROZXZlcihub3JtYWxpemVkKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcyhcbiAgYXJyOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgLi4uaW50ZXJwb2xhdGVkOiB1bmtub3duW11cbik6IFtCdWlsZGVyLkxpdGVyYWwsIHN0cmluZ10ge1xuICBsZXQgcmVzdWx0ID0gYXJyLnJlZHVjZShcbiAgICAocmVzdWx0LCBzdHJpbmcsIGkpID0+IHJlc3VsdCArIGAke3N0cmluZ30ke2ludGVycG9sYXRlZFtpXSA/IFN0cmluZyhpbnRlcnBvbGF0ZWRbaV0pIDogJyd9YCxcbiAgICAnJ1xuICApO1xuXG4gIHJldHVybiBbQnVpbGRlci5MaXRlcmFsLCByZXN1bHRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYyhhcnI6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi5pbnRlcnBvbGF0ZWQ6IHVua25vd25bXSk6IEJ1aWxkZXJDb21tZW50IHtcbiAgbGV0IHJlc3VsdCA9IGFyci5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgc3RyaW5nLCBpKSA9PiByZXN1bHQgKyBgJHtzdHJpbmd9JHtpbnRlcnBvbGF0ZWRbaV0gPyBTdHJpbmcoaW50ZXJwb2xhdGVkW2ldKSA6ICcnfWAsXG4gICAgJydcbiAgKTtcblxuICByZXR1cm4gW0J1aWxkZXIuQ29tbWVudCwgcmVzdWx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWNvZGUoY2hhckNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNoYXJDb2RlLCAxNikpO1xufVxuXG5leHBvcnQgY29uc3QgTkVXTElORSA9ICdcXG4nO1xuXG5mdW5jdGlvbiBidWlsZEtleXdvcmQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRLZXl3b3JkU3RhdGVtZW50LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudCB7XG4gIGxldCB7IG5hbWUgfSA9IG5vcm1hbGl6ZWQ7XG4gIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gIGxldCBjaGlsZFN5bWJvbHMgPSBzeW1ib2xzLmNoaWxkKG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMgfHwgW10pO1xuXG4gIGxldCBibG9jayA9IGJ1aWxkQmxvY2sobm9ybWFsaXplZC5ibG9ja3MuZGVmYXVsdCwgY2hpbGRTeW1ib2xzLCBjaGlsZFN5bWJvbHMucGFyYW1TeW1ib2xzKTtcbiAgbGV0IGludmVyc2UgPSBub3JtYWxpemVkLmJsb2Nrcy5lbHNlID8gYnVpbGRCbG9jayhub3JtYWxpemVkLmJsb2Nrcy5lbHNlLCBzeW1ib2xzLCBbXSkgOiBudWxsO1xuXG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ3dpdGgnOlxuICAgICAgcmV0dXJuIFtPcC5XaXRoLCBleHBlY3QocGFyYW1zLCAnd2l0aCByZXF1aXJlcyBwYXJhbXMnKVswXSwgYmxvY2ssIGludmVyc2VdO1xuICAgIGNhc2UgJ2lmJzpcbiAgICAgIHJldHVybiBbT3AuSWYsIGV4cGVjdChwYXJhbXMsICdpZiByZXF1aXJlcyBwYXJhbXMnKVswXSwgYmxvY2ssIGludmVyc2VdO1xuICAgIGNhc2UgJ2VhY2gnOlxuICAgICAgbGV0IGtleUV4cHIgPSBub3JtYWxpemVkLmhhc2ggPyBub3JtYWxpemVkLmhhc2hbJ2tleSddIDogbnVsbDtcbiAgICAgIGxldCBrZXkgPSBrZXlFeHByID8gYnVpbGRFeHByZXNzaW9uKGtleUV4cHIsICdTdHJpY3QnLCBzeW1ib2xzKSA6IG51bGw7XG5cbiAgICAgIHJldHVybiBbT3AuRWFjaCwgZXhwZWN0KHBhcmFtcywgJ2lmIHJlcXVpcmVzIHBhcmFtcycpWzBdLCBrZXksIGJsb2NrLCBpbnZlcnNlXTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGtleXdvcmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnQoXG4gIHsgbmFtZSwgYXR0cnMsIGJsb2NrIH06IE5vcm1hbGl6ZWRFbGVtZW50LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtcbiAgICBoYXNTcGxhdChhdHRycykgPyBbT3AuT3BlbkVsZW1lbnRXaXRoU3BsYXQsIG5hbWVdIDogW09wLk9wZW5FbGVtZW50LCBuYW1lXSxcbiAgXTtcbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IHsgcGFyYW1zLCBhcmdzIH0gPSBidWlsZEVsZW1lbnRQYXJhbXMoYXR0cnMsIHN5bWJvbHMpO1xuICAgIG91dC5wdXNoKC4uLnBhcmFtcyk7XG4gICAgYXNzZXJ0KGFyZ3MgPT09IG51bGwsIGBDYW4ndCBwYXNzIGFyZ3MgdG8gYSBzaW1wbGUgZWxlbWVudGApO1xuICB9XG4gIG91dC5wdXNoKFtPcC5GbHVzaEVsZW1lbnRdKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShibG9jaykpIHtcbiAgICBibG9jay5mb3JFYWNoKChzKSA9PiBvdXQucHVzaCguLi5idWlsZFN0YXRlbWVudChzLCBzeW1ib2xzKSkpO1xuICB9IGVsc2UgaWYgKGJsb2NrID09PSBudWxsKSB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9IGVsc2Uge1xuICAgIHRocm93IGFzc2VydE5ldmVyKGJsb2NrKTtcbiAgfVxuXG4gIG91dC5wdXNoKFtPcC5DbG9zZUVsZW1lbnRdKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBoYXNTcGxhdChhdHRyczogT3B0aW9uPE5vcm1hbGl6ZWRBdHRycz4pOiBib29sZWFuIHtcbiAgaWYgKGF0dHJzID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKS5zb21lKChhKSA9PiBhdHRyc1thXSA9PT0gSGVhZEtpbmQuU3BsYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmdsZUludm9jYXRpb24oXG4gIHsgYXR0cnMsIGJsb2NrLCBoZWFkIH06IE5vcm1hbGl6ZWRBbmdsZUludm9jYXRpb24sXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5Db21wb25lbnQge1xuICBsZXQgcGFyYW1MaXN0OiBXaXJlRm9ybWF0LkVsZW1lbnRQYXJhbWV0ZXJbXSA9IFtdO1xuICBsZXQgYXJnczogV2lyZUZvcm1hdC5Db3JlLkhhc2ggPSBudWxsO1xuICBsZXQgYmxvY2tMaXN0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IGJ1aWx0ID0gYnVpbGRFbGVtZW50UGFyYW1zKGF0dHJzLCBzeW1ib2xzKTtcbiAgICBwYXJhbUxpc3QgPSBidWlsdC5wYXJhbXM7XG4gICAgYXJncyA9IGJ1aWx0LmFyZ3M7XG4gIH1cblxuICBpZiAoYmxvY2spIGJsb2NrTGlzdCA9IGJ1aWxkTm9ybWFsaXplZFN0YXRlbWVudHMoYmxvY2ssIHN5bWJvbHMpO1xuXG4gIHJldHVy