UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

258 lines (213 loc) 23.5 kB
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 = false) { let { tagName, namespaceURI } = element; let attribute = { element, name: attr, namespace }; if (DEBUG && attr === 'style' && !isTrusting) { return new DebugStyleAttributeManager(attribute); } if (namespaceURI === "http://www.w3.org/2000/svg" /* SVG */ ) { return buildDynamicAttribute(tagName, attr, attribute); } let { type, normalized } = normalizeProperty(element, attr); 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 class DynamicAttribute { constructor(attribute) { this.attribute = attribute; } } export class SimpleDynamicAttribute extends DynamicAttribute { set(dom, value, _env) { let normalizedValue = normalizeValue(value); if (normalizedValue !== null) { let { name, namespace } = this.attribute; dom.__setAttribute(name, normalizedValue, namespace); } } update(value, _env) { let normalizedValue = normalizeValue(value); let { element, name } = this.attribute; if (normalizedValue === null) { element.removeAttribute(name); } else { element.setAttribute(name, normalizedValue); } } } export class DefaultDynamicProperty extends DynamicAttribute { constructor(normalizedName, attribute) { super(attribute); this.normalizedName = normalizedName; } set(dom, value, _env) { if (value !== null && value !== undefined) { this.value = value; dom.__setProperty(this.normalizedName, value); } } update(value, _env) { let { element } = this.attribute; if (this.value !== value) { element[this.normalizedName] = this.value = value; if (value === null || value === undefined) { this.removeAttribute(); } } } removeAttribute() { // TODO this sucks but to preserve properties first and to meet current // semantics we must do this. let { element, namespace } = this.attribute; if (namespace) { element.removeAttributeNS(namespace, this.normalizedName); } else { element.removeAttribute(this.normalizedName); } } } export class SafeDynamicProperty extends DefaultDynamicProperty { set(dom, value, env) { let { element, name } = this.attribute; let sanitized = sanitizeAttributeValue(element, name, value); super.set(dom, sanitized, env); } update(value, env) { let { element, name } = this.attribute; let sanitized = sanitizeAttributeValue(element, name, value); super.update(sanitized, env); } } export class SafeDynamicAttribute extends SimpleDynamicAttribute { set(dom, value, env) { let { element, name } = this.attribute; let sanitized = sanitizeAttributeValue(element, name, value); super.set(dom, sanitized, env); } update(value, env) { let { element, name } = this.attribute; let sanitized = sanitizeAttributeValue(element, name, value); super.update(sanitized, env); } } export class InputValueDynamicAttribute extends DefaultDynamicProperty { set(dom, value) { dom.__setProperty('value', normalizeStringValue(value)); } update(value) { let input = this.attribute.element; let currentValue = input.value; let normalizedValue = normalizeStringValue(value); if (currentValue !== normalizedValue) { input.value = normalizedValue; } } } export class OptionSelectedDynamicAttribute extends DefaultDynamicProperty { set(dom, value) { if (value !== null && value !== undefined && value !== false) { dom.__setProperty('selected', true); } } update(value) { let option = this.attribute.element; if (value) { option.selected = true; } else { option.selected = false; } } } 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); } let DebugStyleAttributeManager; if (DEBUG) { DebugStyleAttributeManager = class extends SimpleDynamicAttribute { set(dom, value, env) { warnIfStyleNotTrusted(value); super.set(dom, value, env); } update(value, env) { warnIfStyleNotTrusted(value); super.update(value, env); } }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2F0dHJpYnV0ZXMvZHluYW1pYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxTQUFTLHFCQUFULFFBQXNDLHlCQUF0QztBQUVBLFNBQVMsb0JBQVQsUUFBcUMscUJBQXJDO0FBQ0EsU0FBUyxpQkFBVCxRQUFrQyxpQkFBbEM7QUFDQSxTQUFTLG9CQUFULEVBQStCLHNCQUEvQixRQUE2RCw0QkFBN0Q7QUFDQSxTQUFTLEtBQVQsUUFBc0IsY0FBdEI7QUFHQSxPQUFNLFNBQVUsZ0JBQVYsQ0FDSixPQURJLEVBRUosSUFGSSxFQUdKLFNBSEksRUFJSixVQUFVLEdBQUcsS0FKVCxFQUljO0FBRWxCLE1BQUk7QUFBRSxJQUFBLE9BQUY7QUFBVyxJQUFBO0FBQVgsTUFBNEIsT0FBaEM7QUFDQSxNQUFJLFNBQVMsR0FBRztBQUFFLElBQUEsT0FBRjtBQUFXLElBQUEsSUFBSSxFQUFFLElBQWpCO0FBQXVCLElBQUE7QUFBdkIsR0FBaEI7O0FBRUEsTUFBSSxLQUFLLElBQUksSUFBSSxLQUFLLE9BQWxCLElBQTZCLENBQUMsVUFBbEMsRUFBOEM7QUFDNUMsV0FBTyxJQUFJLDBCQUFKLENBQStCLFNBQS9CLENBQVA7QUFDRDs7QUFFRCxNQUFJLFlBQVksS0FBQTtBQUFBO0FBQWhCLElBQW9DO0FBQ2xDLGFBQU8scUJBQXFCLENBQUMsT0FBRCxFQUFVLElBQVYsRUFBZ0IsU0FBaEIsQ0FBNUI7QUFDRDs7QUFFRCxNQUFJO0FBQUUsSUFBQSxJQUFGO0FBQVEsSUFBQTtBQUFSLE1BQXVCLGlCQUFpQixDQUFDLE9BQUQsRUFBVSxJQUFWLENBQTVDOztBQUVBLE1BQUksSUFBSSxLQUFLLE1BQWIsRUFBcUI7QUFDbkIsV0FBTyxxQkFBcUIsQ0FBQyxPQUFELEVBQVUsVUFBVixFQUFzQixTQUF0QixDQUE1QjtBQUNELEdBRkQsTUFFTztBQUNMLFdBQU8sb0JBQW9CLENBQUMs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QWlCLFVBQXJCLEVBQWlDO0FBQy9CLFdBQU8sSUFBUDtBQUNEOztBQUVELFNBQU8sTUFBTSxDQUFDLEtBQUQsQ0FBYjtBQUNEOztBQUVELElBQUksMEJBQUo7O0FBSUEsSUFBSSxLQUFKLEVBQVc7QUFDVCxFQUFBLDBCQUEwQixHQUFHLGNBQWMsc0JBQWQsQ0FBb0M7QUFDL0QsSUFBQSxHQUFHLENBQUMsR0FBRCxFQUFzQixLQUF0QixFQUFzQyxHQUF0QyxFQUFzRDtBQUN2RCxNQUFBLHFCQUFxQixDQUFDLEtBQUQsQ0FBckI7QUFFQSxZQUFNLEdBQU4sQ0FBVSxHQUFWLEVBQWUsS0FBZixFQUFzQixHQUF0QjtBQUNEOztBQUNELElBQUEsTUFBTSxDQUFDLEtBQUQsRUFBaUIsR0FBakIsRUFBaUM7QUFDckMsTUFBQSxxQkFBcUIsQ0FBQyxLQUFELENBQXJCO0FBRUEsWUFBTSxNQUFOLENBQWEsS0FBYixFQUFvQixHQUFwQjtBQUNEOztBQVY4RCxHQUFqRTtBQVlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGljdCxcbiAgRW52aXJvbm1lbnQsXG4gIE9wdGlvbixcbiAgRWxlbWVudEJ1aWxkZXIsXG4gIEF0dHJpYnV0ZU9wZXJhdGlvbixcbiAgQXR0cmlidXRlQ3Vyc29yLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHdhcm5JZlN0eWxlTm90VHJ1c3RlZCB9IGZyb20gJ0BnbGltbWVyL2dsb2JhbC1jb250ZXh0JztcbmltcG9ydCB7IEF0dHJOYW1lc3BhY2UsIE5hbWVzcGFjZSwgU2ltcGxlRWxlbWVudCB9IGZyb20gJ0BzaW1wbGUtZG9tL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBub3JtYWxpemVTdHJpbmdWYWx1ZSB9IGZyb20gJy4uLy4uL2RvbS9ub3JtYWxpemUnO1xuaW1wb3J0IHsgbm9ybWFsaXplUHJvcGVydHkgfSBmcm9tICcuLi8uLi9kb20vcHJvcHMnO1xuaW1wb3J0IHsgcmVxdWlyZXNTYW5pdGl6YXRpb24sIHNhbml0aXplQXR0cmlidXRlVmFsdWUgfSBmcm9tICcuLi8uLi9kb20vc2FuaXRpemVkLXZhbHVlcyc7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBjYXN0VG9Ccm93c2VyIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkeW5hbWljQXR0cmlidXRlKFxuICBlbGVtZW50OiBTaW1wbGVFbGVtZW50LFxuICBhdHRyOiBzdHJpbmcsXG4gIG5hbWVzcGFjZTogT3B0aW9uPEF0dHJOYW1lc3BhY2U+LFxuICBpc1RydXN0aW5nID0gZmFsc2Vcbik6IER5bmFtaWNBdHRyaWJ1dGUge1xuICBsZXQgeyB0YWdOYW1lLCBuYW1lc3BhY2VVUkkgfSA9IGVsZW1lbnQ7XG4gIGxldCBhdHRyaWJ1dGUgPSB7IGVsZW1lbnQsIG5hbWU6IGF0dHIsIG5hbWVzcGFjZSB9O1xuXG4gIGlmIChERUJVRyAmJiBhdHRyID09PSAnc3R5bGUnICYmICFpc1RydXN0aW5nKSB7XG4gICAgcmV0dXJuIG5ldyBEZWJ1Z1N0eWxlQXR0cmlidXRlTWFuYWdlcihhdHRyaWJ1dGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gTmFtZXNwYWNlLlNWRykge1xuICAgIHJldHVybiBidWlsZER5bmFtaWNBdHRyaWJ1dGUodGFnTmFtZSwgYXR0ciwgYXR0cmlidXRlKTtcbiAgfVxuXG4gIGxldCB7IHR5cGUsIG5vcm1hbGl6ZWQgfSA9IG5vcm1hbGl6ZVByb3BlcnR5KGVsZW1lbnQsIGF0dHIpO1xuXG4gIGlmICh0eXBlID09PSAnYXR0cicpIHtcbiAgICByZXR1cm4gYnVpbGREeW5hbWljQXR0cmlidXRlKHRhZ05hbWUsIG5vcm1hbGl6ZWQsIGF0dHJpYnV0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1aWxkRHluYW1pY1Byb3BlcnR5KHRhZ05hbWUsIG5vcm1hbGl6ZWQsIGF0dHJpYnV0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGREeW5hbWljQXR0cmlidXRlKFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgYXR0cmlidXRlOiBBdHRyaWJ1dGVDdXJzb3Jcbik6IER5bmFtaWNBdHRyaWJ1dGUge1xuICBpZiAocmVxdWlyZXNTYW5pdGl6YXRpb24odGFnTmFtZSwgbmFtZSkpIHtcbiAgICByZXR1cm4gbmV3IFNhZmVEeW5hbWljQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBTaW1wbGVEeW5hbWljQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGREeW5hbWljUHJvcGVydHkoXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBhdHRyaWJ1dGU6IEF0dHJpYnV0ZUN1cnNvclxuKTogRHluYW1pY0F0dHJpYnV0ZSB7XG4gIGlmIChyZXF1aXJlc1Nhbml0aXphdGlvbih0YWdOYW1lLCBuYW1lKSkge1xuICAgIHJldHVybiBuZXcgU2FmZUR5bmFtaWNQcm9wZXJ0eShuYW1lLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgaWYgKGlzVXNlcklucHV0VmFsdWUodGFnTmFtZSwgbmFtZSkpIHtcbiAgICByZXR1cm4gbmV3IElucHV0VmFsdWVEeW5hbWljQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICBpZiAoaXNPcHRpb25TZWxlY3RlZCh0YWdOYW1lLCBuYW1lKSkge1xuICAgIHJldHVybiBuZXcgT3B0aW9uU2VsZWN0ZWREeW5hbWljQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IERlZmF1bHREeW5hbWljUHJvcGVydHkobmFtZSwgYXR0cmlidXRlKTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIER5bmFtaWNBdHRyaWJ1dGUgaW1wbGVtZW50cyBBdHRyaWJ1dGVPcGVyYXRpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXR0cmlidXRlOiBBdHRyaWJ1dGVDdXJzb3IpIHt9XG5cbiAgYWJzdHJhY3Qgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duLCBlbnY6IEVudmlyb25tZW50KTogdm9pZDtcbiAgYWJzdHJhY3QgdXBkYXRlKHZhbHVlOiB1bmtub3duLCBlbnY6IEVudmlyb25tZW50KTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbXBsZUR5bmFtaWNBdHRyaWJ1dGUgZXh0ZW5kcyBEeW5hbWljQXR0cmlidXRlIHtcbiAgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duLCBfZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICBpZiAobm9ybWFsaXplZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBsZXQgeyBuYW1lLCBuYW1lc3BhY2UgfSA9IHRoaXMuYXR0cmlidXRlO1xuICAgICAgZG9tLl9fc2V0QXR0cmlidXRlKG5hbWUsIG5vcm1hbGl6ZWRWYWx1ZSwgbmFtZXNwYWNlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUodmFsdWU6IHVua25vd24sIF9lbnY6IEVudmlyb25tZW50KTogdm9pZCB7XG4gICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICBsZXQgeyBlbGVtZW50LCBuYW1lIH0gPSB0aGlzLmF0dHJpYnV0ZTtcblxuICAgIGlmIChub3JtYWxpemVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdER5bmFtaWNQcm9wZXJ0eSBleHRlbmRzIER5bmFtaWNBdHRyaWJ1dGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vcm1hbGl6ZWROYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZTogQXR0cmlidXRlQ3Vyc29yKSB7XG4gICAgc3VwZXIoYXR0cmlidXRlKTtcbiAgfVxuXG4gIHZhbHVlOiB1bmtub3duO1xuICBzZXQoZG9tOiBFbGVtZW50QnVpbGRlciwgdmFsdWU6IHVua25vd24sIF9lbnY6IEVudmlyb25tZW50KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGRvbS5fX3NldFByb3BlcnR5KHRoaXMubm9ybWFsaXplZE5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUodmFsdWU6IHVua25vd24sIF9lbnY6IEVudmlyb25tZW50KTogdm9pZCB7XG4gICAgbGV0IHsgZWxlbWVudCB9ID0gdGhpcy5hdHRyaWJ1dGU7XG5cbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIChlbGVtZW50IGFzIGFueSlbdGhpcy5ub3JtYWxpemVkTmFtZV0gPSB0aGlzLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbW92ZUF0dHJpYnV0ZSgpIHtcbiAgICAvLyBUT0RPIHRoaXMgc3Vja3MgYnV0IHRvIHByZXNlcnZlIHByb3BlcnRpZXMgZmlyc3QgYW5kIHRvIG1lZXQgY3VycmVudFxuICAgIC8vIHNlbWFudGljcyB3ZSBtdXN0IGRvIHRoaXMuXG4gICAgbGV0IHsgZWxlbWVudCwgbmFtZXNwYWNlIH0gPSB0aGlzLmF0dHJpYnV0ZTtcblxuICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTlMobmFtZXNwYWNlLCB0aGlzLm5vcm1hbGl6ZWROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUodGhpcy5ub3JtYWxpemVkTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTYWZlRHluYW1pY1Byb3BlcnR5IGV4dGVuZHMgRGVmYXVsdER5bmFtaWNQcm9wZXJ0eSB7XG4gIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCB7IGVsZW1lbnQsIG5hbWUgfSA9IHRoaXMuYXR0cmlidXRlO1xuICAgIGxldCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICBzdXBlci5zZXQoZG9tLCBzYW5pdGl6ZWQsIGVudik7XG4gIH1cblxuICB1cGRhdGUodmFsdWU6IHVua25vd24sIGVudjogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICBsZXQgeyBlbGVtZW50LCBuYW1lIH0gPSB0aGlzLmF0dHJpYnV0ZTtcbiAgICBsZXQgc2FuaXRpemVkID0gc2FuaXRpemVBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgc3VwZXIudXBkYXRlKHNhbml0aXplZCwgZW52KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZUR5bmFtaWNBdHRyaWJ1dGUgZXh0ZW5kcyBTaW1wbGVEeW5hbWljQXR0cmlidXRlIHtcbiAgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duLCBlbnY6IEVudmlyb25tZW50KTogdm9pZCB7XG4gICAgbGV0IHsgZWxlbWVudCwgbmFtZSB9ID0gdGhpcy5hdHRyaWJ1dGU7XG4gICAgbGV0IHNhbml0aXplZCA9IHNhbml0aXplQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHN1cGVyLnNldChkb20sIHNhbml0aXplZCwgZW52KTtcbiAgfVxuXG4gIHVwZGF0ZSh2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgIGxldCB7IGVsZW1lbnQsIG5hbWUgfSA9IHRoaXMuYXR0cmlidXRlO1xuICAgIGxldCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICBzdXBlci51cGRhdGUoc2FuaXRpemVkLCBlbnYpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnB1dFZhbHVlRHluYW1pY0F0dHJpYnV0ZSBleHRlbmRzIERlZmF1bHREeW5hbWljUHJvcGVydHkge1xuICBzZXQoZG9tOiBFbGVtZW50QnVpbGRlciwgdmFsdWU6IHVua25vd24pIHtcbiAgICBkb20uX19zZXRQcm9wZXJ0eSgndmFsdWUnLCBub3JtYWxpemVTdHJpbmdWYWx1ZSh2YWx1ZSkpO1xuICB9XG5cbiAgdXBkYXRlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgbGV0IGlucHV0ID0gY2FzdFRvQnJvd3Nlcih0aGlzLmF0dHJpYnV0ZS5lbGVtZW50LCBbJ2lucHV0JywgJ3RleHRhcmVhJ10pO1xuICAgIGxldCBjdXJyZW50VmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICBsZXQgbm9ybWFsaXplZFZhbHVlID0gbm9ybWFsaXplU3RyaW5nVmFsdWUodmFsdWUpO1xuICAgIGlmIChjdXJyZW50VmFsdWUgIT09IG5vcm1hbGl6ZWRWYWx1ZSkge1xuICAgICAgaW5wdXQudmFsdWUgPSBub3JtYWxpemVkVmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcHRpb25TZWxlY3RlZER5bmFtaWNBdHRyaWJ1dGUgZXh0ZW5kcyBEZWZhdWx0RHluYW1pY1Byb3BlcnR5IHtcbiAgc2V0KGRvbTogRWxlbWVudEJ1aWxkZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICBkb20uX19zZXRQcm9wZXJ0eSgnc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgb3B0aW9uID0gY2FzdFRvQnJvd3Nlcih0aGlzLmF0dHJpYnV0ZS5lbGVtZW50LCAnb3B0aW9uJyk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc09wdGlvblNlbGVjdGVkKHRhZ05hbWU6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHRhZ05hbWUgPT09ICdPUFRJT04nICYmIGF0dHJpYnV0ZSA9PT0gJ3NlbGVjdGVkJztcbn1cblxuZnVuY3Rpb24gaXNVc2VySW5wdXRWYWx1ZSh0YWdOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gIHJldHVybiAodGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09PSAnVEVYVEFSRUEnKSAmJiBhdHRyaWJ1dGUgPT09ICd2YWx1ZSc7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogT3B0aW9uPHN0cmluZz4ge1xuICBpZiAoXG4gICAgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgdmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgdHlwZW9mICh2YWx1ZSBhcyBEaWN0KS50b1N0cmluZyA9PT0gJ3VuZGVmaW5lZCdcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIC8vIG9uY2xpY2sgZnVuY3Rpb24gZXRjIGluIFNTUlxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxubGV0IERlYnVnU3R5bGVBdHRyaWJ1dGVNYW5hZ2VyOiB7XG4gIG5ldyAoYXR0cmlidXRlOiBBdHRyaWJ1dGVDdXJzb3IpOiBBdHRyaWJ1dGVPcGVyYXRpb247XG59O1xuXG5pZiAoREVCVUcpIHtcbiAgRGVidWdTdHlsZUF0dHJpYnV0ZU1hbmFnZXIgPSBjbGFzcyBleHRlbmRzIFNpbXBsZUR5bmFtaWNBdHRyaWJ1dGUge1xuICAgIHNldChkb206IEVsZW1lbnRCdWlsZGVyLCB2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgICAgd2FybklmU3R5bGVOb3RUcnVzdGVkKHZhbHVlKTtcblxuICAgICAgc3VwZXIuc2V0KGRvbSwgdmFsdWUsIGVudik7XG4gICAgfVxuICAgIHVwZGF0ZSh2YWx1ZTogdW5rbm93biwgZW52OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgICAgd2FybklmU3R5bGVOb3RUcnVzdGVkKHZhbHVlKTtcblxuICAgICAgc3VwZXIudXBkYXRlKHZhbHVlLCBlbnYpO1xuICAgIH1cbiAgfTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=