UNPKG

@blox/material

Version:

Material Components for Angular

174 lines 25 kB
import { ElementRef, Renderer2, HostListener, Directive } from '@angular/core'; import { MDCRippleFoundation, util } from '@material/ripple'; import { events } from '@material/dom'; import { ponyfill } from '@material/dom'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; /** @docs-private */ export class AbstractMdcRipple { constructor(_rippleElm, _renderer, _registry, doc) { this._rippleElm = _rippleElm; this._renderer = _renderer; this._registry = _registry; this.mdcRippleAdapter = { browserSupportsCssVars: () => util.supportsCssVariables(this.document.defaultView), isUnbounded: () => this._unbounded, isSurfaceActive: () => this.isRippleSurfaceActive(), isSurfaceDisabled: () => this.isRippleSurfaceDisabled(), addClass: (className) => this.addClassToRipple(className), removeClass: (className) => this.removeClassFromRipple(className), containsEventTarget: (target) => this._rippleElm.nativeElement.contains(target), registerInteractionHandler: (type, handler) => { if (this.getRippleInteractionElement()) this._registry.listenElm(this._renderer, type, handler, this.getRippleInteractionElement().nativeElement, events.applyPassive()); }, deregisterInteractionHandler: (type, handler) => { this._registry.unlisten(type, handler); }, registerDocumentInteractionHandler: (type, handler) => this._registry.listenElm(this._renderer, type, handler, this.document, events.applyPassive()), deregisterDocumentInteractionHandler: (type, handler) => this._registry.unlisten(type, handler), registerResizeHandler: (handler) => { this._registry.listenElm(this._renderer, 'resize', handler, this.document.defaultView); }, deregisterResizeHandler: (handler) => { this._registry.unlisten('resize', handler); }, updateCssVariable: (name, value) => { this.getRippleStylingElement().nativeElement.style.setProperty(name, value); }, computeBoundingRect: () => this.computeRippleBoundingRect(), getWindowPageOffset: () => ({ x: this.document.defaultView.pageXOffset, y: this.document.defaultView.pageYOffset }) }; /** @internal */ this._rippleFoundation = null; this._unbounded = false; this._rippleSurface = null; // workaround compiler bug when using ViewEngine. Type Document fails compilation this.document = doc; } /** @internal */ initRipple(unbounded = false) { if (this._rippleFoundation) throw new Error('initRipple() is called multiple times'); this._unbounded = unbounded; this._rippleFoundation = new MDCRippleFoundation(this.mdcRippleAdapter); this._rippleFoundation.init(); } /** @internal */ destroyRipple() { if (this._rippleFoundation) { this._rippleFoundation.destroy(); this._rippleFoundation = null; } } /** @internal */ reinitRipple() { if (this._rippleFoundation) { this.destroyRipple(); this.initRipple(this._unbounded); } } /** @internal */ isRippleInitialized() { return this._rippleFoundation != null; } /** @internal */ addRippleSurface(clazz, firstElement = false) { this.destroyRippleSurface(); this._rippleSurface = this._renderer.createElement('div'); this._renderer.addClass(this._rippleSurface, clazz); if (firstElement && this._rippleElm.nativeElement.children.length > 0) { const firstChild = this._rippleElm.nativeElement.children.item(0); this._renderer.insertBefore(this._rippleElm.nativeElement, this._rippleSurface, firstChild); } else this._renderer.appendChild(this._rippleElm.nativeElement, this._rippleSurface); return this._rippleSurface; } /** @internal */ destroyRippleSurface() { if (this._rippleSurface) { this._renderer.removeChild(this._rippleElm.nativeElement, this._rippleSurface); this._rippleSurface = null; } } activateRipple() { if (this._rippleFoundation) this._rippleFoundation.activate(); } deactivateRipple() { if (this._rippleFoundation) this._rippleFoundation.deactivate(); } layout() { if (this._rippleFoundation) this._rippleFoundation.layout(); } get rippleSurface() { return new ElementRef(this._rippleSurface); } getRippleInteractionElement() { return this._rippleElm; } getRippleStylingElement() { return this._rippleElm; } isRippleUnbounded() { return this._unbounded; } /** @internal */ setRippleUnbounded(value) { if (!!value !== this._unbounded) { this._unbounded = !!value; // despite what the documentation seems to indicate, you can't // just change the unbounded property of an already initialized // ripple. The initialization registers different handlers, and won't // change those registrations when you change the unbounded property. // Hence we destroy and re-init the whole thing: this.reinitRipple(); } } isRippleSurfaceActive() { let interactionElm = this.getRippleInteractionElement(); return !!interactionElm && this.isActiveElement(interactionElm.nativeElement); } isActiveElement(element) { return element == null ? false : ponyfill.matches(element, ':active'); } isRippleSurfaceDisabled() { let interactionElm = this.getRippleInteractionElement(); return !!interactionElm && !!interactionElm.nativeElement.attributes.getNamedItem('disabled'); } /** @internal */ addClassToRipple(name) { this._renderer.addClass(this.getRippleStylingElement().nativeElement, name); } /** @internal */ removeClassFromRipple(name) { this._renderer.removeClass(this.getRippleStylingElement().nativeElement, name); } computeRippleBoundingRect() { return this._rippleElm.nativeElement.getBoundingClientRect(); } /** @internal */ onFocus() { if (this._rippleFoundation) this._rippleFoundation.handleFocus(); } /** @internal */ onBlur() { if (this._rippleFoundation) this._rippleFoundation.handleBlur(); } } AbstractMdcRipple.decorators = [ { type: Directive } ]; AbstractMdcRipple.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: MdcEventRegistry }, { type: undefined } ]; AbstractMdcRipple.propDecorators = { onFocus: [{ type: HostListener, args: ['focusin',] }], onBlur: [{ type: HostListener, args: ['focusout',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QubWRjLnJpcHBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JpcHBsZS9hYnN0cmFjdC5tZGMucmlwcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFvQixJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsb0JBQW9CO0FBRXBCLE1BQU0sT0FBZ0IsaUJBQWlCO0lBbUNuQyxZQUFzQixVQUFzQixFQUFZLFNBQW9CLEVBQVksU0FBMkIsRUFDL0csR0FBUTtRQURVLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQVksY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFsQzNHLHFCQUFnQixHQUFxQjtZQUN6QyxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFZLENBQUM7WUFDbkYsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2xDLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDbkQsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ3ZELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMs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QixFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFUyx5QkFBeUI7UUFDL0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxnQkFBZ0I7SUFDUyxPQUFPO1FBQzVCLElBQUksSUFBSSxDQUFDLGlCQUFpQjtZQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELGdCQUFnQjtJQUNVLE1BQU07UUFDNUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCO1lBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM1QyxDQUFDOzs7WUEvS0osU0FBUzs7O1lBUEQsVUFBVTtZQUFFLFNBQVM7WUFJckIsZ0JBQWdCOzs7O3NCQXlLcEIsWUFBWSxTQUFDLFNBQVM7cUJBTXRCLFlBQVksU0FBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBIb3N0TGlzdGVuZXIsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNRENSaXBwbGVGb3VuZGF0aW9uLCBNRENSaXBwbGVBZGFwdGVyLCB1dGlsIH0gZnJvbSAnQG1hdGVyaWFsL3JpcHBsZSc7XHJcbmltcG9ydCB7IGV2ZW50cyB9IGZyb20gJ0BtYXRlcmlhbC9kb20nO1xyXG5pbXBvcnQgeyBwb255ZmlsbCB9IGZyb20gJ0BtYXRlcmlhbC9kb20nO1xyXG5pbXBvcnQgeyBNZGNFdmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvbWRjLmV2ZW50LnJlZ2lzdHJ5JztcclxuXHJcbi8qKiBAZG9jcy1wcml2YXRlICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZGNSaXBwbGUge1xyXG4gICAgcHJpdmF0ZSBtZGNSaXBwbGVBZGFwdGVyOiBNRENSaXBwbGVBZGFwdGVyID0ge1xyXG4gICAgICAgIGJyb3dzZXJTdXBwb3J0c0Nzc1ZhcnM6ICgpID0+IHV0aWwuc3VwcG9ydHNDc3NWYXJpYWJsZXModGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldyEpLFxyXG4gICAgICAgIGlzVW5ib3VuZGVkOiAoKSA9PiB0aGlzLl91bmJvdW5kZWQsXHJcbiAgICAgICAgaXNTdXJmYWNlQWN0aXZlOiAoKSA9PiB0aGlzLmlzUmlwcGxlU3VyZmFjZUFjdGl2ZSgpLFxyXG4gICAgICAgIGlzU3VyZmFjZURpc2FibGVkOiAoKSA9PiB0aGlzLmlzUmlwcGxlU3VyZmFjZURpc2FibGVkKCksXHJcbiAgICAgICAgYWRkQ2xhc3M6IChjbGFzc05hbWUpID0+IHRoaXMuYWRkQ2xhc3NUb1JpcHBsZShjbGFzc05hbWUpLFxyXG4gICAgICAgIHJlbW92ZUNsYXNzOiAoY2xhc3NOYW1lKSA9PiB0aGlzLnJlbW92ZUNsYXNzRnJvbVJpcHBsZShjbGFzc05hbWUpLFxyXG4gICAgICAgIGNvbnRhaW5zRXZlbnRUYXJnZXQ6ICh0YXJnZXQpID0+IHRoaXMuX3JpcHBsZUVsbS5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCksXHJcbiAgICAgICAgcmVnaXN0ZXJJbnRlcmFjdGlvbkhhbmRsZXI6ICh0eXBlLCBoYW5kbGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFJpcHBsZUludGVyYWN0aW9uRWxlbWVudCgpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkubGlzdGVuRWxtKHRoaXMuX3JlbmRlcmVyLCB0eXBlLCBoYW5kbGVyLCB0aGlzLmdldFJpcHBsZUludGVyYWN0aW9uRWxlbWVudCgpIS5uYXRpdmVFbGVtZW50LCBldmVudHMuYXBwbHlQYXNzaXZlKCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVyZWdpc3RlckludGVyYWN0aW9uSGFuZGxlcjogKHR5cGUsIGhhbmRsZXIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkudW5saXN0ZW4odHlwZSwgaGFuZGxlcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICByZWdpc3RlckRvY3VtZW50SW50ZXJhY3Rpb25IYW5kbGVyOiAodHlwZSwgaGFuZGxlcikgPT4gdGhpcy5fcmVnaXN0cnkubGlzdGVuRWxtKHRoaXMuX3JlbmRlcmVyLCB0eXBlLCBoYW5kbGVyLCB0aGlzLmRvY3VtZW50LCBldmVudHMuYXBwbHlQYXNzaXZlKCkpLFxyXG4gICAgICAgIGRlcmVnaXN0ZXJEb2N1bWVudEludGVyYWN0aW9uSGFuZGxlcjogKHR5cGUsIGhhbmRsZXIpID0+IHRoaXMuX3JlZ2lzdHJ5LnVubGlzdGVuKHR5cGUsIGhhbmRsZXIpLFxyXG4gICAgICAgIHJlZ2lzdGVyUmVzaXplSGFuZGxlcjogKGhhbmRsZXIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkubGlzdGVuRWxtKHRoaXMuX3JlbmRlcmVyLCAncmVzaXplJywgaGFuZGxlciwgdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldyEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGVyZWdpc3RlclJlc2l6ZUhhbmRsZXI6IChoYW5kbGVyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LnVubGlzdGVuKCdyZXNpemUnLCBoYW5kbGVyKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZUNzc1ZhcmlhYmxlOiAobmFtZSwgdmFsdWUpID0+IHsgdGhpcy5nZXRSaXBwbGVTdHlsaW5nRWxlbWVudCgpLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOyB9LFxyXG4gICAgICAgIGNvbXB1dGVCb3VuZGluZ1JlY3Q6ICgpID0+IHRoaXMuY29tcHV0ZVJpcHBsZUJvdW5kaW5nUmVjdCgpLFxyXG4gICAgICAgIGdldFdpbmRvd1BhZ2VPZmZzZXQ6ICgpID0+ICh7eDogdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldyEucGFnZVhPZmZzZXQsIHk6IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXchLnBhZ2VZT2Zmc2V0fSlcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgX3JpcHBsZUZvdW5kYXRpb246IE1EQ1JpcHBsZUZvdW5kYXRpb24gfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX3VuYm91bmRlZCA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfcmlwcGxlU3VyZmFjZTogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICAgIHByb3RlY3RlZCBkb2N1bWVudDogRG9jdW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9yaXBwbGVFbG06IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBfcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJvdGVjdGVkIF9yZWdpc3RyeTogTWRjRXZlbnRSZWdpc3RyeSxcclxuICAgICAgICBkb2M6IGFueSkge1xyXG4gICAgICAgIC8vIHdvcmthcm91bmQgY29tcGlsZXIgYnVnIHdoZW4gdXNpbmcgVmlld0VuZ2luZS4gVHlwZSBEb2N1bWVudCBmYWlscyBjb21waWxhdGlvblxyXG4gICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2MgYXMgRG9jdW1lbnRcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFJpcHBsZSh1bmJvdW5kZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yaXBwbGVGb3VuZGF0aW9uKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luaXRSaXBwbGUoKSBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKTtcclxuICAgICAgICB0aGlzLl91bmJvdW5kZWQgPSB1bmJvdW5kZWQ7XHJcbiAgICAgICAgdGhpcy5fcmlwcGxlRm91bmRhdGlvbiA9IG5ldyBNRENSaXBwbGVGb3VuZGF0aW9uKHRoaXMubWRjUmlwcGxlQWRhcHRlcik7XHJcbiAgICAgICAgdGhpcy5fcmlwcGxlRm91bmRhdGlvbi5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIGRlc3Ryb3lSaXBwbGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JpcHBsZUZvdW5kYXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5fcmlwcGxlRm91bmRhdGlvbi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JpcHBsZUZvdW5kYXRpb24gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgcmVpbml0UmlwcGxlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yaXBwbGVGb3VuZGF0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVJpcHBsZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRSaXBwbGUodGhpcy5fdW5ib3VuZGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIGlzUmlwcGxlSW5pdGlhbGl6ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JpcHBsZUZvdW5kYXRpb24gIT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgYWRkUmlwcGxlU3VyZmFjZShjbGF6ejogc3RyaW5nLCBmaXJzdEVsZW1lbnQgPSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveVJpcHBsZVN1cmZhY2UoKTtcclxuICAgICAgICB0aGlzLl9yaXBwbGVTdXJmYWNlID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fcmlwcGxlU3VyZmFjZSwgY2xhenopO1xyXG4gICAgICAgIGlmIChmaXJzdEVsZW1lbnQgJiYgdGhpcy5fcmlwcGxlRWxtLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gdGhpcy5fcmlwcGxlRWxtLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4uaXRlbSgwKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMuX3JpcHBsZUVsbS5uYXRpdmVFbGVtZW50LCB0aGlzLl9yaXBwbGVTdXJmYWNlLCBmaXJzdENoaWxkKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5fcmlwcGxlRWxtLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX3JpcHBsZVN1cmZhY2UpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yaXBwbGVTdXJmYWNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBkZXN0cm95UmlwcGxlU3VyZmFjZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmlwcGxlU3VyZmFjZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLl9yaXBwbGVFbG0ubmF0aXZlRWxlbWVudCwgdGhpcy5fcmlwcGxlU3VyZmFjZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JpcHBsZVN1cmZhY2UgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3RpdmF0ZVJpcHBsZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmlwcGxlRm91bmRhdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fcmlwcGxlRm91bmRhdGlvbi5hY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlYWN0aXZhdGVSaXBwbGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JpcHBsZUZvdW5kYXRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuX3JpcHBsZUZvdW5kYXRpb24uZGVhY3RpdmF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxheW91dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmlwcGxlRm91bmRhdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fcmlwcGxlRm91bmRhdGlvbi5sYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHJpcHBsZVN1cmZhY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50UmVmKHRoaXMuX3JpcHBsZVN1cmZhY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRSaXBwbGVJbnRlcmFjdGlvbkVsZW1lbnQoKTogRWxlbWVudFJlZiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JpcHBsZUVsbTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0UmlwcGxlU3R5bGluZ0VsZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JpcHBsZUVsbTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaXNSaXBwbGVVbmJvdW5kZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VuYm91bmRlZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgc2V0UmlwcGxlVW5ib3VuZGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCEhdmFsdWUgIT09IHRoaXMuX3VuYm91bmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl91bmJvdW5kZWQgPSAhIXZhbHVlO1xyXG4gICAgICAgICAgICAvLyBkZXNwaXRlIHdoYXQgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gaW5kaWNhdGUsIHlvdSBjYW4ndFxyXG4gICAgICAgICAgICAvLyBqdXN0IGNoYW5nZSB0aGUgdW5ib3VuZGVkIHByb3BlcnR5IG9mIGFuIGFscmVhZHkgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgLy8gcmlwcGxlLiBUaGUgaW5pdGlhbGl6YXRpb24gcmVnaXN0ZXJzIGRpZmZlcmVudCBoYW5kbGVycywgYW5kIHdvbid0XHJcbiAgICAgICAgICAgIC8vIGNoYW5nZSB0aG9zZSByZWdpc3RyYXRpb25zIHdoZW4geW91IGNoYW5nZSB0aGUgdW5ib3VuZGVkIHByb3BlcnR5LlxyXG4gICAgICAgICAgICAvLyBIZW5jZSB3ZSBkZXN0cm95IGFuZCByZS1pbml0IHRoZSB3aG9sZSB0aGluZzpcclxuICAgICAgICAgICAgdGhpcy5yZWluaXRSaXBwbGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGlzUmlwcGxlU3VyZmFjZUFjdGl2ZSgpIHtcclxuICAgICAgICBsZXQgaW50ZXJhY3Rpb25FbG0gPSB0aGlzLmdldFJpcHBsZUludGVyYWN0aW9uRWxlbWVudCgpO1xyXG4gICAgICAgIHJldHVybiAhIWludGVyYWN0aW9uRWxtICYmIHRoaXMuaXNBY3RpdmVFbGVtZW50KGludGVyYWN0aW9uRWxtLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpc0FjdGl2ZUVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCA9PSBudWxsID8gZmFsc2UgOiBwb255ZmlsbC5tYXRjaGVzKGVsZW1lbnQsICc6YWN0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGlzUmlwcGxlU3VyZmFjZURpc2FibGVkKCkge1xyXG4gICAgICAgIGxldCBpbnRlcmFjdGlvbkVsbSA9IHRoaXMuZ2V0UmlwcGxlSW50ZXJhY3Rpb25FbGVtZW50KCk7XHJcbiAgICAgICAgcmV0dXJuICEhaW50ZXJhY3Rpb25FbG0gJiYgISFpbnRlcmFjdGlvbkVsbS5uYXRpdmVFbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBhZGRDbGFzc1RvUmlwcGxlKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRoaXMuZ2V0UmlwcGxlU3R5bGluZ0VsZW1lbnQoKS5uYXRpdmVFbGVtZW50LCBuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlQ2xhc3NGcm9tUmlwcGxlKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZ2V0UmlwcGxlU3R5bGluZ0VsZW1lbnQoKS5uYXRpdmVFbGVtZW50LCBuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29tcHV0ZVJpcHBsZUJvdW5kaW5nUmVjdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmlwcGxlRWxtLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgQEhvc3RMaXN0ZW5lcignZm9jdXNpbicpIG9uRm9jdXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JpcHBsZUZvdW5kYXRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuX3JpcHBsZUZvdW5kYXRpb24uaGFuZGxlRm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpIG9uQmx1cigpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmlwcGxlRm91bmRhdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fcmlwcGxlRm91bmRhdGlvbi5oYW5kbGVCbHVyKCk7XHJcbiAgICB9XHJcbn1cclxuIl19