@aligent/cdk-prerender-proxy 0.2.4-beta → 0.2.4-beta1
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/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ import { PrerenderFunction } from "./lib/prerender-construct";
|
|
|
3
3
|
import { PrerenderCheckFunction } from "./lib/prerender-check-construct";
|
|
4
4
|
import { ErrorResponseFunction } from "./lib/error-response-construct";
|
|
5
5
|
import { CloudFrontCacheControl, CloudFrontCacheControlOptions } from "./lib/prerender-cf-cache-control-construct";
|
|
6
|
-
import {
|
|
7
|
-
export { PrerenderLambda, PrerenderFunction, PrerenderCheckFunction, ErrorResponseFunction, CloudFrontCacheControl, CloudFrontCacheControlOptions,
|
|
6
|
+
import { sendToPrerender } from './lib/sendToPrerender';
|
|
7
|
+
export { PrerenderLambda, PrerenderFunction, PrerenderCheckFunction, ErrorResponseFunction, CloudFrontCacheControl, CloudFrontCacheControlOptions, sendToPrerender };
|
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.sendToPrerender = exports.CloudFrontCacheControl = exports.ErrorResponseFunction = exports.PrerenderCheckFunction = exports.PrerenderFunction = exports.PrerenderLambda = void 0;
|
|
4
4
|
const prerender_lambda_construct_1 = require("./lib/prerender-lambda-construct");
|
|
5
5
|
Object.defineProperty(exports, "PrerenderLambda", { enumerable: true, get: function () { return prerender_lambda_construct_1.PrerenderLambda; } });
|
|
6
6
|
const prerender_construct_1 = require("./lib/prerender-construct");
|
|
@@ -11,6 +11,6 @@ const error_response_construct_1 = require("./lib/error-response-construct");
|
|
|
11
11
|
Object.defineProperty(exports, "ErrorResponseFunction", { enumerable: true, get: function () { return error_response_construct_1.ErrorResponseFunction; } });
|
|
12
12
|
const prerender_cf_cache_control_construct_1 = require("./lib/prerender-cf-cache-control-construct");
|
|
13
13
|
Object.defineProperty(exports, "CloudFrontCacheControl", { enumerable: true, get: function () { return prerender_cf_cache_control_construct_1.CloudFrontCacheControl; } });
|
|
14
|
-
const
|
|
15
|
-
Object.defineProperty(exports, "
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
const sendToPrerender_1 = require("./lib/sendToPrerender");
|
|
15
|
+
Object.defineProperty(exports, "sendToPrerender", { enumerable: true, get: function () { return sendToPrerender_1.sendToPrerender; } });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRkFBbUU7QUFVakUsZ0dBVk8sNENBQWUsT0FVUDtBQVRqQixtRUFBOEQ7QUFVNUQsa0dBVk8sdUNBQWlCLE9BVVA7QUFUbkIsK0VBQXlFO0FBVXZFLHVHQVZPLGtEQUFzQixPQVVQO0FBVHhCLDZFQUF1RTtBQVVyRSxzR0FWTyxnREFBcUIsT0FVUDtBQVR2QixxR0FHb0Q7QUFPbEQsdUdBVEEsNkRBQXNCLE9BU0E7QUFOeEIsMkRBQXdEO0FBUXRELGdHQVJPLGlDQUFlLE9BUVAiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcmVyZW5kZXJMYW1iZGEgfSBmcm9tIFwiLi9saWIvcHJlcmVuZGVyLWxhbWJkYS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IFByZXJlbmRlckZ1bmN0aW9uIH0gZnJvbSBcIi4vbGliL3ByZXJlbmRlci1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IFByZXJlbmRlckNoZWNrRnVuY3Rpb24gfSBmcm9tIFwiLi9saWIvcHJlcmVuZGVyLWNoZWNrLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgRXJyb3JSZXNwb25zZUZ1bmN0aW9uIH0gZnJvbSBcIi4vbGliL2Vycm9yLXJlc3BvbnNlLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHtcbiAgQ2xvdWRGcm9udENhY2hlQ29udHJvbCxcbiAgQ2xvdWRGcm9udENhY2hlQ29udHJvbE9wdGlvbnMsXG59IGZyb20gXCIuL2xpYi9wcmVyZW5kZXItY2YtY2FjaGUtY29udHJvbC1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IHNlbmRUb1ByZXJlbmRlciB9IGZyb20gJy4vbGliL3NlbmRUb1ByZXJlbmRlcic7XG5leHBvcnQge1xuICBQcmVyZW5kZXJMYW1iZGEsXG4gIFByZXJlbmRlckZ1bmN0aW9uLFxuICBQcmVyZW5kZXJDaGVja0Z1bmN0aW9uLFxuICBFcnJvclJlc3BvbnNlRnVuY3Rpb24sXG4gIENsb3VkRnJvbnRDYWNoZUNvbnRyb2wsXG4gIENsb3VkRnJvbnRDYWNoZUNvbnRyb2xPcHRpb25zLFxuICBzZW5kVG9QcmVyZW5kZXIgXG59O1xuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import 'source-map-support/register';
|
|
2
|
+
import {sendToPrerender} from '../sendToPrerender';
|
|
3
|
+
import { CloudFrontRequest, CloudFrontRequestEvent, CloudFrontResponse } from 'aws-lambda';
|
|
4
|
+
|
|
5
|
+
const PRERENDER_TOKEN = process.env.PRERENDER_TOKEN;
|
|
6
|
+
const PATH_PREFIX = process.env.PATH_PREFIX;
|
|
7
|
+
const PRERENDER_URL = process.env.PRERENDER_URL;
|
|
8
|
+
|
|
9
|
+
export const handler = async (event: CloudFrontRequestEvent): Promise<CloudFrontResponse|CloudFrontRequest> => {
|
|
10
|
+
let request = event.Records[0].cf.request;
|
|
11
|
+
|
|
12
|
+
return sendToPrerender(request)
|
|
13
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendToPrerender = void 0;
|
|
4
|
+
require("source-map-support/register");
|
|
5
|
+
const PRERENDER_TOKEN = process.env.PRERENDER_TOKEN;
|
|
6
|
+
const PATH_PREFIX = process.env.PATH_PREFIX;
|
|
7
|
+
const PRERENDER_URL = process.env.PRERENDER_URL;
|
|
8
|
+
const sendToPrerender = (request) => {
|
|
9
|
+
// viewer-request function will determine whether we prerender or not
|
|
10
|
+
// if we should we add prerender as our custom origin
|
|
11
|
+
if (request.headers['x-request-prerender']) {
|
|
12
|
+
// Cloudfront will alter the request for / to /index.html
|
|
13
|
+
// since it is defined as the default root object
|
|
14
|
+
// we do not want to do this when prerendering the homepage
|
|
15
|
+
if (request.uri === `${PATH_PREFIX}/index.html`) {
|
|
16
|
+
request.uri = `${PATH_PREFIX}/`;
|
|
17
|
+
}
|
|
18
|
+
request.origin = {
|
|
19
|
+
custom: {
|
|
20
|
+
domainName: PRERENDER_URL,
|
|
21
|
+
port: 443,
|
|
22
|
+
protocol: 'https',
|
|
23
|
+
readTimeout: 20,
|
|
24
|
+
keepaliveTimeout: 5,
|
|
25
|
+
sslProtocols: ['TLSv1', 'TLSv1.1', 'TLSv1.2'],
|
|
26
|
+
path: '/https%3A%2F%2F' + request.headers['x-prerender-host'][0].value,
|
|
27
|
+
customHeaders: {
|
|
28
|
+
'x-prerender-token': [{
|
|
29
|
+
key: 'x-prerender-token',
|
|
30
|
+
value: PRERENDER_TOKEN
|
|
31
|
+
}]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
request.uri = `${PATH_PREFIX}/index.html`;
|
|
38
|
+
}
|
|
39
|
+
return request;
|
|
40
|
+
};
|
|
41
|
+
exports.sendToPrerender = sendToPrerender;
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZFRvUHJlcmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VuZFRvUHJlcmVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFxQztBQUVyQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztBQUNwRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztBQUV6QyxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQVksRUFBRSxFQUFFO0lBQzVDLHFFQUFxRTtJQUN2RSxxREFBcUQ7SUFDckQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7UUFDMUMseURBQXlEO1FBQ3pELGlEQUFpRDtRQUNqRCwyREFBMkQ7UUFDM0QsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxhQUFhLEVBQUU7WUFDNUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLFdBQVcsR0FBRyxDQUFDO1NBQ3BDO1FBRUQsT0FBTyxDQUFDLE1BQU0sR0FBRztZQUNaLE1BQU0sRUFBRTtnQkFDSCxVQUFVLEVBQUUsYUFBYTtnQkFDekIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFdBQVcsRUFBRSxFQUFFO2dCQUNmLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25CLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLEVBQUUsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ3RFLGFBQWEsRUFBRTtvQkFDVixtQkFBbUIsRUFBRSxDQUFDOzRCQUNqQixHQUFHLEVBQUUsbUJBQW1COzRCQUN4QixLQUFLLEVBQUUsZUFBZTt5QkFDMUIsQ0FBQztpQkFDTjthQUNMO1NBQ0wsQ0FBQztLQUNMO1NBQU07UUFDSCxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsV0FBVyxhQUFhLENBQUM7S0FDN0M7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNmLENBQUMsQ0FBQTtBQWpDWSxRQUFBLGVBQWUsbUJBaUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyJztcblxuY29uc3QgUFJFUkVOREVSX1RPS0VOID0gcHJvY2Vzcy5lbnYuUFJFUkVOREVSX1RPS0VOO1xuY29uc3QgUEFUSF9QUkVGSVggPSBwcm9jZXNzLmVudi5QQVRIX1BSRUZJWDtcbmNvbnN0IFBSRVJFTkRFUl9VUkwgPSBwcm9jZXNzLmVudi5QUkVSRU5ERVJfVVJMO1xuXG5leHBvcnQgY29uc3Qgc2VuZFRvUHJlcmVuZGVyID0gKHJlcXVlc3Q6IGFueSkgPT4ge1xuICAgIC8vIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgd2UgcHJlcmVuZGVyIG9yIG5vdFxuICAvLyBpZiB3ZSBzaG91bGQgd2UgYWRkIHByZXJlbmRlciBhcyBvdXIgY3VzdG9tIG9yaWdpblxuICBpZiAocmVxdWVzdC5oZWFkZXJzWyd4LXJlcXVlc3QtcHJlcmVuZGVyJ10pIHtcbiAgICAvLyBDbG91ZGZyb250IHdpbGwgYWx0ZXIgdGhlIHJlcXVlc3QgZm9yIC8gdG8gL2luZGV4Lmh0bWxcbiAgICAvLyBzaW5jZSBpdCBpcyBkZWZpbmVkIGFzIHRoZSBkZWZhdWx0IHJvb3Qgb2JqZWN0XG4gICAgLy8gd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcyB3aGVuIHByZXJlbmRlcmluZyB0aGUgaG9tZXBhZ2VcbiAgICBpZiAocmVxdWVzdC51cmkgPT09IGAke1BBVEhfUFJFRklYfS9pbmRleC5odG1sYCkge1xuICAgICAgICAgcmVxdWVzdC51cmkgPSBgJHtQQVRIX1BSRUZJWH0vYDtcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9yaWdpbiA9IHtcbiAgICAgICAgIGN1c3RvbToge1xuICAgICAgICAgICAgICBkb21haW5OYW1lOiBQUkVSRU5ERVJfVVJMLFxuICAgICAgICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgICAgICAgIHByb3RvY29sOiAnaHR0cHMnLFxuICAgICAgICAgICAgICByZWFkVGltZW91dDogMjAsXG4gICAgICAgICAgICAgIGtlZXBhbGl2ZVRpbWVvdXQ6IDUsXG4gICAgICAgICAgICAgIHNzbFByb3RvY29sczogWydUTFN2MScsICdUTFN2MS4xJywgJ1RMU3YxLjInXSxcbiAgICAgICAgICAgICAgcGF0aDogJy9odHRwcyUzQSUyRiUyRicgKyByZXF1ZXN0LmhlYWRlcnNbJ3gtcHJlcmVuZGVyLWhvc3QnXVswXS52YWx1ZSxcbiAgICAgICAgICAgICAgY3VzdG9tSGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICd4LXByZXJlbmRlci10b2tlbic6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd4LXByZXJlbmRlci10b2tlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogUFJFUkVOREVSX1RPS0VOXG4gICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgIH07XG59IGVsc2Uge1xuICAgIHJlcXVlc3QudXJpID0gYCR7UEFUSF9QUkVGSVh9L2luZGV4Lmh0bWxgO1xufVxuXG5yZXR1cm4gcmVxdWVzdDtcbn0gIl19
|
package/package.json
CHANGED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handler = void 0;
|
|
4
|
-
require("source-map-support/register");
|
|
5
|
-
const IS_BOT = /googlebot|chrome-lighthouse|lighthouse|adsbot\-google|Feedfetcher\-Google|bingbot|yandex|baiduspider|Facebot|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator/i;
|
|
6
|
-
const IS_FILE = /\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)$/i;
|
|
7
|
-
const handler = async (event) => {
|
|
8
|
-
let request = event.Records[0].cf.request;
|
|
9
|
-
// If the request is from a bot, is not a file and is not from prerender
|
|
10
|
-
// then set the x-request-prerender header so the origin-request lambda function
|
|
11
|
-
// alters the origin to prerender.io
|
|
12
|
-
if (!IS_FILE.test(request.uri)
|
|
13
|
-
&& IS_BOT.test(request.headers['user-agent'][0].value)
|
|
14
|
-
&& !request.headers['x-prerender']) {
|
|
15
|
-
request.headers['x-request-prerender'] = [
|
|
16
|
-
{
|
|
17
|
-
key: 'x-request-prerender',
|
|
18
|
-
value: 'true'
|
|
19
|
-
}
|
|
20
|
-
];
|
|
21
|
-
request.headers['x-prerender-host'] = [{ key: 'X-Prerender-Host', value: request.headers.host[0].value }];
|
|
22
|
-
}
|
|
23
|
-
return request;
|
|
24
|
-
};
|
|
25
|
-
exports.handler = handler;
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcmVuZGVyLWNoZWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHJlcmVuZGVyLWNoZWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFxQztBQUdyQyxNQUFNLE1BQU0sR0FBRywyUEFBMlAsQ0FBQztBQUMzUSxNQUFNLE9BQU8sR0FBRyxxTEFBcUwsQ0FBQztBQUUvTCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBNkIsRUFBOEIsRUFBRTtJQUN2RixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFFMUMsd0VBQXdFO0lBQ3hFLGdGQUFnRjtJQUNoRixvQ0FBb0M7SUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztXQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1dBQ25ELENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUc7WUFDckM7Z0JBQ0ksR0FBRyxFQUFFLHFCQUFxQjtnQkFDMUIsS0FBSyxFQUFFLE1BQU07YUFDaEI7U0FDSixDQUFDO1FBRUYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUM7S0FDNUc7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUE7QUFwQlksUUFBQSxPQUFPLFdBb0JuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyJztcbmltcG9ydCB7IENsb3VkRnJvbnRSZXF1ZXN0LCBDbG91ZEZyb250UmVxdWVzdEV2ZW50IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5cbmNvbnN0IElTX0JPVCA9IC9nb29nbGVib3R8Y2hyb21lLWxpZ2h0aG91c2V8bGlnaHRob3VzZXxhZHNib3RcXC1nb29nbGV8RmVlZGZldGNoZXJcXC1Hb29nbGV8YmluZ2JvdHx5YW5kZXh8YmFpZHVzcGlkZXJ8RmFjZWJvdHxmYWNlYm9va2V4dGVybmFsaGl0fHR3aXR0ZXJib3R8cm9nZXJib3R8bGlua2VkaW5ib3R8ZW1iZWRseXxxdW9yYSBsaW5rIHByZXZpZXd8c2hvd3lvdWJvdHxvdXRicmFpbnxwaW50ZXJlc3R8c2xhY2tib3R8dmtTaGFyZXxXM0NfVmFsaWRhdG9yL2k7XG5jb25zdCBJU19GSUxFID0gL1xcLihqc3xjc3N8eG1sfGxlc3N8cG5nfGpwZ3xqcGVnfGdpZnxwZGZ8ZG9jfHR4dHxpY298cnNzfHppcHxtcDN8cmFyfGV4ZXx3bXZ8ZG9jfGF2aXxwcHR8bXBnfG1wZWd8dGlmfHdhdnxtb3Z8cHNkfGFpfHhsc3xtcDR8bTRhfHN3ZnxkYXR8ZG1nfGlzb3xmbHZ8bTR2fHRvcnJlbnR8dHRmfHdvZmZ8c3ZnfGVvdCkkL2k7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBDbG91ZEZyb250UmVxdWVzdEV2ZW50KTogUHJvbWlzZTxDbG91ZEZyb250UmVxdWVzdD4gPT4ge1xuICAgIGxldCByZXF1ZXN0ID0gZXZlbnQuUmVjb3Jkc1swXS5jZi5yZXF1ZXN0O1xuXG4gICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBhIGJvdCwgaXMgbm90IGEgZmlsZSBhbmQgaXMgbm90IGZyb20gcHJlcmVuZGVyXG4gICAgLy8gdGhlbiBzZXQgdGhlIHgtcmVxdWVzdC1wcmVyZW5kZXIgaGVhZGVyIHNvIHRoZSBvcmlnaW4tcmVxdWVzdCBsYW1iZGEgZnVuY3Rpb25cbiAgICAvLyBhbHRlcnMgdGhlIG9yaWdpbiB0byBwcmVyZW5kZXIuaW9cbiAgICBpZiAoIUlTX0ZJTEUudGVzdChyZXF1ZXN0LnVyaSkgXG4gICAgICAgICYmIElTX0JPVC50ZXN0KHJlcXVlc3QuaGVhZGVyc1sndXNlci1hZ2VudCddWzBdLnZhbHVlKVxuICAgICAgICAmJiAhcmVxdWVzdC5oZWFkZXJzWyd4LXByZXJlbmRlciddKSB7XG4gICAgICAgIHJlcXVlc3QuaGVhZGVyc1sneC1yZXF1ZXN0LXByZXJlbmRlciddID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogJ3gtcmVxdWVzdC1wcmVyZW5kZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcblxuICAgICAgICByZXF1ZXN0LmhlYWRlcnNbJ3gtcHJlcmVuZGVyLWhvc3QnXSA9IFt7IGtleTogJ1gtUHJlcmVuZGVyLUhvc3QnLCB2YWx1ZTogcmVxdWVzdC5oZWFkZXJzLmhvc3RbMF0udmFsdWV9XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdDtcbn1cbiJdfQ==
|