@aws-cdk/integ-tests-alpha
Version:
CDK Integration Testing Constructs
100 lines • 13.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeployAssert = void 0;
const core_1 = require("aws-cdk-lib/core");
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
const constructs_1 = require("constructs");
const assertions_1 = require("../assertions");
const http_call_1 = require("../http-call");
const hash_1 = require("../private/hash");
const sdk_1 = require("../sdk");
const DEPLOY_ASSERT_SYMBOL = Symbol.for('@aws-cdk/integ-tests.DeployAssert');
/**
* Construct that allows for registering a list of assertions
* that should be performed on a construct
*/
class DeployAssert extends constructs_1.Construct {
/**
* Returns whether the construct is a DeployAssert construct
*/
static isDeployAssert(x) {
return x !== null && typeof (x) === 'object' && DEPLOY_ASSERT_SYMBOL in x;
}
/**
* Finds a DeployAssert construct in the given scope
*/
static of(construct) {
const scopes = constructs_1.Node.of(constructs_1.Node.of(construct).root).findAll();
const deployAssert = scopes.find(s => DeployAssert.isDeployAssert(s));
if (!deployAssert) {
throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `DeployAssertNotFound`, 'No DeployAssert construct found in scopes');
}
return deployAssert;
}
scope;
assertionIdCounts = new Map();
constructor(scope, props) {
super(scope, 'Default');
this.scope = props?.stack ?? new core_1.Stack(scope, 'DeployAssert');
Object.defineProperty(this, DEPLOY_ASSERT_SYMBOL, { value: true });
}
awsApiCall(service, api, parameters, outputPaths) {
let hash = '';
try {
hash = (0, hash_1.md5hash)(this.scope.resolve(parameters));
}
catch { }
return new sdk_1.AwsApiCall(this.scope, this.uniqueAssertionId(`AwsApiCall${service}${api}${hash}`), {
api,
service,
parameters,
outputPaths,
});
}
httpApiCall(url, options) {
let hash = '';
try {
hash = (0, hash_1.md5hash)(this.scope.resolve({
url,
options,
}));
}
catch { }
let append = '';
if (!core_1.Token.isUnresolved(url)) {
const parsedUrl = new URL(url);
append = `${parsedUrl.hostname}${parsedUrl.pathname}`;
}
return new http_call_1.HttpApiCall(this.scope, this.uniqueAssertionId(`HttpApiCall${append}${hash}`), {
url,
fetchOptions: options,
});
}
invokeFunction(props) {
const hash = (0, hash_1.md5hash)(this.scope.resolve(props));
return new sdk_1.LambdaInvokeFunction(this.scope, this.uniqueAssertionId(`LambdaInvoke${hash}`), props);
}
expect(id, expected, actual) {
new assertions_1.EqualsAssertion(this.scope, `EqualsAssertion${id}`, {
expected,
actual,
});
}
/**
* Gets a unique logical id based on a proposed assertion id.
*/
uniqueAssertionId(id) {
const count = this.assertionIdCounts.get(id);
if (count === undefined) {
// If we've never seen this id before, we'll return the id unchanged
// to maintain backward compatibility.
this.assertionIdCounts.set(id, 1);
return id;
}
// Otherwise, we'll increment the counter and return a unique id.
this.assertionIdCounts.set(id, count + 1);
return `${id}${count}`;
}
}
exports.DeployAssert = DeployAssert;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LWFzc2VydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRlcGxveS1hc3NlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXlFO0FBQ3pFLDRFQUE0RDtBQUU1RCwyQ0FBNkM7QUFFN0MsOENBQWdEO0FBRWhELDRDQUEwRDtBQUMxRCwwQ0FBMEM7QUFHMUMsZ0NBQTBEO0FBRzFELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBZTdFOzs7R0FHRztBQUNILE1BQWEsWUFBYSxTQUFRLHNCQUFTO0lBQ3pDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFNO1FBQ2pDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLG9CQUFvQixJQUFJLENBQUMsQ0FBQztLQUMzRTtJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFxQjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksOEJBQXVCLENBQUMsSUFBQSxzQkFBRyxFQUFBLHNCQUFzQixFQUFFLDJDQUEyQyxDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUNELE9BQU8sWUFBNEIsQ0FBQztLQUNyQztJQUVNLEtBQUssQ0FBUTtJQUNaLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRXRELFlBQVksS0FBZ0IsRUFBRSxLQUF5QjtRQUNyRCxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLEtBQUssSUFBSSxJQUFJLFlBQUssQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFOUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUNwRTtJQUVNLFVBQVUsQ0FBQyxPQUFlLEVBQUUsR0FBVyxFQUFFLFVBQWdCLEVBQUUsV0FBc0I7UUFDdEYsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsSUFBSSxHQUFHLElBQUEsY0FBTyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUM7UUFFVixPQUFPLElBQUksZ0JBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRTtZQUM3RixHQUFHO1lBQ0gsT0FBTztZQUNQLFVBQVU7WUFDVixXQUFXO1NBQ1osQ0FBQyxDQUFDO0tBQ0o7SUFFTSxXQUFXLENBQUMsR0FBVyxFQUFFLE9BQXNCO1FBQ3BELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQztZQUNILElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDaEMsR0FBRztnQkFDSCxPQUFPO2FBQ1IsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztRQUVWLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsWUFBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLElBQUksdUJBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3hGLEdBQUc7WUFDSCxZQUFZLEVBQUUsT0FBTztTQUN0QixDQUFDLENBQUM7S0FDSjtJQUVNLGNBQWMsQ0FBQyxLQUFnQztRQUNwRCxNQUFNLElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sSUFBSSwwQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbkc7SUFFTSxNQUFNLENBQUMsRUFBVSxFQUFFLFFBQXdCLEVBQUUsTUFBb0I7UUFDdEUsSUFBSSw0QkFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFFBQVE7WUFDUixNQUFNO1NBQ1AsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLEVBQVU7UUFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU3QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixvRUFBb0U7WUFDcEUsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztLQUN4QjtDQUNGO0FBOUZELG9DQThGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrLCBUb2tlbiwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIE5vZGUgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgSUFwaUNhbGwgfSBmcm9tICcuLi9hcGktY2FsbC1iYXNlJztcbmltcG9ydCB7IEVxdWFsc0Fzc2VydGlvbiB9IGZyb20gJy4uL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBBY3R1YWxSZXN1bHQsIEV4cGVjdGVkUmVzdWx0IH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IEh0dHBBcGlDYWxsIGFzIEh0dHBBcGlDYWxsIH0gZnJvbSAnLi4vaHR0cC1jYWxsJztcbmltcG9ydCB7IG1kNWhhc2ggfSBmcm9tICcuLi9wcml2YXRlL2hhc2gnO1xuaW1wb3J0IHR5cGUgeyBGZXRjaE9wdGlvbnMgfSBmcm9tICcuLi9wcm92aWRlcnMnO1xuaW1wb3J0IHR5cGUgeyBMYW1iZGFJbnZva2VGdW5jdGlvblByb3BzIH0gZnJvbSAnLi4vc2RrJztcbmltcG9ydCB7IEF3c0FwaUNhbGwsIExhbWJkYUludm9rZUZ1bmN0aW9uIH0gZnJvbSAnLi4vc2RrJztcbmltcG9ydCB0eXBlIHsgSURlcGxveUFzc2VydCB9IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgREVQTE9ZX0FTU0VSVF9TWU1CT0wgPSBTeW1ib2wuZm9yKCdAYXdzLWNkay9pbnRlZy10ZXN0cy5EZXBsb3lBc3NlcnQnKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBEZXBsb3lBc3NlcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lBc3NlcnRQcm9wcyB7XG5cbiAgLyoqXG4gICAqIEEgc3RhY2sgdG8gdXNlIGZvciBhc3NlcnRpb25zXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBzdGFjayBpcyBjcmVhdGVkIGZvciB5b3VcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrPzogU3RhY2s7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IHRoYXQgYWxsb3dzIGZvciByZWdpc3RlcmluZyBhIGxpc3Qgb2YgYXNzZXJ0aW9uc1xuICogdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGEgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3lBc3NlcnQgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJRGVwbG95QXNzZXJ0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgY29uc3RydWN0IGlzIGEgRGVwbG95QXNzZXJ0IGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc0RlcGxveUFzc2VydCh4OiBhbnkpOiB4IGlzIERlcGxveUFzc2VydCB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mICh4KSA9PT0gJ29iamVjdCcgJiYgREVQTE9ZX0FTU0VSVF9TWU1CT0wgaW4geDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIERlcGxveUFzc2VydCBjb25zdHJ1Y3QgaW4gdGhlIGdpdmVuIHNjb3BlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKGNvbnN0cnVjdDogSUNvbnN0cnVjdCk6IERlcGxveUFzc2VydCB7XG4gICAgY29uc3Qgc2NvcGVzID0gTm9kZS5vZihOb2RlLm9mKGNvbnN0cnVjdCkucm9vdCkuZmluZEFsbCgpO1xuICAgIGNvbnN0IGRlcGxveUFzc2VydCA9IHNjb3Blcy5maW5kKHMgPT4gRGVwbG95QXNzZXJ0LmlzRGVwbG95QXNzZXJ0KHMpKTtcbiAgICBpZiAoIWRlcGxveUFzc2VydCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBEZXBsb3lBc3NlcnROb3RGb3VuZGAsICdObyBEZXBsb3lBc3NlcnQgY29uc3RydWN0IGZvdW5kIGluIHNjb3BlcycpO1xuICAgIH1cbiAgICByZXR1cm4gZGVwbG95QXNzZXJ0IGFzIERlcGxveUFzc2VydDtcbiAgfVxuXG4gIHB1YmxpYyBzY29wZTogU3RhY2s7XG4gIHByaXZhdGUgYXNzZXJ0aW9uSWRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzPzogRGVwbG95QXNzZXJ0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgJ0RlZmF1bHQnKTtcblxuICAgIHRoaXMuc2NvcGUgPSBwcm9wcz8uc3RhY2sgPz8gbmV3IFN0YWNrKHNjb3BlLCAnRGVwbG95QXNzZXJ0Jyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgREVQTE9ZX0FTU0VSVF9TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG4gIH1cblxuICBwdWJsaWMgYXdzQXBpQ2FsbChzZXJ2aWNlOiBzdHJpbmcsIGFwaTogc3RyaW5nLCBwYXJhbWV0ZXJzPzogYW55LCBvdXRwdXRQYXRocz86IHN0cmluZ1tdKTogSUFwaUNhbGwge1xuICAgIGxldCBoYXNoID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSBtZDVoYXNoKHRoaXMuc2NvcGUucmVzb2x2ZShwYXJhbWV0ZXJzKSk7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgcmV0dXJuIG5ldyBBd3NBcGlDYWxsKHRoaXMuc2NvcGUsIHRoaXMudW5pcXVlQXNzZXJ0aW9uSWQoYEF3c0FwaUNhbGwke3NlcnZpY2V9JHthcGl9JHtoYXNofWApLCB7XG4gICAgICBhcGksXG4gICAgICBzZXJ2aWNlLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICAgIG91dHB1dFBhdGhzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGh0dHBBcGlDYWxsKHVybDogc3RyaW5nLCBvcHRpb25zPzogRmV0Y2hPcHRpb25zKTogSUFwaUNhbGwge1xuICAgIGxldCBoYXNoID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSBtZDVoYXNoKHRoaXMuc2NvcGUucmVzb2x2ZSh7XG4gICAgICAgIHVybCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIHt9XG5cbiAgICBsZXQgYXBwZW5kID0gJyc7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodXJsKSkge1xuICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgYXBwZW5kID0gYCR7cGFyc2VkVXJsLmhvc3RuYW1lfSR7cGFyc2VkVXJsLnBhdGhuYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHR0cEFwaUNhbGwodGhpcy5zY29wZSwgdGhpcy51bmlxdWVBc3NlcnRpb25JZChgSHR0cEFwaUNhbGwke2FwcGVuZH0ke2hhc2h9YCksIHtcbiAgICAgIHVybCxcbiAgICAgIGZldGNoT3B0aW9uczogb3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpbnZva2VGdW5jdGlvbihwcm9wczogTGFtYmRhSW52b2tlRnVuY3Rpb25Qcm9wcyk6IElBcGlDYWxsIHtcbiAgICBjb25zdCBoYXNoID0gbWQ1aGFzaCh0aGlzLnNjb3BlLnJlc29sdmUocHJvcHMpKTtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZUZ1bmN0aW9uKHRoaXMuc2NvcGUsIHRoaXMudW5pcXVlQXNzZXJ0aW9uSWQoYExhbWJkYUludm9rZSR7aGFzaH1gKSwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIGV4cGVjdChpZDogc3RyaW5nLCBleHBlY3RlZDogRXhwZWN0ZWRSZXN1bHQsIGFjdHVhbDogQWN0dWFsUmVzdWx0KTogdm9pZCB7XG4gICAgbmV3IEVxdWFsc0Fzc2VydGlvbih0aGlzLnNjb3BlLCBgRXF1YWxzQXNzZXJ0aW9uJHtpZH1gLCB7XG4gICAgICBleHBlY3RlZCxcbiAgICAgIGFjdHVhbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgdW5pcXVlIGxvZ2ljYWwgaWQgYmFzZWQgb24gYSBwcm9wb3NlZCBhc3NlcnRpb24gaWQuXG4gICAqL1xuICBwcml2YXRlIHVuaXF1ZUFzc2VydGlvbklkKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5hc3NlcnRpb25JZENvdW50cy5nZXQoaWQpO1xuXG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIHdlJ3ZlIG5ldmVyIHNlZW4gdGhpcyBpZCBiZWZvcmUsIHdlJ2xsIHJldHVybiB0aGUgaWQgdW5jaGFuZ2VkXG4gICAgICAvLyB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgICAgdGhpcy5hc3NlcnRpb25JZENvdW50cy5zZXQoaWQsIDEpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgaW5jcmVtZW50IHRoZSBjb3VudGVyIGFuZCByZXR1cm4gYSB1bmlxdWUgaWQuXG4gICAgdGhpcy5hc3NlcnRpb25JZENvdW50cy5zZXQoaWQsIGNvdW50ICsgMSk7XG4gICAgcmV0dXJuIGAke2lkfSR7Y291bnR9YDtcbiAgfVxufVxuIl19