UNPKG

@affinidi/common-check-widget-backend-lib

Version:

An common-check-widget-backend-lib used to development backend for common-check-widget-frontend

129 lines 16.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.EndpointServiceBase = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = require("fs"); const node_fetch_1 = require("node-fetch"); const crypto = require("crypto"); const jwt = require("jsonwebtoken"); class EndpointServiceBase { constructor(apiEndpoint, apiKey, errorCode, privateKeyFile, secretPassphrase, requestID) { this.apiEndpoint = apiEndpoint; this.apiKey = apiKey; this.errorCode = errorCode; this.privateKeyFile = privateKeyFile; this.secretPassphrase = secretPassphrase; this.requestID = requestID; } retrieveApiKey() { return this.apiKey; } fillOptions(options) { this.options = options; } async callAPIEndpoint() { console.log(new Date(), "Calling Endpoint", this.apiEndpoint); let response; try { response = await node_fetch_1.default(this.apiEndpoint, this.options); console.log(new Date(), "Completed Endpoint"); if (response === null || response === void 0 ? void 0 : response.code) { return this.getErrorMessage({ type: 'Error Code', value: response.code, description: 'Error From Endpoint' }); } return response.json(); } catch (error) { console.log(new Date(), "Fail Endpoint with error", { error }); throw new Error(response.status); } } getErrorMessage(errorObj) { let error = []; if (errorObj) { error.push(errorObj); } this.errors = ({ code: this.errorCode, errors: error, metadata: { requestID: this.requestID, service: 'EndpointService' } }); return this.errors; } decrypt(data) { console.log("encrypted_data", data); try { const privateKey = fs.readFileSync(this.privateKeyFile); const buffer = Buffer.from(data, "base64"); const decrypted = crypto.privateDecrypt({ key: privateKey, passphrase: this.secretPassphrase, }, buffer).toString(); return decrypted; } catch (error) { console.log(new Date(), "Fail Endpoint with error", { error }); throw new Error(error); } } generatePayloadJson(flightNumber, flightDate, firstName, lastName, dateOfBirth, passport, nationality) { const json = { intent: { flight_number: flightNumber, scheduled_departure_time: flightDate }, user_identity: { first_name: firstName, last_name: lastName, dob: dateOfBirth, passport: passport, nationality: nationality } }; return JSON.stringify(json); } async generateHashFromData(dataToSign) { const binary = Buffer.from(dataToSign, 'binary'); const hashSum = crypto.createHash('sha256'); hashSum.update(binary); const hash = hashSum.digest('hex'); return hash; } async generateJWTFromDataHash(dataToSign) { const binary = Buffer.from(dataToSign, 'binary'); const hashSum = crypto.createHash('sha256'); hashSum.update(binary); const privateKey = fs.readFileSync(this.privateKeyFile); const objectToSign = hashSum.digest('hex'); const token = jwt.sign(objectToSign, { key: privateKey, passphrase: this.secretPassphrase }, { algorithm: 'RS512' }); return token; } async generateJWTFromData(dataToSign) { const privateKey = fs.readFileSync(this.privateKeyFile); const token = jwt.sign(dataToSign, { key: privateKey, passphrase: this.secretPassphrase }, { algorithm: 'RS512' }); return token; } compare(tokenExpected, tokenCompared) { let isVaildToken = false; if (tokenCompared && tokenCompared) { if (tokenExpected === tokenCompared) { isVaildToken = true; } else { isVaildToken = false; } } return isVaildToken; } } exports.EndpointServiceBase = EndpointServiceBase; _a = JSII_RTTI_SYMBOL_1; EndpointServiceBase[_a] = { fqn: "@affinidi/common-check-widget-backend-lib.commonCheckVerify.endpointServiceBase.EndpointServiceBase", version: "2.1.1" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBd0I7QUFDeEIsMkNBQThCO0FBQzlCLGlDQUFnQztBQUNoQyxvQ0FBbUM7QUFFbkMsTUFBc0IsbUJBQW1CO0lBVXJDLFlBQWEsV0FBbUIsRUFBRSxNQUFjLEVBQUUsU0FBZ0IsRUFBRSxjQUFzQixFQUFFLGdCQUF3QixFQUFFLFNBQWlCO1FBQ25JLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQTtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDO0lBRU0sY0FBYztRQUVqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxPQUFZO1FBRTNCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQzFCLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZTtRQUV4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzdELElBQUksUUFBWSxDQUFBO1FBQ2hCLElBQUc7WUFDQyxRQUFRLEdBQUcsTUFBTSxvQkFBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1lBQzdDLElBQUksUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLElBQUksRUFDbEI7Z0JBQ0ksT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO29CQUN4QixJQUFJLEVBQUUsWUFBWTtvQkFDbEIsS0FBSyxFQUFHLFFBQVEsQ0FBQyxJQUFJO29CQUNyQixXQUFXLEVBQUcscUJBQXFCO2lCQUN0QyxDQUFDLENBQUE7YUFDTDtZQUNELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1NBQ3pCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQ25DO0lBQ0wsQ0FBQztJQUVNLGVBQWUsQ0FBQyxRQUFjO1FBRWpDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQTtRQUNkLElBQUksUUFBUSxFQUNaO1lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtTQUN2QjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FDVjtZQUNFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztZQUNwQixNQUFNLEVBQUUsS0FBSztZQUNiLFFBQVEsRUFBRTtnQkFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLE9BQU8sRUFBRSxpQkFBaUI7YUFFN0I7U0FDRixDQUNGLENBQUE7UUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxJQUFTO1FBRXBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDbkMsSUFBSTtZQUNBLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ3ZELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQ3hDLEdBQUcsRUFBRSxVQUFVO2dCQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO2FBQ2hDLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7WUFDckIsT0FBTyxTQUFTLENBQUE7U0FDbkI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSwwQkFBMEIsRUFBRSxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7WUFDNUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFlLENBQUMsQ0FBQTtTQUNuQztJQUNMLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxZQUFvQixFQUFFLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxRQUFnQixFQUFFLFdBQW1CLEVBQUUsUUFBZ0IsRUFBRSxXQUFtQjtRQUNoSyxNQUFNLElBQUksR0FBSTtZQUNWLE1BQU0sRUFBRTtnQkFDTixhQUFhLEVBQUUsWUFBWTtnQkFDM0Isd0JBQXdCLEVBQUUsVUFBVTthQUNyQztZQUNELGFBQWEsRUFBQztnQkFDWixVQUFVLEVBQUUsU0FBUztnQkFDckIsU0FBUyxFQUFFLFFBQVE7Z0JBQ25CLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsV0FBVyxFQUFFLFdBQVc7YUFDekI7U0FDRixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsVUFBZTtRQUU3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsQyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsVUFBZTtRQUVoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDdEIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDdkQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMxQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDcEgsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxVQUFlO1FBRTVDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNsSCxPQUFPLEtBQUssQ0FBQTtJQUNoQixDQUFDO0lBRU0sT0FBTyxDQUFDLGFBQWtCLEVBQUUsYUFBaUI7UUFFbEQsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLElBQUksYUFBYSxJQUFJLGFBQWEsRUFDbEM7WUFFRSxJQUFJLGFBQWEsS0FBSyxhQUFhLEVBQ25DO2dCQUNFLFlBQVksR0FBRyxJQUFJLENBQUE7YUFDcEI7aUJBRUQ7Z0JBQ0UsWUFBWSxHQUFHLEtBQUssQ0FBQTthQUNyQjtTQUNGO1FBQ0QsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQzs7QUFySkwsa0RBc0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgZmV0Y2ggZnJvbSAnbm9kZS1mZXRjaCdcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nXG5pbXBvcnQgKiBhcyBqd3QgZnJvbSAnanNvbndlYnRva2VuJ1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRW5kcG9pbnRTZXJ2aWNlQmFzZSB7XG4gICAgYXBpRW5kcG9pbnQ6IHN0cmluZ1xuICAgIGFwaUtleTogc3RyaW5nXG4gICAgZXJyb3JDb2RlOiBzdHJpbmdcbiAgICBwcml2YXRlS2V5RmlsZTogc3RyaW5nXG4gICAgc2VjcmV0UGFzc3BocmFzZTogc3RyaW5nXG4gICAgcmVxdWVzdElEOiBzdHJpbmdcbiAgICBvcHRpb25zOiBhbnlcbiAgICBlcnJvcnM6IGFueVxuXG4gICAgY29uc3RydWN0b3IgKGFwaUVuZHBvaW50OiBzdHJpbmcsIGFwaUtleTogc3RyaW5nLCBlcnJvckNvZGU6c3RyaW5nLCBwcml2YXRlS2V5RmlsZTogc3RyaW5nLCBzZWNyZXRQYXNzcGhyYXNlOiBzdHJpbmcsIHJlcXVlc3RJRDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYXBpRW5kcG9pbnQgPSBhcGlFbmRwb2ludFxuICAgICAgICB0aGlzLmFwaUtleSA9IGFwaUtleVxuICAgICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZVxuICAgICAgICB0aGlzLnByaXZhdGVLZXlGaWxlID0gcHJpdmF0ZUtleUZpbGVcbiAgICAgICAgdGhpcy5zZWNyZXRQYXNzcGhyYXNlID0gc2VjcmV0UGFzc3BocmFzZVxuICAgICAgICB0aGlzLnJlcXVlc3RJRCA9IHJlcXVlc3RJRFxuICAgIH1cblxuICAgIHB1YmxpYyByZXRyaWV2ZUFwaUtleSgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlLZXlcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsbE9wdGlvbnMob3B0aW9uczogYW55KVxuICAgIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjYWxsQVBJRW5kcG9pbnQgKCkge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKG5ldyBEYXRlKCksIFwiQ2FsbGluZyBFbmRwb2ludFwiLCB0aGlzLmFwaUVuZHBvaW50KVxuICAgICAgICBsZXQgcmVzcG9uc2U6YW55XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCwgdGhpcy5vcHRpb25zKVxuICAgICAgICAgICAgY29uc29sZS5sb2cobmV3IERhdGUoKSwgXCJDb21wbGV0ZWQgRW5kcG9pbnRcIilcbiAgICAgICAgICAgIGlmIChyZXNwb25zZT8uY29kZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFcnJvck1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRXJyb3IgQ29kZScsIFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA6IHJlc3BvbnNlLmNvZGUsIFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA6ICdFcnJvciBGcm9tIEVuZHBvaW50J1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhuZXcgRGF0ZSgpLCBcIkZhaWwgRW5kcG9pbnQgd2l0aCBlcnJvclwiLCB7ZXJyb3J9KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFcnJvck1lc3NhZ2UoZXJyb3JPYmo/OiBhbnkpXG4gICAge1xuICAgICAgICBsZXQgZXJyb3IgPSBbXVxuICAgICAgICBpZiAoZXJyb3JPYmopXG4gICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yLnB1c2goZXJyb3JPYmopXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcnJvcnMgPSAoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvZGU6IHRoaXMuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICBlcnJvcnM6IGVycm9yLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgICAgcmVxdWVzdElEOiB0aGlzLnJlcXVlc3RJRCxcbiAgICAgICAgICAgICAgICAgIHNlcnZpY2U6ICdFbmRwb2ludFNlcnZpY2UnXG5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzXG4gICAgfVxuXG4gICAgcHVibGljIGRlY3J5cHQoZGF0YTogYW55KVxuICAgIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlbmNyeXB0ZWRfZGF0YVwiLCBkYXRhKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLnByaXZhdGVLZXlGaWxlKVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIilcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGNyeXB0by5wcml2YXRlRGVjcnlwdCh7XG4gICAgICAgICAgICBrZXk6IHByaXZhdGVLZXksXG4gICAgICAgICAgICBwYXNzcGhyYXNlOiB0aGlzLnNlY3JldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICB9LCBidWZmZXIpLnRvU3RyaW5nKClcbiAgICAgICAgICAgIHJldHVybiBkZWNyeXB0ZWRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG5ldyBEYXRlKCksIFwiRmFpbCBFbmRwb2ludCB3aXRoIGVycm9yXCIsIHtlcnJvcn0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IgYXMgc3RyaW5nKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlUGF5bG9hZEpzb24oZmxpZ2h0TnVtYmVyOiBzdHJpbmcsIGZsaWdodERhdGU6IHN0cmluZywgZmlyc3ROYW1lOiBzdHJpbmcsIGxhc3ROYW1lOiBzdHJpbmcsIGRhdGVPZkJpcnRoOiBzdHJpbmcsIHBhc3Nwb3J0OiBzdHJpbmcsIG5hdGlvbmFsaXR5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QganNvbiA9ICB7XG4gICAgICAgICAgICBpbnRlbnQ6IHtcbiAgICAgICAgICAgICAgZmxpZ2h0X251bWJlcjogZmxpZ2h0TnVtYmVyLFxuICAgICAgICAgICAgICBzY2hlZHVsZWRfZGVwYXJ0dXJlX3RpbWU6IGZsaWdodERhdGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1c2VyX2lkZW50aXR5OntcbiAgICAgICAgICAgICAgZmlyc3RfbmFtZTogZmlyc3ROYW1lLFxuICAgICAgICAgICAgICBsYXN0X25hbWU6IGxhc3ROYW1lLFxuICAgICAgICAgICAgICBkb2I6IGRhdGVPZkJpcnRoLFxuICAgICAgICAgICAgICBwYXNzcG9ydDogcGFzc3BvcnQsXG4gICAgICAgICAgICAgIG5hdGlvbmFsaXR5OiBuYXRpb25hbGl0eVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVIYXNoRnJvbURhdGEoZGF0YVRvU2lnbjogYW55KVxuICAgIHtcbiAgICAgICAgY29uc3QgYmluYXJ5ID0gQnVmZmVyLmZyb20oZGF0YVRvU2lnbiwgJ2JpbmFyeScpXG4gICAgICAgIGNvbnN0IGhhc2hTdW0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgICAgaGFzaFN1bS51cGRhdGUoYmluYXJ5KVxuICAgICAgICBjb25zdCBoYXNoID0gaGFzaFN1bS5kaWdlc3QoJ2hleCcpXG4gICAgICAgIHJldHVybiBoYXNoXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlSldURnJvbURhdGFIYXNoKGRhdGFUb1NpZ246IGFueSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGJpbmFyeSA9IEJ1ZmZlci5mcm9tKGRhdGFUb1NpZ24sICdiaW5hcnknKVxuICAgICAgICBjb25zdCBoYXNoU3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAgIGhhc2hTdW0udXBkYXRlKGJpbmFyeSlcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLnByaXZhdGVLZXlGaWxlKVxuICAgICAgICBjb25zdCBvYmplY3RUb1NpZ24gPSBoYXNoU3VtLmRpZ2VzdCgnaGV4JylcbiAgICAgICAgY29uc3QgdG9rZW4gPSBqd3Quc2lnbihvYmplY3RUb1NpZ24sIHsga2V5OiBwcml2YXRlS2V5LCBwYXNzcGhyYXNlOiB0aGlzLnNlY3JldFBhc3NwaHJhc2UgfSwgeyBhbGdvcml0aG06ICdSUzUxMicgfSlcbiAgICAgICAgcmV0dXJuIHRva2VuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlSldURnJvbURhdGEoZGF0YVRvU2lnbjogYW55KVxuICAgIHtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyh0aGlzLnByaXZhdGVLZXlGaWxlKVxuICAgICAgICBjb25zdCB0b2tlbiA9IGp3dC5zaWduKGRhdGFUb1NpZ24sIHsga2V5OiBwcml2YXRlS2V5LCBwYXNzcGhyYXNlOiB0aGlzLnNlY3JldFBhc3NwaHJhc2UgfSwgeyBhbGdvcml0aG06ICdSUzUxMicgfSlcbiAgICAgICAgcmV0dXJuIHRva2VuXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBhcmUodG9rZW5FeHBlY3RlZDogYW55LCB0b2tlbkNvbXBhcmVkOmFueSkgXG4gICAge1xuICAgICAgbGV0IGlzVmFpbGRUb2tlbiA9IGZhbHNlXG4gICAgICBpZiAodG9rZW5Db21wYXJlZCAmJiB0b2tlbkNvbXBhcmVkKVxuICAgICAge1xuXG4gICAgICAgIGlmICh0b2tlbkV4cGVjdGVkID09PSB0b2tlbkNvbXBhcmVkKVxuICAgICAgICB7XG4gICAgICAgICAgaXNWYWlsZFRva2VuID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgIGlzVmFpbGRUb2tlbiA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1ZhaWxkVG9rZW5cbiAgICB9XG59Il19