UNPKG

@glimmer/compiler

Version:
342 lines (297 loc) 42.5 kB
import { generateSyntaxError } from '@glimmer/syntax'; import { Err, Ok, Result } from '../../../shared/result'; import * as mir from '../../2-encoding/mir'; import { VISIT_EXPRS } from '../visitors/expressions'; import { VISIT_STMTS } from '../visitors/statements'; import { keywords } from './impl'; import { assertCurryKeyword } from './utils/curry'; export const BLOCK_KEYWORDS = keywords('Block').kw('in-element', { assert(node) { let { args } = node; let guid = args.get('guid'); if (guid) { return Err(generateSyntaxError(`Cannot pass \`guid\` to \`{{#in-element}}\``, guid.loc)); } let insertBefore = args.get('insertBefore'); let destination = args.nth(0); if (destination === null) { return Err(generateSyntaxError(`{{#in-element}} requires a target element as its first positional parameter`, args.loc)); } // TODO Better syntax checks return Ok({ insertBefore, destination }); }, translate({ node, state }, { insertBefore, destination }) { let named = node.blocks.get('default'); let body = VISIT_STMTS.NamedBlock(named, state); let destinationResult = VISIT_EXPRS.visit(destination, state); return Result.all(body, destinationResult).andThen(([body, destination]) => { if (insertBefore) { return VISIT_EXPRS.visit(insertBefore, state).mapOk(insertBefore => ({ body, destination, insertBefore })); } else { return Ok({ body, destination, insertBefore: new mir.Missing({ loc: node.callee.loc.collapse('end') }) }); } }).mapOk(({ body, destination, insertBefore }) => new mir.InElement({ loc: node.loc, block: body, insertBefore, guid: state.generateUniqueCursor(), destination })); } }).kw('if', { assert(node) { let { args } = node; if (!args.named.isEmpty()) { return Err(generateSyntaxError(`{{#if}} cannot receive named parameters, received ${args.named.entries.map(e => e.name.chars).join(', ')}`, node.loc)); } if (args.positional.size > 1) { return Err(generateSyntaxError(`{{#if}} can only receive one positional parameter in block form, the conditional value. Received ${args.positional.size} parameters`, node.loc)); } let condition = args.nth(0); if (condition === null) { return Err(generateSyntaxError(`{{#if}} requires a condition as its first positional parameter, did not receive any parameters`, node.loc)); } return Ok({ condition }); }, translate({ node, state }, { condition }) { let block = node.blocks.get('default'); let inverse = node.blocks.get('else'); let conditionResult = VISIT_EXPRS.visit(condition, state); let blockResult = VISIT_STMTS.NamedBlock(block, state); let inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return Result.all(conditionResult, blockResult, inverseResult).mapOk(([condition, block, inverse]) => new mir.If({ loc: node.loc, condition, block, inverse })); } }).kw('unless', { assert(node) { let { args } = node; if (!args.named.isEmpty()) { return Err(generateSyntaxError(`{{#unless}} cannot receive named parameters, received ${args.named.entries.map(e => e.name.chars).join(', ')}`, node.loc)); } if (args.positional.size > 1) { return Err(generateSyntaxError(`{{#unless}} can only receive one positional parameter in block form, the conditional value. Received ${args.positional.size} parameters`, node.loc)); } let condition = args.nth(0); if (condition === null) { return Err(generateSyntaxError(`{{#unless}} requires a condition as its first positional parameter, did not receive any parameters`, node.loc)); } return Ok({ condition }); }, translate({ node, state }, { condition }) { let block = node.blocks.get('default'); let inverse = node.blocks.get('else'); let conditionResult = VISIT_EXPRS.visit(condition, state); let blockResult = VISIT_STMTS.NamedBlock(block, state); let inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return Result.all(conditionResult, blockResult, inverseResult).mapOk(([condition, block, inverse]) => new mir.If({ loc: node.loc, condition: new mir.Not({ value: condition, loc: node.loc }), block, inverse })); } }).kw('each', { assert(node) { let { args } = node; if (!args.named.entries.every(e => e.name.chars === 'key')) { return Err(generateSyntaxError(`{{#each}} can only receive the 'key' named parameter, received ${args.named.entries.filter(e => e.name.chars !== 'key').map(e => e.name.chars).join(', ')}`, args.named.loc)); } if (args.positional.size > 1) { return Err(generateSyntaxError(`{{#each}} can only receive one positional parameter, the collection being iterated. Received ${args.positional.size} parameters`, args.positional.loc)); } let value = args.nth(0); let key = args.get('key'); if (value === null) { return Err(generateSyntaxError(`{{#each}} requires an iterable value to be passed as its first positional parameter, did not receive any parameters`, args.loc)); } return Ok({ value, key }); }, translate({ node, state }, { value, key }) { let block = node.blocks.get('default'); let inverse = node.blocks.get('else'); let valueResult = VISIT_EXPRS.visit(value, state); let keyResult = key ? VISIT_EXPRS.visit(key, state) : Ok(null); let blockResult = VISIT_STMTS.NamedBlock(block, state); let inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return Result.all(valueResult, keyResult, blockResult, inverseResult).mapOk(([value, key, block, inverse]) => new mir.Each({ loc: node.loc, value, key, block, inverse })); } }).kw('with', { assert(node) { let { args } = node; if (!args.named.isEmpty()) { return Err(generateSyntaxError(`{{#with}} cannot receive named parameters, received ${args.named.entries.map(e => e.name.chars).join(', ')}`, args.named.loc)); } if (args.positional.size > 1) { return Err(generateSyntaxError(`{{#with}} can only receive one positional parameter. Received ${args.positional.size} parameters`, args.positional.loc)); } let value = args.nth(0); if (value === null) { return Err(generateSyntaxError(`{{#with}} requires a value as its first positional parameter, did not receive any parameters`, args.loc)); } return Ok({ value }); }, translate({ node, state }, { value }) { let block = node.blocks.get('default'); let inverse = node.blocks.get('else'); let valueResult = VISIT_EXPRS.visit(value, state); let blockResult = VISIT_STMTS.NamedBlock(block, state); let inverseResult = inverse ? VISIT_STMTS.NamedBlock(inverse, state) : Ok(null); return Result.all(valueResult, blockResult, inverseResult).mapOk(([value, block, inverse]) => new mir.With({ loc: node.loc, value, block, inverse })); } }).kw('let', { assert(node) { let { args } = node; if (!args.named.isEmpty()) { return Err(generateSyntaxError(`{{#let}} cannot receive named parameters, received ${args.named.entries.map(e => e.name.chars).join(', ')}`, args.named.loc)); } if (args.positional.size === 0) { return Err(generateSyntaxError(`{{#let}} requires at least one value as its first positional parameter, did not receive any parameters`, args.positional.loc)); } if (node.blocks.get('else')) { return Err(generateSyntaxError(`{{#let}} cannot receive an {{else}} block`, args.positional.loc)); } return Ok({ positional: args.positional }); }, translate({ node, state }, { positional }) { let block = node.blocks.get('default'); let positionalResult = VISIT_EXPRS.Positional(positional, state); let blockResult = VISIT_STMTS.NamedBlock(block, state); return Result.all(positionalResult, blockResult).mapOk(([positional, block]) => new mir.Let({ loc: node.loc, positional, block })); } }).kw('-with-dynamic-vars', { assert(node) { return Ok({ named: node.args.named }); }, translate({ node, state }, { named }) { let block = node.blocks.get('default'); let namedResult = VISIT_EXPRS.NamedArguments(named, state); let blockResult = VISIT_STMTS.NamedBlock(block, state); return Result.all(namedResult, blockResult).mapOk(([named, block]) => new mir.WithDynamicVars({ loc: node.loc, named, block })); } }).kw('component', { assert: assertCurryKeyword(0 /* Component */ ), translate({ node, state }, { definition, args }) { let definitionResult = VISIT_EXPRS.visit(definition, state); let argsResult = VISIT_EXPRS.Args(args, state); let blocksResult = VISIT_STMTS.NamedBlocks(node.blocks, state); return Result.all(definitionResult, argsResult, blocksResult).mapOk(([definition, args, blocks]) => new mir.InvokeComponent({ loc: node.loc, definition, args, blocks })); } }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL2tleXdvcmRzL2Jsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQWdCLG1CQUFoQixRQUEyQyxpQkFBM0M7QUFFQSxTQUFTLEdBQVQsRUFBYyxFQUFkLEVBQWtCLE1BQWxCLFFBQWdDLHdCQUFoQztBQUNBLE9BQU8sS0FBSyxHQUFaLE1BQXFCLHNCQUFyQjtBQUVBLFNBQVMsV0FBVCxRQUE0Qix5QkFBNUI7QUFDQSxTQUFTLFdBQVQsUUFBNEIsd0JBQTVCO0FBQ0EsU0FBUyxRQUFULFFBQXlCLFFBQXpCO0FBQ0EsU0FBUyxrQkFBVCxRQUFtQyxlQUFuQztBQUVBLE9BQU8sTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQUQsQ0FBUixDQUMzQixFQUQyQixDQUN4QixZQUR3QixFQUNWO0FBQ2hCLEVBQUEsTUFBTSxDQUNKLElBREksRUFDbUI7QUFLdkIsUUFBSTtBQUFFLE1BQUE7QUFBRixRQUFXLElBQWY7QUFFQSxRQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBTCxDQUFTLE1BQVQsQ0FBWDs7QUFFQSxRQUFJLElBQUosRUFBVTtBQUNSLGFBQU8sR0FBRyxDQUFDLG1CQUFtQixDQUFDLDZDQUFELEVBQWdELElBQUksQ0FBQyxHQUFyRCxDQUFwQixDQUFWO0FBQ0Q7O0FBRUQsUUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUwsQ0FBUyxjQUFULENBQW5CO0FBQ0EsUUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUwsQ0FBUyxDQUFULENBQWxCOztBQUVBLFFBQUksV0FBVyxLQUFLLElBQXBCLEVBQTBCO0FBQ3hCLGFBQU8sR0FBRyxDQUNSLG1CQUFtQixDQUNqQiw2RUFEaUIsRUFFakIsSUFBSSxDQUFDLEdBRlksQ0FEWCxDQUFWO0FBTUQsS0F2QnNCLENBeUJ2Qjs7O0FBRUEsV0FBTyxFQUFF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YyxDQTFhVyxDQUF2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJpZWRUeXBlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBU1R2MiwgZ2VuZXJhdGVTeW50YXhFcnJvciB9IGZyb20gJ0BnbGltbWVyL3N5bnRheCc7XG5cbmltcG9ydCB7IEVyciwgT2ssIFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9yZXN1bHQnO1xuaW1wb3J0ICogYXMgbWlyIGZyb20gJy4uLy4uLzItZW5jb2RpbmcvbWlyJztcbmltcG9ydCB7IE5vcm1hbGl6YXRpb25TdGF0ZSB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHsgVklTSVRfRVhQUlMgfSBmcm9tICcuLi92aXNpdG9ycy9leHByZXNzaW9ucyc7XG5pbXBvcnQgeyBWSVNJVF9TVE1UUyB9IGZyb20gJy4uL3Zpc2l0b3JzL3N0YXRlbWVudHMnO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tICcuL2ltcGwnO1xuaW1wb3J0IHsgYXNzZXJ0Q3VycnlLZXl3b3JkIH0gZnJvbSAnLi91dGlscy9jdXJyeSc7XG5cbmV4cG9ydCBjb25zdCBCTE9DS19LRVlXT1JEUyA9IGtleXdvcmRzKCdCbG9jaycpXG4gIC5rdygnaW4tZWxlbWVudCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICBpbnNlcnRCZWZvcmU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDtcbiAgICAgIGRlc3RpbmF0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBsZXQgZ3VpZCA9IGFyZ3MuZ2V0KCdndWlkJyk7XG5cbiAgICAgIGlmIChndWlkKSB7XG4gICAgICAgIHJldHVybiBFcnIoZ2VuZXJhdGVTeW50YXhFcnJvcihgQ2Fubm90IHBhc3MgXFxgZ3VpZFxcYCB0byBcXGB7eyNpbi1lbGVtZW50fX1cXGBgLCBndWlkLmxvYykpO1xuICAgICAgfVxuXG4gICAgICBsZXQgaW5zZXJ0QmVmb3JlID0gYXJncy5nZXQoJ2luc2VydEJlZm9yZScpO1xuICAgICAgbGV0IGRlc3RpbmF0aW9uID0gYXJncy5udGgoMCk7XG5cbiAgICAgIGlmIChkZXN0aW5hdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjaW4tZWxlbWVudH19IHJlcXVpcmVzIGEgdGFyZ2V0IGVsZW1lbnQgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyYCxcbiAgICAgICAgICAgIGFyZ3MubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPIEJldHRlciBzeW50YXggY2hlY2tzXG5cbiAgICAgIHJldHVybiBPayh7IGluc2VydEJlZm9yZSwgZGVzdGluYXRpb24gfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAge1xuICAgICAgICBpbnNlcnRCZWZvcmUsXG4gICAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgfTogeyBpbnNlcnRCZWZvcmU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbDsgZGVzdGluYXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLkluRWxlbWVudD4ge1xuICAgICAgbGV0IG5hbWVkID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgYm9keSA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2sobmFtZWQsIHN0YXRlKTtcbiAgICAgIGxldCBkZXN0aW5hdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGRlc3RpbmF0aW9uLCBzdGF0ZSk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGJvZHksIGRlc3RpbmF0aW9uUmVzdWx0KVxuICAgICAgICAuYW5kVGhlbihcbiAgICAgICAgICAoW2JvZHksIGRlc3RpbmF0aW9uXSk6IFJlc3VsdDx7XG4gICAgICAgICAgICBib2R5OiBtaXIuTmFtZWRCbG9jaztcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBtaXIuRXhwcmVzc2lvbk5vZGU7XG4gICAgICAgICAgICBpbnNlcnRCZWZvcmU6IG1pci5FeHByZXNzaW9uTm9kZTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBWSVNJVF9FWFBSUy52aXNpdChpbnNlcnRCZWZvcmUsIHN0YXRlKS5tYXBPaygoaW5zZXJ0QmVmb3JlKSA9PiAoe1xuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlLFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gT2soe1xuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlOiBuZXcgbWlyLk1pc3Npbmcoe1xuICAgICAgICAgICAgICAgICAgbG9jOiBub2RlLmNhbGxlZS5sb2MuY29sbGFwc2UoJ2VuZCcpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgLm1hcE9rKFxuICAgICAgICAgICh7IGJvZHksIGRlc3RpbmF0aW9uLCBpbnNlcnRCZWZvcmUgfSkgPT5cbiAgICAgICAgICAgIG5ldyBtaXIuSW5FbGVtZW50KHtcbiAgICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgICAgYmxvY2s6IGJvZHksXG4gICAgICAgICAgICAgIGluc2VydEJlZm9yZSxcbiAgICAgICAgICAgICAgZ3VpZDogc3RhdGUuZ2VuZXJhdGVVbmlxdWVDdXJzb3IoKSxcbiAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnaWYnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgY29uZGl0aW9uOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IGNhbiBvbmx5IHJlY2VpdmUgb25lIHBvc2l0aW9uYWwgcGFyYW1ldGVyIGluIGJsb2NrIGZvcm0sIHRoZSBjb25kaXRpb25hbCB2YWx1ZS4gUmVjZWl2ZWQgJHthcmdzLnBvc2l0aW9uYWwuc2l6ZX0gcGFyYW1ldGVyc2AsXG4gICAgICAgICAgICBub2RlLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbmRpdGlvbiA9IGFyZ3MubnRoKDApO1xuXG4gICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNpZn19IHJlcXVpcmVzIGEgY29uZGl0aW9uIGFzIGl0cyBmaXJzdCBwb3NpdGlvbmFsIHBhcmFtZXRlciwgZGlkIG5vdCByZWNlaXZlIGFueSBwYXJhbWV0ZXJzYCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyBjb25kaXRpb24gfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBjb25kaXRpb24gfTogeyBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlIH1cbiAgICApOiBSZXN1bHQ8bWlyLklmPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcbiAgICAgIGxldCBpbnZlcnNlID0gbm9kZS5ibG9ja3MuZ2V0KCdlbHNlJyk7XG5cbiAgICAgIGxldCBjb25kaXRpb25SZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdChjb25kaXRpb24sIHN0YXRlKTtcbiAgICAgIGxldCBibG9ja1Jlc3VsdCA9IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soYmxvY2ssIHN0YXRlKTtcbiAgICAgIGxldCBpbnZlcnNlUmVzdWx0ID0gaW52ZXJzZSA/IFZJU0lUX1NUTVRTLk5hbWVkQmxvY2soaW52ZXJzZSwgc3RhdGUpIDogT2sobnVsbCk7XG5cbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKGNvbmRpdGlvblJlc3VsdCwgYmxvY2tSZXN1bHQsIGludmVyc2VSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW2NvbmRpdGlvbiwgYmxvY2ssIGludmVyc2VdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuSWYoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgaW52ZXJzZSxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KVxuICAua3coJ3VubGVzcycsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICBjb25kaXRpb246IEFTVHYyLkV4cHJlc3Npb25Ob2RlO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmICghYXJncy5uYW1lZC5pc0VtcHR5KCkpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I3VubGVzc319IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIG5vZGUubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyN1bmxlc3N9fSBjYW4gb25seSByZWNlaXZlIG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciBpbiBibG9jayBmb3JtLCB0aGUgY29uZGl0aW9uYWwgdmFsdWUuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgbm9kZS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBjb25kaXRpb24gPSBhcmdzLm50aCgwKTtcblxuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjdW5sZXNzfX0gcmVxdWlyZXMgYSBjb25kaXRpb24gYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgbm9kZS5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IGNvbmRpdGlvbiB9KTtcbiAgICB9LFxuXG4gICAgdHJhbnNsYXRlKFxuICAgICAgeyBub2RlLCBzdGF0ZSB9OiB7IG5vZGU6IEFTVHYyLkludm9rZUJsb2NrOyBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlIH0sXG4gICAgICB7IGNvbmRpdGlvbiB9OiB7IGNvbmRpdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfVxuICAgICk6IFJlc3VsdDxtaXIuSWY+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuICAgICAgbGV0IGludmVyc2UgPSBub2RlLmJsb2Nrcy5nZXQoJ2Vsc2UnKTtcblxuICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGNvbmRpdGlvbiwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwoY29uZGl0aW9uUmVzdWx0LCBibG9ja1Jlc3VsdCwgaW52ZXJzZVJlc3VsdCkubWFwT2soXG4gICAgICAgIChbY29uZGl0aW9uLCBibG9jaywgaW52ZXJzZV0pID0+XG4gICAgICAgICAgbmV3IG1pci5JZih7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgY29uZGl0aW9uOiBuZXcgbWlyLk5vdCh7IHZhbHVlOiBjb25kaXRpb24sIGxvYzogbm9kZS5sb2MgfSksXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdlYWNoJywge1xuICAgIGFzc2VydChcbiAgICAgIG5vZGU6IEFTVHYyLkludm9rZUJsb2NrXG4gICAgKTogUmVzdWx0PHtcbiAgICAgIHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgICAgIGtleTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfCBudWxsO1xuICAgIH0+IHtcbiAgICAgIGxldCB7IGFyZ3MgfSA9IG5vZGU7XG5cbiAgICAgIGlmICghYXJncy5uYW1lZC5lbnRyaWVzLmV2ZXJ5KChlKSA9PiBlLm5hbWUuY2hhcnMgPT09ICdrZXknKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjZWFjaH19IGNhbiBvbmx5IHJlY2VpdmUgdGhlICdrZXknIG5hbWVkIHBhcmFtZXRlciwgcmVjZWl2ZWQgJHthcmdzLm5hbWVkLmVudHJpZXNcbiAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5uYW1lLmNoYXJzICE9PSAna2V5JylcbiAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5uYW1lLmNoYXJzKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgYXJncy5uYW1lZC5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLnBvc2l0aW9uYWwuc2l6ZSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2VhY2h9fSBjYW4gb25seSByZWNlaXZlIG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciwgdGhlIGNvbGxlY3Rpb24gYmVpbmcgaXRlcmF0ZWQuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0gYXJncy5udGgoMCk7XG4gICAgICBsZXQga2V5ID0gYXJncy5nZXQoJ2tleScpO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIEVycihcbiAgICAgICAgICBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICAgICAgYHt7I2VhY2h9fSByZXF1aXJlcyBhbiBpdGVyYWJsZSB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IHZhbHVlLCBrZXkgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyB2YWx1ZSwga2V5IH06IHsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyBrZXk6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHwgbnVsbCB9XG4gICAgKTogUmVzdWx0PG1pci5FYWNoPiB7XG4gICAgICBsZXQgYmxvY2sgPSBub2RlLmJsb2Nrcy5nZXQoJ2RlZmF1bHQnKTtcbiAgICAgIGxldCBpbnZlcnNlID0gbm9kZS5ibG9ja3MuZ2V0KCdlbHNlJyk7XG5cbiAgICAgIGxldCB2YWx1ZVJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KHZhbHVlLCBzdGF0ZSk7XG4gICAgICBsZXQga2V5UmVzdWx0ID0ga2V5ID8gVklTSVRfRVhQUlMudmlzaXQoa2V5LCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwodmFsdWVSZXN1bHQsIGtleVJlc3VsdCwgYmxvY2tSZXN1bHQsIGludmVyc2VSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW3ZhbHVlLCBrZXksIGJsb2NrLCBpbnZlcnNlXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLkVhY2goe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICBpbnZlcnNlLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gIH0pXG4gIC5rdygnd2l0aCcsIHtcbiAgICBhc3NlcnQoXG4gICAgICBub2RlOiBBU1R2Mi5JbnZva2VCbG9ja1xuICAgICk6IFJlc3VsdDx7XG4gICAgICB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGU7XG4gICAgfT4ge1xuICAgICAgbGV0IHsgYXJncyB9ID0gbm9kZTtcblxuICAgICAgaWYgKCFhcmdzLm5hbWVkLmlzRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjd2l0aH19IGNhbm5vdCByZWNlaXZlIG5hbWVkIHBhcmFtZXRlcnMsIHJlY2VpdmVkICR7YXJncy5uYW1lZC5lbnRyaWVzXG4gICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUubmFtZS5jaGFycylcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIGFyZ3MubmFtZWQubG9jXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5wb3NpdGlvbmFsLnNpemUgPiAxKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyN3aXRofX0gY2FuIG9ubHkgcmVjZWl2ZSBvbmUgcG9zaXRpb25hbCBwYXJhbWV0ZXIuIFJlY2VpdmVkICR7YXJncy5wb3NpdGlvbmFsLnNpemV9IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0gYXJncy5udGgoMCk7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKFxuICAgICAgICAgIGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBge3sjd2l0aH19IHJlcXVpcmVzIGEgdmFsdWUgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5sb2NcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPayh7IHZhbHVlIH0pO1xuICAgIH0sXG5cbiAgICB0cmFuc2xhdGUoXG4gICAgICB7IG5vZGUsIHN0YXRlIH06IHsgbm9kZTogQVNUdjIuSW52b2tlQmxvY2s7IHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUgfSxcbiAgICAgIHsgdmFsdWUgfTogeyB2YWx1ZTogQVNUdjIuRXhwcmVzc2lvbk5vZGUgfVxuICAgICk6IFJlc3VsdDxtaXIuV2l0aD4ge1xuICAgICAgbGV0IGJsb2NrID0gbm9kZS5ibG9ja3MuZ2V0KCdkZWZhdWx0Jyk7XG4gICAgICBsZXQgaW52ZXJzZSA9IG5vZGUuYmxvY2tzLmdldCgnZWxzZScpO1xuXG4gICAgICBsZXQgdmFsdWVSZXN1bHQgPSBWSVNJVF9FWFBSUy52aXNpdCh2YWx1ZSwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuICAgICAgbGV0IGludmVyc2VSZXN1bHQgPSBpbnZlcnNlID8gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhpbnZlcnNlLCBzdGF0ZSkgOiBPayhudWxsKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwodmFsdWVSZXN1bHQsIGJsb2NrUmVzdWx0LCBpbnZlcnNlUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFt2YWx1ZSwgYmxvY2ssIGludmVyc2VdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuV2l0aCh7XG4gICAgICAgICAgICBsb2M6IG5vZGUubG9jLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGludmVyc2UsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdsZXQnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgICB9PiB7XG4gICAgICBsZXQgeyBhcmdzIH0gPSBub2RlO1xuXG4gICAgICBpZiAoIWFyZ3MubmFtZWQuaXNFbXB0eSgpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNsZXR9fSBjYW5ub3QgcmVjZWl2ZSBuYW1lZCBwYXJhbWV0ZXJzLCByZWNlaXZlZCAke2FyZ3MubmFtZWQuZW50cmllc1xuICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLm5hbWUuY2hhcnMpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBhcmdzLm5hbWVkLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZ3MucG9zaXRpb25hbC5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGB7eyNsZXR9fSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWUgYXMgaXRzIGZpcnN0IHBvc2l0aW9uYWwgcGFyYW1ldGVyLCBkaWQgbm90IHJlY2VpdmUgYW55IHBhcmFtZXRlcnNgLFxuICAgICAgICAgICAgYXJncy5wb3NpdGlvbmFsLmxvY1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuYmxvY2tzLmdldCgnZWxzZScpKSB7XG4gICAgICAgIHJldHVybiBFcnIoXG4gICAgICAgICAgZ2VuZXJhdGVTeW50YXhFcnJvcihge3sjbGV0fX0gY2Fubm90IHJlY2VpdmUgYW4ge3tlbHNlfX0gYmxvY2tgLCBhcmdzLnBvc2l0aW9uYWwubG9jKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gT2soeyBwb3NpdGlvbmFsOiBhcmdzLnBvc2l0aW9uYWwgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBwb3NpdGlvbmFsIH06IHsgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyB9XG4gICAgKTogUmVzdWx0PG1pci5MZXQ+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuXG4gICAgICBsZXQgcG9zaXRpb25hbFJlc3VsdCA9IFZJU0lUX0VYUFJTLlBvc2l0aW9uYWwocG9zaXRpb25hbCwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChwb3NpdGlvbmFsUmVzdWx0LCBibG9ja1Jlc3VsdCkubWFwT2soXG4gICAgICAgIChbcG9zaXRpb25hbCwgYmxvY2tdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuTGV0KHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBwb3NpdGlvbmFsLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCctd2l0aC1keW5hbWljLXZhcnMnLCB7XG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZTogQVNUdjIuSW52b2tlQmxvY2tcbiAgICApOiBSZXN1bHQ8e1xuICAgICAgbmFtZWQ6IEFTVHYyLk5hbWVkQXJndW1lbnRzO1xuICAgIH0+IHtcbiAgICAgIHJldHVybiBPayh7IG5hbWVkOiBub2RlLmFyZ3MubmFtZWQgfSk7XG4gICAgfSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBuYW1lZCB9OiB7IG5hbWVkOiBBU1R2Mi5OYW1lZEFyZ3VtZW50cyB9XG4gICAgKTogUmVzdWx0PG1pci5XaXRoRHluYW1pY1ZhcnM+IHtcbiAgICAgIGxldCBibG9jayA9IG5vZGUuYmxvY2tzLmdldCgnZGVmYXVsdCcpO1xuXG4gICAgICBsZXQgbmFtZWRSZXN1bHQgPSBWSVNJVF9FWFBSUy5OYW1lZEFyZ3VtZW50cyhuYW1lZCwgc3RhdGUpO1xuICAgICAgbGV0IGJsb2NrUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9jayhibG9jaywgc3RhdGUpO1xuXG4gICAgICByZXR1cm4gUmVzdWx0LmFsbChuYW1lZFJlc3VsdCwgYmxvY2tSZXN1bHQpLm1hcE9rKFxuICAgICAgICAoW25hbWVkLCBibG9ja10pID0+XG4gICAgICAgICAgbmV3IG1pci5XaXRoRHluYW1pY1ZhcnMoe1xuICAgICAgICAgICAgbG9jOiBub2RlLmxvYyxcbiAgICAgICAgICAgIG5hbWVkLFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSlcbiAgLmt3KCdjb21wb25lbnQnLCB7XG4gICAgYXNzZXJ0OiBhc3NlcnRDdXJyeUtleXdvcmQoQ3VycmllZFR5cGUuQ29tcG9uZW50KSxcblxuICAgIHRyYW5zbGF0ZShcbiAgICAgIHsgbm9kZSwgc3RhdGUgfTogeyBub2RlOiBBU1R2Mi5JbnZva2VCbG9jazsgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSB9LFxuICAgICAgeyBkZWZpbml0aW9uLCBhcmdzIH06IHsgZGVmaW5pdGlvbjogQVNUdjIuRXhwcmVzc2lvbk5vZGU7IGFyZ3M6IEFTVHYyLkFyZ3MgfVxuICAgICk6IFJlc3VsdDxtaXIuSW52b2tlQ29tcG9uZW50PiB7XG4gICAgICBsZXQgZGVmaW5pdGlvblJlc3VsdCA9IFZJU0lUX0VYUFJTLnZpc2l0KGRlZmluaXRpb24sIHN0YXRlKTtcbiAgICAgIGxldCBhcmdzUmVzdWx0ID0gVklTSVRfRVhQUlMuQXJncyhhcmdzLCBzdGF0ZSk7XG4gICAgICBsZXQgYmxvY2tzUmVzdWx0ID0gVklTSVRfU1RNVFMuTmFtZWRCbG9ja3Mobm9kZS5ibG9ja3MsIHN0YXRlKTtcblxuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwoZGVmaW5pdGlvblJlc3VsdCwgYXJnc1Jlc3VsdCwgYmxvY2tzUmVzdWx0KS5tYXBPayhcbiAgICAgICAgKFtkZWZpbml0aW9uLCBhcmdzLCBibG9ja3NdKSA9PlxuICAgICAgICAgIG5ldyBtaXIuSW52b2tlQ29tcG9uZW50KHtcbiAgICAgICAgICAgIGxvYzogbm9kZS5sb2MsXG4gICAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGJsb2NrcyxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=