UNPKG

ngx-autocom-place

Version:

Angular GoogleMaps Places Api Autocomplete Directive

171 lines 28.9 kB
import { __awaiter } from "tslib"; import { Directive, Output, EventEmitter, Input, ElementRef } from '@angular/core'; import { NgxAutocomPlaceService } from './ngx-autocom-place.service'; import { fromEvent } from 'rxjs'; import { debounceTime } from "rxjs/operators"; export class NgxAutocomPlaceDirective { constructor(el, ngxAutocomplaceService) { this.el = el; this.ngxAutocomplaceService = ngxAutocomplaceService; this.points = []; this.selectedPlace = new EventEmitter(); this.predictions = new EventEmitter(); this.options = { types: ["geocode"] // 'establishment' / 'address' / 'geocode' }; this.handleEnterKeydown = true; this.hideResultDropdown = false; this.debounceTime = 150; this.downArrowIndex = -1; } ; ngOnInit() { return __awaiter(this, void 0, void 0, function* () { if (this.el.nativeElement instanceof HTMLInputElement) { this.inputElement = this.el.nativeElement; } else if (this.el.nativeElement.tagName === 'ION-INPUT') { this.inputElement = yield this.el.nativeElement.getInputElement(); } else if (this.el.nativeElement.tagName === 'ION-SEARCHBAR') { this.inputElement = yield this.el.nativeElement.getInputElement(); } else { return; } const styles = document.createElement('style'); styles.innerHTML = `@keyframes beginBrowserAutofill{0%{}to{}}@keyframes endBrowserAutofill{0%{}to{}}.pac-container{background-color:#fff;position:absolute!important;z-index:1000;border-radius:2px;border-top:1px solid #d9d9d9;font-family:Arial,sans-serif;box-shadow:0 2px 6px rgba(0,0,0,0.3);-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.pac-logo:after{content:"";padding:1px 1px 1px 0;height:18px;box-sizing:border-box;text-align:right;display:block;background-image:url(https://maps.gstatic.com/mapfiles/api-3/images/powered-by-google-on-white3.png);background-position:right;background-repeat:no-repeat;background-size:120px 14px}.hdpi.pac-logo:after{background-image:url(https://maps.gstatic.com/mapfiles/api-3/images/powered-by-google-on-white3_hdpi.png)}.pac-item{cursor:default;padding:0 4px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;line-height:30px;text-align:left;border-top:1px solid #e6e6e6;font-size:11px;color:#999}.pac-item:hover{background-color:#fafafa}.pac-item-selected,.pac-item-selected:hover{background-color:#ebf2fe}.pac-matched{font-weight:700}.pac-item-query{font-size:13px;padding-right:3px;color:#000}.pac-icon{width:15px;height:20px;margin-right:7px;margin-top:6px;display:inline-block;vertical-align:top;background-image:url(https://maps.gstatic.com/mapfiles/api-3/images/autocomplete-icons.png);background-size:34px}.hdpi .pac-icon{background-image:url(https://maps.gstatic.com/mapfiles/api-3/images/autocomplete-icons_hdpi.png)}.pac-icon-search{background-position:-1px -1px}.pac-item-selected .pac-icon-search{background-position:-18px -1px}.pac-icon-marker{background-position:-1px -161px}.pac-item-selected .pac-icon-marker{background-position:-18px -161px}.pac-placeholder{color:gray}.pac-target-input:-webkit-autofill{animation-name:beginBrowserAutofill}.pac-target-input:not(:-webkit-autofill){animation-name:endBrowserAutofill}`; var ref = document.querySelector('script'); ref.parentNode.insertBefore(styles, ref); this.inputElement.addEventListener('blur', () => { this.blurEvent(); }); this.inputSubscription = fromEvent(this.inputElement, 'input').pipe(debounceTime(this.debounceTime)).subscribe((_e) => { this.inputEvent(_e); }); this.inputElement.addEventListener('keydown', (e) => { this.keydownEvent(e); }); }); } createPacContainer(input, results) { this.resultPacContainer = document.createElement('div'); const inputRect = input.getBoundingClientRect(); this.resultPacContainer.classList.add('pac-container', 'pac-logo', 'hdpi'); this.resultPacContainer.style.position = 'absolute'; this.resultPacContainer.style.top = inputRect.bottom + 'px'; this.resultPacContainer.style.left = inputRect.left + 'px'; this.resultPacContainer.style.width = (inputRect.right - inputRect.left) + 'px'; results.forEach(element => { this.resultPacContainer.appendChild(this.createPacItem(element.place_id, element.structured_formatting.main_text, element.structured_formatting.secondary_text, element.structured_formatting.main_text_matched_substrings[0].length)); }); document.querySelector('body').appendChild(this.resultPacContainer); } createPacItem(placeId, mainText, secondaryText, matchMainOffset) { const item = document.createElement('div'); item.classList.add('pac-item'); item.id = placeId; const spanIcon = document.createElement('span'); spanIcon.classList.add('pac-icon', 'pac-icon-marker'); const spanContentMatch = document.createElement('span'); spanContentMatch.classList.add('pac-item-query'); const spanContentMatched = document.createElement('span'); spanContentMatched.classList.add('pac-matched'); spanContentMatched.innerText = mainText.substr(0, matchMainOffset); spanContentMatch.appendChild(spanContentMatched); spanContentMatch.appendChild(document.createTextNode(mainText.substr(matchMainOffset))); const spanCity = document.createElement('span'); spanCity.appendChild(document.createTextNode(secondaryText)); item.appendChild(spanIcon); item.appendChild(spanContentMatch); item.appendChild(spanCity); item.addEventListener('click', () => { this.getPlaceDetails(placeId); }); return item; } getPlaceDetails(placeId) { this.ngxAutocomplaceService.getPlaceDetails(placeId).then((result) => { // this.inputElement.value = result.formatted_address; // this.inputElement.blur(); this.selectedPlace.emit(result); }); } blurEvent() { setTimeout(() => { if (this.resultPacContainer) { this.removePacItems(); } }, 250); } inputEvent(_e) { if (this.inputElement && this.inputElement.value) { this.ngxAutocomplaceService.getPredictions(this.inputElement.value, this.options).then((results) => { this.removePacItems(); if (results) { if (!this.hideResultDropdown) { this.results = results; this.createPacContainer(this.inputElement, results); } this.predictions.emit(results); } }); } else { this.removePacItems(); } } keydownEvent(e) { var _a, _b; if (this.handleEnterKeydown) { if (e.key === 'Enter' || e.keyCode === 13) { if (this.results && this.results.length > 0) { this.getPlaceDetails(this.results[this.downArrowIndex > -1 ? this.downArrowIndex : 0].place_id); this.removePacItems(); } } } if (e.keyCode === 40) { this.downArrowIndex++; if (this.downArrowIndex > 0) { (_a = document.querySelectorAll('.pac-item')[this.downArrowIndex - 1]) === null || _a === void 0 ? void 0 : _a.classList.remove('pac-item-selected'); } (_b = document.querySelectorAll('.pac-item')[this.downArrowIndex]) === null || _b === void 0 ? void 0 : _b.classList.add('pac-item-selected'); } } removePacItems() { if (this.resultPacContainer) { this.resultPacContainer.remove(); this.resultPacContainer = null; } this.downArrowIndex = -1; ; } ngOnDestroy() { this.inputElement.removeEventListener('blur', () => { this.blurEvent(); }); this.inputSubscription.unsubscribe(); this.inputElement.removeEventListener('keydown', (e) => { this.keydownEvent(e); }); } } NgxAutocomPlaceDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxAutocomPlace]' },] } ]; NgxAutocomPlaceDirective.ctorParameters = () => [ { type: ElementRef }, { type: NgxAutocomPlaceService } ]; NgxAutocomPlaceDirective.propDecorators = { selectedPlace: [{ type: Output }], predictions: [{ type: Output }], options: [{ type: Input }], handleEnterKeydown: [{ type: Input }], hideResultDropdown: [{ type: Input }], debounceTime: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF1dG9jb20tcGxhY2UuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL3ZhbGVuL0RvY3VtZW50cy9Qcm9qZWN0cy9uZ3hBdXRvY29tUGxhY2UvcHJvamVjdHMvbmd4LWF1dG9jb20tcGxhY2Uvc3JjLyIsInNvdXJjZXMiOlsibGliL25neC1hdXRvY29tLXBsYWNlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQVN4QixNQUFNLE9BQU8sd0JBQXdCO0lBbUJuQyxZQUFtQixFQUFjLEVBQVMsc0JBQThDO1FBQXJFLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBUywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBbEJ4RixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ0Ysa0JBQWEsR0FFbkIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNiLGdCQUFXLEdBQThELElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0YsWUFBTyxHQUF3QjtZQUN0QyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQywwQ0FBMEM7U0FDOUQsQ0FBQztRQUNPLHVCQUFrQixHQUFHLElBQUksQ0FBQztRQUMxQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFJNUIsbUJBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUl3RSxDQUFDO0lBSnpFLENBQUM7SUFNZixRQUFROztZQUNaLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLFlB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgRWxlbWVudFJlZiwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neEF1dG9jb21QbGFjZVNlcnZpY2UgfSBmcm9tICcuL25neC1hdXRvY29tLXBsYWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZVxufSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXRvY29tcGxhY2VPcHRpb25zIGV4dGVuZHMgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnMge1xuICBpbnB1dD86IHN0cmluZzsgLy8gbm90IHVzZWQgaW4gb3VyIGNhc2UgaGFuZGxlZCBieSA8aW5wdXQ+IGVsZW1lbnQgdmFsdWVcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEF1dG9jb21QbGFjZV0nXG59KVxuZXhwb3J0IGNsYXNzIE5neEF1dG9jb21QbGFjZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcG9pbnRzID0gW107XG4gIEBPdXRwdXQoKSBzZWxlY3RlZFBsYWNlOiBFdmVudEVtaXR0ZXI8XG4gICAgZ29vZ2xlLm1hcHMucGxhY2VzLlBsYWNlUmVzdWx0XG4gID4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwcmVkaWN0aW9uczogRXZlbnRFbWl0dGVyPGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVQcmVkaWN0aW9uW10+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKSBvcHRpb25zOiBBdXRvY29tcGxhY2VPcHRpb25zID0ge1xuICAgIHR5cGVzOiBbXCJnZW9jb2RlXCJdIC8vICdlc3RhYmxpc2htZW50JyAvICdhZGRyZXNzJyAvICdnZW9jb2RlJ1xuICB9O1xuICBASW5wdXQoKSBoYW5kbGVFbnRlcktleWRvd24gPSB0cnVlO1xuICBASW5wdXQoKSBoaWRlUmVzdWx0RHJvcGRvd24gPSBmYWxzZTtcbiAgQElucHV0KCkgZGVib3VuY2VUaW1lID0gMTUwO1xuXG4gIHJlc3VsdHM6IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVQcmVkaWN0aW9uW107XG4gIHJlc3VsdFBhY0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIGRvd25BcnJvd0luZGV4ID0gLTE7O1xuICBpbnB1dEVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG4gIGlucHV0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHVibGljIGVsOiBFbGVtZW50UmVmLCBwdWJsaWMgbmd4QXV0b2NvbXBsYWNlU2VydmljZTogTmd4QXV0b2NvbVBsYWNlU2VydmljZSkgeyB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZWwubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50XG4gICAgfSBlbHNlIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudGFnTmFtZSA9PT0gJ0lPTi1JTlBVVCcpIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50ID0gYXdhaXQgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldElucHV0RWxlbWVudCgpXG4gICAgfSBlbHNlIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudGFnTmFtZSA9PT0gJ0lPTi1TRUFSQ0hCQVInKSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudCA9IGF3YWl0IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRJbnB1dEVsZW1lbnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZXMuaW5uZXJIVE1MID0gYEBrZXlmcmFtZXMgYmVnaW5Ccm93c2VyQXV0b2ZpbGx7MCV7fXRve319QGtleWZyYW1lcyBlbmRCcm93c2VyQXV0b2ZpbGx7MCV7fXRve319LnBhYy1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO3Bvc2l0aW9uOmFic29sdXRlIWltcG9ydGFudDt6LWluZGV4OjEwMDA7Ym9yZGVyLXJhZGl1czoycHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2Q5ZDlkOTtmb250LWZhbWlseTpBcmlhbCxzYW5zLXNlcmlmO2JveC1zaGFkb3c6MCAycHggNnB4IHJnYmEoMCwwLDAsMC4zKTstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6aGlkZGVufS5wYWMtbG9nbzphZnRlcntjb250ZW50OlwiXCI7cGFkZGluZzoxcHggMXB4IDFweCAwO2hlaWdodDoxOHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDt0ZXh0LWFsaWduOnJpZ2h0O2Rpc3BsYXk6YmxvY2s7YmFja2dyb3VuZC1pbWFnZTp1cmwoaHR0cHM6Ly9tYXBzLmdzdGF0aWMuY29tL21hcGZpbGVzL2FwaS0zL2ltYWdlcy9wb3dlcmVkLWJ5LWdvb2dsZS1vbi13aGl0ZTMucG5nKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0O2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6MTIwcHggMTRweH0uaGRwaS5wYWMtbG9nbzphZnRlcntiYWNrZ3JvdW5kLWltYWdlOnVybChodHRwczovL21hcHMuZ3N0YXRpYy5jb20vbWFwZmlsZXMvYXBpLTMvaW1hZ2VzL3Bvd2VyZWQtYnktZ29vZ2xlLW9uLXdoaXRlM19oZHBpLnBuZyl9LnBhYy1pdGVte2N1cnNvcjpkZWZhdWx0O3BhZGRpbmc6MCA0cHg7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO2xpbmUtaGVpZ2h0OjMwcHg7dGV4dC1hbGlnbjpsZWZ0O2JvcmRlci10b3A6MXB4IHNvbGlkICNlNmU2ZTY7Zm9udC1zaXplOjExcHg7Y29sb3I6Izk5OX0ucGFjLWl0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5wYWMtaXRlbS1zZWxlY3RlZCwucGFjLWl0ZW0tc2VsZWN0ZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZWJmMmZlfS5wYWMtbWF0Y2hlZHtmb250LXdlaWdodDo3MDB9LnBhYy1pdGVtLXF1ZXJ5e2ZvbnQtc2l6ZToxM3B4O3BhZGRpbmctcmlnaHQ6M3B4O2NvbG9yOiMwMDB9LnBhYy1pY29ue3dpZHRoOjE1cHg7aGVpZ2h0OjIwcHg7bWFyZ2luLXJpZ2h0OjdweDttYXJnaW4tdG9wOjZweDtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7YmFja2dyb3VuZC1pbWFnZTp1cmwoaHR0cHM6Ly9tYXBzLmdzdGF0aWMuY29tL21hcGZpbGVzL2FwaS0zL2ltYWdlcy9hdXRvY29tcGxldGUtaWNvbnMucG5nKTtiYWNrZ3JvdW5kLXNpemU6MzRweH0uaGRwaSAucGFjLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoaHR0cHM6Ly9tYXBzLmdzdGF0aWMuY29tL21hcGZpbGVzL2FwaS0zL2ltYWdlcy9hdXRvY29tcGxldGUtaWNvbnNfaGRwaS5wbmcpfS5wYWMtaWNvbi1zZWFyY2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMXB4IC0xcHh9LnBhYy1pdGVtLXNlbGVjdGVkIC5wYWMtaWNvbi1zZWFyY2h7YmFja2dyb3VuZC1wb3NpdGlvbjotMThweCAtMXB4fS5wYWMtaWNvbi1tYXJrZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMXB4IC0xNjFweH0ucGFjLWl0ZW0tc2VsZWN0ZWQgLnBhYy1pY29uLW1hcmtlcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOHB4IC0xNjFweH0ucGFjLXBsYWNlaG9sZGVye2NvbG9yOmdyYXl9LnBhYy10YXJnZXQtaW5wdXQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb24tbmFtZTpiZWdpbkJyb3dzZXJBdXRvZmlsbH0ucGFjLXRhcmdldC1pbnB1dDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbi1uYW1lOmVuZEJyb3dzZXJBdXRvZmlsbH1gO1xuICAgIHZhciByZWYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHQnKTtcbiAgICByZWYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc3R5bGVzLCByZWYpO1xuXG4gICAgdGhpcy5pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgIHRoaXMuYmx1ckV2ZW50KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmlucHV0U3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50KHRoaXMuaW5wdXRFbGVtZW50LCAnaW5wdXQnKS5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKVxuICAgICkuc3Vic2NyaWJlKChfZSkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEV2ZW50KF9lKTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgdGhpcy5rZXlkb3duRXZlbnQoZSk7XG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVQYWNDb250YWluZXIoaW5wdXQsIHJlc3VsdHM6IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVQcmVkaWN0aW9uW10pIHsgIC8vIHN0b3JlIHRoZSBvcmlnaW5hbCBldmVudCBiaW5kaW5nIGZ1bmN0aW9uXG4gICAgdGhpcy5yZXN1bHRQYWNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBpbnB1dFJlY3QgPSBpbnB1dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLnJlc3VsdFBhY0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdwYWMtY29udGFpbmVyJywgJ3BhYy1sb2dvJywgJ2hkcGknKTtcbiAgICB0aGlzLnJlc3VsdFBhY0NvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgdGhpcy5yZXN1bHRQYWNDb250YWluZXIuc3R5bGUudG9wID0gaW5wdXRSZWN0LmJvdHRvbSArICdweCc7XG4gICAgdGhpcy5yZXN1bHRQYWNDb250YWluZXIuc3R5bGUubGVmdCA9IGlucHV0UmVjdC5sZWZ0ICsgJ3B4JztcbiAgICB0aGlzLnJlc3VsdFBhY0NvbnRhaW5lci5zdHlsZS53aWR0aCA9IChpbnB1dFJlY3QucmlnaHQgLSBpbnB1dFJlY3QubGVmdCkgKyAncHgnO1xuXG4gICAgcmVzdWx0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgdGhpcy5yZXN1bHRQYWNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVQYWNJdGVtKGVsZW1lbnQucGxhY2VfaWQsIGVsZW1lbnQuc3RydWN0dXJlZF9mb3JtYXR0aW5nLm1haW5fdGV4dCwgZWxlbWVudC5zdHJ1Y3R1cmVkX2Zvcm1hdHRpbmcuc2Vjb25kYXJ5X3RleHQsIGVsZW1lbnQuc3RydWN0dXJlZF9mb3JtYXR0aW5nLm1haW5fdGV4dF9tYXRjaGVkX3N1YnN0cmluZ3NbMF0ubGVuZ3RoKSk7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuYXBwZW5kQ2hpbGQodGhpcy5yZXN1bHRQYWNDb250YWluZXIpO1xuICB9XG5cbiAgY3JlYXRlUGFjSXRlbShwbGFjZUlkOiBzdHJpbmcsIG1haW5UZXh0OiBzdHJpbmcsIHNlY29uZGFyeVRleHQ6IHN0cmluZywgbWF0Y2hNYWluT2Zmc2V0OiBudW1iZXIpIHtcbiAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdwYWMtaXRlbScpO1xuICAgIGl0ZW0uaWQgPSBwbGFjZUlkO1xuICAgIGNvbnN0IHNwYW5JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwYW5JY29uLmNsYXNzTGlzdC5hZGQoJ3BhYy1pY29uJywgJ3BhYy1pY29uLW1hcmtlcicpO1xuXG4gICAgY29uc3Qgc3BhbkNvbnRlbnRNYXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFuQ29udGVudE1hdGNoLmNsYXNzTGlzdC5hZGQoJ3BhYy1pdGVtLXF1ZXJ5Jyk7XG5cbiAgICBjb25zdCBzcGFuQ29udGVudE1hdGNoZWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3BhbkNvbnRlbnRNYXRjaGVkLmNsYXNzTGlzdC5hZGQoJ3BhYy1tYXRjaGVkJyk7XG4gICAgc3BhbkNvbnRlbnRNYXRjaGVkLmlubmVyVGV4dCA9IG1haW5UZXh0LnN1YnN0cigwLCBtYXRjaE1haW5PZmZzZXQpO1xuXG4gICAgc3BhbkNvbnRlbnRNYXRjaC5hcHBlbmRDaGlsZChzcGFuQ29udGVudE1hdGNoZWQpO1xuICAgIHNwYW5Db250ZW50TWF0Y2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWFpblRleHQuc3Vic3RyKG1hdGNoTWFpbk9mZnNldCkpKTtcblxuICAgIGNvbnN0IHNwYW5DaXR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwYW5DaXR5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlY29uZGFyeVRleHQpKTtcblxuICAgIGl0ZW0uYXBwZW5kQ2hpbGQoc3Bhbkljb24pO1xuICAgIGl0ZW0uYXBwZW5kQ2hpbGQoc3BhbkNvbnRlbnRNYXRjaCk7XG4gICAgaXRlbS5hcHBlbmRDaGlsZChzcGFuQ2l0eSk7XG4gICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuZ2V0UGxhY2VEZXRhaWxzKHBsYWNlSWQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBnZXRQbGFjZURldGFpbHMocGxhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5uZ3hBdXRvY29tcGxhY2VTZXJ2aWNlLmdldFBsYWNlRGV0YWlscyhwbGFjZUlkKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIC8vIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gcmVzdWx0LmZvcm1hdHRlZF9hZGRyZXNzO1xuICAgICAgLy8gdGhpcy5pbnB1dEVsZW1lbnQuYmx1cigpO1xuICAgICAgdGhpcy5zZWxlY3RlZFBsYWNlLmVtaXQocmVzdWx0KTtcbiAgICB9KVxuICB9XG5cbiAgYmx1ckV2ZW50KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmVzdWx0UGFjQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlUGFjSXRlbXMoKTtcbiAgICAgIH1cbiAgICB9LCAyNTApO1xuICB9XG5cbiAgaW5wdXRFdmVudChfZSkge1xuICAgIGlmICh0aGlzLmlucHV0RWxlbWVudCAmJiB0aGlzLmlucHV0RWxlbWVudC52YWx1ZSkge1xuICAgICAgdGhpcy5uZ3hBdXRvY29tcGxhY2VTZXJ2aWNlLmdldFByZWRpY3Rpb25zKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLCB0aGlzLm9wdGlvbnMpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVQYWNJdGVtcygpO1xuICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgIGlmICghdGhpcy5oaWRlUmVzdWx0RHJvcGRvd24pIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdHM7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVBhY0NvbnRhaW5lcih0aGlzLmlucHV0RWxlbWVudCwgcmVzdWx0cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJlZGljdGlvbnMuZW1pdChyZXN1bHRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlUGFjSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICBrZXlkb3duRXZlbnQoZSkge1xuICAgIGlmICh0aGlzLmhhbmRsZUVudGVyS2V5ZG93bikge1xuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInIHx8IGUua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0cyAmJiB0aGlzLnJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZ2V0UGxhY2VEZXRhaWxzKHRoaXMucmVzdWx0c1t0aGlzLmRvd25BcnJvd0luZGV4ID4gLTEgPyB0aGlzLmRvd25BcnJvd0luZGV4IDogMF0ucGxhY2VfaWQpO1xuICAgICAgICAgIHRoaXMucmVtb3ZlUGFjSXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZS5rZXlDb2RlID09PSA0MCkge1xuICAgICAgdGhpcy5kb3duQXJyb3dJbmRleCsrO1xuICAgICAgaWYgKHRoaXMuZG93bkFycm93SW5kZXggPiAwKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYWMtaXRlbScpW3RoaXMuZG93bkFycm93SW5kZXggLSAxXT8uY2xhc3NMaXN0LnJlbW92ZSgncGFjLWl0ZW0tc2VsZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYWMtaXRlbScpW3RoaXMuZG93bkFycm93SW5kZXhdPy5jbGFzc0xpc3QuYWRkKCdwYWMtaXRlbS1zZWxlY3RlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVBhY0l0ZW1zKCkge1xuICAgIGlmICh0aGlzLnJlc3VsdFBhY0NvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZXN1bHRQYWNDb250YWluZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLnJlc3VsdFBhY0NvbnRhaW5lciA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZG93bkFycm93SW5kZXggPSAtMTs7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmlucHV0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgdGhpcy5ibHVyRXZlbnQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW5wdXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuaW5wdXRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgdGhpcy5rZXlkb3duRXZlbnQoZSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==