ng-gpt
Version:
A Angular implementation of the google GPT API.
181 lines • 25.1 kB
JavaScript
import { isPlatformBrowser } from '@angular/common';
import { Directive, EventEmitter, Inject, Input, Output, PLATFORM_ID, } from '@angular/core';
import { loadImaSdk } from '@alugha/ima';
import * as i0 from "@angular/core";
import * as i1 from "./services";
export class NgGptVideoDirective {
constructor(platformId, elementRef, renderer, gptIDGenerator) {
this.platformId = platformId;
this.elementRef = elementRef;
this.renderer = renderer;
this.gptIDGenerator = gptIDGenerator;
this.adEvents = new EventEmitter();
this.adsDone = false;
}
ngOnInit() {
if (isPlatformBrowser(this.platformId)) {
const el = this.elementRef.nativeElement;
if (!this.id) {
this.gptIDGenerator.gptIDGenerator(el);
}
this.contentPlayer = el.querySelector('video');
this.renderer.setAttribute(this.contentPlayer, 'width', this.sizes[0].toString());
this.renderer.setAttribute(this.contentPlayer, 'height', this.sizes[1].toString());
this.adContainer = el.querySelector('.ad-container');
if (!this.adContainer) {
this.adContainer = this.renderer.createElement('div');
this.renderer.addClass(this.adContainer, 'ad-container');
this.renderer.appendChild(el, this.adContainer);
}
// ima setup
loadImaSdk().then((ima) => {
this.ima = ima;
return this.setUpIMA();
});
this.adActions.subscribe((act) => {
switch (act) {
case 'play':
this.play();
break;
case 'pause':
this.pause();
break;
case 'resume':
this.resume();
break;
}
});
}
}
play() {
if (!this.adsDone) {
this.initialUserAction();
this.loadAds();
this.adsDone = true;
}
}
pause() {
if (this.adsManager) {
this.adsManager.pause();
}
}
resume() {
if (this.adsManager) {
this.adsManager.resume();
}
}
setUpIMA() {
// Create the ad display container.
this.adDisplayContainer = new this.ima.AdDisplayContainer(this.adContainer, this.contentPlayer);
// Create ads loader.
this.adsLoader = new this.ima.AdsLoader(this.adDisplayContainer);
// Listen and respond to ads loaded and error events.
this.adsLoader.addEventListener(this.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, (event) => this.onAdsManagerLoaded(event), false);
this.adsLoader.addEventListener(this.ima.AdErrorEvent.Type.AD_ERROR, (event) => this.onAdError(event), false);
// An event listener to tell the SDK that our content video
// is completed so the SDK can play any post-roll ads.
this.contentPlayer.onended = () => {
this.contentEnded();
};
}
initialUserAction() {
this.adDisplayContainer.initialize();
this.contentPlayer.load();
}
requestAds(adTagUrl) {
const adsRequest = new this.ima.AdsRequest();
adsRequest.adTagUrl = adTagUrl;
adsRequest.linearAdSlotWidth = this.sizes[0];
adsRequest.linearAdSlotHeight = this.sizes[1];
adsRequest.nonLinearAdSlotWidth = this.sizes[0];
adsRequest.nonLinearAdSlotHeight = this.sizes[1];
this.adsLoader.requestAds(adsRequest);
}
contentEnded() {
this.contentCompleteCalled = true;
this.adsLoader.contentComplete();
}
onAdsManagerLoaded(adsManagerLoadedEvent) {
const adsRenderingSettings = new this.ima.AdsRenderingSettings();
adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;
this.adsManager = adsManagerLoadedEvent.getAdsManager(this.contentPlayer, adsRenderingSettings);
this.startAdsManager(this.adsManager);
}
startAdsManager(adsManager) {
// Attach the pause/resume events.
adsManager.addEventListener(this.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, () => this.onContentPauseRequested(), false);
adsManager.addEventListener(this.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, () => this.onContentResumeRequested(), false);
// Handle errors.
adsManager.addEventListener(this.ima.AdErrorEvent.Type.AD_ERROR, (event) => this.onAdError(event), false);
const events = [
this.ima.AdEvent.Type.ALL_ADS_COMPLETED,
this.ima.AdEvent.Type.CLICK,
this.ima.AdEvent.Type.COMPLETE,
this.ima.AdEvent.Type.FIRST_QUARTILE,
this.ima.AdEvent.Type.LOADED,
this.ima.AdEvent.Type.MIDPOINT,
this.ima.AdEvent.Type.PAUSED,
this.ima.AdEvent.Type.STARTED,
this.ima.AdEvent.Type.THIRD_QUARTILE,
];
events.forEach((event) => adsManager.addEventListener(event, (adEvent) => this.onAdEvent(adEvent), false));
adsManager.init(this.sizes[0], this.sizes[1], this.ima.ViewMode.NORMAL);
adsManager.start();
}
onContentPauseRequested() {
this.pauseForAd();
}
onContentResumeRequested() {
// Without this check the video starts over from the beginning on a
// post-roll's CONTENT_RESUME_REQUESTED
if (!this.contentCompleteCalled) {
this.resumeAfterAd();
}
}
onAdEvent(adEvent) {
if (adEvent.type === this.ima.AdEvent.Type.LOADED) {
const ad = adEvent.getAd();
if (!ad.isLinear()) {
this.onContentResumeRequested();
}
}
this.adEvents.emit(adEvent);
}
onAdError(adErrorEvent) {
if (this.adsManager) {
this.adsManager.destroy();
}
this.resumeAfterAd();
this.adEvents.emit(adErrorEvent);
}
// application functions
resumeAfterAd() {
this.contentPlayer.play();
}
pauseForAd() {
this.contentPlayer.pause();
}
loadAds() {
this.requestAds(this.adTagUrl);
}
}
NgGptVideoDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: NgGptVideoDirective, deps: [{ token: PLATFORM_ID }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.GptIDGeneratorService }], target: i0.ɵɵFactoryTarget.Directive });
NgGptVideoDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.4", type: NgGptVideoDirective, selector: "gpt-video", inputs: { id: "id", adTagUrl: "adTagUrl", sizes: "sizes", adActions: "adActions" }, outputs: { adEvents: "adEvents" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: NgGptVideoDirective, decorators: [{
type: Directive,
args: [{ selector: 'gpt-video' }]
}], ctorParameters: function () { return [{ type: Object, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.GptIDGeneratorService }]; }, propDecorators: { id: [{
type: Input
}], adTagUrl: [{
type: Input
}], sizes: [{
type: Input
}], adEvents: [{
type: Output
}], adActions: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZ3B0LXZpZGVvLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWdwdC9zcmMvbGliL25nLWdwdC12aWRlby5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxHQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQVUsTUFBTSxhQUFhLENBQUM7OztBQUlqRCxNQUFNLE9BQU8sbUJBQW1CO0lBaUI5QixZQUMrQixVQUFrQixFQUN2QyxVQUFzQixFQUN0QixRQUFtQixFQUNuQixjQUFxQztRQUhoQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ3ZDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFqQnJDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBVXJDLFlBQU8sR0FBRyxLQUFLLENBQUM7SUFRckIsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUV6QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN4QztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FDeEIsSUFB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bnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGxvYWRJbWFTZGssIGdvb2dsZSB9IGZyb20gJ0BhbHVnaGEvaW1hJztcbmltcG9ydCB7IEdwdElER2VuZXJhdG9yU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMnO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdncHQtdmlkZW8nIH0pXG5leHBvcnQgY2xhc3MgTmdHcHRWaWRlb0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFkVGFnVXJsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNpemVzOiBbbnVtYmVyLCBudW1iZXJdO1xuICBAT3V0cHV0KCkgYWRFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCkgYWRBY3Rpb25zOiBFdmVudEVtaXR0ZXI8J3BsYXknIHwgJ3BhdXNlJyB8ICdyZXN1bWUnPjtcblxuICBjb250ZW50UGxheWVyOiBIVE1MVmlkZW9FbGVtZW50O1xuICBhZENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBjb250ZW50Q29tcGxldGVDYWxsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgYWREaXNwbGF5Q29udGFpbmVyOiBnb29nbGUuaW1hLkFkRGlzcGxheUNvbnRhaW5lcjtcbiAgcHJpdmF0ZSBhZHNMb2FkZXI6IGdvb2dsZS5pbWEuQWRzTG9hZGVyO1xuICBwcml2YXRlIGFkc01hbmFnZXI6IGdvb2dsZS5pbWEuQWRzTWFuYWdlcjtcbiAgcHJpdmF0ZSBhZHNEb25lID0gZmFsc2U7XG4gIHByaXZhdGUgaW1hOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGdwdElER2VuZXJhdG9yOiBHcHRJREdlbmVyYXRvclNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgICAgdGhpcy5ncHRJREdlbmVyYXRvci5ncHRJREdlbmVyYXRvcihlbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29udGVudFBsYXllciA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5jb250ZW50UGxheWVyLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICB0aGlzLnNpemVzWzBdLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5jb250ZW50UGxheWVyLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgdGhpcy5zaXplc1sxXS50b1N0cmluZygpXG4gICAgICApO1xuXG4gICAgICB0aGlzLmFkQ29udGFpbmVyID0gZWwucXVlcnlTZWxlY3RvcignLmFkLWNvbnRhaW5lcicpO1xuICAgICAgaWYgKCF0aGlzLmFkQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuYWRDb250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYWRDb250YWluZXIsICdhZC1jb250YWluZXInKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChlbCwgdGhpcy5hZENvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIGltYSBzZXR1cFxuICAgICAgbG9hZEltYVNkaygpLnRoZW4oKGltYSkgPT4ge1xuICAgICAgICB0aGlzLmltYSA9IGltYTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0VXBJTUEoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFkQWN0aW9ucy5zdWJzY3JpYmUoKGFjdCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGFjdCkge1xuICAgICAgICAgIGNhc2UgJ3BsYXknOlxuICAgICAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwYXVzZSc6XG4gICAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdyZXN1bWUnOlxuICAgICAgICAgICAgdGhpcy5yZXN1bWUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwbGF5KCkge1xuICAgIGlmICghdGhpcy5hZHNEb25lKSB7XG4gICAgICB0aGlzLmluaXRpYWxVc2VyQWN0aW9uKCk7XG4gICAgICB0aGlzLmxvYWRBZHMoKTtcbiAgICAgIHRoaXMuYWRzRG9uZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuYWRzTWFuYWdlcikge1xuICAgICAgdGhpcy5hZHNNYW5hZ2VyLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzdW1lKCkge1xuICAgIGlmICh0aGlzLmFkc01hbmFnZXIpIHtcbiAgICAgIHRoaXMuYWRzTWFuYWdlci5yZXN1bWUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRVcElNQSgpIHtcbiAgICAvLyBDcmVhdGUgdGhlIGFkIGRpc3BsYXkgY29udGFpbmVyLlxuICAgIHRoaXMuYWREaXNwbGF5Q29udGFpbmVyID0gbmV3IHRoaXMuaW1hLkFkRGlzcGxheUNvbnRhaW5lcihcbiAgICAgIHRoaXMuYWRDb250YWluZXIsXG4gICAgICB0aGlzLmNvbnRlbnRQbGF5ZXJcbiAgICApO1xuICAgIC8vIENyZWF0ZSBhZHMgbG9hZGVyLlxuICAgIHRoaXMuYWRzTG9hZGVyID0gbmV3IHRoaXMuaW1hLkFkc0xvYWRlcih0aGlzLmFkRGlzcGxheUNvbnRhaW5lcik7XG4gICAgLy8gTGlzdGVuIGFuZCByZXNwb25kIHRvIGFkcyBsb2FkZWQgYW5kIGVycm9yIGV2ZW50cy5cbiAgICB0aGlzLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgdGhpcy5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVELFxuICAgICAgKGV2ZW50KSA9PiB0aGlzLm9uQWRzTWFuYWdlckxvYWRlZChldmVudCksXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgdGhpcy5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIHRoaXMuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLFxuICAgICAgKGV2ZW50KSA9PiB0aGlzLm9uQWRFcnJvcihldmVudCksXG4gICAgICBmYWxzZVxuICAgICk7XG5cbiAgICAvLyBBbiBldmVudCBsaXN0ZW5lciB0byB0ZWxsIHRoZSBTREsgdGhhdCBvdXIgY29udGVudCB2aWRlb1xuICAgIC8vIGlzIGNvbXBsZXRlZCBzbyB0aGUgU0RLIGNhbiBwbGF5IGFueSBwb3N0LXJvbGwgYWRzLlxuICAgIHRoaXMuY29udGVudFBsYXllci5vbmVuZGVkID0gKCkgPT4ge1xuICAgICAgdGhpcy5jb250ZW50RW5kZWQoKTtcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbFVzZXJBY3Rpb24oKSB7XG4gICAgdGhpcy5hZERpc3BsYXlDb250YWluZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29udGVudFBsYXllci5sb2FkKCk7XG4gIH1cblxuICByZXF1ZXN0QWRzKGFkVGFnVXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZHNSZXF1ZXN0ID0gbmV3IHRoaXMuaW1hLkFkc1JlcXVlc3QoKTtcbiAgICBhZHNSZXF1ZXN0LmFkVGFnVXJsID0gYWRUYWdVcmw7XG4gICAgYWRzUmVxdWVzdC5saW5lYXJBZFNsb3RXaWR0aCA9IHRoaXMuc2l6ZXNbMF07XG4gICAgYWRzUmVxdWVzdC5saW5lYXJBZFNsb3RIZWlnaHQgPSB0aGlzLnNpemVzWzFdO1xuICAgIGFkc1JlcXVlc3Qubm9uTGluZWFyQWRTbG90V2lkdGggPSB0aGlzLnNpemVzWzBdO1xuICAgIGFkc1JlcXVlc3Qubm9uTGluZWFyQWRTbG90SGVpZ2h0ID0gdGhpcy5zaXplc1sxXTtcbiAgICB0aGlzLmFkc0xvYWRlci5yZXF1ZXN0QWRzKGFkc1JlcXVlc3QpO1xuICB9XG5cbiAgY29udGVudEVuZGVkKCkge1xuICAgIHRoaXMuY29udGVudENvbXBsZXRlQ2FsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmFkc0xvYWRlci5jb250ZW50Q29tcGxldGUoKTtcbiAgfVxuXG4gIG9uQWRzTWFuYWdlckxvYWRlZChhZHNNYW5hZ2VyTG9hZGVkRXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGFkc1JlbmRlcmluZ1NldHRpbmdzID0gbmV3IHRoaXMuaW1hLkFkc1JlbmRlcmluZ1NldHRpbmdzKCk7XG4gICAgYWRzUmVuZGVyaW5nU2V0dGluZ3MucmVzdG9yZUN1c3RvbVBsYXliYWNrU3RhdGVPbkFkQnJlYWtDb21wbGV0ZSA9IHRydWU7XG4gICAgdGhpcy5hZHNNYW5hZ2VyID0gYWRzTWFuYWdlckxvYWRlZEV2ZW50LmdldEFkc01hbmFnZXIoXG4gICAgICB0aGlzLmNvbnRlbnRQbGF5ZXIsXG4gICAgICBhZHNSZW5kZXJpbmdTZXR0aW5nc1xuICAgICk7XG4gICAgdGhpcy5zdGFydEFkc01hbmFnZXIodGhpcy5hZHNNYW5hZ2VyKTtcbiAgfVxuXG4gIHN0YXJ0QWRzTWFuYWdlcihhZHNNYW5hZ2VyOiBnb29nbGUuaW1hLkFkc01hbmFnZXIpIHtcbiAgICAvLyBBdHRhY2ggdGhlIHBhdXNlL3Jlc3VtZSBldmVudHMuXG4gICAgYWRzTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgdGhpcy5pbWEuQWRFdmVudC5UeXBlLkNPTlRFTlRfUEFVU0VfUkVRVUVTVEVELFxuICAgICAgKCkgPT4gdGhpcy5vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIGFkc01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIHRoaXMuaW1hLkFkRXZlbnQuVHlwZS5DT05URU5UX1JFU1VNRV9SRVFVRVNURUQsXG4gICAgICAoKSA9PiB0aGlzLm9uQ29udGVudFJlc3VtZVJlcXVlc3RlZCgpLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIC8vIEhhbmRsZSBlcnJvcnMuXG4gICAgYWRzTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgdGhpcy5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsXG4gICAgICAoZXZlbnQ6IGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50KSA9PiB0aGlzLm9uQWRFcnJvcihldmVudCksXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgY29uc3QgZXZlbnRzID0gW1xuICAgICAgdGhpcy5pbWEuQWRFdmVudC5UeXBlLkFMTF9BRFNfQ09NUExFVEVELFxuICAgICAgdGhpcy5pbWEuQWRFdmVudC5UeXBlLkNMSUNLLFxuICAgICAgdGhpcy5pbWEuQWRFdmVudC5UeXBlLkNPTVBMRVRFLFxuICAgICAgdGhpcy5pbWEuQWRFdmVudC5UeXBlLkZJUlNUX1FVQVJUSUxFLFxuICAgICAgdGhpcy5pbWEuQWRFdmVudC5UeXBlLkxPQURFRCxcbiAgICAgIHRoaXMuaW1hLkFkRXZlbnQuVHlwZS5NSURQT0lOVCxcbiAgICAgIHRoaXMuaW1hLkFkRXZlbnQuVHlwZS5QQVVTRUQsXG4gICAgICB0aGlzLmltYS5BZEV2ZW50LlR5cGUuU1RBUlRFRCxcbiAgICAgIHRoaXMuaW1hLkFkRXZlbnQuVHlwZS5USElSRF9RVUFSVElMRSxcbiAgICBdO1xuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT5cbiAgICAgIGFkc01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIChhZEV2ZW50KSA9PiB0aGlzLm9uQWRFdmVudChhZEV2ZW50KSxcbiAgICAgICAgZmFsc2VcbiAgICAgIClcbiAgICApO1xuXG4gICAgYWRzTWFuYWdlci5pbml0KHRoaXMuc2l6ZXNbMF0sIHRoaXMuc2l6ZXNbMV0sIHRoaXMuaW1hLlZpZXdNb2RlLk5PUk1BTCk7XG5cbiAgICBhZHNNYW5hZ2VyLnN0YXJ0KCk7XG4gIH1cblxuICBvbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpIHtcbiAgICB0aGlzLnBhdXNlRm9yQWQoKTtcbiAgfVxuXG4gIG9uQ29udGVudFJlc3VtZVJlcXVlc3RlZCgpIHtcbiAgICAvLyBXaXRob3V0IHRoaXMgY2hlY2sgdGhlIHZpZGVvIHN0YXJ0cyBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvbiBhXG4gICAgLy8gcG9zdC1yb2xsJ3MgQ09OVEVOVF9SRVNVTUVfUkVRVUVTVEVEXG4gICAgaWYgKCF0aGlzLmNvbnRlbnRDb21wbGV0ZUNhbGxlZCkge1xuICAgICAgdGhpcy5yZXN1bWVBZnRlckFkKCk7XG4gICAgfVxuICB9XG5cbiAgb25BZEV2ZW50KGFkRXZlbnQ6IGFueSkge1xuICAgIGlmIChhZEV2ZW50LnR5cGUgPT09IHRoaXMuaW1hLkFkRXZlbnQuVHlwZS5MT0FERUQpIHtcbiAgICAgIGNvbnN0IGFkID0gYWRFdmVudC5nZXRBZCgpO1xuICAgICAgaWYgKCFhZC5pc0xpbmVhcigpKSB7XG4gICAgICAgIHRoaXMub25Db250ZW50UmVzdW1lUmVxdWVzdGVkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRFdmVudHMuZW1pdChhZEV2ZW50KTtcbiAgfVxuXG4gIG9uQWRFcnJvcihhZEVycm9yRXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmFkc01hbmFnZXIpIHtcbiAgICAgIHRoaXMuYWRzTWFuYWdlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMucmVzdW1lQWZ0ZXJBZCgpO1xuICAgIHRoaXMuYWRFdmVudHMuZW1pdChhZEVycm9yRXZlbnQpO1xuICB9XG5cbiAgLy8gYXBwbGljYXRpb24gZnVuY3Rpb25zXG5cbiAgcmVzdW1lQWZ0ZXJBZCgpIHtcbiAgICB0aGlzLmNvbnRlbnRQbGF5ZXIucGxheSgpO1xuICB9XG5cbiAgcGF1c2VGb3JBZCgpIHtcbiAgICB0aGlzLmNvbnRlbnRQbGF5ZXIucGF1c2UoKTtcbiAgfVxuXG4gIGxvYWRBZHMoKSB7XG4gICAgdGhpcy5yZXF1ZXN0QWRzKHRoaXMuYWRUYWdVcmwpO1xuICB9XG59XG4iXX0=