UNPKG

angular-instantsearch

Version:

Lightning-fast search for Angular apps, by Algolia.

133 lines (132 loc) 15.7 kB
import { Component, Input, Inject, forwardRef, NgZone, ContentChild, Optional, } from '@angular/core'; import { connectVoiceSearch } from 'instantsearch.js/es/connectors'; import { TypedBaseWidget } from '../typed-base-widget'; import { NgAisInstantSearch } from '../instantsearch/instantsearch'; import { NgAisIndex } from '../index-widget/index-widget'; import { noop } from '../utils'; export class NgAisVoiceSearch extends TypedBaseWidget { constructor(parentIndex, instantSearchInstance, zone) { super('VoiceSearch'); this.parentIndex = parentIndex; this.instantSearchInstance = instantSearchInstance; this.zone = zone; // rendering options this.buttonTitle = 'Search by voice'; this.disabledButtonTitle = 'Search by voice (not supported on this browser)'; this.state = { isBrowserSupported: undefined, isListening: undefined, toggleListening: noop, voiceListeningState: { status: 'initial', transcript: '', isSpeechFinal: false, errorCode: undefined, }, }; this.templateContext = { status: 'initial', errorCode: undefined, transcript: '', isSpeechFinal: false, isListening: false, isBrowserSupported: false, }; this.handleClick = (event) => { event.currentTarget.blur(); this.state.toggleListening(); }; this.isNotAllowedError = () => this.state.voiceListeningState.status === 'error' && this.state.voiceListeningState.errorCode === 'not-allowed'; this.updateState = (state) => { this.zone.run(() => { this.templateContext = { status: state.voiceListeningState.status, errorCode: state.voiceListeningState.errorCode, transcript: state.voiceListeningState.transcript, isSpeechFinal: state.voiceListeningState.isSpeechFinal, isListening: state.isListening, isBrowserSupported: state.isBrowserSupported, }; this.state = state; }); }; } ngOnInit() { this.createWidget(connectVoiceSearch, { searchAsYouSpeak: this.searchAsYouSpeak, }, { $$widgetType: 'ais.voiceSearch', }); super.ngOnInit(); } } NgAisVoiceSearch.decorators = [ { type: Component, args: [{ selector: 'ais-voice-search', template: ` <div [class]="cx()"> <button type="button" [class]="cx('button')" [title]="state.isBrowserSupported ? buttonTitle : disabledButtonTitle" [disabled]="!state.isBrowserSupported" (click)="handleClick($event)" > <ng-container *ngTemplateOutlet="button ? button : defaultButton; context: templateContext"></ng-container> </button> <div [class]="cx('status')"> <ng-container *ngTemplateOutlet="status ? status : defaultStatus; context: templateContext"></ng-container> </div> </div> <ng-template #defaultButton let-status="status" let-errorCode="errorCode" let-isListening="isListening"> <svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' strokeWidth='2' strokeLinecap='round' strokeLinejoin='round' > <ng-container *ngIf="isNotAllowedError(); then errorSvgContent else normalSvgContent"> </ng-container> <ng-template #errorSvgContent> <line x1="1" y1="1" x2="23" y2="23"></line> <path d="M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6"></path> <path d="M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23"></path> <line x1="12" y1="19" x2="12" y2="23"></line> <line x1="8" y1="23" x2="16" y2="23"></line> </ng-template> <ng-template #normalSvgContent> <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" [attr.fill]="isListening ? 'currentColor' : 'none'" ></path> <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path> <line x1="12" y1="19" x2="12" y2="23"></line> <line x1="8" y1="23" x2="16" y2="23"></line> </ng-template> </svg> </ng-template> <ng-template #defaultStatus let-transcript="transcript"> <p>{{transcript}}</p> </ng-template> ` },] } ]; NgAisVoiceSearch.ctorParameters = () => [ { type: NgAisIndex, decorators: [{ type: Inject, args: [forwardRef(() => NgAisIndex),] }, { type: Optional }] }, { type: NgAisInstantSearch, decorators: [{ type: Inject, args: [forwardRef(() => NgAisInstantSearch),] }] }, { type: NgZone } ]; NgAisVoiceSearch.propDecorators = { button: [{ type: ContentChild, args: ['button', { static: false },] }], status: [{ type: ContentChild, args: ['status', { static: false },] }], buttonTitle: [{ type: Input }], disabledButtonTitle: [{ type: Input }], searchAsYouSpeak: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2Utc2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZvaWNlLXNlYXJjaC92b2ljZS1zZWFyY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sWUFBWSxFQUlaLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUE4RGhDLE1BQU0sT0FBTyxnQkFDWCxTQUFRLGVBR1A7SUF5Q0QsWUFHUyxXQUF1QixFQUV2QixxQkFBeUMsRUFDeEMsSUFBWTtRQUVwQixLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFMZCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUV2QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQW9CO1FBQ3hDLFNBQUksR0FBSixJQUFJLENBQVE7UUF4Q3RCLG9CQUFvQjtRQUNKLGdCQUFXLEdBQVcsaUJBQWlCLENBQUM7UUFFakQsd0JBQW1CLEdBQ3hCLGlEQUFpRCxDQUFDO1FBTTdDLFVBQUssR0FBMkI7WUFDckMsa0JBQWtCLEVBQUUsU0FBUztZQUM3QixXQUFXLEVBQUUsU0FBUztZQUN0QixlQUFlLEVBQUUsSUFBSTtZQUNyQixtQkFBbUIsRUFBRTtnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLFVBQVUsRUFBRSxFQUFFO2dCQUNkLGFBQWEsRUFBRSxLQUFLO2dCQUNwQixTQUFTLEVBQUUsU0FBUzthQUNyQjtTQUNGLENBQUM7UUFFSyxvQkFBZSxHQUdsQjtZQUNGLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsYUFBYSxFQUFFLEtBQUs7WUFDcEIsV0FBVyxFQUFFLEtBQUs7WUFDbEIsa0JBQWtCLEVBQUUsS0FBSztTQUMxQixDQUFDO1FBMEJLLGdCQUFXLEdBQUcsQ0FBQyxLQUFpQixFQUFRLEVBQUU7WUFDOUMsS0FBSyxDQUFDLGFBQTZCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUM7UUFFSyxzQkFBaUIsR0FBRyxHQUFZLEVBQUUsQ0FDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssT0FBTztZQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUM7UUFFdEQsZ0JBQVcsR0FBRyxDQUFDLEtBQTZCLEVBQVEsRUFBRTtZQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUc7b0JBQ3JCLE1BQU0sRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBTTtvQkFDeEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTO29CQUM5QyxVQUFVLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFVBQVU7b0JBQ2hELGFBQWEsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsYUFBYTtvQkFDdEQsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO2lCQUM3QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBcENGLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksQ0FDZixrQkFBa0IsRUFDbEI7WUFDRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQ3hDLEVBQ0Q7WUFDRSxZQUFZLEVBQUUsaUJBQWlCO1NBQ2hDLENBQ0YsQ0FBQztRQUNGLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNuQixDQUFDOzs7WUExSEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbURUO2FBQ0Y7OztZQTlEUSxVQUFVLHVCQTZHZCxNQUFNLFNBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUNuQyxRQUFRO1lBL0dKLGtCQUFrQix1QkFpSHRCLE1BQU0sU0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUM7WUEzSDlDLE1BQU07OztxQkFnRkwsWUFBWSxTQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7cUJBRXhDLFlBQVksU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzBCQUl4QyxLQUFLO2tDQUNMLEtBQUs7K0JBS0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIEluamVjdCxcbiAgZm9yd2FyZFJlZixcbiAgTmdab25lLFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIFRlbXBsYXRlUmVmLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgY29ubmVjdFZvaWNlU2VhcmNoIH0gZnJvbSAnaW5zdGFudHNlYXJjaC5qcy9lcy9jb25uZWN0b3JzJztcbmltcG9ydCB7IFR5cGVkQmFzZVdpZGdldCB9IGZyb20gJy4uL3R5cGVkLWJhc2Utd2lkZ2V0JztcbmltcG9ydCB7IE5nQWlzSW5zdGFudFNlYXJjaCB9IGZyb20gJy4uL2luc3RhbnRzZWFyY2gvaW5zdGFudHNlYXJjaCc7XG5pbXBvcnQgeyBOZ0Fpc0luZGV4IH0gZnJvbSAnLi4vaW5kZXgtd2lkZ2V0L2luZGV4LXdpZGdldCc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgVm9pY2VTZWFyY2hDb25uZWN0b3JQYXJhbXMsXG4gIFZvaWNlU2VhcmNoV2lkZ2V0RGVzY3JpcHRpb24sXG4gIFZvaWNlU2VhcmNoUmVuZGVyU3RhdGUsXG59IGZyb20gJ2luc3RhbnRzZWFyY2guanMvZXMvY29ubmVjdG9ycy92b2ljZS1zZWFyY2gvY29ubmVjdFZvaWNlU2VhcmNoJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWlzLXZvaWNlLXNlYXJjaCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY3goKVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2NsYXNzXT1cImN4KCdidXR0b24nKVwiXG4gICAgICAgIFt0aXRsZV09XCJzdGF0ZS5pc0Jyb3dzZXJTdXBwb3J0ZWQgPyBidXR0b25UaXRsZSA6IGRpc2FibGVkQnV0dG9uVGl0bGVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlLmlzQnJvd3NlclN1cHBvcnRlZFwiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbiA/IGJ1dHRvbiA6IGRlZmF1bHRCdXR0b247IGNvbnRleHQ6IHRlbXBsYXRlQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2IFtjbGFzc109XCJjeCgnc3RhdHVzJylcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXR1cyA/IHN0YXR1cyA6IGRlZmF1bHRTdGF0dXM7IGNvbnRleHQ6IHRlbXBsYXRlQ29udGV4dFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRCdXR0b24gbGV0LXN0YXR1cz1cInN0YXR1c1wiIGxldC1lcnJvckNvZGU9XCJlcnJvckNvZGVcIiBsZXQtaXNMaXN0ZW5pbmc9XCJpc0xpc3RlbmluZ1wiPlxuICAgICAgPHN2Z1xuICAgICAgICB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnXG4gICAgICAgIHdpZHRoPScxNidcbiAgICAgICAgaGVpZ2h0PScxNidcbiAgICAgICAgdmlld0JveD0nMCAwIDI0IDI0J1xuICAgICAgICBmaWxsPSdub25lJ1xuICAgICAgICBzdHJva2U9J2N1cnJlbnRDb2xvcidcbiAgICAgICAgc3Ryb2tlV2lkdGg9JzInXG4gICAgICAgIHN0cm9rZUxpbmVjYXA9J3JvdW5kJ1xuICAgICAgICBzdHJva2VMaW5lam9pbj0ncm91bmQnXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc05vdEFsbG93ZWRFcnJvcigpOyB0aGVuIGVycm9yU3ZnQ29udGVudCBlbHNlIG5vcm1hbFN2Z0NvbnRlbnRcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZXJyb3JTdmdDb250ZW50PlxuICAgICAgICAgIDxsaW5lIHgxPVwiMVwiIHkxPVwiMVwiIHgyPVwiMjNcIiB5Mj1cIjIzXCI+PC9saW5lPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOSA5djNhMyAzIDAgMCAwIDUuMTIgMi4xMk0xNSA5LjM0VjRhMyAzIDAgMCAwLTUuOTQtLjZcIj48L3BhdGg+XG4gICAgICAgICAgPHBhdGggZD1cIk0xNyAxNi45NUE3IDcgMCAwIDEgNSAxMnYtMm0xNCAwdjJhNyA3IDAgMCAxLS4xMSAxLjIzXCI+PC9wYXRoPlxuICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjE5XCIgeDI9XCIxMlwiIHkyPVwiMjNcIj48L2xpbmU+XG4gICAgICAgICAgPGxpbmUgeDE9XCI4XCIgeTE9XCIyM1wiIHgyPVwiMTZcIiB5Mj1cIjIzXCI+PC9saW5lPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI25vcm1hbFN2Z0NvbnRlbnQ+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNMTIgMWEzIDMgMCAwIDAtMyAzdjhhMyAzIDAgMCAwIDYgMFY0YTMgMyAwIDAgMC0zLTN6XCJcbiAgICAgICAgICAgIFthdHRyLmZpbGxdPVwiaXNMaXN0ZW5pbmcgPyAnY3VycmVudENvbG9yJyA6ICdub25lJ1wiXG4gICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE5IDEwdjJhNyA3IDAgMCAxLTE0IDB2LTJcIj48L3BhdGg+XG4gICAgICAgICAgPGxpbmUgeDE9XCIxMlwiIHkxPVwiMTlcIiB4Mj1cIjEyXCIgeTI9XCIyM1wiPjwvbGluZT5cbiAgICAgICAgICA8bGluZSB4MT1cIjhcIiB5MT1cIjIzXCIgeDI9XCIxNlwiIHkyPVwiMjNcIj48L2xpbmU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3N2Zz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFN0YXR1cyBsZXQtdHJhbnNjcmlwdD1cInRyYW5zY3JpcHRcIj5cbiAgICAgIDxwPnt7dHJhbnNjcmlwdH19PC9wPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIE5nQWlzVm9pY2VTZWFyY2hcbiAgZXh0ZW5kcyBUeXBlZEJhc2VXaWRnZXQ8XG4gICAgVm9pY2VTZWFyY2hXaWRnZXREZXNjcmlwdGlvbixcbiAgICBWb2ljZVNlYXJjaENvbm5lY3RvclBhcmFtc1xuICA+XG4gIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQENvbnRlbnRDaGlsZCgnYnV0dG9uJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGJ1dHRvbjogVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG4gIEBDb250ZW50Q2hpbGQoJ3N0YXR1cycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzdGF0dXM6IFRlbXBsYXRlUmVmPEVsZW1lbnRSZWY+O1xuXG4gIC8vIHJlbmRlcmluZyBvcHRpb25zXG4gIEBJbnB1dCgpIHB1YmxpYyBidXR0b25UaXRsZTogc3RyaW5nID0gJ1NlYXJjaCBieSB2b2ljZSc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkaXNhYmxlZEJ1dHRvblRpdGxlOiBzdHJpbmcgPVxuICAgICdTZWFyY2ggYnkgdm9pY2UgKG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBicm93c2VyKSc7XG5cbiAgLy8gaW5zdGFuY2Ugb3B0aW9uXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWFyY2hBc1lvdVNwZWFrPzogVm9pY2VTZWFyY2hDb25uZWN0b3JQYXJhbXNbJ3NlYXJjaEFzWW91U3BlYWsnXTtcblxuICBwdWJsaWMgc3RhdGU6IFZvaWNlU2VhcmNoUmVuZGVyU3RhdGUgPSB7XG4gICAgaXNCcm93c2VyU3VwcG9ydGVkOiB1bmRlZmluZWQsXG4gICAgaXNMaXN0ZW5pbmc6IHVuZGVmaW5lZCxcbiAgICB0b2dnbGVMaXN0ZW5pbmc6IG5vb3AsXG4gICAgdm9pY2VMaXN0ZW5pbmdTdGF0ZToge1xuICAgICAgc3RhdHVzOiAnaW5pdGlhbCcsXG4gICAgICB0cmFuc2NyaXB0OiAnJyxcbiAgICAgIGlzU3BlZWNoRmluYWw6IGZhbHNlLFxuICAgICAgZXJyb3JDb2RlOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcblxuICBwdWJsaWMgdGVtcGxhdGVDb250ZXh0OiBWb2ljZVNlYXJjaFJlbmRlclN0YXRlWyd2b2ljZUxpc3RlbmluZ1N0YXRlJ10gJiB7XG4gICAgaXNMaXN0ZW5pbmc6IGJvb2xlYW47XG4gICAgaXNCcm93c2VyU3VwcG9ydGVkOiBib29sZWFuO1xuICB9ID0ge1xuICAgIHN0YXR1czogJ2luaXRpYWwnLFxuICAgIGVycm9yQ29kZTogdW5kZWZpbmVkLFxuICAgIHRyYW5zY3JpcHQ6ICcnLFxuICAgIGlzU3BlZWNoRmluYWw6IGZhbHNlLFxuICAgIGlzTGlzdGVuaW5nOiBmYWxzZSxcbiAgICBpc0Jyb3dzZXJTdXBwb3J0ZWQ6IGZhbHNlLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBOZ0Fpc0luZGV4KSlcbiAgICBAT3B0aW9uYWwoKVxuICAgIHB1YmxpYyBwYXJlbnRJbmRleDogTmdBaXNJbmRleCxcbiAgICBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gTmdBaXNJbnN0YW50U2VhcmNoKSlcbiAgICBwdWJsaWMgaW5zdGFudFNlYXJjaEluc3RhbmNlOiBOZ0Fpc0luc3RhbnRTZWFyY2gsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgc3VwZXIoJ1ZvaWNlU2VhcmNoJyk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZVdpZGdldChcbiAgICAgIGNvbm5lY3RWb2ljZVNlYXJjaCxcbiAgICAgIHtcbiAgICAgICAgc2VhcmNoQXNZb3VTcGVhazogdGhpcy5zZWFyY2hBc1lvdVNwZWFrLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJCR3aWRnZXRUeXBlOiAnYWlzLnZvaWNlU2VhcmNoJyxcbiAgICAgIH1cbiAgICApO1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuYmx1cigpO1xuICAgIHRoaXMuc3RhdGUudG9nZ2xlTGlzdGVuaW5nKCk7XG4gIH07XG5cbiAgcHVibGljIGlzTm90QWxsb3dlZEVycm9yID0gKCk6IGJvb2xlYW4gPT5cbiAgICB0aGlzLnN0YXRlLnZvaWNlTGlzdGVuaW5nU3RhdGUuc3RhdHVzID09PSAnZXJyb3InICYmXG4gICAgdGhpcy5zdGF0ZS52b2ljZUxpc3RlbmluZ1N0YXRlLmVycm9yQ29kZSA9PT0gJ25vdC1hbGxvd2VkJztcblxuICBwdWJsaWMgdXBkYXRlU3RhdGUgPSAoc3RhdGU6IFZvaWNlU2VhcmNoUmVuZGVyU3RhdGUpOiB2b2lkID0+IHtcbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMudGVtcGxhdGVDb250ZXh0ID0ge1xuICAgICAgICBzdGF0dXM6IHN0YXRlLnZvaWNlTGlzdGVuaW5nU3RhdGUuc3RhdHVzLFxuICAgICAgICBlcnJvckNvZGU6IHN0YXRlLnZvaWNlTGlzdGVuaW5nU3RhdGUuZXJyb3JDb2RlLFxuICAgICAgICB0cmFuc2NyaXB0OiBzdGF0ZS52b2ljZUxpc3RlbmluZ1N0YXRlLnRyYW5zY3JpcHQsXG4gICAgICAgIGlzU3BlZWNoRmluYWw6IHN0YXRlLnZvaWNlTGlzdGVuaW5nU3RhdGUuaXNTcGVlY2hGaW5hbCxcbiAgICAgICAgaXNMaXN0ZW5pbmc6IHN0YXRlLmlzTGlzdGVuaW5nLFxuICAgICAgICBpc0Jyb3dzZXJTdXBwb3J0ZWQ6IHN0YXRlLmlzQnJvd3NlclN1cHBvcnRlZCxcbiAgICAgIH07XG4gICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfSk7XG4gIH07XG59XG4iXX0=