UNPKG

@flosportsinc/ng-video-autoplay

Version:

Simple way to ensure videos autoplay even if they need to be muted first.

361 lines 26 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Input, Renderer2, ContentChildren, QueryList } from '@angular/core'; import { share, takeUntil, map, flatMap, filter, tap, take } from 'rxjs/operators'; import { fromEvent, Subject } from 'rxjs'; import { maybe, either } from 'typescript-monads'; /** * @record */ function VideoHaltStatus() { } if (false) { /** @type {?} */ VideoHaltStatus.prototype.videoElement; /** @type {?} */ VideoHaltStatus.prototype.halted; } // tslint:disable:no-object-mutation /** @type {?} */ var filterHalted = (/** * @param {?} source * @return {?} */ function (source) { return source.pipe(filter((/** * @param {?} res * @return {?} */ function (res) { return res.halted === true; }))); }); var ɵ0 = filterHalted; /** @type {?} */ var tryPlayVideoAsIs = (/** * @param {?} source * @return {?} */ function (source) { return source.pipe(flatMap((/** * @param {?} videoElement * @return {?} */ function (videoElement) { return videoElement.play() .then((/** * @return {?} */ function () { return ({ videoElement: videoElement, halted: false }); })) .catch((/** * @return {?} */ function () { return ({ videoElement: videoElement, halted: true }); })); })), filterHalted); }); var ɵ1 = tryPlayVideoAsIs; /** @type {?} */ var tryPlayVideoMuted = (/** * @param {?} source * @return {?} */ function (source) { return source.pipe(map((/** * @param {?} res * @return {?} */ function (res) { res.videoElement.muted = true; res.videoElement.volume = 0; return res.videoElement; })), tryPlayVideoAsIs); }) // 1) attempt to play as-is (including autoplay + unmuted) // 2) attempt to play muted, showing unmite button // 3) show click to play ; var ɵ2 = tryPlayVideoMuted; // 1) attempt to play as-is (including autoplay + unmuted) // 2) attempt to play muted, showing unmite button // 3) show click to play var FloVideoAutoplayDirective = /** @class */ (function () { function FloVideoAutoplayDirective(elmRef, rd) { var _this = this; this.elmRef = elmRef; this.rd = rd; this.floVideoAutoplay = true; this.floVideoAutoplayIndex = 0; this.onDestroySource = new Subject(); this.onDestroy = this.onDestroySource.pipe(share()); this.canExecute = (/** * @return {?} */ function () { return _this.floVideoAutoplay === true || _this.floVideoAutoplay === ''; }); this.maybeVideoElement = (/** * @return {?} */ function () { return maybe(_this.elmRef.nativeElement).filter((/** * @param {?} e * @return {?} */ function (e) { return e.nodeName === 'VIDEO'; })); }); this.maybeUnmuteActionRef = (/** * @return {?} */ function () { return maybe(_this.floVideoAutoplayClickUnmuteRef).filter((/** * @param {?} a * @return {?} */ function (a) { return (/** @type {?} */ (a)) !== ''; })); }); this.maybePlayActionRef = (/** * @return {?} */ function () { return maybe(_this.floVideoAutoplayClickPlayRef).filter((/** * @param {?} a * @return {?} */ function (a) { return (/** @type {?} */ (a)) !== ''; })); }); this.hideRef = (/** * @param {?} ref * @return {?} */ function (ref) { return _this.rd.setStyle(ref, 'display', 'none'); }); this.showRef = (/** * @param {?} ref * @return {?} */ function (ref) { return _this.rd.setStyle(ref, 'display', 'block'); }); this.volumeChange = (/** * @param {?} videoElement * @return {?} */ function (videoElement) { return fromEvent(videoElement, 'volumechange', { passive: true }).pipe(map((/** * @param {?} evt * @return {?} */ function (evt) { return (/** @type {?} */ (evt.target)); })), share(), takeUntil(_this.onDestroy)); }); this.initOnVideo = (/** * @param {?} videoElement * @return {?} */ function (videoElement) { return fromEvent(videoElement, 'loadstart').pipe(tap((/** * @return {?} */ function () { return videoElement.setAttribute('autoplay', 'true'); })), map((/** * @param {?} evt * @return {?} */ function (evt) { return (/** @type {?} */ (evt.target)); })), tryPlayVideoAsIs, tryPlayVideoMuted, take(1)).subscribe((/** * @param {?} res * @return {?} */ function (res) { res.videoElement.preload = 'none'; res.videoElement.muted = false; res.videoElement.volume = 1; _this.maybePlayActionRef().tapSome(_this.showRef); })); }); this.runUnmuteSequence = (/** * @param {?} actionRef * @return {?} */ function (actionRef) { return (/** * @param {?} runOnce * @return {?} */ function (runOnce) { return (/** * @param {?} videoElement * @return {?} */ function (videoElement) { videoElement.setAttribute('autoplay', 'true'); fromEvent(actionRef, 'click').pipe(takeUntil(_this.onDestroy)).subscribe((/** * @return {?} */ function () { videoElement.muted = false; videoElement.volume = 1; })); _this.volumeChange(videoElement).pipe(filter((/** * @param {?} v * @return {?} */ function (v) { return !v.muted || v.volume > 0; })), takeUntil(_this.onDestroy)) .subscribe((/** * @return {?} */ function () { return _this.hideRef(actionRef); })); /** @type {?} */ var showRef = _this.volumeChange(videoElement).pipe(filter((/** * @param {?} v * @return {?} */ function (v) { return v.muted || v.volume <= 0; }))); (runOnce ? showRef.pipe(take(1)) : showRef).subscribe((/** * @return {?} */ function () { return _this.showRef(actionRef); })); }); }); }); } /** * @return {?} */ FloVideoAutoplayDirective.prototype.ngAfterContentInit = /** * @return {?} */ function () { var _this = this; if (!this.canExecute()) { return; } this.maybeVideoElement().tapSome(this.initOnVideo); this.videos.map((/** * @param {?} a * @return {?} */ function (a) { return a.nativeElement; })).forEach(this.initOnVideo); this.maybeUnmuteActionRef().tapSome((/** * @param {?} ref * @return {?} */ function (ref) { _this.hideRef(ref); either(_this.maybeVideoElement().valueOrUndefined(), maybe(_this.videos.toArray()[_this.floVideoAutoplayIndex]).map((/** * @param {?} a * @return {?} */ function (a) { return a.nativeElement; })).valueOrUndefined()) .tap({ left: _this.runUnmuteSequence(ref)(false), right: _this.runUnmuteSequence(ref)(true) }); })); this.maybePlayActionRef().tapSome((/** * @param {?} actionRef * @return {?} */ function (actionRef) { _this.hideRef(actionRef); fromEvent(actionRef, 'click').pipe(takeUntil(_this.onDestroy)).subscribe((/** * @return {?} */ function () { _this.hideRef(actionRef); _this.maybeVideoElement().tapSome((/** * @param {?} v * @return {?} */ function (v) { return v.play(); })); })); })); }; /** * @return {?} */ FloVideoAutoplayDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.onDestroySource.next(); this.onDestroySource.complete(); }; FloVideoAutoplayDirective.decorators = [ { type: Directive, args: [{ selector: '[floVideoAutoplay]' },] } ]; /** @nocollapse */ FloVideoAutoplayDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 } ]; }; FloVideoAutoplayDirective.propDecorators = { floVideoAutoplay: [{ type: Input }], floVideoAutoplayClickUnmuteRef: [{ type: Input }], floVideoAutoplayClickPlayRef: [{ type: Input }], floVideoAutoplayIndex: [{ type: Input }], videos: [{ type: ContentChildren, args: ['floVideoAutoplay', { descendants: true },] }] }; return FloVideoAutoplayDirective; }()); export { FloVideoAutoplayDirective }; if (false) { /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplay; /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplayClickUnmuteRef; /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplayClickPlayRef; /** @type {?} */ FloVideoAutoplayDirective.prototype.floVideoAutoplayIndex; /** @type {?} */ FloVideoAutoplayDirective.prototype.videos; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.onDestroySource; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.onDestroy; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.canExecute; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.maybeVideoElement; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.maybeUnmuteActionRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.maybePlayActionRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.hideRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.showRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.volumeChange; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.initOnVideo; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.runUnmuteSequence; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.elmRef; /** * @type {?} * @private */ FloVideoAutoplayDirective.prototype.rd; } export { ɵ0, ɵ1, ɵ2 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlkZW8tYXV0b3BsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZsb3Nwb3J0c2luYy9uZy12aWRlby1hdXRvcGxheS8iLCJzb3VyY2VzIjpbImxpYi9uZy12aWRlby1hdXRvcGxheS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQStCLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDaEksT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7Ozs7QUFFakQsOEJBR0M7OztJQUZDLHVDQUF1Qzs7SUFDdkMsaUNBQXdCOzs7O0lBSXBCLFlBQVk7Ozs7QUFDaEIsVUFBQyxNQUFtQztJQUNsQyxPQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTs7OztJQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQW5CLENBQW1CLEVBQUMsQ0FBQztBQUEvQyxDQUErQyxDQUFBOzs7SUFFN0MsZ0JBQWdCOzs7O0FBQ3BCLFVBQUMsTUFBb0M7SUFDbkMsT0FBQSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU87Ozs7SUFBQyxVQUFBLFlBQVksSUFBSSxPQUFBLFlBQVksQ0FBQyxJQUFJLEVBQUU7U0FDcEQsSUFBSTs7O0lBQUMsY0FBTSxPQUFBLENBQUMsRUFBRSxZQUFZLGNBQUEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBakMsQ0FBaUMsRUFBQztT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QUFDOzs7O0lBRUQsK0NBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ2pDLENBQUM7O2dCQXRGRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7Ozs7Z0JBbkNtQixVQUFVO2dCQUFTLFNBQVM7OzttQ0FxQzdDLEtBQUs7aURBQ0wsS0FBSzsrQ0FDTCxLQUFLO3dDQUNMLEtBQUs7eUJBRUwsZUFBZSxTQUFDLGtCQUFrQixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTs7SUE4RTVELGdDQUFDO0NBQUEsQUF2RkQsSUF1RkM7U0FwRlkseUJBQXlCOzs7SUFDcEMscURBQWdEOztJQUNoRCxtRUFBcUU7O0lBQ3JFLGlFQUFtRTs7SUFDbkUsMERBQWtEOztJQUVsRCwyQ0FBMkg7Ozs7O0lBRTNILG9EQUFnRDs7Ozs7SUFDaEQsOENBQStEOzs7OztJQUMvRCwrQ0FBa0c7Ozs7O0lBQ2xHLHNEQUErRzs7Ozs7SUFDL0cseURBQXFIOzs7OztJQUNySCx1REFBaUg7Ozs7O0lBRWpILDRDQUF5Rjs7Ozs7SUFDekYsNENBQTBGOzs7OztJQUUxRixpREFJOEI7Ozs7O0lBRTlCLGdEQVlJOzs7OztJQUlKLHNEQVdDOzs7OztJQWJXLDJDQUE0Qzs7Ozs7SUFBRSx1Q0FBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0LCBSZW5kZXJlcjIsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgc2hhcmUsIHRha2VVbnRpbCwgbWFwLCBmbGF0TWFwLCBmaWx0ZXIsIHRhcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1heWJlLCBlaXRoZXIgfSBmcm9tICd0eXBlc2NyaXB0LW1vbmFkcydcblxuaW50ZXJmYWNlIFZpZGVvSGFsdFN0YXR1cyB7XG4gIHJlYWRvbmx5IHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudFxuICByZWFkb25seSBoYWx0ZWQ6IGJvb2xlYW5cbn1cblxuLy8gdHNsaW50OmRpc2FibGU6bm8tb2JqZWN0LW11dGF0aW9uXG5jb25zdCBmaWx0ZXJIYWx0ZWQgPVxuICAoc291cmNlOiBPYnNlcnZhYmxlPFZpZGVvSGFsdFN0YXR1cz4pID0+XG4gICAgc291cmNlLnBpcGUoZmlsdGVyKHJlcyA9PiByZXMuaGFsdGVkID09PSB0cnVlKSlcblxuY29uc3QgdHJ5UGxheVZpZGVvQXNJcyA9XG4gIChzb3VyY2U6IE9ic2VydmFibGU8SFRNTFZpZGVvRWxlbWVudD4pID0+XG4gICAgc291cmNlLnBpcGUoZmxhdE1hcCh2aWRlb0VsZW1lbnQgPT4gdmlkZW9FbGVtZW50LnBsYXkoKVxuICAgICAgLnRoZW4oKCkgPT4gKHsgdmlkZW9FbGVtZW50LCBoYWx0ZWQ6IGZhbHNlIH0pKVxuICAgICAgLmNhdGNoKCgpID0+ICh7IHZpZGVvRWxlbWVudCwgaGFsdGVkOiB0cnVlIH0pKVxuICAgICksIGZpbHRlckhhbHRlZClcblxuY29uc3QgdHJ5UGxheVZpZGVvTXV0ZWQgPVxuICAoc291cmNlOiBPYnNlcnZhYmxlPFZpZGVvSGFsdFN0YXR1cz4pID0+XG4gICAgc291cmNlLnBpcGUobWFwKHJlcyA9PiB7XG4gICAgICByZXMudmlkZW9FbGVtZW50Lm11dGVkID0gdHJ1ZVxuICAgICAgcmVzLnZpZGVvRWxlbWVudC52b2x1bWUgPSAwXG4gICAgICByZXR1cm4gcmVzLnZpZGVvRWxlbWVudFxuICAgIH0pLCB0cnlQbGF5VmlkZW9Bc0lzKVxuXG4vLyAxKSBhdHRlbXB0IHRvIHBsYXkgYXMtaXMgKGluY2x1ZGluZyBhdXRvcGxheSArIHVubXV0ZWQpXG4vLyAyKSBhdHRlbXB0IHRvIHBsYXkgbXV0ZWQsIHNob3dpbmcgdW5taXRlIGJ1dHRvblxuLy8gMykgc2hvdyBjbGljayB0byBwbGF5XG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZmxvVmlkZW9BdXRvcGxheV0nXG59KVxuZXhwb3J0IGNsYXNzIEZsb1ZpZGVvQXV0b3BsYXlEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHkgZmxvVmlkZW9BdXRvcGxheSA9IHRydWVcbiAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5IGZsb1ZpZGVvQXV0b3BsYXlDbGlja1VubXV0ZVJlZj86IEhUTUxFbGVtZW50XG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seSBmbG9WaWRlb0F1dG9wbGF5Q2xpY2tQbGF5UmVmPzogSFRNTEVsZW1lbnRcbiAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5IGZsb1ZpZGVvQXV0b3BsYXlJbmRleCA9IDBcblxuICBAQ29udGVudENoaWxkcmVuKCdmbG9WaWRlb0F1dG9wbGF5JywgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSBwdWJsaWMgcmVhZG9ubHkgdmlkZW9zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50Pj5cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveVNvdXJjZSA9IG5ldyBTdWJqZWN0KClcbiAgcHJpdmF0ZSByZWFkb25seSBvbkRlc3Ryb3kgPSB0aGlzLm9uRGVzdHJveVNvdXJjZS5waXBlKHNoYXJlKCkpXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuRXhlY3V0ZSA9ICgpID0+IHRoaXMuZmxvVmlkZW9BdXRvcGxheSA9PT0gdHJ1ZSB8fCB0aGlzLmZsb1ZpZGVvQXV0b3BsYXkgPT09ICcnXG4gIHByaXZhdGUgcmVhZG9ubHkgbWF5YmVWaWRlb0VsZW1lbnQgPSAoKSA9PiBtYXliZSh0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50KS5maWx0ZXIoZSA9PiBlLm5vZGVOYW1lID09PSAnVklERU8nKVxuICBwcml2YXRlIHJlYWRvbmx5IG1heWJlVW5tdXRlQWN0aW9uUmVmID0gKCkgPT4gbWF5YmUodGhpcy5mbG9WaWRlb0F1dG9wbGF5Q2xpY2tVbm11dGVSZWYpLmZpbHRlcihhID0+IGEgYXMgYW55ICE9PSAnJylcbiAgcHJpdmF0ZSByZWFkb25seSBtYXliZVBsYXlBY3Rpb25SZWYgPSAoKSA9PiBtYXliZSh0aGlzLmZsb1ZpZGVvQXV0b3BsYXlDbGlja1BsYXlSZWYpLmZpbHRlcihhID0+IGEgYXMgYW55ICE9PSAnJylcblxuICBwcml2YXRlIHJlYWRvbmx5IGhpZGVSZWYgPSAocmVmOiBIVE1MRWxlbWVudCkgPT4gdGhpcy5yZC5zZXRTdHlsZShyZWYsICdkaXNwbGF5JywgJ25vbmUnKVxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dSZWYgPSAocmVmOiBIVE1MRWxlbWVudCkgPT4gdGhpcy5yZC5zZXRTdHlsZShyZWYsICdkaXNwbGF5JywgJ2Jsb2NrJylcblxuICBwcml2YXRlIHJlYWRvbmx5IHZvbHVtZUNoYW5nZSA9ICh2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQpID0+XG4gICAgZnJvbUV2ZW50KHZpZGVvRWxlbWVudCwgJ3ZvbHVtZWNoYW5nZScsIHsgcGFzc2l2ZTogdHJ1ZSB9KS5waXBlKFxuICAgICAgbWFwKGV2dCA9PiBldnQudGFyZ2V0IGFzIEhUTUxWaWRlb0VsZW1lbnQpLFxuICAgICAgc2hhcmUoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpXG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbml0T25WaWRlbyA9ICh2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQpID0+XG4gICAgZnJvbUV2ZW50KHZpZGVvRWxlbWVudCwgJ2xvYWRzdGFydCcpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdmlkZW9FbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b3BsYXknLCAndHJ1ZScpKSxcbiAgICAgIG1hcChldnQgPT4gZXZ0LnRhcmdldCBhcyBIVE1MVmlkZW9FbGVtZW50KSxcbiAgICAgIHRyeVBsYXlWaWRlb0FzSXMsXG4gICAgICB0cnlQbGF5VmlkZW9NdXRlZCxcbiAgICAgIHRha2UoMSlcbiAgICApLnN1YnNjcmliZShyZXMgPT4geyAvLyBjb3VsZCBub3QgYXV0b3BsYXksIG11c3QgY2xpY2sgdG8gcGxheVxuICAgICAgcmVzLnZpZGVvRWxlbWVudC5wcmVsb2FkID0gJ25vbmUnXG4gICAgICByZXMudmlkZW9FbGVtZW50Lm11dGVkID0gZmFsc2VcbiAgICAgIHJlcy52aWRlb0VsZW1lbnQudm9sdW1lID0gMVxuICAgICAgdGhpcy5tYXliZVBsYXlBY3Rpb25SZWYoKS50YXBTb21lKHRoaXMuc2hvd1JlZilcbiAgICB9KVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxtUmVmOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+LCBwcml2YXRlIHJkOiBSZW5kZXJlcjIpIHsgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVuVW5tdXRlU2VxdWVuY2UgPSAoYWN0aW9uUmVmOiBIVE1MRWxlbWVudCkgPT4gKHJ1bk9uY2U6IGJvb2xlYW4pID0+ICh2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQpID0+IHtcbiAgICB2aWRlb0VsZW1lbnQuc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICd0cnVlJylcbiAgICBmcm9tRXZlbnQoYWN0aW9uUmVmLCAnY2xpY2snKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB2aWRlb0VsZW1lbnQubXV0ZWQgPSBmYWxzZVxuICAgICAgdmlkZW9FbGVtZW50LnZvbHVtZSA9IDFcbiAgICB9KVxuXG4gICAgdGhpcy52b2x1bWVDaGFuZ2UodmlkZW9FbGVtZW50KS5waXBlKGZpbHRlcih2ID0+ICF2Lm11dGVkIHx8IHYudm9sdW1lID4gMCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuaGlkZVJlZihhY3Rpb25SZWYpKVxuICAgIGNvbnN0IHNob3dSZWYgPSB0aGlzLnZvbHVtZUNoYW5nZSh2aWRlb0VsZW1lbnQpLnBpcGUoZmlsdGVyKHYgPT4gdi5tdXRlZCB8fCB2LnZvbHVtZSA8PSAwKSk7XG4gICAgKHJ1bk9uY2UgPyBzaG93UmVmLnBpcGUodGFrZSgxKSkgOiBzaG93UmVmKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93UmVmKGFjdGlvblJlZikpXG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNhbkV4ZWN1dGUoKSkgeyByZXR1cm4gfVxuXG4gICAgdGhpcy5tYXliZVZpZGVvRWxlbWVudCgpLnRhcFNvbWUodGhpcy5pbml0T25WaWRlbylcbiAgICB0aGlzLnZpZGVvcy5tYXAoYSA9PiBhLm5hdGl2ZUVsZW1lbnQpLmZvckVhY2godGhpcy5pbml0T25WaWRlbylcblxuICAgIHRoaXMubWF5YmVVbm11dGVBY3Rpb25SZWYoKS50YXBTb21lKHJlZiA9PiB7XG4gICAgICB0aGlzLmhpZGVSZWYocmVmKVxuXG4gICAgICBlaXRoZXIodGhpcy5tYXliZVZpZGVvRWxlbWVudCgpLnZhbHVlT3JVbmRlZmluZWQoKSxcbiAgICAgICAgbWF5YmUodGhpcy52aWRlb3MudG9BcnJheSgpW3RoaXMuZmxvVmlkZW9BdXRvcGxheUluZGV4XSkubWFwKGEgPT4gYS5uYXRpdmVFbGVtZW50KS52YWx1ZU9yVW5kZWZpbmVkKCkpXG4gICAgICAgIC50YXAoe1xuICAgICAgICAgIGxlZnQ6IHRoaXMucnVuVW5tdXRlU2VxdWVuY2UocmVmKShmYWxzZSksXG4gICAgICAgICAgcmlnaHQ6IHRoaXMucnVuVW5tdXRlU2VxdWVuY2UocmVmKSh0cnVlKVxuICAgICAgICB9KVxuICAgIH0pXG5cbiAgICB0aGlzLm1heWJlUGxheUFjdGlvblJlZigpLnRhcFNvbWUoYWN0aW9uUmVmID0+IHtcbiAgICAgIHRoaXMuaGlkZVJlZihhY3Rpb25SZWYpXG5cbiAgICAgIGZyb21FdmVudChhY3Rpb25SZWYsICdjbGljaycpLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlUmVmKGFjdGlvblJlZilcbiAgICAgICAgdGhpcy5tYXliZVZpZGVvRWxlbWVudCgpLnRhcFNvbWUodiA9PiB2LnBsYXkoKSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMub25EZXN0cm95U291cmNlLm5leHQoKVxuICAgIHRoaXMub25EZXN0cm95U291cmNlLmNvbXBsZXRlKClcbiAgfVxufVxuIl19