@doolehealth/service-lib 0.0.4 → 0.0.6
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/README.md +112 -13
- package/esm2022/lib/configuration.mjs +1 -1
- package/esm2022/lib/models/notifications/notification-options.mjs +192 -0
- package/esm2022/lib/models/shared-care-plan.mjs +223 -0
- package/esm2022/lib/models/user.mjs +1 -1
- package/esm2022/lib/service-lib.component.mjs +5 -5
- package/esm2022/lib/service-lib.module.mjs +4 -4
- package/esm2022/lib/services/analytics.service.mjs +20 -11
- package/esm2022/lib/services/api-endpoints.service.mjs +22 -6
- package/esm2022/lib/services/authentication.service.mjs +74 -52
- package/esm2022/lib/services/change-endpoints.service.mjs +46 -22
- package/esm2022/lib/services/date.service.mjs +106 -45
- package/esm2022/lib/services/doole.service.mjs +658 -221
- package/esm2022/lib/services/encryption.service.mjs +3 -3
- package/esm2022/lib/services/error.service.mjs +3 -3
- package/esm2022/lib/services/events.service.mjs +5 -5
- package/esm2022/lib/services/firebase/auth/firebase-auth.service.mjs +154 -0
- package/esm2022/lib/services/firebase/auth/firebase-profile.model.mjs +7 -0
- package/esm2022/lib/services/health.service.mjs +303 -0
- package/esm2022/lib/services/highcharts.service.mjs +37 -67
- package/esm2022/lib/services/http.service.mjs +14 -14
- package/esm2022/lib/services/language.model.mjs +3 -0
- package/esm2022/lib/services/language.service.mjs +6 -6
- package/esm2022/lib/services/loading.service.mjs +3 -3
- package/esm2022/lib/services/logging.service.mjs +4 -4
- package/esm2022/lib/services/navigation.service.mjs +108 -9
- package/esm2022/lib/services/network.service.mjs +7 -7
- package/esm2022/lib/services/notification.service.mjs +10 -96
- package/esm2022/lib/services/opentok.service.mjs +10 -7
- package/esm2022/lib/services/permission.service.mjs +94 -0
- package/esm2022/lib/services/roles.service.mjs +9 -8
- package/esm2022/lib/services/shared-care-plan/shared-care-plan.service.mjs +103 -0
- package/esm2022/lib/services/storage.service.mjs +3 -3
- package/esm2022/lib/services/token.service.mjs +7 -7
- package/esm2022/lib/utils/chatParameters.mjs +17 -0
- package/esm2022/lib/utils/data-store.mjs +62 -0
- package/esm2022/lib/utils/query-string-parameters.mjs +11 -0
- package/esm2022/lib/utils/url-builder.mjs +15 -0
- package/esm2022/public-api.mjs +8 -9
- package/fesm2022/doolehealth-service-lib.mjs +2055 -1228
- package/fesm2022/doolehealth-service-lib.mjs.map +1 -1
- package/lib/configuration.d.ts +4 -2
- package/lib/{util → models/notifications}/notification-options.d.ts +0 -32
- package/lib/models/shared-care-plan.d.ts +206 -0
- package/lib/models/user.d.ts +2 -0
- package/lib/service-lib.component.d.ts +1 -1
- package/lib/services/analytics.service.d.ts +6 -3
- package/lib/services/api-endpoints.service.d.ts +3 -0
- package/lib/services/authentication.service.d.ts +27 -25
- package/lib/services/change-endpoints.service.d.ts +1 -0
- package/lib/services/date.service.d.ts +15 -8
- package/lib/services/doole.service.d.ts +64 -23
- package/lib/services/{auth → firebase/auth}/firebase-auth.service.d.ts +1 -1
- package/lib/services/{auth → firebase/auth}/firebase-profile.model.d.ts +1 -1
- package/lib/services/health.service.d.ts +49 -0
- package/lib/services/highcharts.service.d.ts +1 -2
- package/lib/services/http.service.d.ts +1 -1
- package/lib/services/language.service.d.ts +1 -1
- package/lib/services/navigation.service.d.ts +6 -1
- package/lib/services/notification.service.d.ts +2 -7
- package/lib/services/permission.service.d.ts +33 -0
- package/lib/services/roles.service.d.ts +3 -2
- package/lib/services/shared-care-plan/shared-care-plan.service.d.ts +20 -0
- package/lib/{util → utils}/data-store.d.ts +3 -1
- package/package.json +2 -15
- package/public-api.d.ts +7 -8
- package/esm2022/lib/services/auth/firebase-auth.service.mjs +0 -155
- package/esm2022/lib/services/auth/firebase-profile.model.mjs +0 -7
- package/esm2022/lib/services/pusher/pusher-alarm.service.mjs +0 -39
- package/esm2022/lib/services/pusher/pusher-challenge-notifications.service.mjs +0 -110
- package/esm2022/lib/services/pusher/pusher-connection.service.mjs +0 -73
- package/esm2022/lib/services/pusher/pusher-message.service.mjs +0 -27
- package/esm2022/lib/services/pusher/pusher-notification.service.mjs +0 -116
- package/esm2022/lib/util/chatParameters.mjs +0 -17
- package/esm2022/lib/util/data-store.mjs +0 -54
- package/esm2022/lib/util/environment.mjs +0 -29
- package/esm2022/lib/util/language.model.mjs +0 -3
- package/esm2022/lib/util/notification-options.mjs +0 -245
- package/esm2022/lib/util/query-string-parameters.mjs +0 -11
- package/esm2022/lib/util/url-builder.mjs +0 -15
- package/lib/services/pusher/pusher-alarm.service.d.ts +0 -16
- package/lib/services/pusher/pusher-challenge-notifications.service.d.ts +0 -40
- package/lib/services/pusher/pusher-connection.service.d.ts +0 -24
- package/lib/services/pusher/pusher-message.service.d.ts +0 -13
- package/lib/services/pusher/pusher-notification.service.d.ts +0 -32
- package/lib/util/environment.d.ts +0 -18
- /package/lib/{util → services}/language.model.d.ts +0 -0
- /package/lib/{util → utils}/chatParameters.d.ts +0 -0
- /package/lib/{util → utils}/query-string-parameters.d.ts +0 -0
- /package/lib/{util → utils}/url-builder.d.ts +0 -0
|
@@ -19,10 +19,10 @@ export class EncryptionService {
|
|
|
19
19
|
return encryptedData;
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
23
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.
|
|
22
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
23
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EncryptionService, providedIn: 'root' }); }
|
|
24
24
|
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EncryptionService, decorators: [{
|
|
26
26
|
type: Injectable,
|
|
27
27
|
args: [{
|
|
28
28
|
providedIn: 'root'
|
|
@@ -37,10 +37,10 @@ export class ErrorService {
|
|
|
37
37
|
// handle stack trace
|
|
38
38
|
return 'stack';
|
|
39
39
|
}
|
|
40
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
41
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.
|
|
40
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorService, providedIn: 'root' }); }
|
|
42
42
|
}
|
|
43
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ErrorService, decorators: [{
|
|
44
44
|
type: Injectable,
|
|
45
45
|
args: [{
|
|
46
46
|
providedIn: 'root'
|
|
@@ -18,7 +18,7 @@ export class Events {
|
|
|
18
18
|
* @returns Subscription from which you can unsubscribe to release memory resources and to prevent memory leak.
|
|
19
19
|
*/
|
|
20
20
|
subscribe(topic, observer) {
|
|
21
|
-
console.log("subscribe topic: ", topic);
|
|
21
|
+
//console.log("subscribe topic: ", topic);
|
|
22
22
|
if (!this.channels[topic]) {
|
|
23
23
|
// You can also use ReplaySubject with one concequence
|
|
24
24
|
this.channels[topic] = new Subject();
|
|
@@ -51,13 +51,13 @@ export class Events {
|
|
|
51
51
|
subject.complete();
|
|
52
52
|
delete this.channels[topic];
|
|
53
53
|
}
|
|
54
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
55
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.
|
|
54
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Events, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
55
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Events, providedIn: 'root' }); }
|
|
56
56
|
}
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Events, decorators: [{
|
|
58
58
|
type: Injectable,
|
|
59
59
|
args: [{
|
|
60
60
|
providedIn: 'root'
|
|
61
61
|
}]
|
|
62
62
|
}] });
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlLWxpYi9zcmMvbGliL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQzs7QUFFM0M7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxNQUFNO0lBSG5CO1FBS1ksYUFBUSxHQUFxQyxFQUFFLENBQUM7S0FnRDNEO0lBOUNHOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxLQUFhLEVBQUUsUUFBMEI7UUFDL0MsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsc0RBQXNEO1lBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxLQUFhLEVBQUUsSUFBVTtRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLHlEQUF5RDtZQUN6RCxPQUFPO1FBQ1gsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsS0FBYTtRQUNqQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7K0dBakRRLE1BQU07bUhBQU4sTUFBTSxjQUZILE1BQU07OzRGQUVULE1BQU07a0JBSGxCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBBIGN1c3RvbSBFdmVudHMgc2VydmljZSBqdXN0IGxpa2UgSW9uaWMgMyBFdmVudHMgaHR0cHM6Ly9pb25pY2ZyYW1ld29yay5jb20vZG9jcy92My9hcGkvdXRpbC9FdmVudHMvIHdoaWNoIGdvdCByZW1vdmVkIGluIElvbmljIDUuXG4gKlxuICogQGF1dGhvciBTaGFzaGFuayBBZ3Jhd2FsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRXZlbnRzIHtcblxuICAgIHByaXZhdGUgY2hhbm5lbHM6IHsgW2tleTogc3RyaW5nXTogU3ViamVjdDxhbnk+OyB9ID0ge307XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gYSB0b3BpYyBhbmQgcHJvdmlkZSBhIHNpbmdsZSBoYW5kbGVyL29ic2VydmVyLlxuICAgICAqIEBwYXJhbSB0b3BpYyBUaGUgbmFtZSBvZiB0aGUgdG9waWMgdG8gc3Vic2NyaWJlIHRvLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlciBUaGUgb2JzZXJ2ZXIgb3IgY2FsbGJhY2sgZnVuY3Rpb24gdG8gbGlzdGVuIHdoZW4gY2hhbmdlcyBhcmUgcHVibGlzaGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgU3Vic2NyaXB0aW9uIGZyb20gd2hpY2ggeW91IGNhbiB1bnN1YnNjcmliZSB0byByZWxlYXNlIG1lbW9yeSByZXNvdXJjZXMgYW5kIHRvIHByZXZlbnQgbWVtb3J5IGxlYWsuXG4gICAgICovXG4gICAgc3Vic2NyaWJlKHRvcGljOiBzdHJpbmcsIG9ic2VydmVyOiAoXzogYW55KSA9PiB2b2lkKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcInN1YnNjcmliZSB0b3BpYzogXCIsIHRvcGljKTtcbiAgICAgICAgaWYgKCF0aGlzLmNoYW5uZWxzW3RvcGljXSkge1xuICAgICAgICAgICAgLy8gWW91IGNhbiBhbHNvIHVzZSBSZXBsYXlTdWJqZWN0IHdpdGggb25lIGNvbmNlcXVlbmNlXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzW3RvcGljXSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzW3RvcGljXS5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1Ymxpc2ggc29tZSBkYXRhIHRvIHRoZSBzdWJzY3JpYmVycyBvZiB0aGUgZ2l2ZW4gdG9waWMuXG4gICAgICogQHBhcmFtIHRvcGljIFRoZSBuYW1lIG9mIHRoZSB0b3BpYyB0byBlbWl0IGRhdGEgdG8uXG4gICAgICogQHBhcmFtIGRhdGEgZGF0YSBpbiBhbnkgZm9ybWF0IHRvIHBhc3Mgb24uXG4gICAgICovXG4gICAgcHVibGlzaCh0b3BpYzogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLmNoYW5uZWxzW3RvcGljXTtcbiAgICAgICAgaWYgKCFzdWJqZWN0KSB7XG4gICAgICAgICAgICAvLyBPciB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBzdWJqZWN0IGZvciBmdXR1cmUgc3Vic2NyaWJlcnNcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YmplY3QubmV4dChkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHlvdSBhcmUgc3VyZSB0aGF0IHlvdSBhcmUgZG9uZSB3aXRoIHRoZSB0b3BpYyBhbmQgdGhlIHN1YnNjcmliZXJzIG5vIGxvbmdlciBuZWVkcyB0byBsaXN0ZW4gdG8gYSBwYXJ0aWN1bGFyIHRvcGljLCB5b3UgY2FuXG4gICAgICogZGVzdHJveSB0aGUgb2JzZXJ2YWJsZSBvZiB0aGUgdG9waWMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAgICogQHBhcmFtIHRvcGljIFRoZSBuYW1lIG9mIHRoZSB0b3BpYyB0byBkZXN0cm95LlxuICAgICAqL1xuICAgIGRlc3Ryb3kodG9waWM6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5jaGFubmVsc1t0b3BpY107XG4gICAgICAgIGlmICghc3ViamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5uZWxzW3RvcGljXTtcbiAgICB9XG59Il19
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
|
|
2
|
+
import { Subject, from, of } from 'rxjs';
|
|
3
|
+
import { FirebaseProfileModel } from './firebase-profile.model';
|
|
4
|
+
import { filter, map } from 'rxjs/operators';
|
|
5
|
+
import firebase from "firebase/compat/app";
|
|
6
|
+
//import { cfaSignIn, cfaSignOut } from 'capacitor-firebase-auth';
|
|
7
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/fire/compat/auth";
|
|
10
|
+
import * as i2 from "@ionic/angular";
|
|
11
|
+
export class FirebaseAuthService {
|
|
12
|
+
constructor(angularFire, platform, platformId) {
|
|
13
|
+
this.angularFire = angularFire;
|
|
14
|
+
this.platform = platform;
|
|
15
|
+
this.platformId = platformId;
|
|
16
|
+
this.redirectResult = new Subject();
|
|
17
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
18
|
+
this.angularFire.onAuthStateChanged((user) => {
|
|
19
|
+
if (user) {
|
|
20
|
+
// User is signed in.
|
|
21
|
+
this.currentUser = user;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// No user is signed in.
|
|
25
|
+
this.currentUser = null;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
if (!this.platform.is('capacitor')) {
|
|
29
|
+
// when using signInWithRedirect, this listens for the redirect results
|
|
30
|
+
this.angularFire.getRedirectResult()
|
|
31
|
+
.then((result) => {
|
|
32
|
+
// result.credential.accessToken gives you the Provider Access Token. You can use it to access the Provider API.
|
|
33
|
+
if (result.user) {
|
|
34
|
+
this.userProviderAdditionalInfo = result.additionalUserInfo.profile;
|
|
35
|
+
this.redirectResult.next(result);
|
|
36
|
+
}
|
|
37
|
+
}, (error) => {
|
|
38
|
+
this.redirectResult.next({ error: error.code });
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
getRedirectResult() {
|
|
44
|
+
return this.redirectResult.asObservable();
|
|
45
|
+
}
|
|
46
|
+
getPhotoURL(signInProviderId, photoURL) {
|
|
47
|
+
// Default imgs are too small and our app needs a bigger image
|
|
48
|
+
switch (signInProviderId) {
|
|
49
|
+
case 'facebook.com':
|
|
50
|
+
return photoURL + '?height=400';
|
|
51
|
+
case 'password':
|
|
52
|
+
return 'https://s3-us-west-2.amazonaws.com/ionicthemes/otros/avatar-placeholder.png';
|
|
53
|
+
case 'twitter.com':
|
|
54
|
+
return photoURL.replace('_normal', '_400x400');
|
|
55
|
+
case 'google.com':
|
|
56
|
+
return photoURL.split('=')[0];
|
|
57
|
+
default:
|
|
58
|
+
return photoURL;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
signOut() {
|
|
62
|
+
if (this.platform.is('capacitor')) {
|
|
63
|
+
//return cfaSignOut();
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return from(this.angularFire.signOut());
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
signInWithEmail(email, password) {
|
|
71
|
+
return this.angularFire.signInWithEmailAndPassword(email, password);
|
|
72
|
+
}
|
|
73
|
+
signUpWithEmail(email, password) {
|
|
74
|
+
return this.angularFire.createUserWithEmailAndPassword(email, password);
|
|
75
|
+
}
|
|
76
|
+
socialSignIn(providerName, scopes) {
|
|
77
|
+
if (this.platform.is('capacitor')) {
|
|
78
|
+
//return cfaSignIn(providerName);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const provider = new firebase.auth.OAuthProvider(providerName);
|
|
82
|
+
////console.log("provider. ", provider);
|
|
83
|
+
if (scopes) {
|
|
84
|
+
scopes.forEach(scope => {
|
|
85
|
+
provider.addScope(scope);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (this.platform.is('desktop')) {
|
|
89
|
+
return from(this.angularFire.signInWithPopup(provider));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// web but not desktop, for example mobile PWA
|
|
93
|
+
return from(this.angularFire.signInWithRedirect(provider));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
signInWithGoogle() {
|
|
99
|
+
const provider = new firebase.auth.GoogleAuthProvider();
|
|
100
|
+
////console.log("provider: ", provider);
|
|
101
|
+
const scopes = ['profile', 'email'];
|
|
102
|
+
return this.socialSignIn(provider.providerId, scopes);
|
|
103
|
+
}
|
|
104
|
+
signInWithTwitter() {
|
|
105
|
+
const provider = new firebase.auth.TwitterAuthProvider();
|
|
106
|
+
return this.socialSignIn(provider.providerId);
|
|
107
|
+
}
|
|
108
|
+
getProfileDataSource() {
|
|
109
|
+
// we need to do this differentiation because there is a bug in
|
|
110
|
+
// platform capacitor ios when executing this.angularFire.user
|
|
111
|
+
if (this.platform.is('capacitor')) {
|
|
112
|
+
return of(this.setUserModelForProfile());
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
return this.angularFire.user
|
|
116
|
+
.pipe(filter((user) => user != null), map((user) => {
|
|
117
|
+
return this.setUserModelForProfile();
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
setUserModelForProfile() {
|
|
122
|
+
const userModel = new FirebaseProfileModel();
|
|
123
|
+
const provierData = this.currentUser.providerData[0];
|
|
124
|
+
const userData = this.userProviderAdditionalInfo ? this.userProviderAdditionalInfo : provierData;
|
|
125
|
+
userModel.image = this.getPhotoURL(provierData.providerId, provierData.photoURL);
|
|
126
|
+
userModel.name = userData.name || userData.displayName || 'What\'s your name?';
|
|
127
|
+
userModel.role = 'How would you describe yourself?';
|
|
128
|
+
userModel.description = userData.description || 'Anything else you would like to share with the world?';
|
|
129
|
+
userModel.phoneNumber = userData.phoneNumber || 'Is there a number where I can reach you?';
|
|
130
|
+
userModel.email = userData.email || 'Where can I send you emails?';
|
|
131
|
+
userModel.provider = (provierData.providerId !== 'password') ? provierData.providerId : 'Credentials';
|
|
132
|
+
return userModel;
|
|
133
|
+
}
|
|
134
|
+
getProfileStore(dataSource) {
|
|
135
|
+
// Initialize the model specifying that it is a shell model
|
|
136
|
+
const shellModel = new FirebaseProfileModel();
|
|
137
|
+
//this.profileDataStore = new DataStore(shellModel);
|
|
138
|
+
// Trigger the loading mechanism (with shell) in the dataStore
|
|
139
|
+
this.profileDataStore.load(dataSource);
|
|
140
|
+
return this.profileDataStore;
|
|
141
|
+
}
|
|
142
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FirebaseAuthService, deps: [{ token: i1.AngularFireAuth }, { token: i2.Platform }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
143
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FirebaseAuthService, providedIn: 'root' }); }
|
|
144
|
+
}
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FirebaseAuthService, decorators: [{
|
|
146
|
+
type: Injectable,
|
|
147
|
+
args: [{
|
|
148
|
+
providedIn: 'root'
|
|
149
|
+
}]
|
|
150
|
+
}], ctorParameters: () => [{ type: i1.AngularFireAuth }, { type: i2.Platform }, { type: undefined, decorators: [{
|
|
151
|
+
type: Inject,
|
|
152
|
+
args: [PLATFORM_ID]
|
|
153
|
+
}] }] });
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2UtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2VydmljZS1saWIvc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9hdXRoL2ZpcmViYXNlLWF1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEUsT0FBTyxFQUFjLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxRQUFRLE1BQU0scUJBQXFCLENBQUM7QUFDM0Msa0VBQWtFO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBTXBELE1BQU0sT0FBTyxtQkFBbUI7SUFROUIsWUFDUyxXQUE0QixFQUM1QixRQUFrQixFQUNJLFVBQWtCO1FBRnhDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ0ksZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQU5qRCxtQkFBYyxHQUFpQixJQUFJLE9BQU8sRUFBTyxDQUFDO1FBUWhELElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMzQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULHFCQUFxQjtvQkFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLENBQUM7cUJBQU0sQ0FB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O1FBQ2pFLDJEQUEyRDtRQUMzRCxNQUFNLFVBQVUsR0FBeUIsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ3BFLG9EQUFvRDtRQUNwRCw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOytHQXZKVSxtQkFBbUIseUVBV3BCLFdBQVc7bUhBWFYsbUJBQW1CLGNBRmxCLE1BQU07OzRGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVlJLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZ3VsYXJGaXJlQXV0aCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvY29tcGF0L2F1dGgnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGFTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2RhdGEtc3RvcmUnO1xuaW1wb3J0IHsgRmlyZWJhc2VQcm9maWxlTW9kZWwgfSBmcm9tICcuL2ZpcmViYXNlLXByb2ZpbGUubW9kZWwnO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IGZpcmViYXNlIGZyb20gXCJmaXJlYmFzZS9jb21wYXQvYXBwXCI7XG4vL2ltcG9ydCB7IGNmYVNpZ25JbiwgY2ZhU2lnbk91dCB9IGZyb20gJ2NhcGFjaXRvci1maXJlYmFzZS1hdXRoJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFVzZXIsIEF1dGggfSBmcm9tICdmaXJlYmFzZS9hdXRoJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VBdXRoU2VydmljZSB7XG5cbiAgY3VycmVudFVzZXI6IFVzZXI7XG4gIHVzZXJQcm92aWRlckFkZGl0aW9uYWxJbmZvOiBhbnk7XG4gIHByb2ZpbGVEYXRhU3RvcmU6IERhdGFTdG9yZTxGaXJlYmFzZVByb2ZpbGVNb2RlbD47XG4gIHJlZGlyZWN0UmVzdWx0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYW5ndWxhckZpcmU6IEFuZ3VsYXJGaXJlQXV0aCxcbiAgICBwdWJsaWMgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogb2JqZWN0XG4gICkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmFuZ3VsYXJGaXJlLm9uQXV0aFN0YXRlQ2hhbmdlZCgodXNlcikgPT4ge1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIC8vIFVzZXIgaXMgc2lnbmVkIGluLlxuICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSB1c2VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHVzZXIgaXMgc2lnbmVkIGluLlxuICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLnBsYXRmb3JtLmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgICAvLyB3aGVuIHVzaW5nIHNpZ25JbldpdGhSZWRpcmVjdCwgdGhpcyBsaXN0ZW5zIGZvciB0aGUgcmVkaXJlY3QgcmVzdWx0c1xuICAgICAgICB0aGlzLmFuZ3VsYXJGaXJlLmdldFJlZGlyZWN0UmVzdWx0KClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3VsdC5jcmVkZW50aWFsLmFjY2Vzc1Rva2VuIGdpdmVzIHlvdSB0aGUgUHJvdmlkZXIgQWNjZXNzIFRva2VuLiBZb3UgY2FuIHVzZSBpdCB0byBhY2Nlc3MgdGhlIFByb3ZpZGVyIEFQSS5cbiAgICAgICAgICBpZiAocmVzdWx0LnVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXNlclByb3ZpZGVyQWRkaXRpb25hbEluZm8gPSByZXN1bHQuYWRkaXRpb25hbFVzZXJJbmZvLnByb2ZpbGU7XG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0UmVzdWx0Lm5leHQocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMucmVkaXJlY3RSZXN1bHQubmV4dCh7ZXJyb3I6IGVycm9yLmNvZGV9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVkaXJlY3RSZXN1bHQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFJlc3VsdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFBob3RvVVJMKHNpZ25JblByb3ZpZGVySWQ6IHN0cmluZywgcGhvdG9VUkw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gRGVmYXVsdCBpbWdzIGFyZSB0b28gc21hbGwgYW5kIG91ciBhcHAgbmVlZHMgYSBiaWdnZXIgaW1hZ2VcbiAgICBzd2l0Y2ggKHNpZ25JblByb3ZpZGVySWQpIHtcbiAgICAgIGNhc2UgJ2ZhY2Vib29rLmNvbSc6XG4gICAgICAgIHJldHVybiBwaG90b1VSTCArICc/aGVpZ2h0PTQwMCc7XG4gICAgICBjYXNlICdwYXNzd29yZCc6XG4gICAgICAgIHJldHVybiAnaHR0cHM6Ly9zMy11cy13ZXN0LTIuYW1hem9uYXdzLmNvbS9pb25pY3RoZW1lcy9vdHJvcy9hdmF0YXItcGxhY2Vob2xkZXIucG5nJztcbiAgICAgIGNhc2UgJ3R3aXR0ZXIuY29tJzpcbiAgICAgICAgcmV0dXJuIHBob3RvVVJMLnJlcGxhY2UoJ19ub3JtYWwnLCAnXzQwMHg0MDAnKTtcbiAgICAgIGNhc2UgJ2dvb2dsZS5jb20nOlxuICAgICAgICByZXR1cm4gcGhvdG9VUkwuc3BsaXQoJz0nKVswXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwaG90b1VSTDtcbiAgICB9XG4gIH1cblxuICBzaWduT3V0KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoJ2NhcGFjaXRvcicpKSB7XG4gICAgICAvL3JldHVybiBjZmFTaWduT3V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmcm9tKHRoaXMuYW5ndWxhckZpcmUuc2lnbk91dCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHNpZ25JbldpdGhFbWFpbChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxmaXJlYmFzZS5hdXRoLlVzZXJDcmVkZW50aWFsPiB7XG4gICAgcmV0dXJuIHRoaXMuYW5ndWxhckZpcmUuc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoZW1haWwsIHBhc3N3b3JkKTtcbiAgfVxuXG4gIHNpZ25VcFdpdGhFbWFpbChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxmaXJlYmFzZS5hdXRoLlVzZXJDcmVkZW50aWFsPiB7XG4gICAgcmV0dXJuIHRoaXMuYW5ndWxhckZpcmUuY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCk7XG4gIH1cblxuICBzb2NpYWxTaWduSW4ocHJvdmlkZXJOYW1lOiBzdHJpbmcsIHNjb3Blcz86IEFycmF5PHN0cmluZz4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgLy9yZXR1cm4gY2ZhU2lnbkluKHByb3ZpZGVyTmFtZSk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZmlyZWJhc2UuYXV0aC5PQXV0aFByb3ZpZGVyKHByb3ZpZGVyTmFtZSk7XG4gICAgICAvLy8vY29uc29sZS5sb2coXCJwcm92aWRlci4gXCIsIHByb3ZpZGVyKTtcbiAgICAgIGlmIChzY29wZXMpIHtcbiAgICAgICAgc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xuICAgICAgICAgIHByb3ZpZGVyLmFkZFNjb3BlKHNjb3BlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cblxuICAgICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoJ2Rlc2t0b3AnKSkge1xuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmFuZ3VsYXJGaXJlLnNpZ25JbldpdGhQb3B1cChwcm92aWRlcikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2ViIGJ1dCBub3QgZGVza3RvcCwgZm9yIGV4YW1wbGUgbW9iaWxlIFBXQVxuICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmFuZ3VsYXJGaXJlLnNpZ25JbldpdGhSZWRpcmVjdChwcm92aWRlcikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgc2lnbkluV2l0aEdvb2dsZSgpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBmaXJlYmFzZS5hdXRoLkdvb2dsZUF1dGhQcm92aWRlcigpO1xuICAgIC8vLy9jb25zb2xlLmxvZyhcInByb3ZpZGVyOiBcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IHNjb3BlcyA9IFsncHJvZmlsZScsICdlbWFpbCddO1xuICAgIHJldHVybiB0aGlzLnNvY2lhbFNpZ25Jbihwcm92aWRlci5wcm92aWRlcklkLCBzY29wZXMpO1xuICB9XG5cbiAgc2lnbkluV2l0aFR3aXR0ZXIoKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZmlyZWJhc2UuYXV0aC5Ud2l0dGVyQXV0aFByb3ZpZGVyKCk7XG4gICAgcmV0dXJuIHRoaXMuc29jaWFsU2lnbkluKHByb3ZpZGVyLnByb3ZpZGVySWQpO1xuICB9XG5cbiAgcHVibGljIGdldFByb2ZpbGVEYXRhU291cmNlKCk6IE9ic2VydmFibGU8RmlyZWJhc2VQcm9maWxlTW9kZWw+IHtcbiAgICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgZGlmZmVyZW50aWF0aW9uIGJlY2F1c2UgdGhlcmUgaXMgYSBidWcgaW5cbiAgICAvLyBwbGF0Zm9ybSBjYXBhY2l0b3IgaW9zIHdoZW4gZXhlY3V0aW5nIHRoaXMuYW5ndWxhckZpcmUudXNlclxuICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuc2V0VXNlck1vZGVsRm9yUHJvZmlsZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuYW5ndWxhckZpcmUudXNlclxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigodXNlcjogVXNlcikgPT4gdXNlciAhPSBudWxsKSxcbiAgICAgICAgbWFwKCh1c2VyOiBVc2VyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2V0VXNlck1vZGVsRm9yUHJvZmlsZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFVzZXJNb2RlbEZvclByb2ZpbGUoKTogRmlyZWJhc2VQcm9maWxlTW9kZWwge1xuICAgIGNvbnN0IHVzZXJNb2RlbCA9IG5ldyBGaXJlYmFzZVByb2ZpbGVNb2RlbCgpO1xuICAgIGNvbnN0IHByb3ZpZXJEYXRhID0gdGhpcy5jdXJyZW50VXNlci5wcm92aWRlckRhdGFbMF07XG4gICAgY29uc3QgdXNlckRhdGEgPSB0aGlzLnVzZXJQcm92aWRlckFkZGl0aW9uYWxJbmZvID8gdGhpcy51c2VyUHJvdmlkZXJBZGRpdGlvbmFsSW5mbyA6IHByb3ZpZXJEYXRhO1xuICAgIHVzZXJNb2RlbC5pbWFnZSA9IHRoaXMuZ2V0UGhvdG9VUkwocHJvdmllckRhdGEucHJvdmlkZXJJZCwgcHJvdmllckRhdGEucGhvdG9VUkwpO1xuICAgIHVzZXJNb2RlbC5uYW1lID0gdXNlckRhdGEubmFtZSB8fCB1c2VyRGF0YS5kaXNwbGF5TmFtZSB8fCAnV2hhdFxcJ3MgeW91ciBuYW1lPyc7XG4gICAgdXNlck1vZGVsLnJvbGUgPSAnSG93IHdvdWxkIHlvdSBkZXNjcmliZSB5b3Vyc2VsZj8nO1xuICAgIHVzZXJNb2RlbC5kZXNjcmlwdGlvbiA9IHVzZXJEYXRhLmRlc2NyaXB0aW9uIHx8ICdBbnl0aGluZyBlbHNlIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHdpdGggdGhlIHdvcmxkPyc7XG4gICAgdXNlck1vZGVsLnBob25lTnVtYmVyID0gdXNlckRhdGEucGhvbmVOdW1iZXIgfHwgJ0lzIHRoZXJlIGEgbnVtYmVyIHdoZXJlIEkgY2FuIHJlYWNoIHlvdT8nO1xuICAgIHVzZXJNb2RlbC5lbWFpbCA9IHVzZXJEYXRhLmVtYWlsIHx8ICdXaGVyZSBjYW4gSSBzZW5kIHlvdSBlbWFpbHM/JztcbiAgICB1c2VyTW9kZWwucHJvdmlkZXIgPSAocHJvdmllckRhdGEucHJvdmlkZXJJZCAhPT0gJ3Bhc3N3b3JkJykgPyBwcm92aWVyRGF0YS5wcm92aWRlcklkIDogJ0NyZWRlbnRpYWxzJztcblxuICAgIHJldHVybiB1c2VyTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvZmlsZVN0b3JlKGRhdGFTb3VyY2U6IE9ic2VydmFibGU8RmlyZWJhc2VQcm9maWxlTW9kZWw+KTogRGF0YVN0b3JlPEZpcmViYXNlUHJvZmlsZU1vZGVsPiB7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgbW9kZWwgc3BlY2lmeWluZyB0aGF0IGl0IGlzIGEgc2hlbGwgbW9kZWxcbiAgICBjb25zdCBzaGVsbE1vZGVsOiBGaXJlYmFzZVByb2ZpbGVNb2RlbCA9IG5ldyBGaXJlYmFzZVByb2ZpbGVNb2RlbCgpO1xuICAgIC8vdGhpcy5wcm9maWxlRGF0YVN0b3JlID0gbmV3IERhdGFTdG9yZShzaGVsbE1vZGVsKTtcbiAgICAvLyBUcmlnZ2VyIHRoZSBsb2FkaW5nIG1lY2hhbmlzbSAod2l0aCBzaGVsbCkgaW4gdGhlIGRhdGFTdG9yZVxuICAgIHRoaXMucHJvZmlsZURhdGFTdG9yZS5sb2FkKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiB0aGlzLnByb2ZpbGVEYXRhU3RvcmU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ShellModel } from '../../../utils/data-store';
|
|
2
|
+
export class FirebaseProfileModel extends ShellModel {
|
|
3
|
+
constructor() {
|
|
4
|
+
super();
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2UtcHJvZmlsZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlcnZpY2UtbGliL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2UvYXV0aC9maXJlYmFzZS1wcm9maWxlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsVUFBVTtJQVNsRDtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hlbGxNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2RhdGEtc3RvcmUnO1xuXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VQcm9maWxlTW9kZWwgZXh0ZW5kcyBTaGVsbE1vZGVsIHtcbiAgaW1hZ2U6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICByb2xlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { NativeMarket } from "@capacitor-community/native-market";
|
|
3
|
+
import { CONFIGURACION_TOKEN } from '../configuration';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@awesome-cordova-plugins/device/ngx";
|
|
6
|
+
import * as i2 from "@ionic/angular";
|
|
7
|
+
import * as i3 from "./doole.service";
|
|
8
|
+
import * as i4 from "@angular/router";
|
|
9
|
+
import * as i5 from "@ngx-translate/core";
|
|
10
|
+
import * as i6 from "./language.service";
|
|
11
|
+
import * as i7 from "./authentication.service";
|
|
12
|
+
export class HealthService {
|
|
13
|
+
constructor(device, platform, dooleService, router, translate, languageService, constants, authService, alertController) {
|
|
14
|
+
this.device = device;
|
|
15
|
+
this.platform = platform;
|
|
16
|
+
this.dooleService = dooleService;
|
|
17
|
+
this.router = router;
|
|
18
|
+
this.translate = translate;
|
|
19
|
+
this.languageService = languageService;
|
|
20
|
+
this.constants = constants;
|
|
21
|
+
this.authService = authService;
|
|
22
|
+
this.alertController = alertController;
|
|
23
|
+
//private dataTypes = ['distance', 'steps', 'weight', 'blood_glucose', 'heart_rate' ];
|
|
24
|
+
this.dataTypes = ['distance', 'steps', 'weight', 'heart_rate'];
|
|
25
|
+
this.enableHealthConnectSettings = false;
|
|
26
|
+
this.isHealthConnect = true;
|
|
27
|
+
this.hideButtonHealthConnect = false;
|
|
28
|
+
if (this.platform.is('android') && !this.platform.is('mobileweb')) {
|
|
29
|
+
//this.setPrivacyPolicy();
|
|
30
|
+
this.btnDowloadHealthConnect();
|
|
31
|
+
// if(this.device.sdkVersion == '34'){
|
|
32
|
+
// this.isHealthConnect = false;
|
|
33
|
+
// }else{
|
|
34
|
+
// this.isHealthConnect = true;
|
|
35
|
+
// }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
btnDowloadHealthConnect() {
|
|
39
|
+
if (this.platform.is("cordova")) {
|
|
40
|
+
cordova.plugins.health.isAvailable((available) => {
|
|
41
|
+
if (available) {
|
|
42
|
+
this.hideButtonHealthConnect = true;
|
|
43
|
+
}
|
|
44
|
+
}, (e) => {
|
|
45
|
+
//this.presentAlertConfirm(e);
|
|
46
|
+
console.error('[HealthService] connect(): error', e);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
setHealthConnect() {
|
|
51
|
+
}
|
|
52
|
+
downloadHealthConnect() {
|
|
53
|
+
NativeMarket.openStoreListing({
|
|
54
|
+
appId: /* this.constants.healthconnectPackageID */ 'com.google.android.apps.healthdata'
|
|
55
|
+
});
|
|
56
|
+
/* cordova.plugins.health.getHealthConnectFromStore(
|
|
57
|
+
(success)=>{console.log("All good: ", success)},
|
|
58
|
+
(error)=>{console.log("Wrong error", error)} ); */
|
|
59
|
+
}
|
|
60
|
+
downloadGoogleFit() {
|
|
61
|
+
NativeMarket.openStoreListing({
|
|
62
|
+
appId: this.constants.googleFitPackageID
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
setPrivacyPolicy() {
|
|
66
|
+
cordova.plugins.health.setPrivacyPolicyURL(/* this.constants.privacyPolicies */ 'https://doolehealth.com/en/privacy-policy/', () => { }, () => { });
|
|
67
|
+
}
|
|
68
|
+
openHealthServices() {
|
|
69
|
+
cordova.plugins.health.openHealthSettings((success) => { }, (error) => { });
|
|
70
|
+
}
|
|
71
|
+
connect(comesFromSettings) {
|
|
72
|
+
//console.log('HealthService requestAuthorization() connect:', comesFromSettings)
|
|
73
|
+
if (this.platform.is("cordova")) {
|
|
74
|
+
cordova.plugins.health.isAvailable((available) => {
|
|
75
|
+
//console.log('HealthService requestAuthorization() available:', available)
|
|
76
|
+
if (available) {
|
|
77
|
+
cordova.plugins.health.isAuthorized({ read: this.dataTypes }, (authorized) => {
|
|
78
|
+
if (!authorized) {
|
|
79
|
+
cordova.plugins.health.requestAuthorization({ read: this.dataTypes }, (success) => {
|
|
80
|
+
//console.log('HealthService requestAuthorization() success:', success)
|
|
81
|
+
this.loadingData = true;
|
|
82
|
+
this.authService.setShowHealthConnectLocalstorage();
|
|
83
|
+
this.authService.setCanceledHealthConnectLocalstorage("true");
|
|
84
|
+
this.readDataFromApp(30);
|
|
85
|
+
if (comesFromSettings) {
|
|
86
|
+
this.router.navigate(['settings'], { replaceUrl: true });
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.router.navigate(['home'], { replaceUrl: true });
|
|
90
|
+
}
|
|
91
|
+
this.enableHealthConnectSettings = true;
|
|
92
|
+
}, (error) => {
|
|
93
|
+
//console.log('HealthService requestAuthorization() error:', error)
|
|
94
|
+
this.enableHealthConnectSettings = false;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this.loadingData = true;
|
|
99
|
+
this.authService.setShowHealthConnectLocalstorage();
|
|
100
|
+
this.authService.setCanceledHealthConnectLocalstorage("true");
|
|
101
|
+
this.readDataFromApp(30);
|
|
102
|
+
this.router.navigate(['home']);
|
|
103
|
+
this.enableHealthConnectSettings = true;
|
|
104
|
+
}
|
|
105
|
+
}, (error) => {
|
|
106
|
+
this.presentAlertConfirm();
|
|
107
|
+
//console.log(error);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.enableHealthConnectSettings = false;
|
|
112
|
+
this.presentAlertConfirm();
|
|
113
|
+
//console.log("Health plugin not available");
|
|
114
|
+
}
|
|
115
|
+
}, (e) => {
|
|
116
|
+
//this.presentAlertConfirm(e);
|
|
117
|
+
console.error('[HealthService] connect(): error', e);
|
|
118
|
+
this.downloadHealthConnect();
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
retrieveData() {
|
|
123
|
+
if (this.platform.is("cordova")) {
|
|
124
|
+
cordova.plugins.health.isAvailable((available) => {
|
|
125
|
+
if (available) {
|
|
126
|
+
cordova.plugins.health.isAuthorized({ read: this.dataTypes }, (authorized) => {
|
|
127
|
+
if (authorized) {
|
|
128
|
+
this.loadingData = true;
|
|
129
|
+
this.authService.setShowHealthConnectLocalstorage();
|
|
130
|
+
this.authService.setCanceledHealthConnectLocalstorage("true");
|
|
131
|
+
this.readDataFromApp(30);
|
|
132
|
+
this.enableHealthConnectSettings = true;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this.enableHealthConnectSettings = false;
|
|
136
|
+
}
|
|
137
|
+
}, (error) => {
|
|
138
|
+
this.presentAlertConfirm();
|
|
139
|
+
//console.log(error);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}, (e) => {
|
|
143
|
+
//this.presentAlertConfirm(e);
|
|
144
|
+
console.error('[HealthService] connect(): error', e);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
readDataFromApp(days) {
|
|
149
|
+
let startDate = new Date(new Date().getTime() - days * 24 * 60 * 60 * 1000);
|
|
150
|
+
let endDate = new Date(); // now
|
|
151
|
+
//console.log("Entering for reading data")
|
|
152
|
+
this.readData(startDate, endDate);
|
|
153
|
+
// this.readBloodGlucose(startDate, endDate);
|
|
154
|
+
// this.readSteps(startDate, endDate);
|
|
155
|
+
// this.readDistance(startDate, endDate);
|
|
156
|
+
//this.readHeartRate(startDate, endDate);
|
|
157
|
+
// this.readWeightData(startDate, endDate);
|
|
158
|
+
// setTimeout(()=> this.readBloodGlucose(startDate, endDate), 500);
|
|
159
|
+
// setTimeout(()=> this.readSteps(startDate, endDate), 1500);
|
|
160
|
+
// setTimeout(()=> this.readDistance(startDate, endDate), 1500);
|
|
161
|
+
// setTimeout(()=> this.readWeightData(startDate, endDate), 1500);
|
|
162
|
+
// setTimeout(()=> this.readHeartRate(startDate, endDate), 500);
|
|
163
|
+
}
|
|
164
|
+
async readData(startDate, endDate) {
|
|
165
|
+
await this.platform.ready();
|
|
166
|
+
//console.log("[HealthService] Entering for reading health data");
|
|
167
|
+
for (const element of this.dataTypes) {
|
|
168
|
+
const config = { startDate: startDate, endDate: endDate, dataType: element };
|
|
169
|
+
if (element === 'distance' || element === 'steps') {
|
|
170
|
+
config['bucket'] = 'hour';
|
|
171
|
+
try {
|
|
172
|
+
const data = await this.queryAggregatedHealthData(config);
|
|
173
|
+
//console.log(`DATA HEALTH CONNECT (${element}): `, JSON.stringify(data));
|
|
174
|
+
await this.postHealth(element, data);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error(`Error for posting ${element} data: `, error);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
try {
|
|
182
|
+
const data = await this.queryHealthData(config);
|
|
183
|
+
//console.log(`DATA HEALTH CONNECT (${element}): `, JSON.stringify(data));
|
|
184
|
+
await this.postHealth(element, data);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.error(`Error for posting ${element} data: `, error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
queryAggregatedHealthData(config) {
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
cordova.plugins.health.queryAggregated(config, (data) => resolve(data), (error) => reject(error));
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
queryHealthData(config) {
|
|
198
|
+
return new Promise((resolve, reject) => {
|
|
199
|
+
cordova.plugins.health.query(config, (data) => resolve(data), (error) => reject(error));
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
readWeightData(startDate, endDate) {
|
|
203
|
+
//console.log("[HealthService] Entering for reading weight data")
|
|
204
|
+
//cordova.plugins.health.query({startDate: startDate, endDate: endDate , dataType: 'weight'}, (data)=> {this.postHealth('weight', data);}, ()=> {console.error()})
|
|
205
|
+
cordova.plugins.health.query({
|
|
206
|
+
startDate: startDate, endDate: endDate,
|
|
207
|
+
dataType: 'weight'
|
|
208
|
+
}, (data) => { this.postHealth('weight', data); }, (error) => { console.error("Error for posting weight data: ", error); });
|
|
209
|
+
}
|
|
210
|
+
readBloodGlucose(startDate, endDate) {
|
|
211
|
+
//console.log("[HealthService] Entering for reading blood_glucose data")
|
|
212
|
+
cordova.plugins.health.query({
|
|
213
|
+
startDate: startDate, endDate: endDate,
|
|
214
|
+
dataType: 'blood_glucose'
|
|
215
|
+
}, (data) => { this.postHealth('blood_glucose', data); }, (error) => { console.error("Error for posting blood_glucose data ", error); });
|
|
216
|
+
}
|
|
217
|
+
readSteps(startDate, endDate) {
|
|
218
|
+
//console.log("[HealthService] Entering for reading steps data")
|
|
219
|
+
cordova.plugins.health.queryAggregated({ startDate: startDate, endDate: endDate, dataType: 'steps', bucket: 'day' }, (data) => { this.postHealth('steps', data); }, (error) => { console.error("Error for posting steps data ", error); });
|
|
220
|
+
}
|
|
221
|
+
readDistance(startDate, endDate) {
|
|
222
|
+
//console.log("[HealthService] Entering for reading distance data")
|
|
223
|
+
cordova.plugins.health.queryAggregated({ startDate: startDate, endDate: endDate, dataType: 'distance', bucket: 'day' }, (data) => { this.postHealth('distance', data); }, (error) => { console.error("Error for posting distance data ", error); })
|
|
224
|
+
.then(data => {
|
|
225
|
+
//console.log("[HealthService] Entering for reading distance data1", data)
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
readHeartRate(startDate, endDate) {
|
|
229
|
+
//console.log("[HealthService] Entering for reading heart_rate data")
|
|
230
|
+
cordova.plugins.health.query({
|
|
231
|
+
startDate: startDate, endDate: endDate,
|
|
232
|
+
dataType: 'heart_rate'
|
|
233
|
+
}, (data) => { this.postHealth('heart_rate', data); }, () => { console.error(); });
|
|
234
|
+
}
|
|
235
|
+
//To send POST with health data to api
|
|
236
|
+
async postHealth(type, data) {
|
|
237
|
+
//console.log("[HealthService] postHealth()", type, data);
|
|
238
|
+
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
239
|
+
//console.log('[HealthService] syncData', timezone);
|
|
240
|
+
const postData = {
|
|
241
|
+
timezone: timezone,
|
|
242
|
+
type: type,
|
|
243
|
+
vals: JSON.stringify(data),
|
|
244
|
+
};
|
|
245
|
+
//console.log('[HealthService] postObject', postData);
|
|
246
|
+
if (this.authService?.deviceToken) {
|
|
247
|
+
postData['device_token'] = this.authService.deviceToken;
|
|
248
|
+
}
|
|
249
|
+
try {
|
|
250
|
+
const response = await this.dooleService.post('user/element/sync', postData).toPromise();
|
|
251
|
+
//console.log('[HealthService] apiRes', JSON.stringify(response));
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
//console.log('[HealthService] apiErr', JSON.stringify(error));
|
|
255
|
+
throw error;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
async presentAlertConfirm(error) {
|
|
259
|
+
const alert = await this.alertController.create({
|
|
260
|
+
cssClass: 'my-alert-class',
|
|
261
|
+
header: this.getErrorMessage(error),
|
|
262
|
+
buttons: [
|
|
263
|
+
{
|
|
264
|
+
text: this.translate.instant("alert.button_cancel"),
|
|
265
|
+
role: 'cancel',
|
|
266
|
+
cssClass: 'secondary',
|
|
267
|
+
handler: async (blah) => {
|
|
268
|
+
//console.log('Confirm Cancel: blah');
|
|
269
|
+
}
|
|
270
|
+
}, {
|
|
271
|
+
text: this.translate.instant("health-connect.return_home"),
|
|
272
|
+
handler: () => {
|
|
273
|
+
this.authService.setShowHealthConnectLocalstorage();
|
|
274
|
+
if (this.router.url.includes('landing'))
|
|
275
|
+
this.router.navigate(['landing']);
|
|
276
|
+
else
|
|
277
|
+
this.router.navigate(['home']);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
]
|
|
281
|
+
});
|
|
282
|
+
await alert.present();
|
|
283
|
+
}
|
|
284
|
+
getErrorMessage(e) {
|
|
285
|
+
if (e && e === 'Health Connect is not installed') {
|
|
286
|
+
return this.translate.instant("health-connect.error_msg_not_install");
|
|
287
|
+
}
|
|
288
|
+
else
|
|
289
|
+
return this.translate.instant("health-connect.error_msg");
|
|
290
|
+
}
|
|
291
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HealthService, deps: [{ token: i1.Device }, { token: i2.Platform }, { token: i3.DooleService }, { token: i4.Router }, { token: i5.TranslateService }, { token: i6.LanguageService }, { token: CONFIGURACION_TOKEN }, { token: i7.AuthenticationService }, { token: i2.AlertController }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
292
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HealthService, providedIn: 'root' }); }
|
|
293
|
+
}
|
|
294
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HealthService, decorators: [{
|
|
295
|
+
type: Injectable,
|
|
296
|
+
args: [{
|
|
297
|
+
providedIn: 'root'
|
|
298
|
+
}]
|
|
299
|
+
}], ctorParameters: () => [{ type: i1.Device }, { type: i2.Platform }, { type: i3.DooleService }, { type: i4.Router }, { type: i5.TranslateService }, { type: i6.LanguageService }, { type: undefined, decorators: [{
|
|
300
|
+
type: Inject,
|
|
301
|
+
args: [CONFIGURACION_TOKEN]
|
|
302
|
+
}] }, { type: i7.AuthenticationService }, { type: i2.AlertController }] });
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlLWxpYi9zcmMvbGliL3NlcnZpY2VzL2hlYWx0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQWlCLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7OztBQWF0RSxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUFvQixNQUFjLEVBQVMsUUFBa0IsRUFBVSxZQUEwQixFQUFTLE1BQWMsRUFBVSxTQUEyQixFQUFTLGVBQWdDLEVBQXVDLFNBQXdCLEVBQVMsV0FBa0MsRUFBVSxlQUFnQztRQUF0VSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQXVDLGNBQVMsR0FBVCxTQUFTLENBQWU7UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFQMVYsdUZBQXVGO1FBQy9FLGNBQVMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUcsUUFBUSxFQUFFLFlBQVksQ0FBRSxDQUFDO1FBQ3BFLGdDQUEyQixHQUFZLEtBQUssQ0FBQztRQUU3QyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFJOUIsSUFBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUks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a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFTME0sTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJy4vbGFuZ3VhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTmF0aXZlTWFya2V0IH0gZnJvbSBcIkBjYXBhY2l0b3ItY29tbXVuaXR5L25hdGl2ZS1tYXJrZXRcIjtcbmltcG9ydCB7IENPTkZJR1VSQUNJT05fVE9LRU4sIENvbmZpZ3VyYWNpb24gfSBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBEb29sZVNlcnZpY2UgfSBmcm9tICcuL2Rvb2xlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IERldmljZSB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kZXZpY2Uvbmd4JztcblxuXG5kZWNsYXJlIGxldCBjb3Jkb3ZhOiBhbnk7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBIZWFsdGhTZXJ2aWNlIHtcbiAgLy9wcml2YXRlIGRhdGFUeXBlcyA9IFsnZGlzdGFuY2UnLCAnc3RlcHMnLCAgJ3dlaWdodCcsICdibG9vZF9nbHVjb3NlJywgJ2hlYXJ0X3JhdGUnIF07XG4gIHByaXZhdGUgZGF0YVR5cGVzID0gWydkaXN0YW5jZScsICdzdGVwcycsICAnd2VpZ2h0JywgJ2hlYXJ0X3JhdGUnIF07XG4gIGVuYWJsZUhlYWx0aENvbm5lY3RTZXR0aW5nczogYm9vbGVhbiA9IGZhbHNlO1xuICBsb2FkaW5nRGF0YTogYm9vbGVhbjtcbiAgaXNIZWFsdGhDb25uZWN0OiBib29sZWFuID0gdHJ1ZTtcbiAgaGlkZUJ1dHRvbkhlYWx0aENvbm5lY3QgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRldmljZTogRGV2aWNlLCBwdWJsaWMgcGxhdGZvcm06IFBsYXRmb3JtLCBwcml2YXRlIGRvb2xlU2VydmljZTogRG9vbGVTZXJ2aWNlLCBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBwdWJsaWMgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsIEBJbmplY3QoQ09ORklHVVJBQ0lPTl9UT0tFTikgcHJpdmF0ZSBjb25zdGFudHM6IENvbmZpZ3VyYWNpb24sIHB1YmxpYyBhdXRoU2VydmljZTogQXV0aGVudGljYXRpb25TZXJ2aWNlLCBwcml2YXRlIGFsZXJ0Q29udHJvbGxlcjogQWxlcnRDb250cm9sbGVyKSB7IFxuICAgIFxuICAgIGlmKHRoaXMucGxhdGZvcm0uaXMoJ2FuZHJvaWQnKSAmJiAhdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxld2ViJykpe1xuICAgICAgLy90aGlzLnNldFByaXZhY3lQb2xpY3koKTtcbiAgICAgIHRoaXMuYnRuRG93bG9hZEhlYWx0aENvbm5lY3QoKTtcbiAgICAgIFxuXG4gICAgICAvLyBpZih0aGlzLmRldmljZS5zZGtWZXJzaW9uID09ICczNCcpe1xuICAgICAgLy8gICB0aGlzLmlzSGVhbHRoQ29ubmVjdCA9IGZhbHNlO1xuICAgICAgLy8gfWVsc2V7XG4gICAgICAvLyAgIHRoaXMuaXNIZWFsdGhDb25uZWN0ID0gdHJ1ZTtcbiAgICAgIC8vIH1cbiAgICAgIFxuICAgIH1cblxuICB9XG5cbiAgYnRuRG93bG9hZEhlYWx0aENvbm5lY3QoKXtcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pcyhcImNvcmRvdmFcIikpIHtcbiAgICAgIGNvcmRvdmEucGx1Z2lucy5oZWFsdGguaXNBdmFpbGFibGUoKGF2YWlsYWJsZSkgPT4ge1xuICAgICAgICBpZiAoYXZhaWxhYmxlKSB7XG4gICAgICAgICAgdGhpcy5oaWRlQnV0dG9uSGVhbHRoQ29ubmVjdD0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICB9LCAoZSkgPT4ge1xuICAgICAgICAvL3RoaXMucHJlc2VudEFsZXJ0Q29uZmlybShlKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0hlYWx0aFNlcnZpY2VdIGNvbm5lY3QoKTogZXJyb3InLCBlKVxuICAgICAgfSk7XG4gICAgIH1cbiAgfVxuICBzZXRIZWFsdGhDb25uZWN0KCl7XG4gICAgXG4gIH1cblxuICBkb3dubG9hZEhlYWx0aENvbm5lY3QoKSB7XG4gICAgTmF0aXZlTWFya2V0Lm9wZW5TdG9yZUxpc3Rpbmcoe1xuICAgICAgYXBwSWQ6IC8qIHRoaXMuY29uc3RhbnRzLmhlYWx0aGNvbm5lY3RQYWNrYWdlSUQgKi8gJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmhlYWx0aGRhdGEnXG4gICAgfSk7XG4gICAgLyogY29yZG92YS5wbHVnaW5zLmhlYWx0aC5nZXRIZWFsdGhDb25uZWN0RnJvbVN0b3JlKFxuICAgICAgKHN1Y2Nlc3MpPT57Y29uc29sZS5sb2coXCJBbGwgZ29vZDogXCIsIHN1Y2Nlc3MpfSxcbiAgICAgIChlcnJvcik9Pntjb25zb2xlLmxvZyhcIldyb25nIGVycm9yXCIsIGVycm9yKX0gKTsgKi9cbiAgfVxuXG4gIGRvd25sb2FkR29vZ2xlRml0KCkge1xuICAgIE5hdGl2ZU1hcmtldC5vcGVuU3RvcmVMaXN0aW5nKHtcbiAgICAgIGFwcElkOiB0aGlzLmNvbnN0YW50cy5nb29nbGVGaXRQYWNrYWdlSURcbiAgICB9KTtcbiAgfVxuXG4gIHNldFByaXZhY3lQb2xpY3koKSB7XG4gICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5zZXRQcml2YWN5UG9saWN5VVJMKC8qIHRoaXMuY29uc3RhbnRzLnByaXZhY3lQb2xpY2llcyAqLyAnaHR0cHM6Ly9kb29sZWhlYWx0aC5jb20vZW4vcHJpdmFjeS1wb2xpY3kvJywgKCk9PnsvKmNvbnNvbGUubG9nKFwic3VjY2VzZnVseSBzaG93blwiKSovfSwgICgpPT57Lypjb25zb2xlLmxvZyhcIm5vdCBkaXNwbGF5c1wiKSovfSlcbiAgfVxuXG4gIG9wZW5IZWFsdGhTZXJ2aWNlcygpIHtcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLm9wZW5IZWFsdGhTZXR0aW5ncyhcbiAgICAgIChzdWNjZXNzKT0+ey8qY29uc29sZS5sb2coJ1tIZWFsdGhTZXJ2aWNlXSBvcGVuSGVhbHRoU2V0dGluZ3MoKSBzdWNjZXNzOiAnLCBzdWNjZXNzKSovfSwgIFxuICAgICAgKGVycm9yKT0+ey8qY29uc29sZS5sb2coJ1tIZWFsdGhTZXJ2aWNlXSBvcGVuSGVhbHRoU2V0dGluZ3MoKSBlcnJvcjogJywgZXJyb3IpKi99XG4gICAgKVxuICB9XG5cbiAgcHVibGljIGNvbm5lY3QoY29tZXNGcm9tU2V0dGluZ3M/OiBib29sZWFuKSB7XG4gICAgLy9jb25zb2xlLmxvZygnSGVhbHRoU2VydmljZSByZXF1ZXN0QXV0aG9yaXphdGlvbigpIGNvbm5lY3Q6JywgY29tZXNGcm9tU2V0dGluZ3MpXG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoXCJjb3Jkb3ZhXCIpKSB7XG4gICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLmlzQXZhaWxhYmxlKChhdmFpbGFibGUpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnSGVhbHRoU2VydmljZSByZXF1ZXN0QXV0aG9yaXphdGlvbigpIGF2YWlsYWJsZTonLCBhdmFpbGFibGUpXG4gICAgICAgIGlmIChhdmFpbGFibGUpIHtcblxuICAgICAgICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLmlzQXV0aG9yaXplZCh7IHJlYWQgOiB0aGlzLmRhdGFUeXBlcyB9LCAoYXV0aG9yaXplZCkgPT4ge1xuICAgICAgICAgICAgIGlmICghYXV0aG9yaXplZCkge1xuXG5cbiAgICAgICAgICAgICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5yZXF1ZXN0QXV0aG9yaXphdGlvbiggeyByZWFkIDogdGhpcy5kYXRhVHlwZXN9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWNjZXNzKT0+e1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdIZWFsdGhTZXJ2aWNlIHJlcXVlc3RBdXRob3JpemF0aW9uKCkgc3VjY2VzczonLCBzdWNjZXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldFNob3dIZWFsdGhDb25uZWN0TG9jYWxzdG9yYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnNldENhbmNlbGVkSGVhbHRoQ29ubmVjdExvY2Fsc3RvcmFnZShcInRydWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWREYXRhRnJvbUFwcCgzMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tZXNGcm9tU2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydzZXR0aW5ncyddLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydob21lJ10sIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSGVhbHRoU2VydmljZSByZXF1ZXN0QXV0aG9yaXphdGlvbigpIGVycm9yOicsIGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUhlYWx0aENvbm5lY3RTZXR0aW5ncyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0U2hvd0hlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5zZXRDYW5jZWxlZEhlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICB0aGlzLnJlYWREYXRhRnJvbUFwcCgzMCk7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnaG9tZSddKTtcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSB0cnVlXG4gICAgICAgICAgIH1cbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJlc2VudEFsZXJ0Q29uZmlybSgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnByZXNlbnRBbGVydENvbmZpcm0oKTtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiSGVhbHRoIHBsdWdpbiBub3QgYXZhaWxhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICB9LCAoZSkgPT4ge1xuICAgICAgICAvL3RoaXMucHJlc2VudEFsZXJ0Q29uZmlybShlKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0hlYWx0aFNlcnZpY2VdIGNvbm5lY3QoKTogZXJyb3InLCBlKVxuICAgICAgIHRoaXMuZG93bmxvYWRIZWFsdGhDb25uZWN0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXRyaWV2ZURhdGEoKSB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoXCJjb3Jkb3ZhXCIpKSB7XG4gICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLmlzQXZhaWxhYmxlKChhdmFpbGFibGUpID0+IHtcbiAgICAgICAgaWYgKGF2YWlsYWJsZSkge1xuXG4gICAgICAgICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5pc0F1dGhvcml6ZWQoeyByZWFkIDogdGhpcy5kYXRhVHlwZXN9LCAoYXV0aG9yaXplZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGF1dGhvcml6ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0U2hvd0hlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5zZXRDYW5jZWxlZEhlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICB0aGlzLnJlYWREYXRhRnJvbUFwcCgzMCk7XG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlSGVhbHRoQ29ubmVjdFNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbmFibGVIZWFsdGhDb25uZWN0U2V0dGluZ3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJlc2VudEFsZXJ0Q29uZmlybSgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgIC8vdGhpcy5wcmVzZW50QWxlcnRDb25maXJtKGUpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbSGVhbHRoU2VydmljZV0gY29ubmVjdCgpOiBlcnJvcicsIGUpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZWFkRGF0YUZyb21BcHAoZGF5cykge1xuICAgIGxldCBzdGFydERhdGUgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBsZXQgZW5kRGF0ZSA9IG5ldyBEYXRlKCk7IC8vIG5vd1xuXG4gICAgLy9jb25zb2xlLmxvZyhcIkVudGVyaW5nIGZvciByZWFkaW5nIGRhdGFcIilcbiAgICAgdGhpcy5yZWFkRGF0YShzdGFydERhdGUsIGVuZERhdGUpOyBcbiAgICAvLyB0aGlzLnJlYWRCbG9vZEdsdWNvc2Uoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICAvLyAgdGhpcy5yZWFkU3RlcHMoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICAvLyAgdGhpcy5yZWFkRGlzdGFuY2Uoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICAvL3RoaXMucmVhZEhlYXJ0UmF0ZShzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIC8vIHRoaXMucmVhZFdlaWdodERhdGEoc3RhcnREYXRlLCBlbmREYXRlKTtcblxuXG4gICAgLy8gc2V0VGltZW91dCgoKT0+IHRoaXMucmVhZEJsb29kR2x1Y29zZShzdGFydERhdGUsIGVuZERhdGUpLCA1MDApOyBcbiAgICAvLyBzZXRUaW1lb3V0KCgpPT4gdGhpcy5yZWFkU3RlcHMoc3RhcnREYXRlLCBlbmREYXRlKSwgMTUwMCk7IFxuICAgIC8vIHNldFRpbWVvdXQoKCk9PiB0aGlzLnJlYWREaXN0YW5jZShzdGFydERhdGUsIGVuZERhdGUpLCAxNTAwKTsgXG4gICAgLy8gc2V0VGltZW91dCgoKT0+IHRoaXMucmVhZFdlaWdodERhdGEoc3RhcnREYXRlLCBlbmREYXRlKSwgMTUwMCk7IFxuICAgIC8vIHNldFRpbWVvdXQoKCk9PiB0aGlzLnJlYWRIZWFydFJhdGUoc3RhcnREYXRlLCBlbmREYXRlKSwgNTAwKTsgXG4gIH1cblxuICBhc3luYyByZWFkRGF0YShzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpIHtcbiAgICBhd2FpdCB0aGlzLnBsYXRmb3JtLnJlYWR5KCk7XG5cbiAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIEVudGVyaW5nIGZvciByZWFkaW5nIGhlYWx0aCBkYXRhXCIpO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZGF0YVR5cGVzKSB7XG4gICAgICBjb25zdCBjb25maWc6IGFueSA9IHsgc3RhcnREYXRlOiBzdGFydERhdGUsIGVuZERhdGU6IGVuZERhdGUsIGRhdGFUeXBlOiBlbGVtZW50IH07XG5cbiAgICAgIGlmIChlbGVtZW50ID09PSAnZGlzdGFuY2UnIHx8IGVsZW1lbnQgPT09ICdzdGVwcycpIHtcbiAgICAgICAgY29uZmlnWydidWNrZXQnXSA9ICdob3VyJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5xdWVyeUFnZ3JlZ2F0ZWRIZWFsdGhEYXRhKGNvbmZpZyk7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhgREFUQSBIRUFMVEggQ09OTkVDVCAoJHtlbGVtZW50fSk6IGAsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBvc3RIZWFsdGgoZWxlbWVudCwgZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZm9yIHBvc3RpbmcgJHtlbGVtZW50fSBkYXRhOiBgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucXVlcnlIZWFsdGhEYXRhKGNvbmZpZyk7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhgREFUQSBIRUFMVEggQ09OTkVDVCAoJHtlbGVtZW50fSk6IGAsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBvc3RIZWFsdGgoZWxlbWVudCwgZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZm9yIHBvc3RpbmcgJHtlbGVtZW50fSBkYXRhOiBgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWVyeUFnZ3JlZ2F0ZWRIZWFsdGhEYXRhKGNvbmZpZzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5xdWVyeUFnZ3JlZ2F0ZWQoXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgKGRhdGE6IGFueSkgPT4gcmVzb2x2ZShkYXRhKSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHJlamVjdChlcnJvcilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBxdWVyeUhlYWx0aERhdGEoY29uZmlnOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5KFxuICAgICAgICBjb25maWcsXG4gICAgICAgIChkYXRhOiBhbnkpID0+IHJlc29sdmUoZGF0YSksXG4gICAgICAgIChlcnJvcjogYW55KSA9PiByZWplY3QoZXJyb3IpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFdlaWdodERhdGEoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcIltIZWFsdGhTZXJ2aWNlXSBFbnRlcmluZyBmb3IgcmVhZGluZyB3ZWlnaHQgZGF0YVwiKVxuICAgIC8vY29yZG92YS5wbHVnaW5zLmhlYWx0aC5xdWVyeSh7c3RhcnREYXRlOiBzdGFydERhdGUsICBlbmREYXRlOiBlbmREYXRlICwgIGRhdGFUeXBlOiAnd2VpZ2h0J30sIChkYXRhKT0+IHt0aGlzLnBvc3RIZWFsdGgoJ3dlaWdodCcsIGRhdGEpO30sICgpPT4ge2NvbnNvbGUuZXJyb3IoKX0pXG4gICAgY29yZG92YS5wbHVnaW5zLmhlYWx0aC5xdWVyeSh7XG4gICAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZSwgIGVuZERhdGU6IGVuZERhdGUsXG4gICAgICBkYXRhVHlwZTogJ3dlaWdodCd9LCBcbiAgICAgIChkYXRhOiBhbnkpPT4ge3RoaXMucG9zdEhlYWx0aCgnd2VpZ2h0JywgZGF0YSl9LCBcbiAgICAgIChlcnJvcik9PiB7Y29uc29sZS5lcnJvcihcIkVycm9yIGZvciBwb3N0aW5nIHdlaWdodCBkYXRhOiBcIiwgZXJyb3IpfVxuICAgIClcbiAgfVxuXG4gIHJlYWRCbG9vZEdsdWNvc2Uoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcIltIZWFsdGhTZXJ2aWNlXSBFbnRlcmluZyBmb3IgcmVhZGluZyBibG9vZF9nbHVjb3NlIGRhdGFcIilcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5KHtcbiAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlLCBcbiAgICAgIGRhdGFUeXBlOiAnYmxvb2RfZ2x1Y29zZSd9LCBcbiAgICAgIChkYXRhKT0+IHt0aGlzLnBvc3RIZWFsdGgoJ2Jsb29kX2dsdWNvc2UnLCBkYXRhKX0sIFxuICAgICAgKGVycm9yKT0+IHtjb25zb2xlLmVycm9yKFwiRXJyb3IgZm9yIHBvc3RpbmcgYmxvb2RfZ2x1Y29zZSBkYXRhIFwiLCBlcnJvcil9KVxuICB9XG5cbiAgcmVhZFN0ZXBzKHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSkge1xuICAgIC8vY29uc29sZS5sb2coXCJbSGVhbHRoU2VydmljZV0gRW50ZXJpbmcgZm9yIHJlYWRpbmcgc3RlcHMgZGF0YVwiKVxuICAgIGNvcmRvdmEucGx1Z2lucy5oZWFsdGgucXVlcnlBZ2dyZWdhdGVkKFxuICAgICAge3N0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlLCBkYXRhVHlwZTogJ3N0ZXBzJywgYnVja2V0OiAnZGF5J30sIFxuICAgICAgKGRhdGEpPT4ge3RoaXMucG9zdEhlYWx0aCgnc3RlcHMnLCBkYXRhKX0sIFxuICAgICAgKGVycm9yKT0+IHtjb25zb2xlLmVycm9yKFwiRXJyb3IgZm9yIHBvc3Rpbmcgc3RlcHMgZGF0YSBcIiwgZXJyb3IpfSlcbiAgfVxuXG4gIHJlYWREaXN0YW5jZShzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIEVudGVyaW5nIGZvciByZWFkaW5nIGRpc3RhbmNlIGRhdGFcIilcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5QWdncmVnYXRlZChcbiAgICAgIHtzdGFydERhdGU6IHN0YXJ0RGF0ZSwgZW5kRGF0ZTogZW5kRGF0ZSwgZGF0YVR5cGU6ICdkaXN0YW5jZScsIGJ1Y2tldDogJ2RheSd9LCBcbiAgICAgIChkYXRhKT0+IHsgdGhpcy5wb3N0SGVhbHRoKCdkaXN0YW5jZScsIGRhdGEpfSwgXG4gICAgICAoZXJyb3IpPT4ge2NvbnNvbGUuZXJyb3IoXCJFcnJvciBmb3IgcG9zdGluZyBkaXN0YW5jZSBkYXRhIFwiLCBlcnJvcil9KVxuICAgICAgLnRoZW4oIGRhdGEgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIEVudGVyaW5nIGZvciByZWFkaW5nIGRpc3RhbmNlIGRhdGExXCIsIGRhdGEpXG4gICAgICB9KTtcbiAgfVxuXG4gIHJlYWRIZWFydFJhdGUoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKSB7XG4gICAgLy9jb25zb2xlLmxvZyhcIltIZWFsdGhTZXJ2aWNlXSBFbnRlcmluZyBmb3IgcmVhZGluZyBoZWFydF9yYXRlIGRhdGFcIilcbiAgICBjb3Jkb3ZhLnBsdWdpbnMuaGVhbHRoLnF1ZXJ5KHtcbiAgICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlLFxuICAgICAgZGF0YVR5cGU6ICdoZWFydF9yYXRlJ30sIFxuICAgICAgKGRhdGEpPT4ge3RoaXMucG9zdEhlYWx0aCgnaGVhcnRfcmF0ZScsIGRhdGEpfSwgKCk9PiB7Y29uc29sZS5lcnJvcigpfSlcbiAgfVxuXG4gIC8vVG8gc2VuZCBQT1NUIHdpdGggaGVhbHRoIGRhdGEgdG8gYXBpXG4gIGFzeW5jIHBvc3RIZWFsdGgodHlwZTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICAvL2NvbnNvbGUubG9nKFwiW0hlYWx0aFNlcnZpY2VdIHBvc3RIZWFsdGgoKVwiLCB0eXBlLCBkYXRhKTtcbiAgICBjb25zdCB0aW1lem9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTtcbiAgICAvL2NvbnNvbGUubG9nKCdbSGVhbHRoU2VydmljZV0gc3luY0RhdGEnLCB0aW1lem9uZSk7XG4gICAgY29uc3QgcG9zdERhdGE6IGFueSA9IHtcbiAgICAgIHRpbWV6b25lOiB0aW1lem9uZSxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICB2YWxzOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9O1xuICAgIC8vY29uc29sZS5sb2coJ1tIZWFsdGhTZXJ2aWNlXSBwb3N0T2JqZWN0JywgcG9zdERhdGEpO1xuICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlPy5kZXZpY2VUb2tlbikge1xuICAgICAgcG9zdERhdGFbJ2RldmljZV90b2tlbiddID0gdGhpcy5hdXRoU2VydmljZS5kZXZpY2VUb2tlbjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kb29sZVNlcnZpY2UucG9zdCgndXNlci9lbGVtZW50L3N5bmMnLCBwb3N0RGF0YSkudG9Qcm9taXNlKCk7XG4gICAgICAvL2NvbnNvbGUubG9nKCdbSGVhbHRoU2VydmljZV0gYXBpUmVzJywgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy9jb25zb2xlLmxvZygnW0hlYWx0aFNlcnZpY2VdIGFwaUVycicsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcmVzZW50QWxlcnRDb25maXJtKGVycm9yPykge1xuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGNzc0NsYXNzOiAnbXktYWxlcnQtY2xhc3MnLFxuICAgICAgaGVhZGVyOiB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFwiYWxlcnQuYnV0dG9uX2NhbmNlbFwiKSxcbiAgICAgICAgICByb2xlOiAnY2FuY2VsJyxcbiAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKGJsYWgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0NvbmZpcm0gQ2FuY2VsOiBibGFoJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImhlYWx0aC1jb25uZWN0LnJldHVybl9ob21lXCIpLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2V0U2hvd0hlYWx0aENvbm5lY3RMb2NhbHN0b3JhZ2UoKVxuICAgICAgICAgICAgaWYgKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnbGFuZGluZycpKSBcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydsYW5kaW5nJ10pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2hvbWUnXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICB9XG5cbiAgZ2V0RXJyb3JNZXNzYWdlKGU/KTpzdHJpbmd7XG4gICAgaWYoZSAmJiBlID09PSAnSGVhbHRoIENvbm5lY3QgaXMgbm90IGluc3RhbGxlZCcpe1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJoZWFsdGgtY29ubmVjdC5lcnJvcl9tc2dfbm90X2luc3RhbGxcIilcbiAgICB9ZWxzZVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJoZWFsdGgtY29ubmVjdC5lcnJvcl9tc2dcIilcbiAgfVxufVxuIl19
|