UNPKG

@acrodata/watermark

Version:
185 lines 22.7 kB
import { attributeNameTag, createHost, decrypt, getContainer, getDataSetKey, getDrawPattern, getRandomId, getStyleStr, observeOptions, } from './utils'; export const defaultOptions = { gapX: 100, gapY: 100, offsetX: 0, offsetY: 0, width: 120, height: 60, opacity: 0.15, rotate: -24, fontSize: 16, fontWeight: '400', fontStyle: 'normal', fontVariant: 'normal', fontColor: '#000', fontFamily: 'sans-serif', textAlign: 'center', textBaseline: 'alphabetic', secure: true, blindFontSize: 16, blindOpacity: 0.005, repeat: 'multiply', zIndex: 9999, }; export class Watermark { /** 水印配置 */ options = {}; /** 水印挂载容器 */ container; /** 水印的宿主节点 */ watermarkHost; /** 水印节点 */ watermarkDom; /** 水印样式 */ style = { pointerEvents: 'none', position: 'absolute', inset: 0, }; watermarkTag = getRandomId('watermark'); shadowRoot; mutationObserver = null; constructor(options = {}) { this.options = Object.assign({}, defaultOptions, options); this._render(); } static decrypt = decrypt; update(options = {}) { this.options = { ...this.options, ...options, }; this._render(); } show() { if (this.watermarkDom) { this.style['display'] = 'block'; this.watermarkDom.setAttribute('style', getStyleStr(this.style)); } } hide() { if (this.watermarkDom) { this.style['display'] = 'none'; this.watermarkDom.setAttribute('style', getStyleStr(this.style)); } } destroy() { this.shadowRoot = undefined; if (this.watermarkHost) { this.watermarkHost.remove(); this.watermarkHost = undefined; } if (this.watermarkDom) { this.watermarkDom.remove(); this.watermarkDom = undefined; } this._destroyMutationObserver(); } _shouldRerender = (mutation) => { // 修改样式或属性 if (mutation.type === 'attributes') { if (mutation.attributeName === attributeNameTag) { return true; } if (this.watermarkTag === this._getNodeRandomId(mutation.target)) { return true; } } // 删除节点 if (mutation.removedNodes.length && this.watermarkTag === this._getNodeRandomId(mutation.removedNodes[0])) { return true; } return false; }; _getNodeRandomId = (node) => { return node?.dataset?.[getDataSetKey(attributeNameTag)]; }; _destroyMutationObserver = () => { if (this.mutationObserver) { this.mutationObserver.takeRecords(); this.mutationObserver.disconnect(); this.mutationObserver = null; } }; _getWatermarkDom = async () => { if (!this.watermarkDom) { this.watermarkDom = document.createElement('div'); } const bgConfig = await getDrawPattern(this.options); if (bgConfig?.url) { const bgImg = bgConfig.url; this.style['zIndex'] = this.options.zIndex; if (this.options.repeat === 'multiply') { this.style['backgroundImage'] = `url(${bgImg}), url(${bgImg})`; this.style['backgroundRepeat'] = 'repeat'; this.style['backgroundPosition'] = `${bgConfig.width / 2}px ${bgConfig.height / 2}px, 0 0`; } else { this.style['backgroundImage'] = `url(${bgImg})`; this.style['backgroundRepeat'] = 'repeat'; this.style['backgroundPosition'] = ''; if (this.options.repeat === 'none') { this.style['backgroundRepeat'] = 'no-repeat'; this.style['backgroundPosition'] = this.options.position || 'center'; } } if (!this.options.container) { this.style['position'] = 'fixed'; } if (this.options.scrollHeight) { const height = this.options.scrollHeight; this.style['height'] = isNaN(Number(height)) ? height : height + 'px'; } this.watermarkDom.setAttribute('style', getStyleStr(this.style)); } this.watermarkDom.setAttribute(attributeNameTag, this.watermarkTag); return this.watermarkDom; }; async _render() { this._destroyMutationObserver(); // 获取水印挂载节点 this.container = getContainer(this.options.container); // 获取水印父节点 if (!this.watermarkHost) { this.watermarkHost = createHost(this.watermarkTag); this.container.append(this.watermarkHost); } // 获取水印 DOM this.watermarkDom = await this._getWatermarkDom(); // 删除已有水印 if (this.watermarkHost) { const children = this.watermarkHost.childNodes || []; children.forEach(child => { this.watermarkHost.removeChild(child); }); } // 判断是否支持 Shadow DOM if (typeof this.watermarkHost.attachShadow === 'function') { if (!this.shadowRoot) { this.shadowRoot = this.watermarkHost.attachShadow({ mode: 'open' }); } } else { this.shadowRoot = this.watermarkHost; } this.shadowRoot.append(this.watermarkDom); if (MutationObserver && this.options.secure) { this.mutationObserver = new MutationObserver(mutations => { mutations.forEach(mutation => { if (this._shouldRerender(mutation)) { this.destroy(); this._render(); return; } }); }); this.mutationObserver.observe(this.container, observeOptions); if (this.shadowRoot) { this.mutationObserver.observe(this.shadowRoot, observeOptions); } } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvd2F0ZXJtYXJrL3NyYy9saWIvd2F0ZXJtYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLEVBQ1osYUFBYSxFQUNiLGNBQWMsRUFDZCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGNBQWMsR0FDZixNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQXFCO0lBQzlDLElBQUksRUFBRSxHQUFHO0lBQ1QsSUFBSSxFQUFFLEdBQUc7SUFDVCxPQUFPLEVBQUUsQ0FBQztJQUNWLE9BQU8sRUFBRSxDQUFDO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixNQUFNLEVBQUUsRUFBRTtJQUNWLE9BQU8sRUFBRSxJQUFJO0lBQ2IsTUFBTSxFQUFFLENBQUMsRUFBRTtJQUNYLFFBQVEsRUFBRSxFQUFFO0lBQ1osVUFBVSxFQUFFLEtBQUs7SUFDakIsU0FBUyxFQUFFLFFBQVE7SUFDbkIsV0FBVyxFQUFFLFFBQVE7SUFDckIsU0FBUyxFQUFFLE1BQU07SUFDakIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsU0FBUyxFQUFFLFFBQVE7SUFDbkIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsTUFBTSxFQUFFLElBQUk7SUFDWixhQUFhLEVBQUUsRUFBRTtJQUNqQixZQUFZLEVBQUUsS0FBSztJQUNuQixNQUFNLEVBQUUsVUFBVTtJQUNsQixNQUFNLEVBQUUsSUFBSTtDQUNiLENBQUM7QUFFRixNQUFNLE9BQU8sU0FBUztJQUNwQixXQUFXO0lBQ0gsT0FBTyxHQUFxQixFQUFFLENBQUM7SUFDdkMsYUFBYTtJQUNMLFNBQVMsQ0FBZTtJQUNoQyxjQUFjO0lBQ04sYUFBYSxDQUFlO0lBQ3BDLFdBQVc7SUFDSCxZQUFZLENBQWU7SUFDbkMsV0FBVztJQUNILEtBQUssR0FB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QUFFLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdkMsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxQyxJQUFJLGdCQUFnQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3ZELFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNmLE9BQU87b0JBQ1QsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQzlELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2F0ZXJtYXJrT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgYXR0cmlidXRlTmFtZVRhZyxcbiAgY3JlYXRlSG9zdCxcbiAgZGVjcnlwdCxcbiAgZ2V0Q29udGFpbmVyLFxuICBnZXREYXRhU2V0S2V5LFxuICBnZXREcmF3UGF0dGVybixcbiAgZ2V0UmFuZG9tSWQsXG4gIGdldFN0eWxlU3RyLFxuICBvYnNlcnZlT3B0aW9ucyxcbn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0T3B0aW9uczogV2F0ZXJtYXJrT3B0aW9ucyA9IHtcbiAgZ2FwWDogMTAwLFxuICBnYXBZOiAxMDAsXG4gIG9mZnNldFg6IDAsXG4gIG9mZnNldFk6IDAsXG4gIHdpZHRoOiAxMjAsXG4gIGhlaWdodDogNjAsXG4gIG9wYWNpdHk6IDAuMTUsXG4gIHJvdGF0ZTogLTI0LFxuICBmb250U2l6ZTogMTYsXG4gIGZvbnRXZWlnaHQ6ICc0MDAnLFxuICBmb250U3R5bGU6ICdub3JtYWwnLFxuICBmb250VmFyaWFudDogJ25vcm1hbCcsXG4gIGZvbnRDb2xvcjogJyMwMDAnLFxuICBmb250RmFtaWx5OiAnc2Fucy1zZXJpZicsXG4gIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gIHRleHRCYXNlbGluZTogJ2FscGhhYmV0aWMnLFxuICBzZWN1cmU6IHRydWUsXG4gIGJsaW5kRm9udFNpemU6IDE2LFxuICBibGluZE9wYWNpdHk6IDAuMDA1LFxuICByZXBlYXQ6ICdtdWx0aXBseScsXG4gIHpJbmRleDogOTk5OSxcbn07XG5cbmV4cG9ydCBjbGFzcyBXYXRlcm1hcmsge1xuICAvKiog5rC05Y2w6YWN572uICovXG4gIHByaXZhdGUgb3B0aW9uczogV2F0ZXJtYXJrT3B0aW9ucyA9IHt9O1xuICAvKiog5rC05Y2w5oyC6L295a655ZmoICovXG4gIHByaXZhdGUgY29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIC8qKiDmsLTljbDnmoTlrr/kuLvoioLngrkgKi9cbiAgcHJpdmF0ZSB3YXRlcm1hcmtIb3N0PzogSFRNTEVsZW1lbnQ7XG4gIC8qKiDmsLTljbDoioLngrkgKi9cbiAgcHJpdmF0ZSB3YXRlcm1hcmtEb20/OiBIVE1MRWxlbWVudDtcbiAgLyoqIOawtOWNsOagt+W8jyAqL1xuICBwcml2YXRlIHN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge1xuICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICBpbnNldDogMCxcbiAgfTtcbiAgcHJpdmF0ZSB3YXRlcm1hcmtUYWcgPSBnZXRSYW5kb21JZCgnd2F0ZXJtYXJrJyk7XG4gIHByaXZhdGUgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QgfCBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBtdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2F0ZXJtYXJrT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fcmVuZGVyKCk7XG4gIH1cblxuICBzdGF0aWMgZGVjcnlwdCA9IGRlY3J5cHQ7XG5cbiAgdXBkYXRlKG9wdGlvbnM6IFdhdGVybWFya09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIHRoaXMuX3JlbmRlcigpO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy53YXRlcm1hcmtEb20pIHtcbiAgICAgIHRoaXMuc3R5bGVbJ2Rpc3BsYXknXSA9ICdibG9jayc7XG4gICAgICB0aGlzLndhdGVybWFya0RvbS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgZ2V0U3R5bGVTdHIodGhpcy5zdHlsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMud2F0ZXJtYXJrRG9tKSB7XG4gICAgICB0aGlzLnN0eWxlWydkaXNwbGF5J10gPSAnbm9uZSc7XG4gICAgICB0aGlzLndhdGVybWFya0RvbS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgZ2V0U3R5bGVTdHIodGhpcy5zdHlsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zaGFkb3dSb290ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMud2F0ZXJtYXJrSG9zdCkge1xuICAgICAgdGhpcy53YXRlcm1hcmtIb3N0LnJlbW92ZSgpO1xuICAgICAgdGhpcy53YXRlcm1hcmtIb3N0ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndhdGVybWFya0RvbSkge1xuICAgICAgdGhpcy53YXRlcm1hcmtEb20ucmVtb3ZlKCk7XG4gICAgICB0aGlzLndhdGVybWFya0RvbSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXN0cm95TXV0YXRpb25PYnNlcnZlcigpO1xuICB9XG5cbiAgX3Nob3VsZFJlcmVuZGVyID0gKG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCkgPT4ge1xuICAgIC8vIOS/ruaUueagt+W8j+aIluWxnuaAp1xuICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycpIHtcbiAgICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSBhdHRyaWJ1dGVOYW1lVGFnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMud2F0ZXJtYXJrVGFnID09PSB0aGlzLl9nZXROb2RlUmFuZG9tSWQobXV0YXRpb24udGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDliKDpmaToioLngrlcbiAgICBpZiAoXG4gICAgICBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoICYmXG4gICAgICB0aGlzLndhdGVybWFya1RhZyA9PT0gdGhpcy5fZ2V0Tm9kZVJhbmRvbUlkKG11dGF0aW9uLnJlbW92ZWROb2Rlc1swXSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfZ2V0Tm9kZVJhbmRvbUlkID0gKG5vZGU6IE5vZGUpID0+IHtcbiAgICByZXR1cm4gKG5vZGUgYXMgSFRNTEVsZW1lbnQpPy5kYXRhc2V0Py5bZ2V0RGF0YVNldEtleShhdHRyaWJ1dGVOYW1lVGFnKV07XG4gIH07XG5cbiAgX2Rlc3Ryb3lNdXRhdGlvbk9ic2VydmVyID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci50YWtlUmVjb3JkcygpO1xuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIF9nZXRXYXRlcm1hcmtEb20gPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLndhdGVybWFya0RvbSkge1xuICAgICAgdGhpcy53YXRlcm1hcmtEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiZ0NvbmZpZyA9IGF3YWl0IGdldERyYXdQYXR0ZXJuKHRoaXMub3B0aW9ucyk7XG5cbiAgICBpZiAoYmdDb25maWc/LnVybCkge1xuICAgICAgY29uc3QgYmdJbWcgPSBiZ0NvbmZpZy51cmw7XG5cbiAgICAgIHRoaXMuc3R5bGVbJ3pJbmRleCddID0gdGhpcy5vcHRpb25zLnpJbmRleCE7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVwZWF0ID09PSAnbXVsdGlwbHknKSB7XG4gICAgICAgIHRoaXMuc3R5bGVbJ2JhY2tncm91bmRJbWFnZSddID0gYHVybCgke2JnSW1nfSksIHVybCgke2JnSW1nfSlgO1xuICAgICAgICB0aGlzLnN0eWxlWydiYWNrZ3JvdW5kUmVwZWF0J10gPSAncmVwZWF0JztcbiAgICAgICAgdGhpcy5zdHlsZVsnYmFja2dyb3VuZFBvc2l0aW9uJ10gPSBgJHtiZ0NvbmZpZy53aWR0aCAvIDJ9cHggJHtiZ0NvbmZpZy5oZWlnaHQgLyAyfXB4LCAwIDBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdHlsZVsnYmFja2dyb3VuZEltYWdlJ10gPSBgdXJsKCR7YmdJbWd9KWA7XG4gICAgICAgIHRoaXMuc3R5bGVbJ2JhY2tncm91bmRSZXBlYXQnXSA9ICdyZXBlYXQnO1xuICAgICAgICB0aGlzLnN0eWxlWydiYWNrZ3JvdW5kUG9zaXRpb24nXSA9ICcnO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVwZWF0ID09PSAnbm9uZScpIHtcbiAgICAgICAgICB0aGlzLnN0eWxlWydiYWNrZ3JvdW5kUmVwZWF0J10gPSAnbm8tcmVwZWF0JztcbiAgICAgICAgICB0aGlzLnN0eWxlWydiYWNrZ3JvdW5kUG9zaXRpb24nXSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbiB8fCAnY2VudGVyJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5zdHlsZVsncG9zaXRpb24nXSA9ICdmaXhlZCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2Nyb2xsSGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMub3B0aW9ucy5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHRoaXMuc3R5bGVbJ2hlaWdodCddID0gaXNOYU4oTnVtYmVyKGhlaWdodCkpID8gaGVpZ2h0IDogaGVpZ2h0ICsgJ3B4JztcbiAgICAgIH1cblxuICAgICAgdGhpcy53YXRlcm1hcmtEb20uc2V0QXR0cmlidXRlKCdzdHlsZScsIGdldFN0eWxlU3RyKHRoaXMuc3R5bGUpKTtcbiAgICB9XG5cbiAgICB0aGlzLndhdGVybWFya0RvbS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZVRhZywgdGhpcy53YXRlcm1hcmtUYWcpO1xuXG4gICAgcmV0dXJuIHRoaXMud2F0ZXJtYXJrRG9tO1xuICB9O1xuXG4gIGFzeW5jIF9yZW5kZXIoKSB7XG4gICAgdGhpcy5fZGVzdHJveU11dGF0aW9uT2JzZXJ2ZXIoKTtcblxuICAgIC8vIOiOt+WPluawtOWNsOaMgui9veiKgueCuVxuICAgIHRoaXMuY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKHRoaXMub3B0aW9ucy5jb250YWluZXIpO1xuICAgIC8vIOiOt+WPluawtOWNsOeItuiKgueCuVxuICAgIGlmICghdGhpcy53YXRlcm1hcmtIb3N0KSB7XG4gICAgICB0aGlzLndhdGVybWFya0hvc3QgPSBjcmVhdGVIb3N0KHRoaXMud2F0ZXJtYXJrVGFnKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLndhdGVybWFya0hvc3QpO1xuICAgIH1cblxuICAgIC8vIOiOt+WPluawtOWNsCBET01cbiAgICB0aGlzLndhdGVybWFya0RvbSA9IGF3YWl0IHRoaXMuX2dldFdhdGVybWFya0RvbSgpO1xuXG4gICAgLy8g5Yig6Zmk5bey5pyJ5rC05Y2wXG4gICAgaWYgKHRoaXMud2F0ZXJtYXJrSG9zdCkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLndhdGVybWFya0hvc3QuY2hpbGROb2RlcyB8fCBbXTtcblxuICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIHRoaXMud2F0ZXJtYXJrSG9zdCEucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g5Yik5pat5piv5ZCm5pSv5oyBIFNoYWRvdyBET01cbiAgICBpZiAodHlwZW9mIHRoaXMud2F0ZXJtYXJrSG9zdC5hdHRhY2hTaGFkb3cgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICghdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdCA9IHRoaXMud2F0ZXJtYXJrSG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hhZG93Um9vdCA9IHRoaXMud2F0ZXJtYXJrSG9zdDtcbiAgICB9XG5cbiAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kKHRoaXMud2F0ZXJtYXJrRG9tKTtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyICYmIHRoaXMub3B0aW9ucy5zZWN1cmUpIHtcbiAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKG11dGF0aW9uID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUmVyZW5kZXIobXV0YXRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuY29udGFpbmVyLCBvYnNlcnZlT3B0aW9ucyk7XG4gICAgICBpZiAodGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuc2hhZG93Um9vdCwgb2JzZXJ2ZU9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19