kwikid-forms 0.6.32 → 0.6.34
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/bundles/kwikid-forms.umd.js +1413 -769
- package/bundles/kwikid-forms.umd.js.map +1 -1
- package/esm2015/lib/renderer/config-converter/config-converter.constants.js +11 -1
- package/esm2015/lib/renderer/config-converter/config-converter.js +36 -1
- package/esm2015/lib/renderer/form-view/definitions/form-view.actions.definition.js +5 -1
- package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +2 -1
- package/esm2015/lib/renderer/form-view/definitions/form-view.logs.definition.js +7 -2
- package/esm2015/lib/renderer/form-view/form-view.api.service.js +256 -0
- package/esm2015/lib/renderer/form-view/form-view.component.js +319 -64
- package/fesm2015/kwikid-forms.js +635 -74
- package/fesm2015/kwikid-forms.js.map +1 -1
- package/lib/renderer/config-converter/config-converter.constants.d.ts +10 -0
- package/lib/renderer/form-view/definitions/form-view.actions.definition.d.ts +5 -1
- package/lib/renderer/form-view/definitions/form-view.fields.definition.d.ts +17 -2
- package/lib/renderer/form-view/definitions/form-view.logs.definition.d.ts +6 -1
- package/lib/renderer/form-view/form-view.api.service.d.ts +11 -0
- package/lib/renderer/form-view/form-view.component.d.ts +9 -1
- package/package.json +3 -2
|
@@ -8,10 +8,12 @@ export var ELogEventType;
|
|
|
8
8
|
ELogEventType["FORM__API_BUTTON_CLICK"] = "FORM__API_BUTTON_CLICK";
|
|
9
9
|
ELogEventType["FORM__API_REQUEST"] = "FORM__API_REQUEST";
|
|
10
10
|
ELogEventType["FORM__API_REQUEST_INVALID"] = "FORM__API_REQUEST_INVALID";
|
|
11
|
+
ELogEventType["FORM__API_REQUEST_REVERSE_LAT_LONG"] = "FORM__API_REQUEST_REVERSE_LAT_LONG";
|
|
11
12
|
ELogEventType["FORM__API_REQUEST_UPLOAD_FILE"] = "FORM__API_REQUEST_UPLOAD_FILE";
|
|
12
13
|
ELogEventType["FORM__API_REQUEST_UPLOAD_IMAGE"] = "FORM__API_REQUEST_UPLOAD_IMAGE";
|
|
13
14
|
ELogEventType["FORM__API_REQUEST_UPLOAD_VIDEO"] = "FORM__API_REQUEST_UPLOAD_VIDEO";
|
|
14
15
|
ELogEventType["FORM__API_RESPONSE"] = "FORM__API_RESPONSE";
|
|
16
|
+
ELogEventType["FORM__API_RESPONSE_REVERSE_LAT_LONG"] = "FORM__API_RESPONSE_REVERSE_LAT_LONG";
|
|
15
17
|
ELogEventType["FORM__API_RESPONSE_UPLOAD_FILE"] = "FORM__API_RESPONSE_UPLOAD_FILE";
|
|
16
18
|
ELogEventType["FORM__API_RESPONSE_UPLOAD_IMAGE"] = "FORM__API_RESPONSE_UPLOAD_IMAGE";
|
|
17
19
|
ELogEventType["FORM__API_RESPONSE_UPLOAD_VIDEO"] = "FORM__API_RESPONSE_UPLOAD_VIDEO";
|
|
@@ -22,8 +24,8 @@ export var ELogEventType;
|
|
|
22
24
|
ELogEventType["FORM__DIALOG_ERROR"] = "FORM__DIALOG_ERROR";
|
|
23
25
|
ELogEventType["FORM__DIALOG_HIDE"] = "FORM__DIALOG_HIDE";
|
|
24
26
|
ELogEventType["FORM__DIALOG_SHOW"] = "FORM__DIALOG_SHOW";
|
|
25
|
-
ELogEventType["FORM__FIELD_API_TIMER_MESSAGE_SHOW"] = "FORM__FIELD_API_TIMER_MESSAGE_SHOW";
|
|
26
27
|
ELogEventType["FORM__FIELD_API_TIMER_MESSAGE_HIDE"] = "FORM__FIELD_API_TIMER_MESSAGE_HIDE";
|
|
28
|
+
ELogEventType["FORM__FIELD_API_TIMER_MESSAGE_SHOW"] = "FORM__FIELD_API_TIMER_MESSAGE_SHOW";
|
|
27
29
|
ELogEventType["FORM__FIELD_BUTTON_CLICK"] = "FORM__FIELD_BUTTON_CLICK";
|
|
28
30
|
ELogEventType["FORM__FIELD_CAMERA_BUTTON_CLICK"] = "FORM__FIELD_CAMERA_BUTTON_CLICK";
|
|
29
31
|
ELogEventType["FORM__FIELD_DISABLE"] = "FORM__FIELD_DISABLE";
|
|
@@ -39,6 +41,9 @@ export var ELogEventType;
|
|
|
39
41
|
ELogEventType["FORM__FIELD_RESET"] = "FORM__FIELD_RESET";
|
|
40
42
|
ELogEventType["FORM__FIELD_RESET_BUTTON_CLICK"] = "FORM__FIELD_RESET_BUTTON_CLICK";
|
|
41
43
|
ELogEventType["FORM__FIELD_SHOW"] = "FORM__FIELD_SHOW";
|
|
44
|
+
ELogEventType["FORM__LIVE_LOCATION_BUTTON_CLICK"] = "FORM__LIVE_LOCATION_BUTTON_CLICK";
|
|
45
|
+
ELogEventType["FORM__LIVE_LOCATION_PERMISSION_ERROR"] = "FORM__LIVE_LOCATION_PERMISSION_ERROR";
|
|
46
|
+
ELogEventType["FORM__LIVE_LOCATION_PERMISSION_SUCCESS"] = "FORM__LIVE_LOCATION_PERMISSION_SUCCESS";
|
|
42
47
|
ELogEventType["FORM__PREVIEW_ERROR"] = "FORM__PREVIEW_ERROR";
|
|
43
48
|
ELogEventType["FORM__PREVIEW_HIDE"] = "FORM__PREVIEW_HIDE";
|
|
44
49
|
ELogEventType["FORM__PREVIEW_SHOW"] = "FORM__PREVIEW_SHOW";
|
|
@@ -49,4 +54,4 @@ export var ELogEventType;
|
|
|
49
54
|
ELogEventType["FORM__TASK_PRE"] = "FORM__TASK_PRE";
|
|
50
55
|
ELogEventType["FORM__VIEW_BUTTON_CLICK"] = "FORM__VIEW_BUTTON_CLICK";
|
|
51
56
|
})(ELogEventType || (ELogEventType = {}));
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmxvZ3MuZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1mb3Jtcy9zcmMvbGliL3JlbmRlcmVyL2Zvcm0tdmlldy9kZWZpbml0aW9ucy9mb3JtLXZpZXcubG9ncy5kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGFBc0RYO0FBdERELFdBQVksYUFBYTtJQUN2Qiw4REFBNkMsQ0FBQTtJQUM3QywwRUFBeUQsQ0FBQTtJQUN6RCx3REFBdUMsQ0FBQTtJQUN2QyxzREFBcUMsQ0FBQTtJQUNyQyxzREFBcUMsQ0FBQTtJQUNyQyxrRUFBaUQsQ0FBQTtJQUNqRCx3REFBdUMsQ0FBQTtJQUN2Qyx3RUFBdUQsQ0FBQTtJQUN2RCwwRkFBeUUsQ0FBQTtJQUN6RSxnRkFBK0QsQ0FBQTtJQUMvRCxrRkFBaUUsQ0FBQTtJQUNqRSxrRkFBaUUsQ0FBQTtJQUNqRSwwREFBeUMsQ0FBQTtJQUN6Qyw0RkFBMkUsQ0FBQTtJQUMzRSxrRkFBaUUsQ0FBQTtJQUNqRSxvRkFBbUUsQ0FBQTtJQUNuRSxvRkFBbUUsQ0FBQTtJQUNuRSxrRkFBaUUsQ0FBQTtJQUNqRSxvRkFBbUUsQ0FBQTtJQUNuRSxrRkFBaUUsQ0FBQTtJQUNqRSx3RUFBdUQsQ0FBQTtJQUN2RCwwREFBeUMsQ0FBQTtJQUN6Qyx3REFBdUMsQ0FBQTtJQUN2Qyx3REFBdUMsQ0FBQTtJQUN2QywwRkFBeUUsQ0FBQTtJQUN6RSwwRkFBeUUsQ0FBQTtJQUN6RSxzRUFBcUQsQ0FBQTtJQUNyRCxvRkFBbUUsQ0FBQTtJQUNuRSw0REFBMkMsQ0FBQTtJQUMzQywwREFBeUMsQ0FBQTtJQUN6QyxrRUFBaUQsQ0FBQTtJQUNqRCxrRUFBaUQsQ0FBQTtJQUNqRCw4REFBNkMsQ0FBQTtJQUM3QyxvRUFBbUQsQ0FBQTtJQUNuRCxzREFBcUMsQ0FBQTtJQUNyQyxnRkFBK0QsQ0FBQTtJQUMvRCxzRUFBcUQsQ0FBQTtJQUNyRCxzRUFBcUQsQ0FBQTtJQUNyRCx3REFBdUMsQ0FBQTtJQUN2QyxrRkFBaUUsQ0FBQTtJQUNqRSxzREFBcUMsQ0FBQTtJQUNyQyxzRkFBcUUsQ0FBQTtJQUNyRSw4RkFBNkUsQ0FBQTtJQUM3RSxrR0FBaUYsQ0FBQTtJQUNqRiw0REFBMkMsQ0FBQTtJQUMzQywwREFBeUMsQ0FBQTtJQUN6QywwREFBeUMsQ0FBQTtJQUN6QywwREFBeUMsQ0FBQTtJQUN6QyxvREFBbUMsQ0FBQTtJQUNuQyxvRUFBbUQsQ0FBQTtJQUNuRCxvREFBbUMsQ0FBQTtJQUNuQyxrREFBaUMsQ0FBQTtJQUNqQyxvRUFBbUQsQ0FBQTtBQUNyRCxDQUFDLEVBdERXLGFBQWEsS0FBYixhQUFhLFFBc0R4QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEVMb2dFdmVudFR5cGUge1xuICBGT1JNX19BQ1RJT05fRVhFQ1VURSA9IFwiRk9STV9fQUNUSU9OX0VYRUNVVEVcIixcbiAgRk9STV9fQUNUSU9OX0VYRUNVVEVfR1JPVVAgPSBcIkZPUk1fX0FDVElPTl9FWEVDVVRFX0dST1VQXCIsXG4gIEZPUk1fX0FMRVJUX0VSUk9SID0gXCJGT1JNX19BTEVSVF9FUlJPUlwiLFxuICBGT1JNX19BTEVSVF9ISURFID0gXCJGT1JNX19BTEVSVF9ISURFXCIsXG4gIEZPUk1fX0FMRVJUX1NIT1cgPSBcIkZPUk1fX0FMRVJUX1NIT1dcIixcbiAgRk9STV9fQVBJX0JVVFRPTl9DTElDSyA9IFwiRk9STV9fQVBJX0JVVFRPTl9DTElDS1wiLFxuICBGT1JNX19BUElfUkVRVUVTVCA9IFwiRk9STV9fQVBJX1JFUVVFU1RcIixcbiAgRk9STV9fQVBJX1JFUVVFU1RfSU5WQUxJRCA9IFwiRk9STV9fQVBJX1JFUVVFU1RfSU5WQUxJRFwiLFxuICBGT1JNX19BUElfUkVRVUVTVF9SRVZFUlNFX0xBVF9MT05HID0gXCJGT1JNX19BUElfUkVRVUVTVF9SRVZFUlNFX0xBVF9MT05HXCIsXG4gIEZPUk1fX0FQSV9SRVFVRVNUX1VQTE9BRF9GSUxFID0gXCJGT1JNX19BUElfUkVRVUVTVF9VUExPQURfRklMRVwiLFxuICBGT1JNX19BUElfUkVRVUVTVF9VUExPQURfSU1BR0UgPSBcIkZPUk1fX0FQSV9SRVFVRVNUX1VQTE9BRF9JTUFHRVwiLFxuICBGT1JNX19BUElfUkVRVUVTVF9VUExPQURfVklERU8gPSBcIkZPUk1fX0FQSV9SRVFVRVNUX1VQTE9BRF9WSURFT1wiLFxuICBGT1JNX19BUElfUkVTUE9OU0UgPSBcIkZPUk1fX0FQSV9SRVNQT05TRVwiLFxuICBGT1JNX19BUElfUkVTUE9OU0VfUkVWRVJTRV9MQVRfTE9ORyA9IFwiRk9STV9fQVBJX1JFU1BPTlNFX1JFVkVSU0VfTEFUX0xPTkdcIixcbiAgRk9STV9fQVBJX1JFU1BPTlNFX1VQTE9BRF9GSUxFID0gXCJGT1JNX19BUElfUkVTUE9OU0VfVVBMT0FEX0ZJTEVcIixcbiAgRk9STV9fQVBJX1JFU1BPTlNFX1VQTE9BRF9JTUFHRSA9IFwiRk9STV9fQVBJX1JFU1BPTlNFX1VQTE9BRF9JTUFHRVwiLFxuICBGT1JNX19BUElfUkVTUE9OU0VfVVBMT0FEX1ZJREVPID0gXCJGT1JNX19BUElfUkVTUE9OU0VfVVBMT0FEX1ZJREVPXCIsXG4gIEZPUk1fX0NBTUVSQV9CQUNLX0JVVFRPTl9DTElDSyA9IFwiRk9STV9fQ0FNRVJBX0JBQ0tfQlVUVE9OX0NMSUNLXCIsXG4gIEZPUk1fX0NBTUVSQV9DTE9TRV9CVVRUT05fQ0xJQ0sgPSBcIkZPUk1fX0NBTUVSQV9DTE9TRV9CVVRUT05fQ0xJQ0tcIixcbiAgRk9STV9fQ0FNRVJBX1NBVkVfQlVUVE9OX0NMSUNLID0gXCJGT1JNX19DQU1FUkFfU0FWRV9CVVRUT05fQ0xJQ0tcIixcbiAgRk9STV9fQ09ORklHX0xPQURfU1VDQ0VTUyA9IFwiRk9STV9fQ09ORklHX0xPQURfU1VDQ0VTU1wiLFxuICBGT1JNX19ESUFMT0dfRVJST1IgPSBcIkZPUk1fX0RJQUxPR19FUlJPUlwiLFxuICBGT1JNX19ESUFMT0dfSElERSA9IFwiRk9STV9fRElBTE9HX0hJREVcIixcbiAgRk9STV9fRElBTE9HX1NIT1cgPSBcIkZPUk1fX0RJQUxPR19TSE9XXCIsXG4gIEZPUk1fX0ZJRUxEX0FQSV9USU1FUl9NRVNTQUdFX0hJREUgPSBcIkZPUk1fX0ZJRUxEX0FQSV9USU1FUl9NRVNTQUdFX0hJREVcIixcbiAgRk9STV9fRklFTERfQVBJX1RJTUVSX01FU1NBR0VfU0hPVyA9IFwiRk9STV9fRklFTERfQVBJX1RJTUVSX01FU1NBR0VfU0hPV1wiLFxuICBGT1JNX19GSUVMRF9CVVRUT05fQ0xJQ0sgPSBcIkZPUk1fX0ZJRUxEX0JVVFRPTl9DTElDS1wiLFxuICBGT1JNX19GSUVMRF9DQU1FUkFfQlVUVE9OX0NMSUNLID0gXCJGT1JNX19GSUVMRF9DQU1FUkFfQlVUVE9OX0NMSUNLXCIsXG4gIEZPUk1fX0ZJRUxEX0RJU0FCTEUgPSBcIkZPUk1fX0ZJRUxEX0RJU0FCTEVcIixcbiAgRk9STV9fRklFTERfRU5BQkxFID0gXCJGT1JNX19GSUVMRF9FTkFCTEVcIixcbiAgRk9STV9fRklFTERfRVJST1JfSElERSA9IFwiRk9STV9fRklFTERfRVJST1JfSElERVwiLFxuICBGT1JNX19GSUVMRF9FUlJPUl9TSE9XID0gXCJGT1JNX19GSUVMRF9FUlJPUl9TSE9XXCIsXG4gIEZPUk1fX0ZJRUxEX0ZJTEVfQUREID0gXCJGT1JNX19GSUVMRF9GSUxFX0FERFwiLFxuICBGT1JNX19GSUVMRF9GSUxFX1JFTU9WRSA9IFwiRk9STV9fRklFTERfRklMRV9SRU1PVkVcIixcbiAgRk9STV9fRklFTERfSElERSA9IFwiRk9STV9fRklFTERfSElERVwiLFxuICBGT1JNX19GSUVMRF9NRURJQV9GSUxFX1JFTU9WRSA9IFwiRk9STV9fRklFTERfTUVESUFfRklMRV9SRU1PVkVcIixcbiAgRk9STV9fRklFTERfTUVTU0FHRV9ISURFID0gXCJGT1JNX19GSUVMRF9NRVNTQUdFX0hJREVcIixcbiAgRk9STV9fRklFTERfTUVTU0FHRV9TSE9XID0gXCJGT1JNX19GSUVMRF9NRVNTQUdFX1NIT1dcIixcbiAgRk9STV9fRklFTERfUkVTRVQgPSBcIkZPUk1fX0ZJRUxEX1JFU0VUXCIsXG4gIEZPUk1fX0ZJRUxEX1JFU0VUX0JVVFRPTl9DTElDSyA9IFwiRk9STV9fRklFTERfUkVTRVRfQlVUVE9OX0NMSUNLXCIsXG4gIEZPUk1fX0ZJRUxEX1NIT1cgPSBcIkZPUk1fX0ZJRUxEX1NIT1dcIixcbiAgRk9STV9fTElWRV9MT0NBVElPTl9CVVRUT05fQ0xJQ0sgPSBcIkZPUk1fX0xJVkVfTE9DQVRJT05fQlVUVE9OX0NMSUNLXCIsXG4gIEZPUk1fX0xJVkVfTE9DQVRJT05fUEVSTUlTU0lPTl9FUlJPUiA9IFwiRk9STV9fTElWRV9MT0NBVElPTl9QRVJNSVNTSU9OX0VSUk9SXCIsXG4gIEZPUk1fX0xJVkVfTE9DQVRJT05fUEVSTUlTU0lPTl9TVUNDRVNTID0gXCJGT1JNX19MSVZFX0xPQ0FUSU9OX1BFUk1JU1NJT05fU1VDQ0VTU1wiLFxuICBGT1JNX19QUkVWSUVXX0VSUk9SID0gXCJGT1JNX19QUkVWSUVXX0VSUk9SXCIsXG4gIEZPUk1fX1BSRVZJRVdfSElERSA9IFwiRk9STV9fUFJFVklFV19ISURFXCIsXG4gIEZPUk1fX1BSRVZJRVdfU0hPVyA9IFwiRk9STV9fUFJFVklFV19TSE9XXCIsXG4gIEZPUk1fX1JFRElSRUNUX1VSTCA9IFwiRk9STV9fUkVESVJFQ1RfVVJMXCIsXG4gIEZPUk1fX1NBVkVfQVVUTyA9IFwiRk9STV9fU0FWRV9BVVRPXCIsXG4gIEZPUk1fX1NBVkVfQlVUVE9OX0NMSUNLID0gXCJGT1JNX19TQVZFX0JVVFRPTl9DTElDS1wiLFxuICBGT1JNX19UQVNLX1BPU1QgPSBcIkZPUk1fX1RBU0tfUE9TVFwiLFxuICBGT1JNX19UQVNLX1BSRSA9IFwiRk9STV9fVEFTS19QUkVcIixcbiAgRk9STV9fVklFV19CVVRUT05fQ0xJQ0sgPSBcIkZPUk1fX1ZJRVdfQlVUVE9OX0NMSUNLXCJcbn1cbiJdfQ==
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import { decryptWithAES, encryptWithAES, isNotEmptyValue, logMethod } from "kwikid-toolkit";
|
|
4
|
+
import { Observable } from "rxjs";
|
|
5
|
+
import { v4 as uuidv4 } from "uuid";
|
|
6
|
+
export class KwikIDFormViewApiService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.bytecode = [0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38];
|
|
9
|
+
}
|
|
10
|
+
// Function to derive logic from data
|
|
11
|
+
dataDerivativeLogic(data) {
|
|
12
|
+
if (isNotEmptyValue(data)) {
|
|
13
|
+
const dataString = JSON.stringify(data);
|
|
14
|
+
const charCounts = {};
|
|
15
|
+
const targetCharacters = ["a", "i", "p", "t"];
|
|
16
|
+
// Count occurrences of target characters in the data string
|
|
17
|
+
for (const char of dataString) {
|
|
18
|
+
if (targetCharacters.includes(char)) {
|
|
19
|
+
charCounts[char] = (charCounts[char] || 0) + 1;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Construct the output string based on the character counts
|
|
23
|
+
const outputString = targetCharacters
|
|
24
|
+
.map((char) => char + (charCounts[char] || 0))
|
|
25
|
+
.join("");
|
|
26
|
+
return outputString;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Function to preprocess header data
|
|
33
|
+
preProcessHeader(headerData, isVerifySignature) {
|
|
34
|
+
if (!headerData)
|
|
35
|
+
headerData = {};
|
|
36
|
+
if (!headerData.headers)
|
|
37
|
+
headerData["headers"] = {};
|
|
38
|
+
// Generate a unique identifier if signature verification is required
|
|
39
|
+
if (isVerifySignature) {
|
|
40
|
+
headerData["headers"]["xrid"] = uuidv4();
|
|
41
|
+
}
|
|
42
|
+
// Retrieve session ID from local storage and add it to headers
|
|
43
|
+
let session_id = localStorage.getItem("session_id");
|
|
44
|
+
if (session_id)
|
|
45
|
+
headerData["headers"]["ses"] = session_id;
|
|
46
|
+
return headerData;
|
|
47
|
+
}
|
|
48
|
+
// Function to verify the signature
|
|
49
|
+
verifySignature(data, header, url, isVerifySignature) {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
// Log the function call for verification
|
|
52
|
+
console.log("Verify Signature: Function Called For", url, header);
|
|
53
|
+
// Check if the signature is disabled
|
|
54
|
+
if (!isVerifySignature) {
|
|
55
|
+
console.log("Verify Signature: Authentication Disabled");
|
|
56
|
+
resolve(true);
|
|
57
|
+
}
|
|
58
|
+
// Check if data is invalid
|
|
59
|
+
else if (!data) {
|
|
60
|
+
console.log("Verify Signature: Data Not Available");
|
|
61
|
+
resolve(true);
|
|
62
|
+
}
|
|
63
|
+
// Check if the signature is missing in headers when authentication is not skipped
|
|
64
|
+
else if (isVerifySignature && header && !(header === null || header === void 0 ? void 0 : header.sig)) {
|
|
65
|
+
console.log("Verify Signature Failure: Signature Not Present in Headers");
|
|
66
|
+
reject(false);
|
|
67
|
+
}
|
|
68
|
+
// Verify the signature when public key and header with signature are present and authentication is not skipped
|
|
69
|
+
else if (isVerifySignature && header && (header === null || header === void 0 ? void 0 : header.sig)) {
|
|
70
|
+
console.log("Verify Signature: Signature Present in Headers");
|
|
71
|
+
// Extract the signature and decode it
|
|
72
|
+
let signature = header.sig.split(".")[0];
|
|
73
|
+
let rawSignature = atob(signature);
|
|
74
|
+
// Split the decoded signature to get the parts
|
|
75
|
+
signature = rawSignature.split(".")[0];
|
|
76
|
+
let exp = rawSignature.split(".")[1] + "000"; // Expiration time in milliseconds
|
|
77
|
+
let iat = rawSignature.split(".")[2] + "000"; // Issued at time in milliseconds
|
|
78
|
+
// Check if the signature is valid
|
|
79
|
+
if (signature) {
|
|
80
|
+
// Check if the current time is before the expiration time
|
|
81
|
+
const dateValue = new Date().valueOf();
|
|
82
|
+
let dateCheck = dateValue < parseInt(exp);
|
|
83
|
+
// Check if the signature matches the data
|
|
84
|
+
let res = signature === data;
|
|
85
|
+
console.log("Verify Signature: Matching", signature, data);
|
|
86
|
+
console.log("Verify Signature: Time", dateValue, parseInt(exp), parseInt(exp) - dateValue);
|
|
87
|
+
console.log("Verify Signature: Date", new Date(dateValue), new Date(parseInt(exp)));
|
|
88
|
+
console.log("Verify Signature: Signature Converted to Required Format");
|
|
89
|
+
// Resolve the promise if the signature is valid and the date check passes
|
|
90
|
+
if (res && dateCheck) {
|
|
91
|
+
console.log("Verify Signature Success");
|
|
92
|
+
resolve(res);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Reject the promise if the signature is invalid or the date check fails
|
|
96
|
+
console.log("Verify Signature Failure: Signature did not match");
|
|
97
|
+
reject(res);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Reject the promise if the signature is not in the required format
|
|
102
|
+
console.log("Verify Signature Failure: Signature Not Converted to Required Format");
|
|
103
|
+
reject(false);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Resolve the promise if the signature is missing in headers
|
|
108
|
+
console.log("Verify Signature Failure: Signature Not Present in Headers");
|
|
109
|
+
resolve(true);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// Function to perform POST request
|
|
114
|
+
post(url, body, headerData, isEncrypt = false, isDecrypt = false, isVerifySignature = false, isSkipHeaderAlteration = false) {
|
|
115
|
+
let preProcessedHeader = headerData;
|
|
116
|
+
// Preprocess header data unless instructed to skip
|
|
117
|
+
if (!isSkipHeaderAlteration) {
|
|
118
|
+
preProcessedHeader = this.preProcessHeader(headerData, isVerifySignature);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
preProcessedHeader["observe"] = "response";
|
|
122
|
+
}
|
|
123
|
+
// Encrypt body if required
|
|
124
|
+
if (isEncrypt) {
|
|
125
|
+
body = encryptWithAES(JSON.stringify(body));
|
|
126
|
+
}
|
|
127
|
+
return new Observable((subscriber) => {
|
|
128
|
+
axios.post(url, body, headerData).then((res) => __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
let data = res["data"];
|
|
130
|
+
// Decrypt response if required
|
|
131
|
+
if (data && isDecrypt) {
|
|
132
|
+
const encryptedResponse = data;
|
|
133
|
+
const decryptedResponse = yield decryptWithAES(encryptedResponse);
|
|
134
|
+
data = JSON.parse(decryptedResponse);
|
|
135
|
+
console.log("Decrypted Response", data);
|
|
136
|
+
res.data = data;
|
|
137
|
+
}
|
|
138
|
+
// Verify signature and handle response
|
|
139
|
+
this.verifySignature(this.dataDerivativeLogic(data), res === null || res === void 0 ? void 0 : res.headers, url, isVerifySignature)
|
|
140
|
+
.then((verification) => {
|
|
141
|
+
subscriber.next(res);
|
|
142
|
+
subscriber.complete();
|
|
143
|
+
})
|
|
144
|
+
.catch((err) => {
|
|
145
|
+
subscriber.error(err === null || err === void 0 ? void 0 : err.response);
|
|
146
|
+
});
|
|
147
|
+
}), (err) => __awaiter(this, void 0, void 0, function* () {
|
|
148
|
+
var _a, _b;
|
|
149
|
+
let data = (_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.data;
|
|
150
|
+
// Decrypt error response if required
|
|
151
|
+
if (data && isDecrypt) {
|
|
152
|
+
const encryptedResponse = data;
|
|
153
|
+
const decryptedResponse = yield decryptWithAES(encryptedResponse);
|
|
154
|
+
data = JSON.parse(decryptedResponse);
|
|
155
|
+
console.log("Decrypted Response", data);
|
|
156
|
+
err.response.data = data;
|
|
157
|
+
}
|
|
158
|
+
// Verify signature and handle response
|
|
159
|
+
this.verifySignature(this.dataDerivativeLogic(data), (_b = err === null || err === void 0 ? void 0 : err.response) === null || _b === void 0 ? void 0 : _b.headers, url, isVerifySignature)
|
|
160
|
+
.then((verification) => {
|
|
161
|
+
subscriber.error(err === null || err === void 0 ? void 0 : err.response);
|
|
162
|
+
})
|
|
163
|
+
.catch((err) => {
|
|
164
|
+
subscriber.error(err === null || err === void 0 ? void 0 : err.response);
|
|
165
|
+
});
|
|
166
|
+
}));
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// Function to perform GET request
|
|
170
|
+
get(url, headerData = undefined, isDecrypt = false, isVerifySignature = false, isSkipHeaderAlteration = false) {
|
|
171
|
+
let preProcessedHeader = headerData;
|
|
172
|
+
// Preprocess header data unless instructed to skip
|
|
173
|
+
if (!isSkipHeaderAlteration) {
|
|
174
|
+
preProcessedHeader = this.preProcessHeader(headerData, isVerifySignature);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
preProcessedHeader["observe"] = "response";
|
|
178
|
+
}
|
|
179
|
+
return new Observable((subscriber) => {
|
|
180
|
+
axios.get(url, preProcessedHeader).then((res) => __awaiter(this, void 0, void 0, function* () {
|
|
181
|
+
let data = res["data"];
|
|
182
|
+
// Decrypt response if required
|
|
183
|
+
if (isDecrypt) {
|
|
184
|
+
const encryptedResponse = data;
|
|
185
|
+
const decryptedResponse = yield decryptWithAES(encryptedResponse);
|
|
186
|
+
data = JSON.parse(decryptedResponse);
|
|
187
|
+
console.log("Decrypted Response", data);
|
|
188
|
+
res.data = data;
|
|
189
|
+
}
|
|
190
|
+
// Verify signature and handle response
|
|
191
|
+
this.verifySignature(this.dataDerivativeLogic(data), res === null || res === void 0 ? void 0 : res.headers, url, isVerifySignature)
|
|
192
|
+
.then((verification) => {
|
|
193
|
+
subscriber.next(res);
|
|
194
|
+
subscriber.complete();
|
|
195
|
+
})
|
|
196
|
+
.catch((err) => {
|
|
197
|
+
subscriber.error(err === null || err === void 0 ? void 0 : err.response);
|
|
198
|
+
});
|
|
199
|
+
}), (err) => __awaiter(this, void 0, void 0, function* () {
|
|
200
|
+
var _a, _b;
|
|
201
|
+
let data = (_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.data;
|
|
202
|
+
// Decrypt error response if required
|
|
203
|
+
if (data && isDecrypt) {
|
|
204
|
+
const encryptedResponse = data;
|
|
205
|
+
const decryptedResponse = yield decryptWithAES(encryptedResponse);
|
|
206
|
+
data = JSON.parse(decryptedResponse);
|
|
207
|
+
console.log("Decrypted Response", data);
|
|
208
|
+
err.response.data = data;
|
|
209
|
+
}
|
|
210
|
+
// Verify signature and handle response
|
|
211
|
+
this.verifySignature(this.dataDerivativeLogic(data), (_b = err === null || err === void 0 ? void 0 : err.response) === null || _b === void 0 ? void 0 : _b.headers, url, isVerifySignature)
|
|
212
|
+
.then((verification) => {
|
|
213
|
+
subscriber.error(err === null || err === void 0 ? void 0 : err.response);
|
|
214
|
+
})
|
|
215
|
+
.catch((err) => {
|
|
216
|
+
subscriber.error(err === null || err === void 0 ? void 0 : err.response);
|
|
217
|
+
});
|
|
218
|
+
}));
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
// Function to execute API call based on method type
|
|
222
|
+
executeApiCall(url, method, body, headers, isEncrypt, isDecrypt, isVerifySignature) {
|
|
223
|
+
return new Promise((resolve) => {
|
|
224
|
+
if (method == "GET") {
|
|
225
|
+
this.get(url, { headers: headers }, isDecrypt, isVerifySignature).subscribe((res) => {
|
|
226
|
+
resolve(res);
|
|
227
|
+
}, (err) => {
|
|
228
|
+
resolve(err);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
this.post(url, body, { headers: headers }, isEncrypt, isDecrypt, isVerifySignature).subscribe((res) => {
|
|
233
|
+
resolve(res);
|
|
234
|
+
}, (err) => {
|
|
235
|
+
resolve(err);
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
__decorate([
|
|
242
|
+
logMethod
|
|
243
|
+
], KwikIDFormViewApiService.prototype, "dataDerivativeLogic", null);
|
|
244
|
+
__decorate([
|
|
245
|
+
logMethod
|
|
246
|
+
], KwikIDFormViewApiService.prototype, "preProcessHeader", null);
|
|
247
|
+
__decorate([
|
|
248
|
+
logMethod
|
|
249
|
+
], KwikIDFormViewApiService.prototype, "verifySignature", null);
|
|
250
|
+
__decorate([
|
|
251
|
+
logMethod
|
|
252
|
+
], KwikIDFormViewApiService.prototype, "post", null);
|
|
253
|
+
__decorate([
|
|
254
|
+
logMethod
|
|
255
|
+
], KwikIDFormViewApiService.prototype, "get", null);
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvZm9ybS12aWV3L2Zvcm0tdmlldy5hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsY0FBYyxFQUNkLGVBQWUsRUFDZixTQUFTLEVBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE1BQU0sT0FBTyx3QkFBd0I7SUFHbkM7UUFGUSxhQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFckQsQ0FBQztJQUVoQixxQ0FBcUM7SUFFckMsbUJBQW1CLENBQUMsSUFBSTtRQUN0QixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUN0QixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFOUMsNERBQTREO1lBQzVELEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFO2dCQUM3QixJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbkMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMs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dCB7XG4gIGRlY3J5cHRXaXRoQUVTLFxuICBlbmNyeXB0V2l0aEFFUyxcbiAgaXNOb3RFbXB0eVZhbHVlLFxuICBsb2dNZXRob2Rcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gXCJ1dWlkXCI7XG5cbmV4cG9ydCBjbGFzcyBLd2lrSURGb3JtVmlld0FwaVNlcnZpY2Uge1xuICBwcml2YXRlIGJ5dGVjb2RlID0gWzB4MzgsIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzhdO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvLyBGdW5jdGlvbiB0byBkZXJpdmUgbG9naWMgZnJvbSBkYXRhXG4gIEBsb2dNZXRob2RcbiAgZGF0YURlcml2YXRpdmVMb2dpYyhkYXRhKSB7XG4gICAgaWYgKGlzTm90RW1wdHlWYWx1ZShkYXRhKSkge1xuICAgICAgY29uc3QgZGF0YVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgY29uc3QgY2hhckNvdW50cyA9IHt9O1xuICAgICAgY29uc3QgdGFyZ2V0Q2hhcmFjdGVycyA9IFtcImFcIiwgXCJpXCIsIFwicFwiLCBcInRcIl07XG5cbiAgICAgIC8vIENvdW50IG9jY3VycmVuY2VzIG9mIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZSBkYXRhIHN0cmluZ1xuICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGRhdGFTdHJpbmcpIHtcbiAgICAgICAgaWYgKHRhcmdldENoYXJhY3RlcnMuaW5jbHVkZXMoY2hhcikpIHtcbiAgICAgICAgICBjaGFyQ291bnRzW2NoYXJdID0gKGNoYXJDb3VudHNbY2hhcl0gfHwgMCkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnN0cnVjdCB0aGUgb3V0cHV0IHN0cmluZyBiYXNlZCBvbiB0aGUgY2hhcmFjdGVyIGNvdW50c1xuICAgICAgY29uc3Qgb3V0cHV0U3RyaW5nID0gdGFyZ2V0Q2hhcmFjdGVyc1xuICAgICAgICAubWFwKChjaGFyKSA9PiBjaGFyICsgKGNoYXJDb3VudHNbY2hhcl0gfHwgMCkpXG4gICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgcmV0dXJuIG91dHB1dFN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBGdW5jdGlvbiB0byBwcmVwcm9jZXNzIGhlYWRlciBkYXRhXG4gIEBsb2dNZXRob2RcbiAgcHJlUHJvY2Vzc0hlYWRlcihoZWFkZXJEYXRhOiBhbnksIGlzVmVyaWZ5U2lnbmF0dXJlOiBib29sZWFuKTogYW55IHtcbiAgICBpZiAoIWhlYWRlckRhdGEpIGhlYWRlckRhdGEgPSB7fTtcbiAgICBpZiAoIWhlYWRlckRhdGEuaGVhZGVycykgaGVhZGVyRGF0YVtcImhlYWRlcnNcIl0gPSB7fTtcblxuICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIGlkZW50aWZpZXIgaWYgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZFxuICAgIGlmIChpc1ZlcmlmeVNpZ25hdHVyZSkge1xuICAgICAgaGVhZGVyRGF0YVtcImhlYWRlcnNcIl1bXCJ4cmlkXCJdID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgc2Vzc2lvbiBJRCBmcm9tIGxvY2FsIHN0b3JhZ2UgYW5kIGFkZCBpdCB0byBoZWFkZXJzXG4gICAgbGV0IHNlc3Npb25faWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlc3Npb25faWRcIik7XG4gICAgaWYgKHNlc3Npb25faWQpIGhlYWRlckRhdGFbXCJoZWFkZXJzXCJdW1wic2VzXCJdID0gc2Vzc2lvbl9pZDtcblxuICAgIHJldHVybiBoZWFkZXJEYXRhO1xuICB9XG5cbiAgLy8gRnVuY3Rpb24gdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmVcbiAgQGxvZ01ldGhvZFxuICB2ZXJpZnlTaWduYXR1cmUoZGF0YSwgaGVhZGVyLCB1cmwsIGlzVmVyaWZ5U2lnbmF0dXJlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIExvZyB0aGUgZnVuY3Rpb24gY2FsbCBmb3IgdmVyaWZpY2F0aW9uXG4gICAgICBjb25zb2xlLmxvZyhcIlZlcmlmeSBTaWduYXR1cmU6IEZ1bmN0aW9uIENhbGxlZCBGb3JcIiwgdXJsLCBoZWFkZXIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2lnbmF0dXJlIGlzIGRpc2FibGVkXG4gICAgICBpZiAoIWlzVmVyaWZ5U2lnbmF0dXJlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiVmVyaWZ5IFNpZ25hdHVyZTogQXV0aGVudGljYXRpb24gRGlzYWJsZWRcIik7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgaW52YWxpZFxuICAgICAgZWxzZSBpZiAoIWRhdGEpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZnkgU2lnbmF0dXJlOiBEYXRhIE5vdCBBdmFpbGFibGVcIik7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzaWduYXR1cmUgaXMgbWlzc2luZyBpbiBoZWFkZXJzIHdoZW4gYXV0aGVudGljYXRpb24gaXMgbm90IHNraXBwZWRcbiAgICAgIGVsc2UgaWYgKGlzVmVyaWZ5U2lnbmF0dXJlICYmIGhlYWRlciAmJiAhaGVhZGVyPy5zaWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgXCJWZXJpZnkgU2lnbmF0dXJlIEZhaWx1cmU6IFNpZ25hdHVyZSBOb3QgUHJlc2VudCBpbiBIZWFkZXJzXCJcbiAgICAgICAgKTtcbiAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IHRoZSBzaWduYXR1cmUgd2hlbiBwdWJsaWMga2V5IGFuZCBoZWFkZXIgd2l0aCBzaWduYXR1cmUgYXJlIHByZXNlbnQgYW5kIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBza2lwcGVkXG4gICAgICBlbHNlIGlmIChpc1ZlcmlmeVNpZ25hdHVyZSAmJiBoZWFkZXIgJiYgaGVhZGVyPy5zaWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZnkgU2lnbmF0dXJlOiBTaWduYXR1cmUgUHJlc2VudCBpbiBIZWFkZXJzXCIpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHNpZ25hdHVyZSBhbmQgZGVjb2RlIGl0XG4gICAgICAgIGxldCBzaWduYXR1cmUgPSBoZWFkZXIuc2lnLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgbGV0IHJhd1NpZ25hdHVyZSA9IGF0b2Ioc2lnbmF0dXJlKTtcblxuICAgICAgICAvLyBTcGxpdCB0aGUgZGVjb2RlZCBzaWduYXR1cmUgdG8gZ2V0IHRoZSBwYXJ0c1xuICAgICAgICBzaWduYXR1cmUgPSByYXdTaWduYXR1cmUuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICBsZXQgZXhwID0gcmF3U2lnbmF0dXJlLnNwbGl0KFwiLlwiKVsxXSArIFwiMDAwXCI7IC8vIEV4cGlyYXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgbGV0IGlhdCA9IHJhd1NpZ25hdHVyZS5zcGxpdChcIi5cIilbMl0gKyBcIjAwMFwiOyAvLyBJc3N1ZWQgYXQgdGltZSBpbiBtaWxsaXNlY29uZHNcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkXG4gICAgICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0aW1lIGlzIGJlZm9yZSB0aGUgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAgICAgY29uc3QgZGF0ZVZhbHVlID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XG4gICAgICAgICAgbGV0IGRhdGVDaGVjayA9IGRhdGVWYWx1ZSA8IHBhcnNlSW50KGV4cCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2lnbmF0dXJlIG1hdGNoZXMgdGhlIGRhdGFcbiAgICAgICAgICBsZXQgcmVzID0gc2lnbmF0dXJlID09PSBkYXRhO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiVmVyaWZ5IFNpZ25hdHVyZTogTWF0Y2hpbmdcIiwgc2lnbmF0dXJlLCBkYXRhKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIFwiVmVyaWZ5IFNpZ25hdHVyZTogVGltZVwiLFxuICAgICAgICAgICAgZGF0ZVZhbHVlLFxuICAgICAgICAgICAgcGFyc2VJbnQoZXhwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGV4cCkgLSBkYXRlVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBcIlZlcmlmeSBTaWduYXR1cmU6IERhdGVcIixcbiAgICAgICAgICAgIG5ldyBEYXRlKGRhdGVWYWx1ZSksXG4gICAgICAgICAgICBuZXcgRGF0ZShwYXJzZUludChleHApKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIFwiVmVyaWZ5IFNpZ25hdHVyZTogU2lnbmF0dXJlIENvbnZlcnRlZCB0byBSZXF1aXJlZCBGb3JtYXRcIlxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIGlmIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQgYW5kIHRoZSBkYXRlIGNoZWNrIHBhc3Nlc1xuICAgICAgICAgIGlmIChyZXMgJiYgZGF0ZUNoZWNrKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlZlcmlmeSBTaWduYXR1cmUgU3VjY2Vzc1wiKTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBzaWduYXR1cmUgaXMgaW52YWxpZCBvciB0aGUgZGF0ZSBjaGVjayBmYWlsc1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZnkgU2lnbmF0dXJlIEZhaWx1cmU6IFNpZ25hdHVyZSBkaWQgbm90IG1hdGNoXCIpO1xuICAgICAgICAgICAgcmVqZWN0KHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgc2lnbmF0dXJlIGlzIG5vdCBpbiB0aGUgcmVxdWlyZWQgZm9ybWF0XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBcIlZlcmlmeSBTaWduYXR1cmUgRmFpbHVyZTogU2lnbmF0dXJlIE5vdCBDb252ZXJ0ZWQgdG8gUmVxdWlyZWQgRm9ybWF0XCJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2UgaWYgdGhlIHNpZ25hdHVyZSBpcyBtaXNzaW5nIGluIGhlYWRlcnNcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgXCJWZXJpZnkgU2lnbmF0dXJlIEZhaWx1cmU6IFNpZ25hdHVyZSBOb3QgUHJlc2VudCBpbiBIZWFkZXJzXCJcbiAgICAgICAgKTtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIHBlcmZvcm0gUE9TVCByZXF1ZXN0XG4gIEBsb2dNZXRob2RcbiAgcG9zdChcbiAgICB1cmwsXG4gICAgYm9keSxcbiAgICBoZWFkZXJEYXRhLFxuICAgIGlzRW5jcnlwdCA9IGZhbHNlLFxuICAgIGlzRGVjcnlwdCA9IGZhbHNlLFxuICAgIGlzVmVyaWZ5U2lnbmF0dXJlID0gZmFsc2UsXG4gICAgaXNTa2lwSGVhZGVyQWx0ZXJhdGlvbiA9IGZhbHNlXG4gICkge1xuICAgIGxldCBwcmVQcm9jZXNzZWRIZWFkZXIgPSBoZWFkZXJEYXRhO1xuXG4gICAgLy8gUHJlcHJvY2VzcyBoZWFkZXIgZGF0YSB1bmxlc3MgaW5zdHJ1Y3RlZCB0byBza2lwXG4gICAgaWYgKCFpc1NraXBIZWFkZXJBbHRlcmF0aW9uKSB7XG4gICAgICBwcmVQcm9jZXNzZWRIZWFkZXIgPSB0aGlzLnByZVByb2Nlc3NIZWFkZXIoaGVhZGVyRGF0YSwgaXNWZXJpZnlTaWduYXR1cmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVQcm9jZXNzZWRIZWFkZXJbXCJvYnNlcnZlXCJdID0gXCJyZXNwb25zZVwiO1xuICAgIH1cblxuICAgIC8vIEVuY3J5cHQgYm9keSBpZiByZXF1aXJlZFxuICAgIGlmIChpc0VuY3J5cHQpIHtcbiAgICAgIGJvZHkgPSBlbmNyeXB0V2l0aEFFUyhKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBheGlvcy5wb3N0KHVybCwgYm9keSwgaGVhZGVyRGF0YSkudGhlbihcbiAgICAgICAgYXN5bmMgKHJlcykgPT4ge1xuICAgICAgICAgIGxldCBkYXRhID0gcmVzW1wiZGF0YVwiXTtcblxuICAgICAgICAgIC8vIERlY3J5cHQgcmVzcG9uc2UgaWYgcmVxdWlyZWRcbiAgICAgICAgICBpZiAoZGF0YSAmJiBpc0RlY3J5cHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRlZFJlc3BvbnNlID0gZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZFJlc3BvbnNlID0gYXdhaXQgZGVjcnlwdFdpdGhBRVMoZW5jcnlwdGVkUmVzcG9uc2UpO1xuICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGVjcnlwdGVkUmVzcG9uc2UpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJEZWNyeXB0ZWQgUmVzcG9uc2VcIiwgZGF0YSk7XG4gICAgICAgICAgICByZXMuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZSBhbmQgaGFuZGxlIHJlc3BvbnNlXG4gICAgICAgICAgdGhpcy52ZXJpZnlTaWduYXR1cmUoXG4gICAgICAgICAgICB0aGlzLmRhdGFEZXJpdmF0aXZlTG9naWMoZGF0YSksXG4gICAgICAgICAgICByZXM/LmhlYWRlcnMsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBpc1ZlcmlmeVNpZ25hdHVyZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKCh2ZXJpZmljYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlcyk7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycj8ucmVzcG9uc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgICBsZXQgZGF0YSA9IGVycj8ucmVzcG9uc2U/LmRhdGE7XG5cbiAgICAgICAgICAvLyBEZWNyeXB0IGVycm9yIHJlc3BvbnNlIGlmIHJlcXVpcmVkXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNEZWNyeXB0KSB7XG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0ZWRSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWRSZXNwb25zZSA9IGF3YWl0IGRlY3J5cHRXaXRoQUVTKGVuY3J5cHRlZFJlc3BvbnNlKTtcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRlY3J5cHRlZFJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVjcnlwdGVkIFJlc3BvbnNlXCIsIGRhdGEpO1xuICAgICAgICAgICAgZXJyLnJlc3BvbnNlLmRhdGEgPSBkYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUgYW5kIGhhbmRsZSByZXNwb25zZVxuICAgICAgICAgIHRoaXMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICAgICAgdGhpcy5kYXRhRGVyaXZhdGl2ZUxvZ2ljKGRhdGEpLFxuICAgICAgICAgICAgZXJyPy5yZXNwb25zZT8uaGVhZGVycyxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGlzVmVyaWZ5U2lnbmF0dXJlXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKHZlcmlmaWNhdGlvbikgPT4ge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycj8ucmVzcG9uc2UpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyPy5yZXNwb25zZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIHBlcmZvcm0gR0VUIHJlcXVlc3RcbiAgQGxvZ01ldGhvZFxuICBnZXQoXG4gICAgdXJsLFxuICAgIGhlYWRlckRhdGEgPSB1bmRlZmluZWQsXG4gICAgaXNEZWNyeXB0ID0gZmFsc2UsXG4gICAgaXNWZXJpZnlTaWduYXR1cmUgPSBmYWxzZSxcbiAgICBpc1NraXBIZWFkZXJBbHRlcmF0aW9uID0gZmFsc2VcbiAgKSB7XG4gICAgbGV0IHByZVByb2Nlc3NlZEhlYWRlciA9IGhlYWRlckRhdGE7XG5cbiAgICAvLyBQcmVwcm9jZXNzIGhlYWRlciBkYXRhIHVubGVzcyBpbnN0cnVjdGVkIHRvIHNraXBcbiAgICBpZiAoIWlzU2tpcEhlYWRlckFsdGVyYXRpb24pIHtcbiAgICAgIHByZVByb2Nlc3NlZEhlYWRlciA9IHRoaXMucHJlUHJvY2Vzc0hlYWRlcihoZWFkZXJEYXRhLCBpc1ZlcmlmeVNpZ25hdHVyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZVByb2Nlc3NlZEhlYWRlcltcIm9ic2VydmVcIl0gPSBcInJlc3BvbnNlXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBheGlvcy5nZXQodXJsLCBwcmVQcm9jZXNzZWRIZWFkZXIpLnRoZW4oXG4gICAgICAgIGFzeW5jIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhID0gcmVzW1wiZGF0YVwiXTtcblxuICAgICAgICAgIC8vIERlY3J5cHQgcmVzcG9uc2UgaWYgcmVxdWlyZWRcbiAgICAgICAgICBpZiAoaXNEZWNyeXB0KSB7XG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0ZWRSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWRSZXNwb25zZSA9IGF3YWl0IGRlY3J5cHRXaXRoQUVTKGVuY3J5cHRlZFJlc3BvbnNlKTtcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRlY3J5cHRlZFJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVjcnlwdGVkIFJlc3BvbnNlXCIsIGRhdGEpO1xuICAgICAgICAgICAgcmVzLmRhdGEgPSBkYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUgYW5kIGhhbmRsZSByZXNwb25zZVxuICAgICAgICAgIHRoaXMudmVyaWZ5U2lnbmF0dXJlKFxuICAgICAgICAgICAgdGhpcy5kYXRhRGVyaXZhdGl2ZUxvZ2ljKGRhdGEpLFxuICAgICAgICAgICAgcmVzPy5oZWFkZXJzLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgaXNWZXJpZnlTaWduYXR1cmVcbiAgICAgICAgICApXG4gICAgICAgICAgICAudGhlbigodmVyaWZpY2F0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXMpO1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnI/LnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgICAgbGV0IGRhdGEgPSBlcnI/LnJlc3BvbnNlPy5kYXRhO1xuXG4gICAgICAgICAgLy8gRGVjcnlwdCBlcnJvciByZXNwb25zZSBpZiByZXF1aXJlZFxuICAgICAgICAgIGlmIChkYXRhICYmIGlzRGVjcnlwdCkge1xuICAgICAgICAgICAgY29uc3QgZW5jcnlwdGVkUmVzcG9uc2UgPSBkYXRhO1xuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkUmVzcG9uc2UgPSBhd2FpdCBkZWNyeXB0V2l0aEFFUyhlbmNyeXB0ZWRSZXNwb25zZSk7XG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSZXNwb25zZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlY3J5cHRlZCBSZXNwb25zZVwiLCBkYXRhKTtcbiAgICAgICAgICAgIGVyci5yZXNwb25zZS5kYXRhID0gZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlIGFuZCBoYW5kbGUgcmVzcG9uc2VcbiAgICAgICAgICB0aGlzLnZlcmlmeVNpZ25hdHVyZShcbiAgICAgICAgICAgIHRoaXMuZGF0YURlcml2YXRpdmVMb2dpYyhkYXRhKSxcbiAgICAgICAgICAgIGVycj8ucmVzcG9uc2U/LmhlYWRlcnMsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBpc1ZlcmlmeVNpZ25hdHVyZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKCh2ZXJpZmljYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnI/LnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycj8ucmVzcG9uc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBGdW5jdGlvbiB0byBleGVjdXRlIEFQSSBjYWxsIGJhc2VkIG9uIG1ldGhvZCB0eXBlXG4gIGV4ZWN1dGVBcGlDYWxsKFxuICAgIHVybCxcbiAgICBtZXRob2QsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzLFxuICAgIGlzRW5jcnlwdCxcbiAgICBpc0RlY3J5cHQsXG4gICAgaXNWZXJpZnlTaWduYXR1cmVcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09IFwiR0VUXCIpIHtcbiAgICAgICAgdGhpcy5nZXQoXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHsgaGVhZGVyczogaGVhZGVycyB9LFxuICAgICAgICAgIGlzRGVjcnlwdCxcbiAgICAgICAgICBpc1ZlcmlmeVNpZ25hdHVyZVxuICAgICAgICApLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc3QoXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgeyBoZWFkZXJzOiBoZWFkZXJzIH0sXG4gICAgICAgICAgaXNFbmNyeXB0LFxuICAgICAgICAgIGlzRGVjcnlwdCxcbiAgICAgICAgICBpc1ZlcmlmeVNpZ25hdHVyZVxuICAgICAgICApLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|