angular-instantsearch
Version:
Lightning-fast search for Angular apps, by Algolia.
133 lines (132 loc) • 15.7 kB
JavaScript
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=