@metadev/lux 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -488
- package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +259 -259
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +78 -78
- package/esm2022/lib/checkbox/checkbox.component.mjs +156 -156
- package/esm2022/lib/datasource.mjs +1 -1
- package/esm2022/lib/datetime/datetime.component.mjs +312 -312
- package/esm2022/lib/filter/filter.component.mjs +158 -158
- package/esm2022/lib/geolocation/geolocation.component.mjs +423 -423
- package/esm2022/lib/geolocation/geolocation.service.mjs +123 -123
- package/esm2022/lib/geolocation/openlayer-loader.service.mjs +62 -62
- package/esm2022/lib/helperFns.mjs +118 -118
- package/esm2022/lib/input/input.component.mjs +469 -469
- package/esm2022/lib/input/regexp.service.mjs +195 -195
- package/esm2022/lib/lang.mjs +9 -9
- package/esm2022/lib/lux.module.mjs +118 -118
- package/esm2022/lib/map/geopoint.mjs +1 -1
- package/esm2022/lib/map/map.component.mjs +275 -275
- package/esm2022/lib/modal/modal-backdrop.mjs +24 -24
- package/esm2022/lib/modal/modal-config.mjs +11 -11
- package/esm2022/lib/modal/modal-dismiss-reasons.mjs +5 -5
- package/esm2022/lib/modal/modal-ref.mjs +101 -101
- package/esm2022/lib/modal/modal-stack.mjs +182 -182
- package/esm2022/lib/modal/modal-window.mjs +118 -118
- package/esm2022/lib/modal/modal.service.mjs +27 -27
- package/esm2022/lib/modal/util.mjs +82 -82
- package/esm2022/lib/pagination/pagination.component.mjs +144 -144
- package/esm2022/lib/pagination/pagination.mjs +1 -1
- package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -129
- package/esm2022/lib/select/select.component.mjs +148 -148
- package/esm2022/lib/tooltip/placement.mjs +7 -7
- package/esm2022/lib/tooltip/tooltip-context.mjs +1 -1
- package/esm2022/lib/tooltip/tooltip.component.mjs +21 -21
- package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -69
- package/esm2022/lib/tooltip/tooltip.service.mjs +137 -137
- package/esm2022/lib/tooltip/tooltop-content.mjs +8 -8
- package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -79
- package/esm2022/lib/window/window.service.mjs +46 -46
- package/esm2022/metadev-lux.mjs +4 -4
- package/esm2022/public-api.mjs +20 -20
- package/fesm2022/metadev-lux.mjs +4372 -4372
- package/fesm2022/metadev-lux.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/autocomplete/autocomplete.component.d.ts +81 -81
- package/lib/autocomplete-list/autocomplete-list.component.d.ts +65 -65
- package/lib/breadcrumb/breadcrumb.component.d.ts +22 -22
- package/lib/checkbox/checkbox.component.d.ts +47 -47
- package/lib/datasource.d.ts +13 -13
- package/lib/datetime/datetime.component.d.ts +69 -69
- package/lib/filter/filter.component.d.ts +51 -51
- package/lib/geolocation/geolocation.component.d.ts +123 -123
- package/lib/geolocation/geolocation.service.d.ts +32 -32
- package/lib/geolocation/openlayer-loader.service.d.ts +7 -7
- package/lib/helperFns.d.ts +15 -15
- package/lib/input/input.component.d.ts +108 -108
- package/lib/input/regexp.service.d.ts +15 -15
- package/lib/lang.d.ts +2 -2
- package/lib/lux.module.d.ts +27 -27
- package/lib/map/geopoint.d.ts +7 -7
- package/lib/map/map.component.d.ts +39 -39
- package/lib/modal/modal-backdrop.d.ts +8 -8
- package/lib/modal/modal-config.d.ts +14 -14
- package/lib/modal/modal-dismiss-reasons.d.ts +4 -4
- package/lib/modal/modal-ref.d.ts +41 -41
- package/lib/modal/modal-stack.d.ts +31 -31
- package/lib/modal/modal-window.d.ts +28 -28
- package/lib/modal/modal.service.d.ts +19 -19
- package/lib/modal/util.d.ts +40 -40
- package/lib/pagination/pagination.component.d.ts +52 -52
- package/lib/pagination/pagination.d.ts +10 -10
- package/lib/radiogroup/radiogroup.component.d.ts +37 -37
- package/lib/select/select.component.d.ts +38 -38
- package/lib/tooltip/placement.d.ts +7 -7
- package/lib/tooltip/tooltip-context.d.ts +3 -3
- package/lib/tooltip/tooltip.component.d.ts +11 -11
- package/lib/tooltip/tooltip.directive.d.ts +27 -27
- package/lib/tooltip/tooltip.service.d.ts +20 -20
- package/lib/tooltip/tooltop-content.d.ts +6 -6
- package/lib/voice-recognition/voice-recognition.directive.d.ts +16 -16
- package/lib/window/window.service.d.ts +11 -11
- package/package.json +3 -4
- package/public-api.d.ts +18 -18
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { of, Subject } from 'rxjs';
|
|
4
|
-
import { debounceTime, distinctUntilChanged, map, switchMap } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common/http";
|
|
7
|
-
export class GeolocationService {
|
|
8
|
-
http;
|
|
9
|
-
debouncePeriodMs = 300; // ms
|
|
10
|
-
cacheSize = 20;
|
|
11
|
-
lastQueriesWithResults = new Map();
|
|
12
|
-
lastQueriesLru = [];
|
|
13
|
-
currentSearch$;
|
|
14
|
-
currentQuery$;
|
|
15
|
-
constructor(http) {
|
|
16
|
-
this.http = http;
|
|
17
|
-
this.currentSearch$ = new Subject();
|
|
18
|
-
const typed$ = this.currentSearch$
|
|
19
|
-
.asObservable()
|
|
20
|
-
.pipe(distinctUntilChanged());
|
|
21
|
-
this.currentQuery$ = typed$.pipe(debounceTime(this.debouncePeriodMs), switchMap((currentQuery) => {
|
|
22
|
-
const data = this.getFromCache(currentQuery);
|
|
23
|
-
if (data !== undefined) {
|
|
24
|
-
return of(data);
|
|
25
|
-
}
|
|
26
|
-
// Nominatim search documentation:
|
|
27
|
-
// https://nominatim.org/release-docs/develop/api/Search/
|
|
28
|
-
const url = 'https://nominatim.openstreetmap.org/search?format=json&limit=20&q=' +
|
|
29
|
-
encodeURIComponent(currentQuery);
|
|
30
|
-
const headers = {
|
|
31
|
-
'Content-Type': 'application/json'
|
|
32
|
-
};
|
|
33
|
-
this.addToCache(currentQuery, []);
|
|
34
|
-
return this.http.get(url, { headers }).pipe(map((response) => {
|
|
35
|
-
const searchResults = response;
|
|
36
|
-
const uniqueResults = distinct(searchResults);
|
|
37
|
-
return this.addToCache(currentQuery, uniqueResults);
|
|
38
|
-
}));
|
|
39
|
-
}));
|
|
40
|
-
}
|
|
41
|
-
searchGeolocation(query) {
|
|
42
|
-
this.currentSearch$.next(query);
|
|
43
|
-
return this.currentQuery$;
|
|
44
|
-
}
|
|
45
|
-
getLabels(instance, keys) {
|
|
46
|
-
const searchResults = instance.lastQueriesWithResults
|
|
47
|
-
.get(instance.getLatestQuery())
|
|
48
|
-
.filter((searchResult) => samePosition(searchResult, keys));
|
|
49
|
-
return of(searchResults.map((searchResult) => {
|
|
50
|
-
const key = {
|
|
51
|
-
type: 'Point',
|
|
52
|
-
coordinates: [searchResult.lon, searchResult.lat]
|
|
53
|
-
};
|
|
54
|
-
return {
|
|
55
|
-
key,
|
|
56
|
-
label: searchResult.display_name
|
|
57
|
-
};
|
|
58
|
-
}));
|
|
59
|
-
}
|
|
60
|
-
getData(instance, search) {
|
|
61
|
-
return instance.searchGeolocation(search).pipe(map((searchResults) => searchResults.map((searchResult) => {
|
|
62
|
-
const key = {
|
|
63
|
-
type: 'Point',
|
|
64
|
-
coordinates: [searchResult.lon, searchResult.lat]
|
|
65
|
-
};
|
|
66
|
-
const label = searchResult.display_name;
|
|
67
|
-
return { key, label };
|
|
68
|
-
})));
|
|
69
|
-
}
|
|
70
|
-
// Cache implemementation ---
|
|
71
|
-
getFromCache(query) {
|
|
72
|
-
if (this.lastQueriesWithResults.has(query)) {
|
|
73
|
-
return this.lastQueriesWithResults.get(query);
|
|
74
|
-
}
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
addToCache(query, data) {
|
|
78
|
-
if (this.lastQueriesWithResults.keys.length >= this.cacheSize) {
|
|
79
|
-
const deletedQuery = this.lastQueriesLru[0];
|
|
80
|
-
this.revomeFromCache(deletedQuery);
|
|
81
|
-
}
|
|
82
|
-
this.lastQueriesWithResults.set(query, data);
|
|
83
|
-
this.lastQueriesLru.push(query);
|
|
84
|
-
return data;
|
|
85
|
-
}
|
|
86
|
-
revomeFromCache(query) {
|
|
87
|
-
this.lastQueriesWithResults.delete(query);
|
|
88
|
-
const index = this.lastQueriesLru.findIndex((it) => it === query);
|
|
89
|
-
this.lastQueriesLru.splice(index, 1);
|
|
90
|
-
}
|
|
91
|
-
getLatestQuery() {
|
|
92
|
-
return this.lastQueriesLru.length
|
|
93
|
-
? this.lastQueriesLru[this.lastQueriesLru.length - 1]
|
|
94
|
-
: null;
|
|
95
|
-
}
|
|
96
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
97
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
98
|
-
}
|
|
99
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
100
|
-
type: Injectable,
|
|
101
|
-
args: [{ providedIn: 'root' }]
|
|
102
|
-
}], ctorParameters:
|
|
103
|
-
const samePosition = (searchResult, keys) => {
|
|
104
|
-
let found = false;
|
|
105
|
-
keys.forEach((item) => {
|
|
106
|
-
if (searchResult.lon === item.coordinates[0] &&
|
|
107
|
-
searchResult.lat === item.coordinates[1]) {
|
|
108
|
-
found = true;
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
return found;
|
|
112
|
-
};
|
|
113
|
-
const distinct = (data) => {
|
|
114
|
-
const unique = {};
|
|
115
|
-
return data.filter((r) => {
|
|
116
|
-
if (unique[r.display_name]) {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
unique[r.display_name] = 1;
|
|
120
|
-
return true;
|
|
121
|
-
});
|
|
122
|
-
};
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFNBQVMsRUFDVixNQUFNLGdCQUFnQixDQUFDOzs7QUFZeEIsTUFBTSxPQUFPLGtCQUFrQjtJQVFUO0lBUFosZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSztJQUM3QixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2Ysc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7SUFDM0QsY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUM5QixjQUFjLENBQWtCO0lBQ2hDLGFBQWEsQ0FBNkI7SUFFbEQsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWM7YUFDL0IsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFFbkMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVks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QUFLLENBQUM7SUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3BCLElBQ0UsWUFBWSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN4QyxZQUFZLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ3hDO1lBQ0EsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNkO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBb0IsRUFBa0IsRUFBRTtJQUN4RCxNQUFNLE1BQU0sR0FBOEIsRUFBRSxDQUFDO0lBQzdDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3ZCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMxQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vZGF0YXNvdXJjZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICBzd2l0Y2hNYXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgR2VvUG9pbnQgfSBmcm9tICcuLi9tYXAvZ2VvcG9pbnQnO1xuXG5pbnRlcmZhY2UgU2VhcmNoUmVzdWx0IHtcbiAgcGxhY2VfaWQ6IG51bWJlcjtcbiAgbGF0OiBudW1iZXI7XG4gIGxvbjogbnVtYmVyO1xuICBkaXNwbGF5X25hbWU6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEdlb2xvY2F0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgZGVib3VuY2VQZXJpb2RNcyA9IDMwMDsgLy8gbXNcbiAgcHJpdmF0ZSBjYWNoZVNpemUgPSAyMDtcbiAgcHJpdmF0ZSBsYXN0UXVlcmllc1dpdGhSZXN1bHRzID0gbmV3IE1hcDxzdHJpbmcsIFNlYXJjaFJlc3VsdFtdPigpO1xuICBwcml2YXRlIGxhc3RRdWVyaWVzTHJ1OiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGN1cnJlbnRTZWFyY2gkOiBTdWJqZWN0PHN0cmluZz47XG4gIHByaXZhdGUgY3VycmVudFF1ZXJ5JDogT2JzZXJ2YWJsZTxTZWFyY2hSZXN1bHRbXT47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XG4gICAgdGhpcy5jdXJyZW50U2VhcmNoJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHR5cGVkJCA9IHRoaXMuY3VycmVudFNlYXJjaCRcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgICB0aGlzLmN1cnJlbnRRdWVyeSQgPSB0eXBlZCQucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlUGVyaW9kTXMpLFxuXG4gICAgICBzd2l0Y2hNYXAoKGN1cnJlbnRRdWVyeSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRGcm9tQ2FjaGUoY3VycmVudFF1ZXJ5KTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb21pbmF0aW0gc2VhcmNoIGRvY3VtZW50YXRpb246XG4gICAgICAgIC8vIGh0dHBzOi8vbm9taW5hdGltLm9yZy9yZWxlYXNlLWRvY3MvZGV2ZWxvcC9hcGkvU2VhcmNoL1xuICAgICAgICBjb25zdCB1cmwgPVxuICAgICAgICAgICdodHRwczovL25vbWluYXRpbS5vcGVuc3RyZWV0bWFwLm9yZy9zZWFyY2g/Zm9ybWF0PWpzb24mbGltaXQ9MjAmcT0nICtcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoY3VycmVudFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRkVG9DYWNoZShjdXJyZW50UXVlcnksIFtdKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgaGVhZGVycyB9KS5waXBlKFxuICAgICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSByZXNwb25zZSBhcyB1bmtub3duIGFzIFNlYXJjaFJlc3VsdFtdO1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUmVzdWx0cyA9IGRpc3RpbmN0KHNlYXJjaFJlc3VsdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkVG9DYWNoZShjdXJyZW50UXVlcnksIHVuaXF1ZVJlc3VsdHMpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzZWFyY2hHZW9sb2NhdGlvbihxdWVyeTogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZWFyY2hSZXN1bHRbXT4ge1xuICAgIHRoaXMuY3VycmVudFNlYXJjaCQubmV4dChxdWVyeSk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXJ5JDtcbiAgfVxuXG4gIGdldExhYmVscyhcbiAgICBpbnN0YW5jZTogR2VvbG9jYXRpb25TZXJ2aWNlLFxuICAgIGtleXM6IEdlb1BvaW50W11cbiAgKTogT2JzZXJ2YWJsZTxEYXRhU291cmNlPEdlb1BvaW50LCBzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IGluc3RhbmNlLmxhc3RRdWVyaWVzV2l0aFJlc3VsdHNcbiAgICAgIC5nZXQoaW5zdGFuY2UuZ2V0TGF0ZXN0UXVlcnkoKSlcbiAgICAgIC5maWx0ZXIoKHNlYXJjaFJlc3VsdCkgPT4gc2FtZVBvc2l0aW9uKHNlYXJjaFJlc3VsdCwga2V5cykpO1xuICAgIHJldHVybiBvZihcbiAgICAgIHNlYXJjaFJlc3VsdHMubWFwKChzZWFyY2hSZXN1bHQpID0+IHtcbiAgICAgICAgY29uc3Qga2V5OiBHZW9Qb2ludCA9IHtcbiAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiBbc2VhcmNoUmVzdWx0Lmxvbiwgc2VhcmNoUmVzdWx0LmxhdF1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbGFiZWw6IHNlYXJjaFJlc3VsdC5kaXNwbGF5X25hbWVcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldERhdGEoXG4gICAgaW5zdGFuY2U6IEdlb2xvY2F0aW9uU2VydmljZSxcbiAgICBzZWFyY2g6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPERhdGFTb3VyY2U8R2VvUG9pbnQsIHN0cmluZz4+IHtcbiAgICByZXR1cm4gaW5zdGFuY2Uuc2VhcmNoR2VvbG9jYXRpb24oc2VhcmNoKS5waXBlKFxuICAgICAgbWFwKChzZWFyY2hSZXN1bHRzKSA9PlxuICAgICAgICBzZWFyY2hSZXN1bHRzLm1hcCgoc2VhcmNoUmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3Qga2V5OiBHZW9Qb2ludCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgICBjb29yZGluYXRlczogW3NlYXJjaFJlc3VsdC5sb24sIHNlYXJjaFJlc3VsdC5sYXRdXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IHNlYXJjaFJlc3VsdC5kaXNwbGF5X25hbWU7XG4gICAgICAgICAgcmV0dXJuIHsga2V5LCBsYWJlbCB9O1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvLyBDYWNoZSBpbXBsZW1lbWVudGF0aW9uIC0tLVxuICBwcml2YXRlIGdldEZyb21DYWNoZShxdWVyeTogc3RyaW5nKTogU2VhcmNoUmVzdWx0W10ge1xuICAgIGlmICh0aGlzLmxhc3RRdWVyaWVzV2l0aFJlc3VsdHMuaGFzKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdFF1ZXJpZXNXaXRoUmVzdWx0cy5nZXQocXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHByaXZhdGUgYWRkVG9DYWNoZShxdWVyeTogc3RyaW5nLCBkYXRhOiBTZWFyY2hSZXN1bHRbXSk6IFNlYXJjaFJlc3VsdFtdIHtcbiAgICBpZiAodGhpcy5sYXN0UXVlcmllc1dpdGhSZXN1bHRzLmtleXMubGVuZ3RoID49IHRoaXMuY2FjaGVTaXplKSB7XG4gICAgICBjb25zdCBkZWxldGVkUXVlcnkgPSB0aGlzLmxhc3RRdWVyaWVzTHJ1WzBdO1xuICAgICAgdGhpcy5yZXZvbWVGcm9tQ2FjaGUoZGVsZXRlZFF1ZXJ5KTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UXVlcmllc1dpdGhSZXN1bHRzLnNldChxdWVyeSwgZGF0YSk7XG4gICAgdGhpcy5sYXN0UXVlcmllc0xydS5wdXNoKHF1ZXJ5KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBwcml2YXRlIHJldm9tZUZyb21DYWNoZShxdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sYXN0UXVlcmllc1dpdGhSZXN1bHRzLmRlbGV0ZShxdWVyeSk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxhc3RRdWVyaWVzTHJ1LmZpbmRJbmRleCgoaXQpID0+IGl0ID09PSBxdWVyeSk7XG4gICAgdGhpcy5sYXN0UXVlcmllc0xydS5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByaXZhdGUgZ2V0TGF0ZXN0UXVlcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdFF1ZXJpZXNMcnUubGVuZ3RoXG4gICAgICA/IHRoaXMubGFzdFF1ZXJpZXNMcnVbdGhpcy5sYXN0UXVlcmllc0xydS5sZW5ndGggLSAxXVxuICAgICAgOiBudWxsO1xuICB9XG4gIC8vIEVuZCBjYWNoZSBpbXBsZW1lbWVudGF0aW9uIC0tLVxufVxuXG5jb25zdCBzYW1lUG9zaXRpb24gPSAoXG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0LFxuICBrZXlzOiBHZW9Qb2ludFtdXG4pOiBib29sZWFuID0+IHtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIGtleXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGlmIChcbiAgICAgIHNlYXJjaFJlc3VsdC5sb24gPT09IGl0ZW0uY29vcmRpbmF0ZXNbMF0gJiZcbiAgICAgIHNlYXJjaFJlc3VsdC5sYXQgPT09IGl0ZW0uY29vcmRpbmF0ZXNbMV1cbiAgICApIHtcbiAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZm91bmQ7XG59O1xuXG5jb25zdCBkaXN0aW5jdCA9IChkYXRhOiBTZWFyY2hSZXN1bHRbXSk6IFNlYXJjaFJlc3VsdFtdID0+IHtcbiAgY29uc3QgdW5pcXVlOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gIHJldHVybiBkYXRhLmZpbHRlcigocikgPT4ge1xuICAgIGlmICh1bmlxdWVbci5kaXNwbGF5X25hbWVdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHVuaXF1ZVtyLmRpc3BsYXlfbmFtZV0gPSAxO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn07XG4iXX0=
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { of, Subject } from 'rxjs';
|
|
4
|
+
import { debounceTime, distinctUntilChanged, map, switchMap } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common/http";
|
|
7
|
+
export class GeolocationService {
|
|
8
|
+
http;
|
|
9
|
+
debouncePeriodMs = 300; // ms
|
|
10
|
+
cacheSize = 20;
|
|
11
|
+
lastQueriesWithResults = new Map();
|
|
12
|
+
lastQueriesLru = [];
|
|
13
|
+
currentSearch$;
|
|
14
|
+
currentQuery$;
|
|
15
|
+
constructor(http) {
|
|
16
|
+
this.http = http;
|
|
17
|
+
this.currentSearch$ = new Subject();
|
|
18
|
+
const typed$ = this.currentSearch$
|
|
19
|
+
.asObservable()
|
|
20
|
+
.pipe(distinctUntilChanged());
|
|
21
|
+
this.currentQuery$ = typed$.pipe(debounceTime(this.debouncePeriodMs), switchMap((currentQuery) => {
|
|
22
|
+
const data = this.getFromCache(currentQuery);
|
|
23
|
+
if (data !== undefined) {
|
|
24
|
+
return of(data);
|
|
25
|
+
}
|
|
26
|
+
// Nominatim search documentation:
|
|
27
|
+
// https://nominatim.org/release-docs/develop/api/Search/
|
|
28
|
+
const url = 'https://nominatim.openstreetmap.org/search?format=json&limit=20&q=' +
|
|
29
|
+
encodeURIComponent(currentQuery);
|
|
30
|
+
const headers = {
|
|
31
|
+
'Content-Type': 'application/json'
|
|
32
|
+
};
|
|
33
|
+
this.addToCache(currentQuery, []);
|
|
34
|
+
return this.http.get(url, { headers }).pipe(map((response) => {
|
|
35
|
+
const searchResults = response;
|
|
36
|
+
const uniqueResults = distinct(searchResults);
|
|
37
|
+
return this.addToCache(currentQuery, uniqueResults);
|
|
38
|
+
}));
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
searchGeolocation(query) {
|
|
42
|
+
this.currentSearch$.next(query);
|
|
43
|
+
return this.currentQuery$;
|
|
44
|
+
}
|
|
45
|
+
getLabels(instance, keys) {
|
|
46
|
+
const searchResults = instance.lastQueriesWithResults
|
|
47
|
+
.get(instance.getLatestQuery())
|
|
48
|
+
.filter((searchResult) => samePosition(searchResult, keys));
|
|
49
|
+
return of(searchResults.map((searchResult) => {
|
|
50
|
+
const key = {
|
|
51
|
+
type: 'Point',
|
|
52
|
+
coordinates: [searchResult.lon, searchResult.lat]
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
key,
|
|
56
|
+
label: searchResult.display_name
|
|
57
|
+
};
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
getData(instance, search) {
|
|
61
|
+
return instance.searchGeolocation(search).pipe(map((searchResults) => searchResults.map((searchResult) => {
|
|
62
|
+
const key = {
|
|
63
|
+
type: 'Point',
|
|
64
|
+
coordinates: [searchResult.lon, searchResult.lat]
|
|
65
|
+
};
|
|
66
|
+
const label = searchResult.display_name;
|
|
67
|
+
return { key, label };
|
|
68
|
+
})));
|
|
69
|
+
}
|
|
70
|
+
// Cache implemementation ---
|
|
71
|
+
getFromCache(query) {
|
|
72
|
+
if (this.lastQueriesWithResults.has(query)) {
|
|
73
|
+
return this.lastQueriesWithResults.get(query);
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
addToCache(query, data) {
|
|
78
|
+
if (this.lastQueriesWithResults.keys.length >= this.cacheSize) {
|
|
79
|
+
const deletedQuery = this.lastQueriesLru[0];
|
|
80
|
+
this.revomeFromCache(deletedQuery);
|
|
81
|
+
}
|
|
82
|
+
this.lastQueriesWithResults.set(query, data);
|
|
83
|
+
this.lastQueriesLru.push(query);
|
|
84
|
+
return data;
|
|
85
|
+
}
|
|
86
|
+
revomeFromCache(query) {
|
|
87
|
+
this.lastQueriesWithResults.delete(query);
|
|
88
|
+
const index = this.lastQueriesLru.findIndex((it) => it === query);
|
|
89
|
+
this.lastQueriesLru.splice(index, 1);
|
|
90
|
+
}
|
|
91
|
+
getLatestQuery() {
|
|
92
|
+
return this.lastQueriesLru.length
|
|
93
|
+
? this.lastQueriesLru[this.lastQueriesLru.length - 1]
|
|
94
|
+
: null;
|
|
95
|
+
}
|
|
96
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: GeolocationService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
97
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: GeolocationService, providedIn: 'root' });
|
|
98
|
+
}
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: GeolocationService, decorators: [{
|
|
100
|
+
type: Injectable,
|
|
101
|
+
args: [{ providedIn: 'root' }]
|
|
102
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
103
|
+
const samePosition = (searchResult, keys) => {
|
|
104
|
+
let found = false;
|
|
105
|
+
keys.forEach((item) => {
|
|
106
|
+
if (searchResult.lon === item.coordinates[0] &&
|
|
107
|
+
searchResult.lat === item.coordinates[1]) {
|
|
108
|
+
found = true;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
return found;
|
|
112
|
+
};
|
|
113
|
+
const distinct = (data) => {
|
|
114
|
+
const unique = {};
|
|
115
|
+
return data.filter((r) => {
|
|
116
|
+
if (unique[r.display_name]) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
unique[r.display_name] = 1;
|
|
120
|
+
return true;
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL2dlb2xvY2F0aW9uL2dlb2xvY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFNBQVMsRUFDVixNQUFNLGdCQUFnQixDQUFDOzs7QUFZeEIsTUFBTSxPQUFPLGtCQUFrQjtJQVFUO0lBUFosZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSztJQUM3QixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2Ysc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7SUFDM0QsY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUM5QixjQUFjLENBQWtCO0lBQ2hDLGFBQWEsQ0FBNkI7SUFFbEQsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFFNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWM7YUFDL0IsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFFbkMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVks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QUNQLEVBQUU7SUFDWCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3BCLElBQ0UsWUFBWSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN4QyxZQUFZLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ3hDLENBQUM7WUFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQW9CLEVBQWtCLEVBQUU7SUFDeEQsTUFBTSxNQUFNLEdBQThCLEVBQUUsQ0FBQztJQUM3QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN2QixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9kYXRhc291cmNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkZWJvdW5jZVRpbWUsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBtYXAsXG4gIHN3aXRjaE1hcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBHZW9Qb2ludCB9IGZyb20gJy4uL21hcC9nZW9wb2ludCc7XG5cbmludGVyZmFjZSBTZWFyY2hSZXN1bHQge1xuICBwbGFjZV9pZDogbnVtYmVyO1xuICBsYXQ6IG51bWJlcjtcbiAgbG9uOiBudW1iZXI7XG4gIGRpc3BsYXlfbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgR2VvbG9jYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBkZWJvdW5jZVBlcmlvZE1zID0gMzAwOyAvLyBtc1xuICBwcml2YXRlIGNhY2hlU2l6ZSA9IDIwO1xuICBwcml2YXRlIGxhc3RRdWVyaWVzV2l0aFJlc3VsdHMgPSBuZXcgTWFwPHN0cmluZywgU2VhcmNoUmVzdWx0W10+KCk7XG4gIHByaXZhdGUgbGFzdFF1ZXJpZXNMcnU6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgY3VycmVudFNlYXJjaCQ6IFN1YmplY3Q8c3RyaW5nPjtcbiAgcHJpdmF0ZSBjdXJyZW50UXVlcnkkOiBPYnNlcnZhYmxlPFNlYXJjaFJlc3VsdFtdPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcbiAgICB0aGlzLmN1cnJlbnRTZWFyY2gkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgdHlwZWQkID0gdGhpcy5jdXJyZW50U2VhcmNoJFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcblxuICAgIHRoaXMuY3VycmVudFF1ZXJ5JCA9IHR5cGVkJC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VQZXJpb2RNcyksXG5cbiAgICAgIHN3aXRjaE1hcCgoY3VycmVudFF1ZXJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEZyb21DYWNoZShjdXJyZW50UXVlcnkpO1xuICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vbWluYXRpbSBzZWFyY2ggZG9jdW1lbnRhdGlvbjpcbiAgICAgICAgLy8gaHR0cHM6Ly9ub21pbmF0aW0ub3JnL3JlbGVhc2UtZG9jcy9kZXZlbG9wL2FwaS9TZWFyY2gvXG4gICAgICAgIGNvbnN0IHVybCA9XG4gICAgICAgICAgJ2h0dHBzOi8vbm9taW5hdGltLm9wZW5zdHJlZXRtYXAub3JnL3NlYXJjaD9mb3JtYXQ9anNvbiZsaW1pdD0yMCZxPScgK1xuICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChjdXJyZW50UXVlcnkpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGRUb0NhY2hlKGN1cnJlbnRRdWVyeSwgW10pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IHJlc3BvbnNlIGFzIHVua25vd24gYXMgU2VhcmNoUmVzdWx0W107XG4gICAgICAgICAgICBjb25zdCB1bmlxdWVSZXN1bHRzID0gZGlzdGluY3Qoc2VhcmNoUmVzdWx0cyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRUb0NhY2hlKGN1cnJlbnRRdWVyeSwgdW5pcXVlUmVzdWx0cyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNlYXJjaEdlb2xvY2F0aW9uKHF1ZXJ5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlYXJjaFJlc3VsdFtdPiB7XG4gICAgdGhpcy5jdXJyZW50U2VhcmNoJC5uZXh0KHF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UXVlcnkkO1xuICB9XG5cbiAgZ2V0TGFiZWxzKFxuICAgIGluc3RhbmNlOiBHZW9sb2NhdGlvblNlcnZpY2UsXG4gICAga2V5czogR2VvUG9pbnRbXVxuICApOiBPYnNlcnZhYmxlPERhdGFTb3VyY2U8R2VvUG9pbnQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBzZWFyY2hSZXN1bHRzID0gaW5zdGFuY2UubGFzdFF1ZXJpZXNXaXRoUmVzdWx0c1xuICAgICAgLmdldChpbnN0YW5jZS5nZXRMYXRlc3RRdWVyeSgpKVxuICAgICAgLmZpbHRlcigoc2VhcmNoUmVzdWx0KSA9PiBzYW1lUG9zaXRpb24oc2VhcmNoUmVzdWx0LCBrZXlzKSk7XG4gICAgcmV0dXJuIG9mKFxuICAgICAgc2VhcmNoUmVzdWx0cy5tYXAoKHNlYXJjaFJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCBrZXk6IEdlb1BvaW50ID0ge1xuICAgICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IFtzZWFyY2hSZXN1bHQubG9uLCBzZWFyY2hSZXN1bHQubGF0XVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBsYWJlbDogc2VhcmNoUmVzdWx0LmRpc3BsYXlfbmFtZVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0RGF0YShcbiAgICBpbnN0YW5jZTogR2VvbG9jYXRpb25TZXJ2aWNlLFxuICAgIHNlYXJjaDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8RGF0YVNvdXJjZTxHZW9Qb2ludCwgc3RyaW5nPj4ge1xuICAgIHJldHVybiBpbnN0YW5jZS5zZWFyY2hHZW9sb2NhdGlvbihzZWFyY2gpLnBpcGUoXG4gICAgICBtYXAoKHNlYXJjaFJlc3VsdHMpID0+XG4gICAgICAgIHNlYXJjaFJlc3VsdHMubWFwKChzZWFyY2hSZXN1bHQpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXk6IEdlb1BvaW50ID0ge1xuICAgICAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbc2VhcmNoUmVzdWx0Lmxvbiwgc2VhcmNoUmVzdWx0LmxhdF1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gc2VhcmNoUmVzdWx0LmRpc3BsYXlfbmFtZTtcbiAgICAgICAgICByZXR1cm4geyBrZXksIGxhYmVsIH07XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8vIENhY2hlIGltcGxlbWVtZW50YXRpb24gLS0tXG4gIHByaXZhdGUgZ2V0RnJvbUNhY2hlKHF1ZXJ5OiBzdHJpbmcpOiBTZWFyY2hSZXN1bHRbXSB7XG4gICAgaWYgKHRoaXMubGFzdFF1ZXJpZXNXaXRoUmVzdWx0cy5oYXMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXN0UXVlcmllc1dpdGhSZXN1bHRzLmdldChxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcHJpdmF0ZSBhZGRUb0NhY2hlKHF1ZXJ5OiBzdHJpbmcsIGRhdGE6IFNlYXJjaFJlc3VsdFtdKTogU2VhcmNoUmVzdWx0W10ge1xuICAgIGlmICh0aGlzLmxhc3RRdWVyaWVzV2l0aFJlc3VsdHMua2V5cy5sZW5ndGggPj0gdGhpcy5jYWNoZVNpemUpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRRdWVyeSA9IHRoaXMubGFzdFF1ZXJpZXNMcnVbMF07XG4gICAgICB0aGlzLnJldm9tZUZyb21DYWNoZShkZWxldGVkUXVlcnkpO1xuICAgIH1cbiAgICB0aGlzLmxhc3RRdWVyaWVzV2l0aFJlc3VsdHMuc2V0KHF1ZXJ5LCBkYXRhKTtcbiAgICB0aGlzLmxhc3RRdWVyaWVzTHJ1LnB1c2gocXVlcnkpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIHByaXZhdGUgcmV2b21lRnJvbUNhY2hlKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RRdWVyaWVzV2l0aFJlc3VsdHMuZGVsZXRlKHF1ZXJ5KTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMubGFzdFF1ZXJpZXNMcnUuZmluZEluZGV4KChpdCkgPT4gaXQgPT09IHF1ZXJ5KTtcbiAgICB0aGlzLmxhc3RRdWVyaWVzTHJ1LnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRMYXRlc3RRdWVyeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0UXVlcmllc0xydS5sZW5ndGhcbiAgICAgID8gdGhpcy5sYXN0UXVlcmllc0xydVt0aGlzLmxhc3RRdWVyaWVzTHJ1Lmxlbmd0aCAtIDFdXG4gICAgICA6IG51bGw7XG4gIH1cbiAgLy8gRW5kIGNhY2hlIGltcGxlbWVtZW50YXRpb24gLS0tXG59XG5cbmNvbnN0IHNhbWVQb3NpdGlvbiA9IChcbiAgc2VhcmNoUmVzdWx0OiBTZWFyY2hSZXN1bHQsXG4gIGtleXM6IEdlb1BvaW50W11cbik6IGJvb2xlYW4gPT4ge1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAga2V5cy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgaWYgKFxuICAgICAgc2VhcmNoUmVzdWx0LmxvbiA9PT0gaXRlbS5jb29yZGluYXRlc1swXSAmJlxuICAgICAgc2VhcmNoUmVzdWx0LmxhdCA9PT0gaXRlbS5jb29yZGluYXRlc1sxXVxuICAgICkge1xuICAgICAgZm91bmQgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmb3VuZDtcbn07XG5cbmNvbnN0IGRpc3RpbmN0ID0gKGRhdGE6IFNlYXJjaFJlc3VsdFtdKTogU2VhcmNoUmVzdWx0W10gPT4ge1xuICBjb25zdCB1bmlxdWU6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKChyKSA9PiB7XG4gICAgaWYgKHVuaXF1ZVtyLmRpc3BsYXlfbmFtZV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdW5pcXVlW3IuZGlzcGxheV9uYW1lXSA9IDE7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufTtcbiJdfQ==
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { from, of } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
let openLayersIsInstalled = false;
|
|
5
|
-
export class OpenLayerLoaderService {
|
|
6
|
-
load() {
|
|
7
|
-
if (window.ol) {
|
|
8
|
-
return of(true);
|
|
9
|
-
}
|
|
10
|
-
const openLayerJsUrl = 'https://openlayers.org/en/v5.3.0/build/ol.js';
|
|
11
|
-
const openLayerCssUrl = 'https://openlayers.org/en/v5.3.0/css/ol.css';
|
|
12
|
-
if (!openLayersIsInstalled) {
|
|
13
|
-
openLayersIsInstalled = true; // only try to install it once
|
|
14
|
-
loadCss(openLayerCssUrl, () => { });
|
|
15
|
-
return from(new Promise((resolve, _) => {
|
|
16
|
-
loadScript(openLayerJsUrl, () => resolve(true));
|
|
17
|
-
}));
|
|
18
|
-
}
|
|
19
|
-
return of(true);
|
|
20
|
-
}
|
|
21
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
22
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
23
|
-
}
|
|
24
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
25
|
-
type: Injectable,
|
|
26
|
-
args: [{ providedIn: 'root' }]
|
|
27
|
-
}] });
|
|
28
|
-
/** Dynamically load a script from url and return a callback */
|
|
29
|
-
const loadScript = (url, callback) => {
|
|
30
|
-
const script = document.createElement('script');
|
|
31
|
-
script.type = 'text/javascript';
|
|
32
|
-
if (script.readyState) {
|
|
33
|
-
// for old IE
|
|
34
|
-
script.onreadystatechange = () => {
|
|
35
|
-
if (script.readyState === 'loaded' || script.readyState === 'complete') {
|
|
36
|
-
script.onreadystatechange = null;
|
|
37
|
-
callback();
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
// Others browsers
|
|
43
|
-
script.onload = () => {
|
|
44
|
-
callback();
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
script.src = url;
|
|
48
|
-
document.getElementsByTagName('head')[0].appendChild(script);
|
|
49
|
-
};
|
|
50
|
-
/** Dynamically load css from url and return a callback */
|
|
51
|
-
const loadCss = (url, callback) => {
|
|
52
|
-
const link = document.createElement('link');
|
|
53
|
-
link.type = 'text/css';
|
|
54
|
-
link.rel = 'stylesheet';
|
|
55
|
-
link.type = 'text/javascript';
|
|
56
|
-
link.href = url;
|
|
57
|
-
link.onload = () => {
|
|
58
|
-
callback();
|
|
59
|
-
};
|
|
60
|
-
document.getElementsByTagName('head')[0].appendChild(link);
|
|
61
|
-
};
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { from, of } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
let openLayersIsInstalled = false;
|
|
5
|
+
export class OpenLayerLoaderService {
|
|
6
|
+
load() {
|
|
7
|
+
if (window.ol) {
|
|
8
|
+
return of(true);
|
|
9
|
+
}
|
|
10
|
+
const openLayerJsUrl = 'https://openlayers.org/en/v5.3.0/build/ol.js';
|
|
11
|
+
const openLayerCssUrl = 'https://openlayers.org/en/v5.3.0/css/ol.css';
|
|
12
|
+
if (!openLayersIsInstalled) {
|
|
13
|
+
openLayersIsInstalled = true; // only try to install it once
|
|
14
|
+
loadCss(openLayerCssUrl, () => { });
|
|
15
|
+
return from(new Promise((resolve, _) => {
|
|
16
|
+
loadScript(openLayerJsUrl, () => resolve(true));
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
return of(true);
|
|
20
|
+
}
|
|
21
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: OpenLayerLoaderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
22
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: OpenLayerLoaderService, providedIn: 'root' });
|
|
23
|
+
}
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: OpenLayerLoaderService, decorators: [{
|
|
25
|
+
type: Injectable,
|
|
26
|
+
args: [{ providedIn: 'root' }]
|
|
27
|
+
}] });
|
|
28
|
+
/** Dynamically load a script from url and return a callback */
|
|
29
|
+
const loadScript = (url, callback) => {
|
|
30
|
+
const script = document.createElement('script');
|
|
31
|
+
script.type = 'text/javascript';
|
|
32
|
+
if (script.readyState) {
|
|
33
|
+
// for old IE
|
|
34
|
+
script.onreadystatechange = () => {
|
|
35
|
+
if (script.readyState === 'loaded' || script.readyState === 'complete') {
|
|
36
|
+
script.onreadystatechange = null;
|
|
37
|
+
callback();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Others browsers
|
|
43
|
+
script.onload = () => {
|
|
44
|
+
callback();
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
script.src = url;
|
|
48
|
+
document.getElementsByTagName('head')[0].appendChild(script);
|
|
49
|
+
};
|
|
50
|
+
/** Dynamically load css from url and return a callback */
|
|
51
|
+
const loadCss = (url, callback) => {
|
|
52
|
+
const link = document.createElement('link');
|
|
53
|
+
link.type = 'text/css';
|
|
54
|
+
link.rel = 'stylesheet';
|
|
55
|
+
link.type = 'text/javascript';
|
|
56
|
+
link.href = url;
|
|
57
|
+
link.onload = () => {
|
|
58
|
+
callback();
|
|
59
|
+
};
|
|
60
|
+
document.getElementsByTagName('head')[0].appendChild(link);
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmxheWVyLWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZ2VvbG9jYXRpb24vb3BlbmxheWVyLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRTVDLElBQUkscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0FBR2xDLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsSUFBSTtRQUNGLElBQUssTUFBYyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyw4Q0FBOEMsQ0FBQztRQUN0RSxNQUFNLGVBQWUsR0FBRyw2Q0FBNkMsQ0FBQztRQUV0RSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMzQixxQkFBcUIsR0FBRyxJQUFJLENBQUMsQ0FBQyw4QkFBOEI7WUFDNUQsT0FBTyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FDVCxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEMsVUFBVSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7dUdBbkJVLHNCQUFzQjsyR0FBdEIsc0JBQXNCLGNBRFQsTUFBTTs7MkZBQ25CLHNCQUFzQjtrQkFEbEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBdUJsQywrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQUUsUUFBb0IsRUFBUSxFQUFFO0lBQzdELE1BQU0sTUFBTSxHQUFRLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUVoQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixhQUFhO1FBQ2IsTUFBTSxDQUFDLGtCQUFrQixHQUFHLEdBQVMsRUFBRTtZQUNyQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3ZFLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLFFBQVEsRUFBRSxDQUFDO1lBQ2IsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sa0JBQWtCO1FBQ2xCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBUyxFQUFFO1lBQ3pCLFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2pCLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBRUYsMERBQTBEO0FBQzFELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFFLFFBQW9CLEVBQVEsRUFBRTtJQUMxRCxNQUFNLElBQUksR0FBUSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFTLEVBQUU7UUFDdkIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDLENBQUM7SUFDRixRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmxldCBvcGVuTGF5ZXJzSXNJbnN0YWxsZWQgPSBmYWxzZTtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBPcGVuTGF5ZXJMb2FkZXJTZXJ2aWNlIHtcbiAgbG9hZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLm9sKSB7XG4gICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlbkxheWVySnNVcmwgPSAnaHR0cHM6Ly9vcGVubGF5ZXJzLm9yZy9lbi92NS4zLjAvYnVpbGQvb2wuanMnO1xuICAgIGNvbnN0IG9wZW5MYXllckNzc1VybCA9ICdodHRwczovL29wZW5sYXllcnMub3JnL2VuL3Y1LjMuMC9jc3Mvb2wuY3NzJztcblxuICAgIGlmICghb3BlbkxheWVyc0lzSW5zdGFsbGVkKSB7XG4gICAgICBvcGVuTGF5ZXJzSXNJbnN0YWxsZWQgPSB0cnVlOyAvLyBvbmx5IHRyeSB0byBpbnN0YWxsIGl0IG9uY2VcbiAgICAgIGxvYWRDc3Mob3BlbkxheWVyQ3NzVXJsLCAoKSA9PiB7fSk7XG4gICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIF8pID0+IHtcbiAgICAgICAgICBsb2FkU2NyaXB0KG9wZW5MYXllckpzVXJsLCAoKSA9PiByZXNvbHZlKHRydWUpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvZih0cnVlKTtcbiAgfVxufVxuXG4vKiogRHluYW1pY2FsbHkgbG9hZCBhIHNjcmlwdCBmcm9tIHVybCBhbmQgcmV0dXJuIGEgY2FsbGJhY2sgKi9cbmNvbnN0IGxvYWRTY3JpcHQgPSAodXJsOiBzdHJpbmcsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNjcmlwdDogYW55ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG5cbiAgaWYgKHNjcmlwdC5yZWFkeVN0YXRlKSB7XG4gICAgLy8gZm9yIG9sZCBJRVxuICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2NyaXB0LnJlYWR5U3RhdGUgPT09ICdsb2FkZWQnIHx8IHNjcmlwdC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJzIGJyb3dzZXJzXG4gICAgc2NyaXB0Lm9ubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfTtcbiAgfVxuICBzY3JpcHQuc3JjID0gdXJsO1xuICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7XG59O1xuXG4vKiogRHluYW1pY2FsbHkgbG9hZCBjc3MgZnJvbSB1cmwgYW5kIHJldHVybiBhIGNhbGxiYWNrICovXG5jb25zdCBsb2FkQ3NzID0gKHVybDogc3RyaW5nLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQgPT4ge1xuICBjb25zdCBsaW5rOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gIGxpbmsudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICBsaW5rLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgbGluay5ocmVmID0gdXJsO1xuICBsaW5rLm9ubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICBjYWxsYmFjaygpO1xuICB9O1xuICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKGxpbmspO1xufTtcbiJdfQ==
|