UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

317 lines (244 loc) 27.6 kB
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } import { warnIfStyleNotTrusted } from '@glimmer/global-context'; import { normalizeStringValue } from '../../dom/normalize'; import { normalizeProperty } from '../../dom/props'; import { requiresSanitization, sanitizeAttributeValue } from '../../dom/sanitized-values'; import { DEBUG } from '@glimmer/env'; export function dynamicAttribute(element, attr, namespace, isTrusting) { if (isTrusting === void 0) { isTrusting = false; } var tagName = element.tagName, namespaceURI = element.namespaceURI; var attribute = { element: element, name: attr, namespace: namespace }; if (DEBUG && attr === 'style' && !isTrusting) { return new DebugStyleAttributeManager(attribute); } if (namespaceURI === "http://www.w3.org/2000/svg" /* SVG */ ) { return buildDynamicAttribute(tagName, attr, attribute); } var _normalizeProperty = normalizeProperty(element, attr), type = _normalizeProperty.type, normalized = _normalizeProperty.normalized; if (type === 'attr') { return buildDynamicAttribute(tagName, normalized, attribute); } else { return buildDynamicProperty(tagName, normalized, attribute); } } function buildDynamicAttribute(tagName, name, attribute) { if (requiresSanitization(tagName, name)) { return new SafeDynamicAttribute(attribute); } else { return new SimpleDynamicAttribute(attribute); } } function buildDynamicProperty(tagName, name, attribute) { if (requiresSanitization(tagName, name)) { return new SafeDynamicProperty(name, attribute); } if (isUserInputValue(tagName, name)) { return new InputValueDynamicAttribute(name, attribute); } if (isOptionSelected(tagName, name)) { return new OptionSelectedDynamicAttribute(name, attribute); } return new DefaultDynamicProperty(name, attribute); } export var DynamicAttribute = function DynamicAttribute(attribute) { this.attribute = attribute; }; export var SimpleDynamicAttribute = /*#__PURE__*/function (_DynamicAttribute) { _inheritsLoose(SimpleDynamicAttribute, _DynamicAttribute); function SimpleDynamicAttribute() { return _DynamicAttribute.apply(this, arguments) || this; } var _proto = SimpleDynamicAttribute.prototype; _proto.set = function set(dom, value, _env) { var normalizedValue = normalizeValue(value); if (normalizedValue !== null) { var _this$attribute = this.attribute, name = _this$attribute.name, namespace = _this$attribute.namespace; dom.__setAttribute(name, normalizedValue, namespace); } }; _proto.update = function update(value, _env) { var normalizedValue = normalizeValue(value); var _this$attribute2 = this.attribute, element = _this$attribute2.element, name = _this$attribute2.name; if (normalizedValue === null) { element.removeAttribute(name); } else { element.setAttribute(name, normalizedValue); } }; return SimpleDynamicAttribute; }(DynamicAttribute); export var DefaultDynamicProperty = /*#__PURE__*/function (_DynamicAttribute2) { _inheritsLoose(DefaultDynamicProperty, _DynamicAttribute2); function DefaultDynamicProperty(normalizedName, attribute) { var _this; _this = _DynamicAttribute2.call(this, attribute) || this; _this.normalizedName = normalizedName; return _this; } var _proto2 = DefaultDynamicProperty.prototype; _proto2.set = function set(dom, value, _env) { if (value !== null && value !== undefined) { this.value = value; dom.__setProperty(this.normalizedName, value); } }; _proto2.update = function update(value, _env) { var element = this.attribute.element; if (this.value !== value) { element[this.normalizedName] = this.value = value; if (value === null || value === undefined) { this.removeAttribute(); } } }; _proto2.removeAttribute = function removeAttribute() { // TODO this sucks but to preserve properties first and to meet current // semantics we must do this. var _this$attribute3 = this.attribute, element = _this$attribute3.element, namespace = _this$attribute3.namespace; if (namespace) { element.removeAttributeNS(namespace, this.normalizedName); } else { element.removeAttribute(this.normalizedName); } }; return DefaultDynamicProperty; }(DynamicAttribute); export var SafeDynamicProperty = /*#__PURE__*/function (_DefaultDynamicProper) { _inheritsLoose(SafeDynamicProperty, _DefaultDynamicProper); function SafeDynamicProperty() { return _DefaultDynamicProper.apply(this, arguments) || this; } var _proto3 = SafeDynamicProperty.prototype; _proto3.set = function set(dom, value, env) { var _this$attribute4 = this.attribute, element = _this$attribute4.element, name = _this$attribute4.name; var sanitized = sanitizeAttributeValue(element, name, value); _DefaultDynamicProper.prototype.set.call(this, dom, sanitized, env); }; _proto3.update = function update(value, env) { var _this$attribute5 = this.attribute, element = _this$attribute5.element, name = _this$attribute5.name; var sanitized = sanitizeAttributeValue(element, name, value); _DefaultDynamicProper.prototype.update.call(this, sanitized, env); }; return SafeDynamicProperty; }(DefaultDynamicProperty); export var SafeDynamicAttribute = /*#__PURE__*/function (_SimpleDynamicAttribu) { _inheritsLoose(SafeDynamicAttribute, _SimpleDynamicAttribu); function SafeDynamicAttribute() { return _SimpleDynamicAttribu.apply(this, arguments) || this; } var _proto4 = SafeDynamicAttribute.prototype; _proto4.set = function set(dom, value, env) { var _this$attribute6 = this.attribute, element = _this$attribute6.element, name = _this$attribute6.name; var sanitized = sanitizeAttributeValue(element, name, value); _SimpleDynamicAttribu.prototype.set.call(this, dom, sanitized, env); }; _proto4.update = function update(value, env) { var _this$attribute7 = this.attribute, element = _this$attribute7.element, name = _this$attribute7.name; var sanitized = sanitizeAttributeValue(element, name, value); _SimpleDynamicAttribu.prototype.update.call(this, sanitized, env); }; return SafeDynamicAttribute; }(SimpleDynamicAttribute); export var InputValueDynamicAttribute = /*#__PURE__*/function (_DefaultDynamicProper2) { _inheritsLoose(InputValueDynamicAttribute, _DefaultDynamicProper2); function InputValueDynamicAttribute() { return _DefaultDynamicProper2.apply(this, arguments) || this; } var _proto5 = InputValueDynamicAttribute.prototype; _proto5.set = function set(dom, value) { dom.__setProperty('value', normalizeStringValue(value)); }; _proto5.update = function update(value) { var input = this.attribute.element; var currentValue = input.value; var normalizedValue = normalizeStringValue(value); if (currentValue !== normalizedValue) { input.value = normalizedValue; } }; return InputValueDynamicAttribute; }(DefaultDynamicProperty); export var OptionSelectedDynamicAttribute = /*#__PURE__*/function (_DefaultDynamicProper3) { _inheritsLoose(OptionSelectedDynamicAttribute, _DefaultDynamicProper3); function OptionSelectedDynamicAttribute() { return _DefaultDynamicProper3.apply(this, arguments) || this; } var _proto6 = OptionSelectedDynamicAttribute.prototype; _proto6.set = function set(dom, value) { if (value !== null && value !== undefined && value !== false) { dom.__setProperty('selected', true); } }; _proto6.update = function update(value) { var option = this.attribute.element; if (value) { option.selected = true; } else { option.selected = false; } }; return OptionSelectedDynamicAttribute; }(DefaultDynamicProperty); function isOptionSelected(tagName, attribute) { return tagName === 'OPTION' && attribute === 'selected'; } function isUserInputValue(tagName, attribute) { return (tagName === 'INPUT' || tagName === 'TEXTAREA') && attribute === 'value'; } function normalizeValue(value) { if (value === false || value === undefined || value === null || typeof value.toString === 'undefined') { return null; } if (value === true) { return ''; } // onclick function etc in SSR if (typeof value === 'function') { return null; } return String(value); } var DebugStyleAttributeManager; if (DEBUG) { DebugStyleAttributeManager = /*#__PURE__*/function (_SimpleDynamicAttribu2) { _inheritsLoose(DebugStyleAttributeManager, _SimpleDynamicAttribu2); function DebugStyleAttributeManager() { return _SimpleDynamicAttribu2.apply(this, arguments) || this; } var _proto7 = DebugStyleAttributeManager.prototype; _proto7.set = function set(dom, value, env) { warnIfStyleNotTrusted(value); _SimpleDynamicAttribu2.prototype.set.call(this, dom, value, env); }; _proto7.update = function update(value, env) { warnIfStyleNotTrusted(value); _SimpleDynamicAttribu2.prototype.update.call(this, value, env); }; return DebugStyleAttributeManager; }(SimpleDynamicAttribute); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2F0dHJpYnV0ZXMvZHluYW1pYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVFBLFNBQUEscUJBQUEsUUFBQSx5QkFBQTtBQUVBLFNBQUEsb0JBQUEsUUFBQSxxQkFBQTtBQUNBLFNBQUEsaUJBQUEsUUFBQSxpQkFBQTtBQUNBLFNBQUEsb0JBQUEsRUFBQSxzQkFBQSxRQUFBLDRCQUFBO0FBQ0EsU0FBQSxLQUFBLFFBQUEsY0FBQTtBQUdBLE9BQU0sU0FBQSxnQkFBQSxDQUFBLE9BQUEsRUFBQSxJQUFBLEVBQUEsU0FBQSxFQUlKLFVBSkksRUFJYztBQUFBLE1BQWxCLFVBQWtCO0FBQWxCLElBQUEsVUFBa0IsR0FKZCxLQUljO0FBQUE7O0FBQUEsTUFFZCxPQUZjLEdBRWxCLE9BRmtCLENBRWQsT0FGYztBQUFBLE1BRUgsWUFGRyxHQUVsQixPQUZrQixDQUVILFlBRkc7QUFHbEIsTUFBSSxTQUFTLEdBQUc7QUFBRSxJQUFBLE9BQUYsRUFBRSxPQUFGO0FBQVcsSUFBQSxJQUFJLEVBQWYsSUFBQTtBQUF1QixJQUFBLFNBQUEsRUFBQTtBQUF2QixHQUFoQjs7QUFFQSxNQUFJLEtBQUssSUFBSSxJQUFJLEtBQWIsT0FBQSxJQUE2QixDQUFqQyxVQUFBLEVBQThDO0FBQzVDLFdBQU8sSUFBQSwwQkFBQSxDQUFQLFNBQU8sQ0FBUDtBQUNEOztBQUVELE1BQUksWUFBWSxLQUFBO0FBQUE7QUFBaEIsSUFBb0M7QUFDbEMsYUFBTyxxQkFBcUIsQ0FBQSxPQUFBLEVBQUEsSUFBQSxFQUE1QixTQUE0QixDQUE1QjtBQUNEOztBQVhpQiwyQkFhUyxpQkFBaUIsQ0FBQSxPQUFBLEVBQTVDLElBQTRDLENBYjFCO0FBQUEsTUFhZCxJQWJjLHNCQWFkLElBYmM7QUFBQSxNQWFOLFVBYk0sc0JBYU4sVUFiTTs7QUFlbEIsTUFBSSxJQUFJLEtBQVIsTUFBQSxFQUFxQjtBQUNu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ZW50IjpbImltcG9ydCB7XG4gIERpY3QsXG4gIEVudmlyb25tZW50LFxuICBPcHRpb24sXG4gIEVsZW1lbnRCdWlsZGVyLFxuICBBdHRyaWJ1dGVPcGVyYXRpb24sXG4gIEF0dHJpYnV0ZUN1cnNvcixcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB3YXJuSWZTdHlsZU5vdFRydXN0ZWQgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQgeyBBdHRyTmFtZXNwYWNlLCBOYW1lc3BhY2UsIFNpbXBsZUVsZW1lbnQgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgbm9ybWFsaXplU3RyaW5nVmFsdWUgfSBmcm9tICcuLi8uLi9kb20vbm9ybWFsaXplJztcbmltcG9ydCB7IG5vcm1hbGl6ZVByb3BlcnR5IH0gZnJvbSAnLi4vLi4vZG9tL3Byb3BzJztcbmltcG9ydCB7IHJlcXVpcmVzU2FuaXRpemF0aW9uLCBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlIH0gZnJvbSAnLi4vLi4vZG9tL3Nhbml0aXplZC12YWx1ZXMnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHsgY2FzdFRvQnJvd3NlciB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pY0F0dHJpYnV0ZShcbiAgZWxlbWVudDogU2ltcGxlRWxlbWVudCxcbiAgYXR0cjogc3RyaW5nLFxuICBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPixcbiAgaXNUcnVzdGluZyA9IGZhbHNlXG4pOiBEeW5hbWljQXR0cmlidXRlIHtcbiAgbGV0IHsgdGFnTmFtZSwgbmFtZXNwYWNlVVJJIH0gPSBlbGVtZW50O1xuICBsZXQgYXR0cmlidXRlID0geyBlbGVtZW50LCBuYW1lOiBhdHRyLCBuYW1lc3BhY2UgfTtcblxuICBpZiAoREVCVUcgJiYgYXR0ciA9PT0gJ3N0eWxlJyAmJiAhaXNUcnVzdGluZykge1xuICAgIHJldHVybiBuZXcgRGVidWdTdHlsZUF0dHJpYnV0ZU1hbmFnZXIoYXR0cmlidXRlKTtcbiAgfVxuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IE5hbWVzcGFjZS5TVkcpIHtcbiAgICByZXR1cm4gYnVpbGREeW5hbWljQXR0cmlidXRlKHRhZ05hbWUsIGF0dHIsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICBsZXQgeyB0eXBlLCBub3JtYWxpemVkIH0gPSBub3JtYWxpemVQcm9wZXJ0eShlbGVtZW50LCBhdHRyKTtcblxuICBpZiAodHlwZSA9PT0gJ2F0dHInKSB7XG4gICAgcmV0dXJuIGJ1aWxkRHluYW1pY0F0dHJpYnV0ZSh0YWdOYW1lLCBub3JtYWxpemVkLCBhdHRyaWJ1dGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWlsZER5bmFtaWNQcm9wZXJ0eSh0YWdOYW1lLCBub3JtYWxpemVkLCBhdHRyaWJ1dGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRHluYW1pY0F0dHJpYnV0ZShcbiAgdGFnTmFtZTogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGF0dHJpYnV0ZTogQXR0cmlidXRlQ3Vyc29yXG4pOiBEeW5hbWljQXR0cmlidXRlIHtcbiAgaWYgKHJlcXVpcmVzU2FuaXRpemF0aW9uKHRhZ05hbWUsIG5hbWUpKSB7XG4gICAgcmV0dXJuIG5ldyBTYWZlRHluYW1pY0F0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgU2ltcGxlRHluYW1pY0F0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRHluYW1pY1Byb3BlcnR5KFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgYXR0cmlidXRlOiBBdHRyaWJ1dGVDdXJzb3Jcbik6IER5bmFtaWNBdHRyaWJ1dGUge1xuICBpZiAocmVxdWlyZXNTYW5pdGl6YXRpb24odGFnTmFtZSwgbmFtZSkpIHtcbiAgICByZXR1cm4gbmV3IFNhZmVEeW5hbWljUHJvcGVydHkobmFtZSwgYXR0cmlidXRlKTtcbiAgfVxuXG4gIGlmIChpc1VzZXJJbnB1dFZhbHVlKHRhZ05hbWUsIG5hbWUpKSB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dFZhbHVlRHluYW1pY0F0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgaWYgKGlzT3B0aW9uU2VsZWN0ZWQodGFnTmFtZSwgbmFtZSkpIHtcbiAgICByZXR1cm4gbmV3IE9wdGlvblNlbGVjdGVkRHluYW1pY0F0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEZWZhdWx0RHluYW1pY1Byb3BlcnR5KG5hbWUsIGF0dHJpYnV0ZSk7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeW5hbWljQXR0cmlidXRlIGltcGxlbWVudHMgQXR0cmlidXRlT3BlcmF0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIGF0dHJpYnV0ZTogQXR0cmlidXRlQ3Vyc29yKSB7fVxuXG4gIGFic3RyYWN0IHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQ7XG4gIGFic3RyYWN0IHVwZGF0ZSh2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVEeW5hbWljQXR0cmlidXRlIGV4dGVuZHMgRHluYW1pY0F0dHJpYnV0ZSB7XG4gIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgX2VudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICBsZXQgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHsgbmFtZSwgbmFtZXNwYWNlIH0gPSB0aGlzLmF0dHJpYnV0ZTtcbiAgICAgIGRvbS5fX3NldEF0dHJpYnV0ZShuYW1lLCBub3JtYWxpemVkVmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duLCBfZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgbGV0IHsgZWxlbWVudCwgbmFtZSB9ID0gdGhpcy5hdHRyaWJ1dGU7XG5cbiAgICBpZiAobm9ybWFsaXplZFZhbHVlID09PSBudWxsKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHREeW5hbWljUHJvcGVydHkgZXh0ZW5kcyBEeW5hbWljQXR0cmlidXRlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBub3JtYWxpemVkTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGU6IEF0dHJpYnV0ZUN1cnNvcikge1xuICAgIHN1cGVyKGF0dHJpYnV0ZSk7XG4gIH1cblxuICB2YWx1ZTogdW5rbm93bjtcbiAgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duLCBfZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBkb20uX19zZXRQcm9wZXJ0eSh0aGlzLm5vcm1hbGl6ZWROYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duLCBfZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCB7IGVsZW1lbnQgfSA9IHRoaXMuYXR0cmlidXRlO1xuXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAoZWxlbWVudCBhcyBhbnkpW3RoaXMubm9ybWFsaXplZE5hbWVdID0gdGhpcy52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVBdHRyaWJ1dGUoKSB7XG4gICAgLy8gVE9ETyB0aGlzIHN1Y2tzIGJ1dCB0byBwcmVzZXJ2ZSBwcm9wZXJ0aWVzIGZpcnN0IGFuZCB0byBtZWV0IGN1cnJlbnRcbiAgICAvLyBzZW1hbnRpY3Mgd2UgbXVzdCBkbyB0aGlzLlxuICAgIGxldCB7IGVsZW1lbnQsIG5hbWVzcGFjZSB9ID0gdGhpcy5hdHRyaWJ1dGU7XG5cbiAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgdGhpcy5ub3JtYWxpemVkTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMubm9ybWFsaXplZE5hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZUR5bmFtaWNQcm9wZXJ0eSBleHRlbmRzIERlZmF1bHREeW5hbWljUHJvcGVydHkge1xuICBzZXQoZG9tOiBFbGVtZW50QnVpbGRlciwgdmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICBsZXQgeyBlbGVtZW50LCBuYW1lIH0gPSB0aGlzLmF0dHJpYnV0ZTtcbiAgICBsZXQgc2FuaXRpemVkID0gc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgc3VwZXIuc2V0KGRvbSwgc2FuaXRpemVkLCBlbnYpO1xuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duLCBlbnY6IEVudmlyb25tZW50KTogdm9pZCB7XG4gICAgbGV0IHsgZWxlbWVudCwgbmFtZSB9ID0gdGhpcy5hdHRyaWJ1dGU7XG4gICAgbGV0IHNhbml0aXplZCA9IHNhbml0aXplQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHN1cGVyLnVwZGF0ZShzYW5pdGl6ZWQsIGVudik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhZmVEeW5hbWljQXR0cmlidXRlIGV4dGVuZHMgU2ltcGxlRHluYW1pY0F0dHJpYnV0ZSB7XG4gIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCB7IGVsZW1lbnQsIG5hbWUgfSA9IHRoaXMuYXR0cmlidXRlO1xuICAgIGxldCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICBzdXBlci5zZXQoZG9tLCBzYW5pdGl6ZWQsIGVudik7XG4gIH1cblxuICB1cGRhdGUodmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICBsZXQgeyBlbGVtZW50LCBuYW1lIH0gPSB0aGlzLmF0dHJpYnV0ZTtcbiAgICBsZXQgc2FuaXRpemVkID0gc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgc3VwZXIudXBkYXRlKHNhbml0aXplZCwgZW52KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5wdXRWYWx1ZUR5bmFtaWNBdHRyaWJ1dGUgZXh0ZW5kcyBEZWZhdWx0RHluYW1pY1Byb3BlcnR5IHtcbiAgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgZG9tLl9fc2V0UHJvcGVydHkoJ3ZhbHVlJywgbm9ybWFsaXplU3RyaW5nVmFsdWUodmFsdWUpKTtcbiAgfVxuXG4gIHVwZGF0ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGxldCBpbnB1dCA9IGNhc3RUb0Jyb3dzZXIodGhpcy5hdHRyaWJ1dGUuZWxlbWVudCwgWydpbnB1dCcsICd0ZXh0YXJlYSddKTtcbiAgICBsZXQgY3VycmVudFZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVN0cmluZ1ZhbHVlKHZhbHVlKTtcbiAgICBpZiAoY3VycmVudFZhbHVlICE9PSBub3JtYWxpemVkVmFsdWUpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gbm9ybWFsaXplZFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3B0aW9uU2VsZWN0ZWREeW5hbWljQXR0cmlidXRlIGV4dGVuZHMgRGVmYXVsdER5bmFtaWNQcm9wZXJ0eSB7XG4gIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgZG9tLl9fc2V0UHJvcGVydHkoJ3NlbGVjdGVkJywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgbGV0IG9wdGlvbiA9IGNhc3RUb0Jyb3dzZXIodGhpcy5hdHRyaWJ1dGUuZWxlbWVudCwgJ29wdGlvbicpO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBvcHRpb24uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb24uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPcHRpb25TZWxlY3RlZCh0YWdOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gIHJldHVybiB0YWdOYW1lID09PSAnT1BUSU9OJyAmJiBhdHRyaWJ1dGUgPT09ICdzZWxlY3RlZCc7XG59XG5cbmZ1bmN0aW9uIGlzVXNlcklucHV0VmFsdWUodGFnTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICByZXR1cm4gKHRhZ05hbWUgPT09ICdJTlBVVCcgfHwgdGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykgJiYgYXR0cmlidXRlID09PSAndmFsdWUnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IE9wdGlvbjxzdHJpbmc+IHtcbiAgaWYgKFxuICAgIHZhbHVlID09PSBmYWxzZSB8fFxuICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHR5cGVvZiAodmFsdWUgYXMgRGljdCkudG9TdHJpbmcgPT09ICd1bmRlZmluZWQnXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICAvLyBvbmNsaWNrIGZ1bmN0aW9uIGV0YyBpbiBTU1JcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5cbmxldCBEZWJ1Z1N0eWxlQXR0cmlidXRlTWFuYWdlcjoge1xuICBuZXcgKGF0dHJpYnV0ZTogQXR0cmlidXRlQ3Vyc29yKTogQXR0cmlidXRlT3BlcmF0aW9uO1xufTtcblxuaWYgKERFQlVHKSB7XG4gIERlYnVnU3R5bGVBdHRyaWJ1dGVNYW5hZ2VyID0gY2xhc3MgZXh0ZW5kcyBTaW1wbGVEeW5hbWljQXR0cmlidXRlIHtcbiAgICBzZXQoZG9tOiBFbGVtZW50QnVpbGRlciwgdmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICAgIHdhcm5JZlN0eWxlTm90VHJ1c3RlZCh2YWx1ZSk7XG5cbiAgICAgIHN1cGVyLnNldChkb20sIHZhbHVlLCBlbnYpO1xuICAgIH1cbiAgICB1cGRhdGUodmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICAgIHdhcm5JZlN0eWxlTm90VHJ1c3RlZCh2YWx1ZSk7XG5cbiAgICAgIHN1cGVyLnVwZGF0ZSh2YWx1ZSwgZW52KTtcbiAgICB9XG4gIH07XG59XG4iXSwic291cmNlUm9vdCI6IiJ9