@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
294 lines (293 loc) • 51.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const DiagnosticCode_1 = require("../../../DiagnosticCode");
const DiagnosticMessage_1 = require("../../../DiagnosticMessage");
const builtins_1 = require("../../builtins");
const types_1 = require("../types");
class ObjectBindingHelper extends types_1.TypedHelper {
constructor(options) {
super(options);
this.value = options.value;
}
emit(sb, node, optionsIn) {
const restElement = node.elements.find((element) => ts_utils_1.tsUtils.node.getDotDotDotToken(element) !== undefined);
const elements = restElement === undefined ? [...node.elements] : node.elements.slice(0, -1);
const throwTypeError = (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
};
const throwInnerTypeError = (innerOptions) => {
sb.emitOp(node, 'DROP');
throwTypeError(innerOptions);
};
const handleBuiltin = (member, element, innerOptions) => {
if (builtins_1.isBuiltinInstanceMemberValue(member)) {
member.emitValue(sb, element, innerOptions, true);
return;
}
if (builtins_1.isBuiltinMemberValue(member)) {
member.emitValue(sb, element, innerOptions);
return;
}
sb.context.reportError(element, DiagnosticCode_1.DiagnosticCode.InvalidBuiltinReference, DiagnosticMessage_1.DiagnosticMessage.CannotReferenceBuiltinProperty);
};
const createProcessBuiltin = (builtinName, isBuiltinValue = false) => (innerOptions) => {
if (restElement !== undefined) {
sb.context.reportUnsupportedEfficiency(restElement);
}
elements.forEach((element) => {
const nameNode = ts_utils_1.tsUtils.node.getNameNode(element);
const propertyName = ts_utils_1.tsUtils.node.getPropertyNameNode(element);
const initializer = ts_utils_1.tsUtils.initializer.getInitializer(element);
const elementType = sb.context.analysis.getType(nameNode);
if (typescript_1.default.isIdentifier(nameNode)) {
sb.scope.add(ts_utils_1.tsUtils.node.getText(nameNode));
}
if (!isBuiltinValue) {
sb.emitOp(element, 'DUP');
}
if (propertyName === undefined ||
typescript_1.default.isIdentifier(propertyName) ||
typescript_1.default.isStringLiteral(propertyName) ||
typescript_1.default.isNumericLiteral(propertyName)) {
const memberName = propertyName === undefined
? ts_utils_1.tsUtils.node.getNameOrThrow(element)
: typescript_1.default.isIdentifier(propertyName)
? ts_utils_1.tsUtils.node.getText(propertyName)
: typescript_1.default.isStringLiteral(propertyName)
? ts_utils_1.tsUtils.literal.getLiteralValue(propertyName)
: `${ts_utils_1.tsUtils.literal.getLiteralValue(propertyName)}`;
const member = sb.context.builtins.getOnlyMember(builtinName, memberName);
if (member === undefined) {
throwInnerTypeError(innerOptions);
}
else {
handleBuiltin(member, element, innerOptions);
}
}
else {
sb.context.reportUnsupported(element);
}
if (initializer !== undefined) {
sb.emitHelper(node, innerOptions, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'DUP');
sb.emitHelper(node, innerOptions, sb.helpers.isUndefined);
},
whenTrue: () => {
sb.emitOp(node, 'DROP');
sb.visit(initializer, innerOptions);
},
}));
}
if (typescript_1.default.isIdentifier(nameNode)) {
sb.scope.set(sb, element, innerOptions, ts_utils_1.tsUtils.node.getText(nameNode));
}
else if (typescript_1.default.isArrayBindingPattern(nameNode)) {
sb.emitHelper(nameNode, innerOptions, sb.helpers.arrayBinding({ type: elementType }));
}
else {
sb.emitHelper(nameNode, innerOptions, sb.helpers.objectBinding({ type: elementType }));
}
});
if (!isBuiltinValue) {
sb.emitOp(node, 'DROP');
}
};
const processObject = (innerOptions) => {
let addSymbolProp = () => {
};
let addStringProp = () => {
};
if (restElement !== undefined) {
sb.emitPushInt(node, 0);
sb.emitOp(node, 'NEWARRAY');
sb.emitPushInt(node, 0);
sb.emitOp(node, 'NEWARRAY');
sb.emitOp(node, 'ROT');
addSymbolProp = () => {
sb.emitPushInt(restElement, 4);
sb.emitOp(restElement, 'PICK');
sb.emitOp(node, 'OVER');
sb.emitOp(node, 'APPEND');
};
addStringProp = () => {
sb.emitPushInt(restElement, 3);
sb.emitOp(restElement, 'PICK');
sb.emitOp(node, 'OVER');
sb.emitOp(node, 'APPEND');
};
}
elements.forEach((element) => {
const nameNode = ts_utils_1.tsUtils.node.getNameNode(element);
const propertyName = ts_utils_1.tsUtils.node.getPropertyNameNode(element);
const initializer = ts_utils_1.tsUtils.initializer.getInitializer(element);
const elementType = sb.context.analysis.getType(nameNode);
if (typescript_1.default.isIdentifier(nameNode)) {
sb.scope.add(ts_utils_1.tsUtils.node.getText(nameNode));
}
sb.emitOp(element, 'DUP');
if (propertyName === undefined) {
sb.emitPushString(element, ts_utils_1.tsUtils.node.getNameOrThrow(element));
addStringProp();
sb.emitHelper(element, innerOptions, sb.helpers.getPropertyObjectProperty);
}
else if (typescript_1.default.isIdentifier(propertyName)) {
sb.emitPushString(element, ts_utils_1.tsUtils.node.getText(propertyName));
addStringProp();
sb.emitHelper(element, innerOptions, sb.helpers.getPropertyObjectProperty);
}
else if (typescript_1.default.isComputedPropertyName(propertyName)) {
const expr = ts_utils_1.tsUtils.expression.getExpression(propertyName);
const propertyNameType = sb.context.analysis.getType(expr);
sb.visit(expr, innerOptions);
const handleSymbol = () => {
sb.emitHelper(element, innerOptions, sb.helpers.unwrapSymbol);
addSymbolProp();
sb.emitHelper(element, innerOptions, sb.helpers.getSymbolObjectProperty);
};
const handleStringBase = (innerInnerOptions) => {
addStringProp();
sb.emitHelper(element, innerInnerOptions, sb.helpers.getPropertyObjectProperty);
};
const handleString = (innerInnerOptions) => {
sb.emitHelper(node, innerInnerOptions, sb.helpers.unwrapString);
handleStringBase(innerInnerOptions);
};
const handleNumber = (innerInnerOptions) => {
sb.emitHelper(node, innerInnerOptions, sb.helpers.toString({ type: propertyNameType }));
handleStringBase(innerInnerOptions);
};
sb.emitHelper(element, innerOptions, sb.helpers.forBuiltinType({
type: propertyNameType,
array: throwInnerTypeError,
arrayStorage: throwInnerTypeError,
boolean: throwInnerTypeError,
buffer: throwInnerTypeError,
null: throwInnerTypeError,
number: handleNumber,
object: throwInnerTypeError,
string: handleString,
symbol: handleSymbol,
undefined: throwInnerTypeError,
map: throwInnerTypeError,
mapStorage: throwInnerTypeError,
set: throwInnerTypeError,
setStorage: throwInnerTypeError,
error: throwInnerTypeError,
forwardValue: throwInnerTypeError,
iteratorResult: throwInnerTypeError,
iterable: throwInnerTypeError,
iterableIterator: throwInnerTypeError,
transaction: throwInnerTypeError,
output: throwInnerTypeError,
attribute: throwInnerTypeError,
input: throwInnerTypeError,
account: throwInnerTypeError,
asset: throwInnerTypeError,
contract: throwInnerTypeError,
header: throwInnerTypeError,
block: throwInnerTypeError,
}));
}
else {
sb.emitPushString(propertyName, typescript_1.default.isStringLiteral(propertyName)
? ts_utils_1.tsUtils.literal.getLiteralValue(propertyName)
: `${ts_utils_1.tsUtils.literal.getLiteralValue(propertyName)}`);
addStringProp();
sb.emitHelper(element, innerOptions, sb.helpers.getPropertyObjectProperty);
}
if (initializer !== undefined) {
sb.emitHelper(node, innerOptions, sb.helpers.if({
condition: () => {
sb.emitOp(node, 'DUP');
sb.emitHelper(node, innerOptions, sb.helpers.isUndefined);
},
whenTrue: () => {
sb.emitOp(node, 'DROP');
sb.visit(initializer, innerOptions);
},
}));
}
if (typescript_1.default.isIdentifier(nameNode)) {
sb.scope.set(sb, element, innerOptions, ts_utils_1.tsUtils.node.getText(nameNode));
}
else if (typescript_1.default.isArrayBindingPattern(nameNode)) {
sb.emitHelper(nameNode, innerOptions, sb.helpers.arrayBinding({ type: elementType }));
}
else {
sb.emitHelper(nameNode, innerOptions, sb.helpers.objectBinding({ type: elementType }));
}
});
if (restElement === undefined) {
sb.emitOp(node, 'DROP');
}
else {
const name = ts_utils_1.tsUtils.node.getNameOrThrow(restElement);
sb.scope.add(name);
sb.emitOp(node, 'NEWMAP');
sb.emitOp(node, 'SWAP');
sb.emitOp(node, 'DUP');
sb.emitHelper(node, innerOptions, sb.helpers.getSymbolObject);
sb.emitOp(node, 'SWAP');
sb.emitHelper(node, innerOptions, sb.helpers.getPropertyObject);
sb.emitPushInt(node, 3);
sb.emitHelper(node, innerOptions, sb.helpers.packObject);
sb.emitPushInt(node, 3);
sb.emitOp(node, 'XTUCK');
sb.emitOp(restElement, 'ROT');
sb.emitOp(restElement, 'ROT');
sb.emitHelper(restElement, innerOptions, sb.helpers.omitObjectProperties);
sb.scope.set(sb, restElement, innerOptions, name);
}
};
const options = sb.pushValueOptions(optionsIn);
if (this.value !== undefined) {
const builtinInterface = sb.context.builtins.getValueInterface(this.value);
if (builtinInterface === undefined) {
sb.visit(this.value, options);
}
else {
createProcessBuiltin(builtinInterface, true)(options);
return;
}
}
sb.emitHelper(node, options, sb.helpers.forBuiltinType({
type: this.type,
knownType: this.knownType,
array: createProcessBuiltin('Array'),
arrayStorage: createProcessBuiltin('ArrayStorage'),
boolean: createProcessBuiltin('Boolean'),
buffer: createProcessBuiltin('Buffer'),
null: throwTypeError,
number: createProcessBuiltin('Number'),
object: processObject,
string: createProcessBuiltin('String'),
symbol: createProcessBuiltin('Symbol'),
undefined: throwTypeError,
map: createProcessBuiltin('Map'),
mapStorage: createProcessBuiltin('MapStorage'),
set: createProcessBuiltin('Set'),
setStorage: createProcessBuiltin('SetStorage'),
error: createProcessBuiltin('Error'),
forwardValue: createProcessBuiltin('ForwardValue'),
iteratorResult: createProcessBuiltin('IteratorResult'),
iterable: createProcessBuiltin('Iterable'),
iterableIterator: createProcessBuiltin('IterableIterator'),
transaction: createProcessBuiltin('TransactionBase'),
output: createProcessBuiltin('Output'),
attribute: createProcessBuiltin('AttributeBase'),
input: createProcessBuiltin('Input'),
account: createProcessBuiltin('Account'),
asset: createProcessBuiltin('Asset'),
contract: createProcessBuiltin('Contract'),
header: createProcessBuiltin('Header'),
block: createProcessBuiltin('Block'),
}));
}
}
exports.ObjectBindingHelper = ObjectBindingHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QztDQUNGO0FBbllELGtEQW1ZQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci9iaW5kL09iamVjdEJpbmRpbmdIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvZGUgfSBmcm9tICcuLi8uLi8uLi9EaWFnbm9zdGljQ29kZSc7XG5pbXBvcnQgeyBEaWFnbm9zdGljTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL0RpYWdub3N0aWNNZXNzYWdlJztcbmltcG9ydCB7IEJ1aWx0aW4sIGlzQnVpbHRpbkluc3RhbmNlTWVtYmVyVmFsdWUsIGlzQnVpbHRpbk1lbWJlclZhbHVlIH0gZnJvbSAnLi4vLi4vYnVpbHRpbnMnO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFR5cGVkSGVscGVyLCBUeXBlZEhlbHBlck9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0QmluZGluZ0hlbHBlck9wdGlvbnMgZXh0ZW5kcyBUeXBlZEhlbHBlck9wdGlvbnMge1xuICByZWFkb25seSB2YWx1ZT86IHRzLk5vZGU7XG59XG5cbi8vIElucHV0OiBbdmFsP11cbi8vIE91dHB1dDogW11cbmV4cG9ydCBjbGFzcyBPYmplY3RCaW5kaW5nSGVscGVyIGV4dGVuZHMgVHlwZWRIZWxwZXI8dHMuT2JqZWN0QmluZGluZ1BhdHRlcm4+IHtcbiAgcHJpdmF0ZSByZWFkb25seSB2YWx1ZT86IHRzLk5vZGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9iamVjdEJpbmRpbmdIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZW1pdChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuT2JqZWN0QmluZGluZ1BhdHRlcm4sIG9wdGlvbnNJbjogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdEVsZW1lbnQgPSBub2RlLmVsZW1lbnRzLmZpbmQoKGVsZW1lbnQpID0+IHRzVXRpbHMubm9kZS5nZXREb3REb3REb3RUb2tlbihlbGVtZW50KSAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlbGVtZW50cyA9IHJlc3RFbGVtZW50ID09PSB1bmRlZmluZWQgPyBbLi4ubm9kZS5lbGVtZW50c10gOiBub2RlLmVsZW1lbnRzLnNsaWNlKDAsIC0xKTtcblxuICAgIGNvbnN0IHRocm93VHlwZUVycm9yID0gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAvLyBbXVxuICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy50aHJvd1R5cGVFcnJvcik7XG4gICAgfTtcblxuICAgIGNvbnN0IHRocm93SW5uZXJUeXBlRXJyb3IgPSAoaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIC8vIFtdXG4gICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgIHRocm93VHlwZUVycm9yKGlubmVyT3B0aW9ucyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUJ1aWx0aW4gPSAobWVtYmVyOiBCdWlsdGluLCBlbGVtZW50OiB0cy5CaW5kaW5nRWxlbWVudCwgaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIGlmIChpc0J1aWx0aW5JbnN0YW5jZU1lbWJlclZhbHVlKG1lbWJlcikpIHtcbiAgICAgICAgbWVtYmVyLmVtaXRWYWx1ZShzYiwgZWxlbWVudCwgaW5uZXJPcHRpb25zLCB0cnVlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0J1aWx0aW5NZW1iZXJWYWx1ZShtZW1iZXIpKSB7XG4gICAgICAgIG1lbWJlci5lbWl0VmFsdWUoc2IsIGVsZW1lbnQsIGlubmVyT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzYi5jb250ZXh0LnJlcG9ydEVycm9yKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBEaWFnbm9zdGljQ29kZS5JbnZhbGlkQnVpbHRpblJlZmVyZW5jZSxcbiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2UuQ2Fubm90UmVmZXJlbmNlQnVpbHRpblByb3BlcnR5LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlYXRlUHJvY2Vzc0J1aWx0aW4gPSAoYnVpbHRpbk5hbWU6IHN0cmluZywgaXNCdWlsdGluVmFsdWUgPSBmYWxzZSkgPT4gKGlubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICBpZiAocmVzdEVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYi5jb250ZXh0LnJlcG9ydFVuc3VwcG9ydGVkRWZmaWNpZW5jeShyZXN0RWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZU5vZGUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZU5vZGUoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IHRzVXRpbHMubm9kZS5nZXRQcm9wZXJ0eU5hbWVOb2RlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IHRzVXRpbHMuaW5pdGlhbGl6ZXIuZ2V0SW5pdGlhbGl6ZXIoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKG5hbWVOb2RlKTtcblxuICAgICAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWVOb2RlKSkge1xuICAgICAgICAgIHNiLnNjb3BlLmFkZCh0c1V0aWxzLm5vZGUuZ2V0VGV4dChuYW1lTm9kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0J1aWx0aW5WYWx1ZSkge1xuICAgICAgICAgIC8vIFtvYmplY3RWYWwsIG9iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0T3AoZWxlbWVudCwgJ0RVUCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3BlcnR5TmFtZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5TmFtZSkgfHxcbiAgICAgICAgICB0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHlOYW1lKSB8fFxuICAgICAgICAgIHRzLmlzTnVtZXJpY0xpdGVyYWwocHJvcGVydHlOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZW1iZXJOYW1lID1cbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gdHNVdGlscy5ub2RlLmdldE5hbWVPclRocm93KGVsZW1lbnQpXG4gICAgICAgICAgICAgIDogdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgPyB0c1V0aWxzLm5vZGUuZ2V0VGV4dChwcm9wZXJ0eU5hbWUpXG4gICAgICAgICAgICAgIDogdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgPyB0c1V0aWxzLmxpdGVyYWwuZ2V0TGl0ZXJhbFZhbHVlKHByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgOiBgJHt0c1V0aWxzLmxpdGVyYWwuZ2V0TGl0ZXJhbFZhbHVlKHByb3BlcnR5TmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZW1iZXIgPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldE9ubHlNZW1iZXIoYnVpbHRpbk5hbWUsIG1lbWJlck5hbWUpO1xuXG4gICAgICAgICAgaWYgKG1lbWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvd0lubmVyVHlwZUVycm9yKGlubmVyT3B0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZUJ1aWx0aW4obWVtYmVyLCBlbGVtZW50LCBpbm5lck9wdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYi5jb250ZXh0LnJlcG9ydFVuc3VwcG9ydGVkKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgICAgICBjb25kaXRpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBbdmFsLCB2YWwsIG9iamVjdFZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAgICAgICAgIC8vIFtib29sZWFuLCB2YWwsIG9iamVjdFZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5pc1VuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gW29iamVjdFZhbF1cbiAgICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgICAgICAgICAgICAvLyBbdmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgICAgICAgc2IudmlzaXQoaW5pdGlhbGl6ZXIsIGlubmVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihuYW1lTm9kZSkpIHtcbiAgICAgICAgICAvLyBbb2JqZWN0VmFsXVxuICAgICAgICAgIHNiLnNjb3BlLnNldChzYiwgZWxlbWVudCwgaW5uZXJPcHRpb25zLCB0c1V0aWxzLm5vZGUuZ2V0VGV4dChuYW1lTm9kZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzQXJyYXlCaW5kaW5nUGF0dGVybihuYW1lTm9kZSkpIHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5hbWVOb2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuYXJyYXlCaW5kaW5nKHsgdHlwZTogZWxlbWVudFR5cGUgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIobmFtZU5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5vYmplY3RCaW5kaW5nKHsgdHlwZTogZWxlbWVudFR5cGUgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFpc0J1aWx0aW5WYWx1ZSkge1xuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RST1AnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc09iamVjdCA9IChpbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgbGV0IGFkZFN5bWJvbFByb3AgPSAoKSA9PiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH07XG4gICAgICBsZXQgYWRkU3RyaW5nUHJvcCA9ICgpID0+IHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfTtcbiAgICAgIGlmIChyZXN0RWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFswXVxuICAgICAgICBzYi5lbWl0UHVzaEludChub2RlLCAwKTtcbiAgICAgICAgLy8gW3N5bWJvbEFycl1cbiAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdORVdBUlJBWScpO1xuICAgICAgICAvLyBbMF1cbiAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMCk7XG4gICAgICAgIC8vIFtwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ05FV0FSUkFZJyk7XG4gICAgICAgIC8vIFtvYmplY3RWYWwsIHByb3BlcnR5QXJyLCBzeW1ib2xBcnJdXG4gICAgICAgIHNiLmVtaXRPcChub2RlLCAnUk9UJyk7XG4gICAgICAgIGFkZFN5bWJvbFByb3AgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gWzQsIHZhbCwgb2JqZWN0VmFsLCBvYmplY3RWYWwsIHByb3BlcnR5QXJyLCBzeW1ib2xBcnJdXG4gICAgICAgICAgc2IuZW1pdFB1c2hJbnQocmVzdEVsZW1lbnQsIDQpO1xuICAgICAgICAgIC8vIFtzeW1ib2xBcnIsIHZhbCwgb2JqZWN0VmFsLCBvYmplY3RWYWwsIHByb3BlcnR5QXJyLCBzeW1ib2xBcnJdXG4gICAgICAgICAgc2IuZW1pdE9wKHJlc3RFbGVtZW50LCAnUElDSycpO1xuICAgICAgICAgIC8vIFt2YWwsIHN5bWJvbEFyciwgdmFsLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgcHJvcGVydHlBcnIsIHN5bWJvbEFycl1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ09WRVInKTtcbiAgICAgICAgICAvLyBbdmFsLCBvYmplY3RWYWwsIG9iamVjdFZhbCwgcHJvcGVydHlBcnIsIHN5bWJvbEFycl1cbiAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0FQUEVORCcpO1xuICAgICAgICB9O1xuICAgICAgICBhZGRTdHJpbmdQcm9wID0gKCkgPT4ge1xuICAgICAgICAgIC8vIFszLCB2YWwsIG9iamVjdFZhbCwgb2JqZWN0VmFsLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICAgIHNiLmVtaXRQdXNoSW50KHJlc3RFbGVtZW50LCAzKTtcbiAgICAgICAgICAvLyBbcHJvcGVydHlBcnIsIHZhbCwgb2JqZWN0VmFsLCBvYmplY3RWYWwsIHByb3BlcnR5QXJyLCBzeW1ib2xBcnJdXG4gICAgICAgICAgc2IuZW1pdE9wKHJlc3RFbGVtZW50LCAnUElDSycpO1xuICAgICAgICAgIC8vIFt2YWwsIHByb3BlcnR5QXJyLCB2YWwsIG9iamVjdFZhbCwgb2JqZWN0VmFsLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnT1ZFUicpO1xuICAgICAgICAgIC8vIFt2YWwsIG9iamVjdFZhbCwgb2JqZWN0VmFsLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICAgIHNiLmVtaXRPcChub2RlLCAnQVBQRU5EJyk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZU5vZGUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZU5vZGUoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IHRzVXRpbHMubm9kZS5nZXRQcm9wZXJ0eU5hbWVOb2RlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IHRzVXRpbHMuaW5pdGlhbGl6ZXIuZ2V0SW5pdGlhbGl6ZXIoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKG5hbWVOb2RlKTtcblxuICAgICAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5hbWVOb2RlKSkge1xuICAgICAgICAgIHNiLnNjb3BlLmFkZCh0c1V0aWxzLm5vZGUuZ2V0VGV4dChuYW1lTm9kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gW29iamVjdFZhbCwgb2JqZWN0VmFsXVxuICAgICAgICBzYi5lbWl0T3AoZWxlbWVudCwgJ0RVUCcpO1xuICAgICAgICBpZiAocHJvcGVydHlOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBbc3RyaW5nLCBvYmplY3RWYWwsIG9iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0UHVzaFN0cmluZyhlbGVtZW50LCB0c1V0aWxzLm5vZGUuZ2V0TmFtZU9yVGhyb3coZWxlbWVudCkpO1xuICAgICAgICAgIGFkZFN0cmluZ1Byb3AoKTtcbiAgICAgICAgICAvLyBbdmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihlbGVtZW50LCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuZ2V0UHJvcGVydHlPYmplY3RQcm9wZXJ0eSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNJZGVudGlmaWVyKHByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAvLyBbc3RyaW5nLCBvYmplY3RWYWwsIG9iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0UHVzaFN0cmluZyhlbGVtZW50LCB0c1V0aWxzLm5vZGUuZ2V0VGV4dChwcm9wZXJ0eU5hbWUpKTtcbiAgICAgICAgICBhZGRTdHJpbmdQcm9wKCk7XG4gICAgICAgICAgLy8gW3ZhbCwgb2JqZWN0VmFsXVxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIoZWxlbWVudCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmdldFByb3BlcnR5T2JqZWN0UHJvcGVydHkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzQ29tcHV0ZWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkge1xuICAgICAgICAgIGNvbnN0IGV4cHIgPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbihwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZVR5cGUgPSBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUoZXhwcik7XG5cbiAgICAgICAgICAvLyBbcHJvcFZhbCwgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgc2IudmlzaXQoZXhwciwgaW5uZXJPcHRpb25zKTtcblxuICAgICAgICAgIGNvbnN0IGhhbmRsZVN5bWJvbCA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFtzdHJpbmcsIG9iamVjdFZhbCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihlbGVtZW50LCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwU3ltYm9sKTtcbiAgICAgICAgICAgIGFkZFN5bWJvbFByb3AoKTtcbiAgICAgICAgICAgIC8vIFt2YWwsIG9iamVjdFZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoZWxlbWVudCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmdldFN5bWJvbE9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgaGFuZGxlU3RyaW5nQmFzZSA9IChpbm5lcklubmVyT3B0aW9uczogVmlzaXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBhZGRTdHJpbmdQcm9wKCk7XG4gICAgICAgICAgICAvLyBbdmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKGVsZW1lbnQsIGlubmVySW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmdldFByb3BlcnR5T2JqZWN0UHJvcGVydHkpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBoYW5kbGVTdHJpbmcgPSAoaW5uZXJJbm5lck9wdGlvbnM6IFZpc2l0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgLy8gW3N0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVySW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFN0cmluZyk7XG4gICAgICAgICAgICBoYW5kbGVTdHJpbmdCYXNlKGlubmVySW5uZXJPcHRpb25zKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgaGFuZGxlTnVtYmVyID0gKGlubmVySW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIC8vIFtzdHJpbmcsIG9iamVjdFZhbCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lcklubmVyT3B0aW9ucywgc2IuaGVscGVycy50b1N0cmluZyh7IHR5cGU6IHByb3BlcnR5TmFtZVR5cGUgfSkpO1xuICAgICAgICAgICAgaGFuZGxlU3RyaW5nQmFzZShpbm5lcklubmVyT3B0aW9ucyk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgc2IuaGVscGVycy5mb3JCdWlsdGluVHlwZSh7XG4gICAgICAgICAgICAgIHR5cGU6IHByb3BlcnR5TmFtZVR5cGUsXG4gICAgICAgICAgICAgIGFycmF5OiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgICBhcnJheVN0b3JhZ2U6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGJvb2xlYW46IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGJ1ZmZlcjogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgbnVsbDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgbnVtYmVyOiBoYW5kbGVOdW1iZXIsXG4gICAgICAgICAgICAgIG9iamVjdDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgc3RyaW5nOiBoYW5kbGVTdHJpbmcsXG4gICAgICAgICAgICAgIHN5bWJvbDogaGFuZGxlU3ltYm9sLFxuICAgICAgICAgICAgICB1bmRlZmluZWQ6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIG1hcDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgbWFwU3RvcmFnZTogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgc2V0OiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgICBzZXRTdG9yYWdlOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgICBlcnJvcjogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgZm9yd2FyZFZhbHVlOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgICBpdGVyYXRvclJlc3VsdDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgaXRlcmFibGU6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGl0ZXJhYmxlSXRlcmF0b3I6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgICBvdXRwdXQ6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZTogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgaW5wdXQ6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGFjY291bnQ6IHRocm93SW5uZXJUeXBlRXJyb3IsXG4gICAgICAgICAgICAgIGFzc2V0OiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgICBjb250cmFjdDogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgICAgaGVhZGVyOiB0aHJvd0lubmVyVHlwZUVycm9yLFxuICAgICAgICAgICAgICBibG9jazogdGhyb3dJbm5lclR5cGVFcnJvcixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gW3N0cmluZywgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcoXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICA/IHRzVXRpbHMubGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUocHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICA6IGAke3RzVXRpbHMubGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUocHJvcGVydHlOYW1lKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYWRkU3RyaW5nUHJvcCgpO1xuICAgICAgICAgIC8vIFt2YWwsIG9iamVjdFZhbF1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKGVsZW1lbnQsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5nZXRQcm9wZXJ0eU9iamVjdFByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbml0aWFsaXplciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBpbm5lck9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbCwgdmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEVVAnKTtcbiAgICAgICAgICAgICAgICAvLyBbYm9vbGVhbiwgdmFsLCBvYmplY3RWYWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuaXNVbmRlZmluZWQpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3aGVuVHJ1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFtvYmplY3RWYWxdXG4gICAgICAgICAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gICAgICAgICAgICAgICAgLy8gW3ZhbCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgICAgIHNiLnZpc2l0KGluaXRpYWxpemVyLCBpbm5lck9wdGlvbnMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobmFtZU5vZGUpKSB7XG4gICAgICAgICAgLy8gW29iamVjdFZhbF1cbiAgICAgICAgICBzYi5zY29wZS5zZXQoc2IsIGVsZW1lbnQsIGlubmVyT3B0aW9ucywgdHNVdGlscy5ub2RlLmdldFRleHQobmFtZU5vZGUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc0FycmF5QmluZGluZ1BhdHRlcm4obmFtZU5vZGUpKSB7XG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihuYW1lTm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmFycmF5QmluZGluZyh7IHR5cGU6IGVsZW1lbnRUeXBlIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYi5lbWl0SGVscGVyKG5hbWVOb2RlLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMub2JqZWN0QmluZGluZyh7IHR5cGU6IGVsZW1lbnRUeXBlIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN0RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFtdXG4gICAgICAgIHNiLmVtaXRPcChub2RlLCAnRFJPUCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRzVXRpbHMubm9kZS5nZXROYW1lT3JUaHJvdyhyZXN0RWxlbWVudCk7XG4gICAgICAgIHNiLnNjb3BlLmFkZChuYW1lKTtcblxuICAgICAgICAvLyBbaW9iaiwgb2JqZWN0VmFsLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ05FV01BUCcpO1xuICAgICAgICAvLyBbb2JqZWN0VmFsLCBpb2JqLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgLy8gW29iamVjdFZhbCwgb2JqZWN0VmFsLCBpb2JqLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0RVUCcpO1xuICAgICAgICAvLyBbc29iaiwgb2JqZWN0VmFsLCBpb2JqLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5nZXRTeW1ib2xPYmplY3QpO1xuICAgICAgICAvLyBbb2JqZWN0VmFsLCBzb2JqLCBpb2JqLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ1NXQVAnKTtcbiAgICAgICAgLy8gW3BvYmosIHNvYmosIGlvYmosIHByb3BlcnR5QXJyLCBzeW1ib2xBcnJdXG4gICAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmdldFByb3BlcnR5T2JqZWN0KTtcbiAgICAgICAgLy8gWzMsIHBvYmosIHNvYmosIGlvYmosIHByb3BlcnR5QXJyLCBzeW1ib2xBcnJdXG4gICAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIDMpO1xuICAgICAgICAvLyBbb2JqLCBwcm9wZXJ0eUFyciwgc3ltYm9sQXJyXVxuICAgICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5wYWNrT2JqZWN0KTtcbiAgICAgICAgLy8gWzMsIG9iamVjdFZhbCwgcHJvcGVydHlBcnIsIHN5bWJvbEFycl1cbiAgICAgICAgc2IuZW1pdFB1c2hJbnQobm9kZSwgMyk7XG4gICAgICAgIC8vIFtvYmplY3RWYWwsIHByb3BlcnR5QXJyLCBzeW1ib2xBcnIsIG9iamVjdFZhbF1cbiAgICAgICAgc2IuZW1pdE9wKG5vZGUsICdYVFVDSycpO1xuICAgICAgICAvLyBbc3ltYm9sQXJyLCBvYmplY3RWYWwsIHByb3BlcnR5QXJyLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRPcChyZXN0RWxlbWVudCwgJ1JPVCcpO1xuICAgICAgICAvLyBbcHJvcGVydHlBcnIsIHN5bWJvbEFyciwgb2JqZWN0VmFsLCBvYmplY3RWYWxdXG4gICAgICAgIHNiLmVtaXRPcChyZXN0RWxlbWVudCwgJ1JPVCcpO1xuICAgICAgICAvLyBbb2JqZWN0VmFsXVxuICAgICAgICBzYi5lbWl0SGVscGVyKHJlc3RFbGVtZW50LCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMub21pdE9iamVjdFByb3BlcnRpZXMpO1xuICAgICAgICAvLyBbXVxuICAgICAgICBzYi5zY29wZS5zZXQoc2IsIHJlc3RFbGVtZW50LCBpbm5lck9wdGlvbnMsIG5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIGlmICh0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJ1aWx0aW5JbnRlcmZhY2UgPSBzYi5jb250ZXh0LmJ1aWx0aW5zLmdldFZhbHVlSW50ZXJmYWNlKHRoaXMudmFsdWUpO1xuICAgICAgaWYgKGJ1aWx0aW5JbnRlcmZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYi52aXNpdCh0aGlzLnZhbHVlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZVByb2Nlc3NCdWlsdGluKGJ1aWx0aW5JbnRlcmZhY2UsIHRydWUpKG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgc2IuZW1pdEhlbHBlcihcbiAgICAgIG5vZGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgc2IuaGVscGVycy5mb3JCdWlsdGluVHlwZSh7XG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAga25vd25UeXBlOiB0aGlzLmtub3duVHlwZSxcbiAgICAgICAgYXJyYXk6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBcnJheScpLFxuICAgICAgICBhcnJheVN0b3JhZ2U6IGNyZWF0ZVByb2Nlc3NCdWlsdGluKCdBcnJheVN0b3JhZ2UnK