UNPKG

@odilo/buttons

Version:

Share buttons components for Angular and Ionic.

281 lines 19.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core'; import { ShareService, SHARE_BUTTONS } from '@odilo/core'; import { BehaviorSubject, Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; /** * @record */ function ButtonsState() { } if (false) { /** @type {?|undefined} */ ButtonsState.prototype.includedButtons; /** @type {?|undefined} */ ButtonsState.prototype.excludedButtons; /** @type {?|undefined} */ ButtonsState.prototype.userButtons; /** @type {?|undefined} */ ButtonsState.prototype.selectedButtons; /** @type {?|undefined} */ ButtonsState.prototype.expanded; /** @type {?|undefined} */ ButtonsState.prototype.shownCount; /** @type {?|undefined} */ ButtonsState.prototype.moreIcon; /** @type {?|undefined} */ ButtonsState.prototype.lessIcon; } export class ShareButtons { /** * @param {?} _share */ constructor(_share) { this._share = _share; this._state$ = new BehaviorSubject({ includedButtons: [], excludedButtons: [], userButtons: [], selectedButtons: [], expanded: true, shownCount: Object.keys(SHARE_BUTTONS).length }); this._configSub$ = Subscription.EMPTY; this.theme = this._share.config.theme; /** * Show buttons icons */ this.showIcon = true; /** * Show buttons text */ this.showText = false; /** * Show sharing count */ this.showCount = false; /** * Buttons size */ this.size = 0; /** * Share count event */ this.count = new EventEmitter(); /** * Share dialog opened event */ this.opened = new EventEmitter(); /** * Share dialog closed event */ this.closed = new EventEmitter(); } /** * @param {?} includedButtons * @return {?} */ set includedButtons(includedButtons) { this.updateState({ includedButtons }); } /** * @param {?} excludedButtons * @return {?} */ set excludedButtons(excludedButtons) { this.updateState({ excludedButtons }); } /** * @param {?} shownCount * @return {?} */ set shownButtons(shownCount) { this.updateState({ shownCount }); } /** * @return {?} */ ngOnInit() { this.state$ = this._state$.pipe(map((/** * @param {?} state * @return {?} */ (state) => { // Use component include buttons, otherwise fallback to global include buttons /** @type {?} */ const includedButtons = state.includedButtons.length ? state.includedButtons : state.userButtons; /** @type {?} */ const userButtons = includedButtons.filter((/** * @param {?} btn * @return {?} */ (btn) => state.excludedButtons.indexOf(btn) < 0)); /** @type {?} */ const selectedButtons = userButtons.slice(0, state.expanded ? userButtons.length : state.shownCount); return { userButtons, selectedButtons, expanded: state.expanded, shownCount: state.shownCount, moreIcon: state.moreIcon, lessIcon: state.lessIcon }; }))); // Subscribe to share buttons config changes, This updates the component whenever a new button is added this._configSub$ = this._share.config$.subscribe((/** * @param {?} config * @return {?} */ (config) => { // Use global include buttons, otherwise fallback to all buttons /** @type {?} */ const includedButtons = config.include.length ? config.include : Object.keys(SHARE_BUTTONS); /** @type {?} */ const userButtons = includedButtons.filter((/** * @param {?} btn * @return {?} */ (btn) => config.exclude.indexOf(btn) < 0)); this.updateState({ userButtons, expanded: false, moreIcon: config.moreButtonIcon, lessIcon: config.lessButtonIcon }); })); } /** * @return {?} */ ngOnDestroy() { this._configSub$.unsubscribe(); this._state$.complete(); } /** * @param {?} state * @return {?} */ updateState(state) { this._state$.next(Object.assign({}, this._state$.value, state)); } } ShareButtons.decorators = [ { type: Component, args: [{ selector: 'share-buttons', template: "<div *ngIf=\"state$ | async; let state\" class=\"sb-group sb-{{theme}}\">\n\n <share-button *ngFor=\"let button of state.selectedButtons\"\n [button]=\"button\"\n [theme]=\"theme\"\n [url]=\"url\"\n [title]=\"title\"\n [description]=\"description\"\n [image]=\"image\"\n [tags]=\"tags\"\n [autoSetMeta]=\"autoSetMeta\"\n [showCount]=\"showCount\"\n [showIcon]=\"showIcon\"\n [showText]=\"showText\"\n [size]=\"size\"\n (opened)=\"opened.emit($event)\"\n (closed)=\"closed.emit($event)\"\n (count)=\"count.emit($event)\"></share-button>\n\n <div class=\"sb-button sb-{{theme}}\">\n\n <expand-button *ngIf=\"state.shownCount < state.userButtons.length\"\n [expanded]=\"state.expanded\"\n [moreIcon]=\"state.moreIcon\"\n [lessIcon]=\"state.lessIcon\"\n [size]=\"(1 + size/20) * 14\"\n (toggle)=\"updateState({expanded: $event})\">\n </expand-button>\n\n </div>\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inherit}"] }] } ]; /** @nocollapse */ ShareButtons.ctorParameters = () => [ { type: ShareService } ]; ShareButtons.propDecorators = { theme: [{ type: Input }], includedButtons: [{ type: Input, args: ['include',] }], excludedButtons: [{ type: Input, args: ['exclude',] }], shownButtons: [{ type: Input, args: ['show',] }], url: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], image: [{ type: Input }], tags: [{ type: Input }], autoSetMeta: [{ type: Input }], showIcon: [{ type: Input }], showText: [{ type: Input }], showCount: [{ type: Input }], size: [{ type: Input }], count: [{ type: Output }], opened: [{ type: Output }], closed: [{ type: Output }] }; if (false) { /** @type {?} */ ShareButtons.prototype.state$; /** * @type {?} * @private */ ShareButtons.prototype._state$; /** * @type {?} * @private */ ShareButtons.prototype._configSub$; /** @type {?} */ ShareButtons.prototype.theme; /** * The sharing link * @type {?} */ ShareButtons.prototype.url; /** * The title parameter * @type {?} */ ShareButtons.prototype.title; /** * The description parameter * @type {?} */ ShareButtons.prototype.description; /** * The image parameter for sharing on Pinterest * @type {?} */ ShareButtons.prototype.image; /** * The tags parameter for sharing on Twitter and Tumblr * @type {?} */ ShareButtons.prototype.tags; /** * Sets meta tags from document head, useful when SEO is available * @type {?} */ ShareButtons.prototype.autoSetMeta; /** * Show buttons icons * @type {?} */ ShareButtons.prototype.showIcon; /** * Show buttons text * @type {?} */ ShareButtons.prototype.showText; /** * Show sharing count * @type {?} */ ShareButtons.prototype.showCount; /** * Buttons size * @type {?} */ ShareButtons.prototype.size; /** * Share count event * @type {?} */ ShareButtons.prototype.count; /** * Share dialog opened event * @type {?} */ ShareButtons.prototype.opened; /** * Share dialog closed event * @type {?} */ ShareButtons.prototype.closed; /** * @type {?} * @private */ ShareButtons.prototype._share; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmUtYnV0dG9ucy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BvZGlsby9idXR0b25zLyIsInNvdXJjZXMiOlsibGliL3NoYXJlLWJ1dHRvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBcUIsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxZQUFZLEVBQXNCLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RSxPQUFPLEVBQWMsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFckMsMkJBU0M7OztJQVJDLHVDQUEyQjs7SUFDM0IsdUNBQTJCOztJQUMzQixtQ0FBdUI7O0lBQ3ZCLHVDQUEyQjs7SUFDM0IsZ0NBQW1COztJQUNuQixrQ0FBb0I7O0lBQ3BCLGdDQUFlOztJQUNmLGdDQUFlOztBQVNqQixNQUFNLE9BQU8sWUFBWTs7OztJQW1FdkIsWUFBb0IsTUFBb0I7UUFBcEIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQWhFaEMsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFlO1lBQ2xELGVBQWUsRUFBRSxFQUFFO1lBQ25CLGVBQWUsRUFBRSxFQUFFO1lBQ25CLFdBQVcsRUFBRSxFQUFFO1lBQ2YsZUFBZSxFQUFFLEVBQUU7WUFDbkIsUUFBUSxFQUFFLElBQUk7WUFDZCxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNO1NBQzlDLENBQUMsQ0FBQztRQUVLLGdCQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUVoQyxVQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOzs7O1FBaUNqQyxhQUFRLEdBQUcsSUFBSSxDQUFDOzs7O1FBR2hCLGFB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LElBQUksbUJBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUssS0FBSyxFQUFFLENBQUM7SUFDdkQsQ0FBQzs7O1lBbkhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsbXJDQUFtQztnQkFFbkMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2hEOzs7O1lBcEJRLFlBQVk7OztvQkFtQ2xCLEtBQUs7OEJBRUwsS0FBSyxTQUFDLFNBQVM7OEJBSWYsS0FBSyxTQUFDLFNBQVM7MkJBSWYsS0FBSyxTQUFDLE1BQU07a0JBS1osS0FBSztvQkFHTCxLQUFLOzBCQUdMLEtBQUs7b0JBR0wsS0FBSzttQkFHTCxLQUFLOzBCQUdMLEtBQUs7dUJBR0wsS0FBSzt1QkFHTCxLQUFLO3dCQUdMLEtBQUs7bUJBR0wsS0FBSztvQkFHTCxNQUFNO3FCQUdOLE1BQU07cUJBR04sTUFBTTs7OztJQS9EUCw4QkFBaUM7Ozs7O0lBQ2pDLCtCQU9HOzs7OztJQUVILG1DQUF5Qzs7SUFFekMsNkJBQTBDOzs7OztJQWUxQywyQkFBcUI7Ozs7O0lBR3JCLDZCQUF1Qjs7Ozs7SUFHdkIsbUNBQTZCOzs7OztJQUc3Qiw2QkFBdUI7Ozs7O0lBR3ZCLDRCQUFzQjs7Ozs7SUFHdEIsbUNBQThCOzs7OztJQUc5QixnQ0FBeUI7Ozs7O0lBR3pCLGdDQUEwQjs7Ozs7SUFHMUIsaUNBQTJCOzs7OztJQUczQiw0QkFBa0I7Ozs7O0lBR2xCLDZCQUE2Qzs7Ozs7SUFHN0MsOEJBQThDOzs7OztJQUc5Qyw4QkFBOEM7Ozs7O0lBRWxDLDhCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgT25Jbml0LCBPbkRlc3Ryb3ksIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoYXJlU2VydmljZSwgU2hhcmVCdXR0b25zQ29uZmlnLCBTSEFSRV9CVVRUT05TIH0gZnJvbSAnQG9kaWxvL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW50ZXJmYWNlIEJ1dHRvbnNTdGF0ZSB7XG4gIGluY2x1ZGVkQnV0dG9ucz86IHN0cmluZ1tdO1xuICBleGNsdWRlZEJ1dHRvbnM/OiBzdHJpbmdbXTtcbiAgdXNlckJ1dHRvbnM/OiBzdHJpbmdbXTtcbiAgc2VsZWN0ZWRCdXR0b25zPzogc3RyaW5nW107XG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcbiAgc2hvd25Db3VudD86IG51bWJlcjtcbiAgbW9yZUljb24/OiBhbnk7XG4gIGxlc3NJY29uPzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaGFyZS1idXR0b25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NoYXJlLWJ1dHRvbnMuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NoYXJlLWJ1dHRvbnMuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTaGFyZUJ1dHRvbnMgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgc3RhdGUkOiBPYnNlcnZhYmxlPEJ1dHRvbnNTdGF0ZT47XG4gIHByaXZhdGUgX3N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QnV0dG9uc1N0YXRlPih7XG4gICAgaW5jbHVkZWRCdXR0b25zOiBbXSxcbiAgICBleGNsdWRlZEJ1dHRvbnM6IFtdLFxuICAgIHVzZXJCdXR0b25zOiBbXSxcbiAgICBzZWxlY3RlZEJ1dHRvbnM6IFtdLFxuICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgIHNob3duQ291bnQ6IE9iamVjdC5rZXlzKFNIQVJFX0JVVFRPTlMpLmxlbmd0aFxuICB9KTtcblxuICBwcml2YXRlIF9jb25maWdTdWIkID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIEBJbnB1dCgpIHRoZW1lID0gdGhpcy5fc2hhcmUuY29uZmlnLnRoZW1lO1xuXG4gIEBJbnB1dCgnaW5jbHVkZScpIHNldCBpbmNsdWRlZEJ1dHRvbnMoaW5jbHVkZWRCdXR0b25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe2luY2x1ZGVkQnV0dG9uc30pO1xuICB9XG5cbiAgQElucHV0KCdleGNsdWRlJykgc2V0IGV4Y2x1ZGVkQnV0dG9ucyhleGNsdWRlZEJ1dHRvbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy51cGRhdGVTdGF0ZSh7ZXhjbHVkZWRCdXR0b25zfSk7XG4gIH1cblxuICBASW5wdXQoJ3Nob3cnKSBzZXQgc2hvd25CdXR0b25zKHNob3duQ291bnQ6IG51bWJlcikge1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe3Nob3duQ291bnR9KTtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmluZyBsaW5rICovXG4gIEBJbnB1dCgpIHVybDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdGl0bGUgcGFyYW1ldGVyICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBkZXNjcmlwdGlvbiBwYXJhbWV0ZXIgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKiogVGhlIGltYWdlIHBhcmFtZXRlciBmb3Igc2hhcmluZyBvbiBQaW50ZXJlc3QgKi9cbiAgQElucHV0KCkgaW1hZ2U6IHN0cmluZztcblxuICAvKiogVGhlIHRhZ3MgcGFyYW1ldGVyIGZvciBzaGFyaW5nIG9uIFR3aXR0ZXIgYW5kIFR1bWJsciAqL1xuICBASW5wdXQoKSB0YWdzOiBzdHJpbmc7XG5cbiAgLyoqIFNldHMgbWV0YSB0YWdzIGZyb20gZG9jdW1lbnQgaGVhZCwgdXNlZnVsIHdoZW4gU0VPIGlzIGF2YWlsYWJsZSAqL1xuICBASW5wdXQoKSBhdXRvU2V0TWV0YTogYm9vbGVhbjtcblxuICAvKiogU2hvdyBidXR0b25zIGljb25zICovXG4gIEBJbnB1dCgpIHNob3dJY29uID0gdHJ1ZTtcblxuICAvKiogU2hvdyBidXR0b25zIHRleHQgKi9cbiAgQElucHV0KCkgc2hvd1RleHQgPSBmYWxzZTtcblxuICAvKiogU2hvdyBzaGFyaW5nIGNvdW50ICovXG4gIEBJbnB1dCgpIHNob3dDb3VudCA9IGZhbHNlO1xuXG4gIC8qKiBCdXR0b25zIHNpemUgKi9cbiAgQElucHV0KCkgc2l6ZSA9IDA7XG5cbiAgLyoqIFNoYXJlIGNvdW50IGV2ZW50ICovXG4gIEBPdXRwdXQoKSBjb3VudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBTaGFyZSBkaWFsb2cgb3BlbmVkIGV2ZW50ICovXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogU2hhcmUgZGlhbG9nIGNsb3NlZCBldmVudCAqL1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2hhcmU6IFNoYXJlU2VydmljZSkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLl9zdGF0ZSQucGlwZShcbiAgICAgIG1hcCgoc3RhdGU6IEJ1dHRvbnNTdGF0ZSkgPT4ge1xuICAgICAgICAvLyBVc2UgY29tcG9uZW50IGluY2x1ZGUgYnV0dG9ucywgb3RoZXJ3aXNlIGZhbGxiYWNrIHRvIGdsb2JhbCBpbmNsdWRlIGJ1dHRvbnNcbiAgICAgICAgY29uc3QgaW5jbHVkZWRCdXR0b25zID0gc3RhdGUuaW5jbHVkZWRCdXR0b25zLmxlbmd0aCA/IHN0YXRlLmluY2x1ZGVkQnV0dG9ucyA6IHN0YXRlLnVzZXJCdXR0b25zO1xuICAgICAgICBjb25zdCB1c2VyQnV0dG9ucyA9IGluY2x1ZGVkQnV0dG9ucy5maWx0ZXIoKGJ0bikgPT4gc3RhdGUuZXhjbHVkZWRCdXR0b25zLmluZGV4T2YoYnRuKSA8IDApO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEJ1dHRvbnMgPSB1c2VyQnV0dG9ucy5zbGljZSgwLCBzdGF0ZS5leHBhbmRlZCA/IHVzZXJCdXR0b25zLmxlbmd0aCA6IHN0YXRlLnNob3duQ291bnQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJCdXR0b25zLFxuICAgICAgICAgIHNlbGVjdGVkQnV0dG9ucyxcbiAgICAgICAgICBleHBhbmRlZDogc3RhdGUuZXhwYW5kZWQsXG4gICAgICAgICAgc2hvd25Db3VudDogc3RhdGUuc2hvd25Db3VudCxcbiAgICAgICAgICBtb3JlSWNvbjogc3RhdGUubW9yZUljb24sXG4gICAgICAgICAgbGVzc0ljb246IHN0YXRlLmxlc3NJY29uXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gc2hhcmUgYnV0dG9ucyBjb25maWcgY2hhbmdlcywgVGhpcyB1cGRhdGVzIHRoZSBjb21wb25lbnQgd2hlbmV2ZXIgYSBuZXcgYnV0dG9uIGlzIGFkZGVkXG4gICAgdGhpcy5fY29uZmlnU3ViJCA9IHRoaXMuX3NoYXJlLmNvbmZpZyQuc3Vic2NyaWJlKChjb25maWc6IFNoYXJlQnV0dG9uc0NvbmZpZykgPT4ge1xuICAgICAgLy8gVXNlIGdsb2JhbCBpbmNsdWRlIGJ1dHRvbnMsIG90aGVyd2lzZSBmYWxsYmFjayB0byBhbGwgYnV0dG9uc1xuICAgICAgY29uc3QgaW5jbHVkZWRCdXR0b25zID0gY29uZmlnLmluY2x1ZGUubGVuZ3RoID8gY29uZmlnLmluY2x1ZGUgOiBPYmplY3Qua2V5cyhTSEFSRV9CVVRUT05TKTtcbiAgICAgIGNvbnN0IHVzZXJCdXR0b25zID0gaW5jbHVkZWRCdXR0b25zLmZpbHRlcigoYnRuKSA9PiBjb25maWcuZXhjbHVkZS5pbmRleE9mKGJ0bikgPCAwKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgICB1c2VyQnV0dG9ucyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBtb3JlSWNvbjogY29uZmlnLm1vcmVCdXR0b25JY29uLFxuICAgICAgICBsZXNzSWNvbjogY29uZmlnLmxlc3NCdXR0b25JY29uXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NvbmZpZ1N1YiQudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zdGF0ZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHN0YXRlOiBCdXR0b25zU3RhdGUpIHtcbiAgICB0aGlzLl9zdGF0ZSQubmV4dCh7Li4udGhpcy5fc3RhdGUkLnZhbHVlLCAuLi5zdGF0ZX0pO1xuICB9XG5cbn1cblxuLyoqXG4gKiBFeHBsYW5hdGlvbiBvZiB0aGUgYWJvdmUgY29kZTpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIEluY2x1ZGUgYnV0dG9uczogaW5jbHVkZXMgb25seSB3YW50ZWQgYnV0dG9ucyBhbmQgZXhjbHVkZXMgdGhlIHJlc3RcbiBFeGNsdWRlIGJ1dHRvbnM6IGV4Y2x1ZGVzIG9ubHkgdGhlIHVud2FudGVkIGJ1dHRvbnNcbiBVc2VyIGJ1dHRvbnMgPSBJbmNsdWRlIGJ1dHRvbnMgLSBleGNsdWRlIGJ1dHRvbnNcbiBTZWxlY3RlZCBCdXR0b25zID0gVXNlciBidXR0b25zIFtzaG93biBudW1iZXJdXG4gKi9cbiJdfQ==