@flosportsinc/ng-video-autoplay
Version:
Simple way to ensure videos autoplay even if they need to be muted first.
361 lines • 26 kB
JavaScript
/**
* @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