@lambda-kata/cdk 0.1.4 → 0.1.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/out/dist/index.js +38 -46
- package/out/dist/snapstart-handler.js +3 -5
- package/out/tsc/src/index.d.ts +1 -3
- package/out/tsc/src/kata-wrapper.d.ts +3 -15
- package/out/tsc/src/types.d.ts +0 -6
- package/package.json +2 -2
- package/out/tsc/src/licensing.d.ts +0 -151
- package/out/tsc/src/mock-licensing.d.ts +0 -218
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
[
|
|
3
|
-
[1/5] Enabling SnapStart (ApplyOn: PublishedVersions)...`),await t.send(new n.UpdateFunctionConfigurationCommand({FunctionName:e,SnapStart:{ApplyOn:"PublishedVersions"}})),console.log(" SnapStart configuration sent"),console.log("[2/5] Waiting for configuration update...");try{await(0,n.waitUntilFunctionUpdatedV2)({client:t,maxWaitTime:120},{FunctionName:e})}catch(o){throw A(o)?new Error(`Lambda function '${e}' does not exist. Verify the function name or ARN is correct.`):w(o)?new Error(`Insufficient permissions to activate SnapStart on '${e}'. Ensure the execution role has the following permissions: ${R.join(", ")}`):o}console.log(" Configuration updated successfully"),console.log(` Waiting ${a._prePublishDelayMs/1e3}s for configuration propagation...`),await m.sleep(a._prePublishDelayMs);let i="",u="Unknown",s="Unknown",S="";for(let o=1;o<=d;o++){console.log(`[3/5] Publishing new version (attempt ${o}/${d})...`),o>1&&(console.log(` Waiting ${a._retryDelayMs/1e3}s before retry...`),await m.sleep(a._retryDelayMs),console.log(" Ensuring function is Active before re-publish..."),await(0,n.waitUntilFunctionActiveV2)({client:t,maxWaitTime:60},{FunctionName:e}),console.log(" Re-applying SnapStart config to force new version..."),await t.send(new n.UpdateFunctionConfigurationCommand({FunctionName:e,SnapStart:{ApplyOn:"PublishedVersions"}})),await(0,n.waitUntilFunctionUpdatedV2)({client:t,maxWaitTime:120},{FunctionName:e}),console.log(` Waiting ${a._prePublishDelayMs/1e3}s for configuration propagation...`),await m.sleep(a._prePublishDelayMs)),i=(await t.send(new n.PublishVersionCommand({FunctionName:e,Description:`SnapStart enabled - ${new Date().toISOString()} (attempt ${o})`}))).Version,console.log(` Published version: ${i}`),console.log("[4/5] Waiting for SnapStart snapshot creation..."),s="Unknown";for(let g=0;g<c;g++){let f=await t.send(new n.GetFunctionConfigurationCommand({FunctionName:e,Qualifier:i}));if(u=(f.SnapStart??{}).OptimizationStatus??"Unknown",s=f.State??"Unknown",s==="Active"){console.log(" SnapStart snapshot ready!"),console.log(` OptimizationStatus: ${u}`),console.log(` State: ${s}`);break}else if(s==="Failed"){S=f.StateReason??"Unknown",console.log(` Snapshot creation failed: ${S}`);break}else if(g%10===0||g<5){let b=g*a.pollingIntervalSeconds;console.log(` Creating snapshot... Status: ${u}, State: ${s} (${b}s elapsed)`)}await m.sleep(a.pollingIntervalSeconds*1e3)}if(s==="Active"||s!=="Failed")break;o<d&&(console.log(` Snapshot failed on attempt ${o}, will retry with new version...`),console.log(` Reason: ${S}`))}s==="Failed"&&(console.log(` All ${d} snapshot attempts failed.`),console.log(` Reason: ${S}`),console.log(""),console.log(" [Lambda Kata] SnapStart optimization failed. Alias will be created pointing"),console.log(" to the latest version. Function remains operational without SnapStart."),console.log(" Review CloudWatch logs for initialization errors.")),s!=="Active"&&s!=="Failed"&&(console.log(` Warning: Snapshot creation timeout after ${a.snapshotTimeoutSeconds}s`),console.log(` Final status: OptimizationStatus=${u}, State=${s}`)),console.log(`[5/5] Creating/updating alias '${a.aliasName}' -> version ${i}...`);let r;try{await t.send(new n.GetAliasCommand({FunctionName:e,Name:a.aliasName})),r=(await t.send(new n.UpdateAliasCommand({FunctionName:e,Name:a.aliasName,FunctionVersion:i,Description:"Lambda Kata SnapStart-enabled version"}))).AliasArn,console.log(` Updated existing alias: ${r}`)}catch(o){if(o instanceof n.ResourceNotFoundException||o instanceof Error&&o.name==="ResourceNotFoundException")r=(await t.send(new n.CreateAliasCommand({FunctionName:e,Name:a.aliasName,FunctionVersion:i,Description:"Lambda Kata SnapStart-enabled version"}))).AliasArn,console.log(` Created new alias: ${r}`);else throw o}return console.log(`
|
|
4
|
-
`+"=".repeat(60)),console.log("SNAPSTART ACTIVATION COMPLETE"),console.log("=".repeat(60)),console.log(`Version: ${i}`),console.log(`Alias: ${a.aliasName} -> ${r}`),console.log(`OptimizationStatus: ${u}`),{version:i,aliasName:a.aliasName,aliasArn:r,optimizationStatus:u}}catch(i){throw w(i)?new Error(`Insufficient permissions to activate SnapStart on '${e}'. Ensure the execution role has the following permissions: ${R.join(", ")}`):i}}async function T(t){console.log("Custom Resource Event:",JSON.stringify(t,null,2));let{RequestType:e,StackId:p,RequestId:a,LogicalResourceId:c,ResourceProperties:i}=t,u=i.FunctionName,s=i.AliasName??"kata",r={PhysicalResourceId:t.PhysicalResourceId??`${u}:snapstart:${s}`,StackId:p,RequestId:a,LogicalResourceId:c};try{if(e==="Delete")return console.log("Delete request - no action needed (Lambda will be deleted by CloudFormation)"),{...r,Status:"SUCCESS"};let o=new n.LambdaClient({}),l=await E(o,u,{aliasName:s});return{...r,Status:"SUCCESS",Data:{Version:l.version,AliasName:l.aliasName,AliasArn:l.aliasArn,OptimizationStatus:l.optimizationStatus}}}catch(o){let l=o instanceof Error?o.message:String(o);return console.error("SnapStart activation failed:",l),e==="Update"?(console.log("Returning SUCCESS for Update request to prevent rollback deadlock."),console.log("The function will continue with its previous SnapStart configuration."),{...r,Status:"SUCCESS",Reason:`SnapStart activation failed (non-blocking): ${l}`}):{...r,Status:"FAILED",Reason:`SnapStart activation failed: ${l}`}}}0&&(module.exports={_testable,activateSnapStart,handler});
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NuYXBzdGFydC1hY3RpdmF0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gKiBBcGFjaGUtMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBsYW1iZGFfa2F0YV9ucG1fY2RrLCA8d29ya3RpZl9sYW1iZGFfa2F0YV9ucG1fY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBBcGFjaGUtMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBmb3IgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qKlxuICogU25hcFN0YXJ0IEFjdGl2YXRvciAtIEN1c3RvbSBSZXNvdXJjZSBIYW5kbGVyXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIExhbWJkYSBoYW5kbGVyIGZvciBhIENsb3VkRm9ybWF0aW9uIEN1c3RvbSBSZXNvdXJjZVxuICogdGhhdCBlbmFibGVzIFNuYXBTdGFydCBvbiBMYW1iZGEgZnVuY3Rpb25zIGFmdGVyIGRlcGxveW1lbnQuIFNuYXBTdGFydCByZXF1aXJlc1xuICogYXN5bmNocm9ub3VzIHdhaXRpbmcgZm9yIHNuYXBzaG90IGNyZWF0aW9uLCB3aGljaCBjYW5ub3QgYmUgZG9uZSBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAqXG4gKiBUaGUgYWN0aXZhdGlvbiBwcm9jZXNzOlxuICogMS4gV2FpdCBmb3IgZnVuY3Rpb24gdG8gYmUgQWN0aXZlXG4gKiAyLiBFbmFibGUgU25hcFN0YXJ0IGNvbmZpZ3VyYXRpb25cbiAqIDMuIFdhaXQgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlXG4gKiA0LiBQdWJsaXNoIG5ldyB2ZXJzaW9uICh0cmlnZ2VycyBzbmFwc2hvdCBjcmVhdGlvbilcbiAqIDUuIFdhaXQgZm9yIHNuYXBzaG90IHRvIGJlIHJlYWR5ICh1cCB0byAzIG1pbnV0ZXMpXG4gKiA2LiBDcmVhdGUvdXBkYXRlICdrYXRhJyBhbGlhcyBwb2ludGluZyB0byB0aGUgbmV3IHZlcnNpb25cbiAqXG4gKiBAbW9kdWxlIHNuYXBzdGFydC1hY3RpdmF0b3JcbiAqL1xuXG5pbXBvcnQge1xuICAgIExhbWJkYUNsaWVudCxcbiAgICBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kLFxuICAgIFB1Ymxpc2hWZXJzaW9uQ29tbWFuZCxcbiAgICBHZXRGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kLFxuICAgIENyZWF0ZUFsaWFzQ29tbWFuZCxcbiAgICBVcGRhdGVBbGlhc0NvbW1hbmQsXG4gICAgR2V0QWxpYXNDb21tYW5kLFxuICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sXG4gICAgd2FpdFVudGlsRnVuY3Rpb25VcGRhdGVkVjIsXG4gICAgd2FpdFVudGlsRnVuY3Rpb25BY3RpdmVWMixcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5cbi8qKlxuICogQ3VzdG9tIFJlc291cmNlIGV2ZW50IGZyb20gQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VFdmVudCB7XG4gICAgUmVxdWVzdFR5cGU6ICdDcmVhdGUnIHwgJ1VwZGF0ZScgfCAnRGVsZXRlJztcbiAgICBTZXJ2aWNlVG9rZW46IHN0cmluZztcbiAgICBSZXNwb25zZVVSTDogc3RyaW5nO1xuICAgIFN0YWNrSWQ6IHN0cmluZztcbiAgICBSZXF1ZXN0SWQ6IHN0cmluZztcbiAgICBSZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgICBMb2dpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xuICAgIFBoeXNpY2FsUmVzb3VyY2VJZD86IHN0cmluZztcbiAgICBSZXNvdXJjZVByb3BlcnRpZXM6IHtcbiAgICAgICAgU2VydmljZVRva2VuOiBzdHJpbmc7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAgICAgICBBbGlhc05hbWU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBPbGRSZXNvdXJjZVByb3BlcnRpZXM/OiB7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAgICAgICBBbGlhc05hbWU/OiBzdHJpbmc7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgcmVzcG9uc2UgdG8gQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VSZXNwb25zZSB7XG4gICAgU3RhdHVzOiAnU1VDQ0VTUycgfCAnRkFJTEVEJztcbiAgICBSZWFzb24/OiBzdHJpbmc7XG4gICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgU3RhY2tJZDogc3RyaW5nO1xuICAgIFJlcXVlc3RJZDogc3RyaW5nO1xuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgRGF0YT86IHtcbiAgICAgICAgVmVyc2lvbj86IHN0cmluZztcbiAgICAgICAgQWxpYXNOYW1lPzogc3RyaW5nO1xuICAgICAgICBBbGlhc0Fybj86IHN0cmluZztcbiAgICAgICAgT3B0aW1pemF0aW9uU3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgc3VjY2Vzc2Z1bCBTbmFwU3RhcnQgYWN0aXZhdGlvbiBjeWNsZS5cbiAqXG4gKiBSZXR1cm5lZCBieSB7QGxpbmsgYWN0aXZhdGVTbmFwU3RhcnR9IGFmdGVyIGVuYWJsaW5nIFNuYXBTdGFydCxcbiAqIHB1Ymxpc2hpbmcgYSB2ZXJzaW9uLCB3YWl0aW5nIGZvciBzbmFwc2hvdCByZWFkaW5lc3MsIGFuZCBjcmVhdGluZy91cGRhdGluZyBhbiBhbGlhcy5cbiAqXG4gKiBAc2VlIHtAbGluayBTbmFwU3RhcnRBY3RpdmF0b3JDb25maWd9IGZvciBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbmFwU3RhcnRBY3RpdmF0aW9uUmVzdWx0IHtcbiAgICAvKiogVGhlIHB1Ymxpc2hlZCBMYW1iZGEgdmVyc2lvbiBudW1iZXIgKGUuZy4gXCI0MlwiKS4gKi9cbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhbGlhcyBuYW1lIHRoYXQgd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCAoZS5nLiBcImthdGFcIikuICovXG4gICAgYWxpYXNOYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBmdWxsIEFSTiBvZiB0aGUgYWxpYXMgKGUuZy4gXCJhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZuOmthdGFcIikuICovXG4gICAgYWxpYXNBcm46IHN0cmluZztcbiAgICAvKiogVGhlIFNuYXBTdGFydCBvcHRpbWl6YXRpb24gc3RhdHVzIG9mIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiAoXCJPblwiLCBcIk9mZlwiLCBvciBcIlVua25vd25cIikuICovXG4gICAgb3B0aW1pemF0aW9uU3RhdHVzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgU25hcFN0YXJ0IGFjdGl2YXRpb24gY3ljbGUuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIGFuZCBmYWxsIGJhY2sgdG8gc2Vuc2libGUgZGVmYXVsdHMuXG4gKlxuICogQHNlZSB7QGxpbmsgYWN0aXZhdGVTbmFwU3RhcnR9IGZvciB0aGUgZnVuY3Rpb24gdGhhdCBjb25zdW1lcyB0aGlzIGNvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBTdGFydEFjdGl2YXRvckNvbmZpZyB7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3Igc25hcHNob3QgY3JlYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuXG4gICAgICogSWYgZXhjZWVkZWQsIGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIGFsaWFzIGNyZWF0aW9uIGNvbnRpbnVlcy5cbiAgICAgKiBAZGVmYXVsdCAxODBcbiAgICAgKi9cbiAgICBzbmFwc2hvdFRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGF0dGVtcHRzIGZvciBzbmFwc2hvdCByZWFkaW5lc3MuXG4gICAgICogQGRlZmF1bHQgMlxuICAgICAqL1xuICAgIHBvbGxpbmdJbnRlcnZhbFNlY29uZHM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBhbGlhcyBuYW1lIHRvIGNyZWF0ZSBvciB1cGRhdGUgYWZ0ZXIgcHVibGlzaGluZyBhIHZlcnNpb24uXG4gICAgICogQGRlZmF1bHQgJ2thdGEnXG4gICAgICovXG4gICAgYWxpYXNOYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbCBPdmVycmlkZSBwcmUtcHVibGlzaCBkZWxheSBpbiBtaWxsaXNlY29uZHMgKGZvciB0ZXN0aW5nIG9ubHkpLlxuICAgICAqIEBkZWZhdWx0IDMwMDBcbiAgICAgKi9cbiAgICBfcHJlUHVibGlzaERlbGF5TXM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsIE92ZXJyaWRlIHJldHJ5IGRlbGF5IGluIG1pbGxpc2Vjb25kcyAoZm9yIHRlc3Rpbmcgb25seSkuXG4gICAgICogQGRlZmF1bHQgNTAwMFxuICAgICAqL1xuICAgIF9yZXRyeURlbGF5TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTWF4aW11bSBudW1iZXIgb2YgUHVibGlzaFZlcnNpb24gKyBzbmFwc2hvdCBwb2xsaW5nIGF0dGVtcHRzLlxuICogRWFjaCByZXRyeSBwdWJsaXNoZXMgYSBORVcgdmVyc2lvbiAobmV3IHNuYXBzaG90IGF0dGVtcHQpLlxuICogQm91bmRlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzOyB0b3RhbCB3b3JzdC1jYXNlIHRpbWU6XG4gKiA1ICogKDE1cyBkZWxheSArIHB1Ymxpc2ggKyAxODBzIHBvbGwpIFx1MjI0OCAxNm1pbiwgd2l0aGluIExhbWJkYSAxNW1pbiBsaW1pdFxuICogKGJ1dCBzbmFwc2hvdCB0aW1lb3V0IGlzIHR5cGljYWxseSBtdWNoIHNob3J0ZXIgdGhhbiAxODBzIHBlciBhdHRlbXB0KS5cbiAqL1xuY29uc3QgTUFYX1BVQkxJU0hfUkVUUklFUyA9IDU7XG5cbi8qKlxuICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyBhIGZhaWxlZCBzbmFwc2hvdCBjcmVhdGlvbi5cbiAqIFNldCB0byAxNXMgdG8gZ2l2ZSB0cmFuc2llbnQgTGFtYmRhIGluaXQgZmFpbHVyZXMgdGltZSB0byBjbGVhci5cbiAqL1xuY29uc3QgUkVUUllfREVMQVlfTVMgPSAxNTAwMDtcblxuLyoqXG4gKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2FpdFVudGlsRnVuY3Rpb25VcGRhdGVkVjIgY29tcGxldGVzLFxuICogYmVmb3JlIHRoZSBmaXJzdCBQdWJsaXNoVmVyc2lvbiBjYWxsLiBNaXRpZ2F0ZXMgZXZlbnR1YWwgY29uc2lzdGVuY3lcbiAqIGJldHdlZW4gTGFtYmRhIGNvbmZpZyB1cGRhdGUgcHJvcGFnYXRpb24gYW5kIFB1Ymxpc2hWZXJzaW9uIGluaXQgcGhhc2UuXG4gKi9cbmNvbnN0IFBSRV9QVUJMSVNIX0RFTEFZX01TID0gMzAwMDtcblxuY29uc3QgREVGQVVMVF9DT05GSUc6IFJlcXVpcmVkPFNuYXBTdGFydEFjdGl2YXRvckNvbmZpZz4gPSB7XG4gICAgc25hcHNob3RUaW1lb3V0U2Vjb25kczogMTgwLFxuICAgIHBvbGxpbmdJbnRlcnZhbFNlY29uZHM6IDIsXG4gICAgYWxpYXNOYW1lOiAna2F0YScsXG4gICAgX3ByZVB1Ymxpc2hEZWxheU1zOiBQUkVfUFVCTElTSF9ERUxBWV9NUyxcbiAgICBfcmV0cnlEZWxheU1zOiBSRVRSWV9ERUxBWV9NUyxcbn07XG5cbi8qKlxuICogU2xlZXAgZm9yIHNwZWNpZmllZCBtaWxsaXNlY29uZHMuXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0ZXN0cyBjYW4gamVzdC5zcHlPbiB0byBhdm9pZCByZWFsIGRlbGF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IF90ZXN0YWJsZSA9IHtcbiAgICBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgICB9LFxufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBlcnJvciAob3IgaXRzIGNhdXNlIGNoYWluKSBpcyBhIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24uXG4gKlxuICogQVdTIFNESyB2MyB3YWl0ZXJzIG1heSB0aHJvdyB0aGUgdW5kZXJseWluZyBzZXJ2aWNlIGV4Y2VwdGlvbiBkaXJlY3RseSxcbiAqIG9yIHdyYXAgaXQgaW4gYSB3YWl0ZXItc3RhdGUgZXJyb3IuIFRoaXMgaGVscGVyIGluc3BlY3RzIGJvdGggdGhlIGVycm9yXG4gKiBpdHNlbGYgYW5kIGl0cyBgY2F1c2VgIHByb3BlcnR5IHRvIGRldGVjdCBlaXRoZXIgY2FzZS5cbiAqL1xuZnVuY3Rpb24gaXNSZXNvdXJjZU5vdEZvdW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWl0ZXJzIG1heSB3cmFwIHRoZSBzZXJ2aWNlIGV4Y2VwdGlvbiBpbiBhIGNhdXNlIGNoYWluXG4gICAgICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yICYmIGNhdXNlLm5hbWUgPT09ICdSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcXVpcmVkIElBTSBwZXJtaXNzaW9ucyBmb3IgU25hcFN0YXJ0IGFjdGl2YXRpb24uXG4gKiBVc2VkIGluIGVycm9yIG1lc3NhZ2VzIHRvIGd1aWRlIHVzZXJzIHdoZW4gQWNjZXNzRGVuaWVkRXhjZXB0aW9uIG9jY3Vycy5cbiAqL1xuY29uc3QgUkVRVUlSRURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgICdsYW1iZGE6R2V0RnVuY3Rpb24nLFxuICAgICdsYW1iZGE6R2V0RnVuY3Rpb25Db25maWd1cmF0aW9uJyxcbiAgICAnbGFtYmRhOlVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgJ2xhbWJkYTpQdWJsaXNoVmVyc2lvbicsXG4gICAgJ2xhbWJkYTpHZXRBbGlhcycsXG4gICAgJ2xhbWJkYTpDcmVhdGVBbGlhcycsXG4gICAgJ2xhbWJkYTpVcGRhdGVBbGlhcycsXG5dO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGVycm9yIGlzIGFuIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbi5cbiAqXG4gKiBBV1MgU0RLIHYzIG1heSB0aHJvdyBBY2Nlc3NEZW5pZWRFeGNlcHRpb24gZGlyZWN0bHkgb3Igd3JhcCBpdC5cbiAqIFRoaXMgaGVscGVyIGluc3BlY3RzIGJvdGggdGhlIGVycm9yIGl0c2VsZiBhbmQgaXRzIGBjYXVzZWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGlzQWNjZXNzRGVuaWVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yICYmIGNhdXNlLm5hbWUgPT09ICdBY2Nlc3NEZW5pZWRFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBBY3RpdmF0ZXMgU25hcFN0YXJ0IG9uIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZ1bGwgU25hcFN0YXJ0IGFjdGl2YXRpb24gY3ljbGU6XG4gKiAxLiBFbnN1cmVzIGZ1bmN0aW9uIGlzIEFjdGl2ZVxuICogMi4gRW5hYmxlcyBTbmFwU3RhcnQgY29uZmlndXJhdGlvblxuICogMy4gV2FpdHMgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlXG4gKiA0LiBQdWJsaXNoZXMgbmV3IHZlcnNpb24gKHdpdGggcmV0cnkgb24gc25hcHNob3QgZmFpbHVyZSlcbiAqIDUuIFdhaXRzIGZvciBzbmFwc2hvdCBjcmVhdGlvblxuICogNi4gQ3JlYXRlcy91cGRhdGVzIGFsaWFzXG4gKlxuICogU3RlcHMgMys0IGFyZSB3cmFwcGVkIGluIGEgcmV0cnkgbG9vcDogb24gU3RhdGU6IEZhaWxlZCwgYSBuZXcgdmVyc2lvblxuICogaXMgcHVibGlzaGVkICh1cCB0byBNQVhfUFVCTElTSF9SRVRSSUVTIGF0dGVtcHRzKSB0byBoYW5kbGUgdHJhbnNpZW50XG4gKiBpbml0aWFsaXphdGlvbiBmYWlsdXJlcyBkdXJpbmcgc25hcHNob3QgY3JlYXRpb24uXG4gKlxuICogQHBhcmFtIGxhbWJkYUNsaWVudCAtIEFXUyBMYW1iZGEgY2xpZW50XG4gKiBAcGFyYW0gZnVuY3Rpb25OYW1lIC0gTmFtZSBvciBBUk4gb2YgdGhlIExhbWJkYSBmdW5jdGlvblxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEFjdGl2YXRpb24gcmVzdWx0IHdpdGggdmVyc2lvbiBhbmQgYWxpYXMgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlU25hcFN0YXJ0KFxuICAgIGxhbWJkYUNsaWVudDogTGFtYmRhQ2xpZW50LFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFNuYXBTdGFydEFjdGl2YXRvckNvbmZpZyxcbik6IFByb21pc2U8U25hcFN0YXJ0QWN0aXZhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGNmZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gTWF0aC5jZWlsKGNmZy5zbmFwc2hvdFRpbWVvdXRTZWNvbmRzIC8gY2ZnLnBvbGxpbmdJbnRlcnZhbFNlY29uZHMpO1xuXG4gICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg2MCkpO1xuICAgIGNvbnNvbGUubG9nKCdTTkFQU1RBUlQgQUNUSVZBVElPTiBDWUNMRScpO1xuICAgIGNvbnNvbGUubG9nKCc9Jy5yZXBlYXQoNjApKTtcbiAgICBjb25zb2xlLmxvZyhgRnVuY3Rpb246ICR7ZnVuY3Rpb25OYW1lfWApO1xuICAgIGNvbnNvbGUubG9nKGBUaW1lb3V0OiAke2NmZy5zbmFwc2hvdFRpbWVvdXRTZWNvbmRzfXMsIFBvbGxpbmc6ICR7Y2ZnLnBvbGxpbmdJbnRlcnZhbFNlY29uZHN9c2ApO1xuICAgIGNvbnNvbGUubG9nKGBNYXggcHVibGlzaCByZXRyaWVzOiAke01BWF9QVUJMSVNIX1JFVFJJRVN9YCk7XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBTdGVwIDA6IEVuc3VyZSBmdW5jdGlvbiBpcyBBY3RpdmUgYmVmb3JlIHN0YXJ0aW5nXG4gICAgICAgIGNvbnNvbGUubG9nKCdcXG5bMC81XSBFbnN1cmluZyBmdW5jdGlvbiBpcyBBY3RpdmUuLi4nKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHdhaXRVbnRpbEZ1bmN0aW9uQWN0aXZlVjIoXG4gICAgICAgICAgICAgICAgeyBjbGllbnQ6IGxhbWJkYUNsaWVudCwgbWF4V2FpdFRpbWU6IDYwIH0sXG4gICAgICAgICAgICAgICAgeyBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzUmVzb3VyY2VOb3RGb3VuZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFtYmRhIGZ1bmN0aW9uICcke2Z1bmN0aW9uTmFtZX0nIGRvZXMgbm90IGV4aXN0LiBWZXJpZnkgdGhlIGZ1bmN0aW9uIG5hbWUgb3IgQVJOIGlzIGNvcnJlY3QuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBY2Nlc3NEZW5pZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gYWN0aXZhdGUgU25hcFN0YXJ0IG9uICcke2Z1bmN0aW9uTmFtZX0nLiBgICtcbiAgICAgICAgICAgICAgICAgICAgYEVuc3VyZSB0aGUgZXhlY3V0aW9uIHJvbGUgaGFzIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnM6ICR7UkVRVUlSRURfUEVSTUlTU0lPTlMuam9pbignLCAnKX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgICBGdW5jdGlvbiBpcyBBY3RpdmUnKTtcblxuICAgICAgICAvLyBTdGVwIDE6IEVuYWJsZSBTbmFwU3RhcnQgb24gdGhlIGZ1bmN0aW9uXG4gICAgICAgIGNvbnNvbGUubG9nKCdcXG5bMS81XSBFbmFibGluZyBTbmFwU3RhcnQgKEFwcGx5T246IFB1Ymxpc2hlZFZlcnNpb25zKS4uLicpO1xuICAgICAgICBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgVXBkYXRlRnVuY3Rpb25Db25maWd1cmF0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIFNuYXBTdGFydDogeyBBcHBseU9uOiAnUHVibGlzaGVkVmVyc2lvbnMnIH0sXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICAgIFNuYXBTdGFydCBjb25maWd1cmF0aW9uIHNlbnQnKTtcblxuICAgICAgICAvLyBTdGVwIDI6IFdhaXQgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlIHRvIGNvbXBsZXRlXG4gICAgICAgIGNvbnNvbGUubG9nKCdbMi81XSBXYWl0aW5nIGZvciBjb25maWd1cmF0aW9uIHVwZGF0ZS4uLicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd2FpdFVudGlsRnVuY3Rpb25VcGRhdGVkVjIoXG4gICAgICAgICAgICAgICAgeyBjbGllbnQ6IGxhbWJkYUNsaWVudCwgbWF4V2FpdFRpbWU6IDEyMCB9LFxuICAgICAgICAgICAgICAgIHsgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc1Jlc291cmNlTm90Rm91bmRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhbWJkYSBmdW5jdGlvbiAnJHtmdW5jdGlvbk5hbWV9JyBkb2VzIG5vdCBleGlzdC4gVmVyaWZ5IHRoZSBmdW5jdGlvbiBuYW1lIG9yIEFSTiBpcyBjb3JyZWN0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQWNjZXNzRGVuaWVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSW5zdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGFjdGl2YXRlIFNuYXBTdGFydCBvbiAnJHtmdW5jdGlvbk5hbWV9Jy4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBFbnN1cmUgdGhlIGV4ZWN1dGlvbiByb2xlIGhhcyB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zOiAke1JFUVVJUkVEX1BFUk1JU1NJT05TLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnICAgICAgQ29uZmlndXJhdGlvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICAgIC8vIFByZS1wdWJsaXNoIGRlbGF5OiBtaXRpZ2F0ZSBldmVudHVhbCBjb25zaXN0ZW5jeSBiZXR3ZWVuXG4gICAgICAgIC8vIExhbWJkYSBjb25maWcgdXBkYXRlIHByb3BhZ2F0aW9uIGFuZCBQdWJsaXNoVmVyc2lvbiBpbml0IHBoYXNlXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBXYWl0aW5nICR7Y2ZnLl9wcmVQdWJsaXNoRGVsYXlNcyAvIDEwMDB9cyBmb3IgY29uZmlndXJhdGlvbiBwcm9wYWdhdGlvbi4uLmApO1xuICAgICAgICBhd2FpdCBfdGVzdGFibGUuc2xlZXAoY2ZnLl9wcmVQdWJsaXNoRGVsYXlNcyk7XG5cbiAgICAgICAgLy8gU3RlcHMgMys0OiBQdWJsaXNoIHZlcnNpb24gYW5kIHdhaXQgZm9yIHNuYXBzaG90IChXSVRIIFJFVFJZKVxuICAgICAgICBsZXQgdmVyc2lvbjogc3RyaW5nID0gJyc7XG4gICAgICAgIGxldCBvcHRpbWl6YXRpb25TdGF0dXMgPSAnVW5rbm93bic7XG4gICAgICAgIGxldCBzdGF0ZSA9ICdVbmtub3duJztcbiAgICAgICAgbGV0IGxhc3RGYWlsUmVhc29uID0gJyc7XG5cbiAgICAgICAgZm9yIChsZXQgcHVibGlzaEF0dGVtcHQgPSAxOyBwdWJsaXNoQXR0ZW1wdCA8PSBNQVhfUFVCTElTSF9SRVRSSUVTOyBwdWJsaXNoQXR0ZW1wdCsrKSB7XG4gICAgICAgICAgICAvLyBTdGVwIDM6IFB1Ymxpc2ggbmV3IHZlcnNpb24gdG8gY3JlYXRlIHNuYXBzaG90XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgWzMvNV0gUHVibGlzaGluZyBuZXcgdmVyc2lvbiAoYXR0ZW1wdCAke3B1Ymxpc2hBdHRlbXB0fS8ke01BWF9QVUJMSVNIX1JFVFJJRVN9KS4uLmApO1xuXG4gICAgICAgICAgICAvLyBCZWZvcmUgcmUtcHVibGlzaCAoYXR0ZW1wdCA+IDEpLCB3YWl0IGFuZCBlbnN1cmUgZnVuY3Rpb24gaXMgcmVhZHlcbiAgICAgICAgICAgIGlmIChwdWJsaXNoQXR0ZW1wdCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgV2FpdGluZyAke2NmZy5fcmV0cnlEZWxheU1zIC8gMTAwMH1zIGJlZm9yZSByZXRyeS4uLmApO1xuICAgICAgICAgICAgICAgIGF3YWl0IF90ZXN0YWJsZS5zbGVlcChjZmcuX3JldHJ5RGVsYXlNcyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyAgICAgIEVuc3VyaW5nIGZ1bmN0aW9uIGlzIEFjdGl2ZSBiZWZvcmUgcmUtcHVibGlzaC4uLicpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXRVbnRpbEZ1bmN0aW9uQWN0aXZlVjIoXG4gICAgICAgICAgICAgICAgICAgIHsgY2xpZW50OiBsYW1iZGFDbGllbnQsIG1heFdhaXRUaW1lOiA2MCB9LFxuICAgICAgICAgICAgICAgICAgICB7IEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIEZvcmNlIGEgY29uZmlnIHVwZGF0ZSBzbyBQdWJsaXNoVmVyc2lvbiBjcmVhdGVzIGEgZ2VudWluZWx5IG5ldyB2ZXJzaW9uLlxuICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgUHVibGlzaFZlcnNpb24gcmV0dXJucyB0aGUgc2FtZSAoRmFpbGVkKSB2ZXJzaW9uIG51bWJlclxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgTGFtYmRhIGRlZHVwbGljYXRlcyBpZGVudGljYWwgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyAgICAgIFJlLWFwcGx5aW5nIFNuYXBTdGFydCBjb25maWcgdG8gZm9yY2UgbmV3IHZlcnNpb24uLi4nKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgVXBkYXRlRnVuY3Rpb25Db25maWd1cmF0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICBTbmFwU3RhcnQ6IHsgQXBwbHlPbjogJ1B1Ymxpc2hlZFZlcnNpb25zJyB9LFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0VW50aWxGdW5jdGlvblVwZGF0ZWRWMihcbiAgICAgICAgICAgICAgICAgICAgeyBjbGllbnQ6IGxhbWJkYUNsaWVudCwgbWF4V2FpdFRpbWU6IDEyMCB9LFxuICAgICAgICAgICAgICAgICAgICB7IEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBXYWl0aW5nICR7Y2ZnLl9wcmVQdWJsaXNoRGVsYXlNcyAvIDEwMDB9cyBmb3IgY29uZmlndXJhdGlvbiBwcm9wYWdhdGlvbi4uLmApO1xuICAgICAgICAgICAgICAgIGF3YWl0IF90ZXN0YWJsZS5zbGVlcChjZmcuX3ByZVB1Ymxpc2hEZWxheU1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHVibGlzaFJlc3BvbnNlID0gYXdhaXQgbGFtYmRhQ2xpZW50LnNlbmQobmV3IFB1Ymxpc2hWZXJzaW9uQ29tbWFuZCh7XG4gICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IGBTbmFwU3RhcnQgZW5hYmxlZCAtICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfSAoYXR0ZW1wdCAke3B1Ymxpc2hBdHRlbXB0fSlgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdmVyc2lvbiA9IHB1Ymxpc2hSZXNwb25zZS5WZXJzaW9uITtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBQdWJsaXNoZWQgdmVyc2lvbjogJHt2ZXJzaW9ufWApO1xuXG4gICAgICAgICAgICAvLyBTdGVwIDQ6IFdhaXQgZm9yIHNuYXBzaG90IG9wdGltaXphdGlvbiBhbmQgdmVyaWZ5IHN0YXR1c1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1s0LzVdIFdhaXRpbmcgZm9yIFNuYXBTdGFydCBzbmFwc2hvdCBjcmVhdGlvbi4uLicpO1xuICAgICAgICAgICAgc3RhdGUgPSAnVW5rbm93bic7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb25Db25maWcgPSBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgR2V0RnVuY3Rpb25Db25maWd1cmF0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZXI6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc25hcFN0YXJ0U3RhdHVzID0gdmVyc2lvbkNvbmZpZy5TbmFwU3RhcnQgPz8ge307XG4gICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uU3RhdHVzID0gc25hcFN0YXJ0U3RhdHVzLk9wdGltaXphdGlvblN0YXR1cyA/PyAnVW5rbm93bic7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSB2ZXJzaW9uQ29uZmlnLlN0YXRlID8/ICdVbmtub3duJztcblxuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ0FjdGl2ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyAgICAgIFNuYXBTdGFydCBzbmFwc2hvdCByZWFkeSEnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIE9wdGltaXphdGlvblN0YXR1czogJHtvcHRpbWl6YXRpb25TdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBTdGF0ZTogJHtzdGF0ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ0ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdEZhaWxSZWFzb24gPSB2ZXJzaW9uQ29uZmlnLlN0YXRlUmVhc29uID8/ICdVbmtub3duJztcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIFNuYXBzaG90IGNyZWF0aW9uIGZhaWxlZDogJHtsYXN0RmFpbFJlYXNvbn1gKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBwcm9ncmVzcyBldmVyeSAxMCBhdHRlbXB0cyBvciBmaXJzdCA1XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ICUgMTAgPT09IDAgfHwgYXR0ZW1wdCA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBhdHRlbXB0ICogY2ZnLnBvbGxpbmdJbnRlcnZhbFNlY29uZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgQ3JlYXRpbmcgc25hcHNob3QuLi4gU3RhdHVzOiAke29wdGltaXphdGlvblN0YXR1c30sIFN0YXRlOiAke3N0YXRlfSAoJHtlbGFwc2VkfXMgZWxhcHNlZClgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IF90ZXN0YWJsZS5zbGVlcChjZmcucG9sbGluZ0ludGVydmFsU2Vjb25kcyAqIDEwMDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBzbmFwc2hvdCBzdWNjZWVkZWQsIGJyZWFrIG91dCBvZiByZXRyeSBsb29wXG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09ICdBY3RpdmUnKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9ubHkgcmV0cnkgb24gRmFpbGVkIHN0YXRlIFx1MjAxNCB0aW1lb3V0IChQZW5kaW5nKSBzaG91bGQgbm90IHJldHJ5XG4gICAgICAgICAgICBpZiAoc3RhdGUgIT09ICdGYWlsZWQnKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIGZhaWxlZCBhbmQgd2UgaGF2ZSByZXRyaWVzIGxlZnQsIGxvZyBhbmQgY29udGludWVcbiAgICAgICAgICAgIGlmIChwdWJsaXNoQXR0ZW1wdCA8IE1BWF9QVUJMSVNIX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgU25hcHNob3QgZmFpbGVkIG9uIGF0dGVtcHQgJHtwdWJsaXNoQXR0ZW1wdH0sIHdpbGwgcmV0cnkgd2l0aCBuZXcgdmVyc2lvbi4uLmApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBSZWFzb246ICR7bGFzdEZhaWxSZWFzb259YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZnRlciBhbGwgcmV0cmllcywgY2hlY2sgZmluYWwgc3RhdGVcbiAgICAgICAgaWYgKHN0YXRlID09PSAnRmFpbGVkJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIEFsbCAke01BWF9QVUJMSVNIX1JFVFJJRVN9IHNuYXBzaG90IGF0dGVtcHRzIGZhaWxlZC5gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBSZWFzb246ICR7bGFzdEZhaWxSZWFzb259YCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnICAgICAgW0xhbWJkYSBLYXRhXSBTbmFwU3RhcnQgb3B0aW1pemF0aW9uIGZhaWxlZC4gQWxpYXMgd2lsbCBiZSBjcmVhdGVkIHBvaW50aW5nJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnICAgICAgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLiBGdW5jdGlvbiByZW1haW5zIG9wZXJhdGlvbmFsIHdpdGhvdXQgU25hcFN0YXJ0LicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyAgICAgIFJldmlldyBDbG91ZFdhdGNoIGxvZ3MgZm9yIGluaXRpYWxpemF0aW9uIGVycm9ycy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIHRpbWVkIG91dFxuICAgICAgICBpZiAoc3RhdGUgIT09ICdBY3RpdmUnICYmIHN0YXRlICE9PSAnRmFpbGVkJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIFdhcm5pbmc6IFNuYXBzaG90IGNyZWF0aW9uIHRpbWVvdXQgYWZ0ZXIgJHtjZmcuc25hcHNob3RUaW1lb3V0U2Vjb25kc31zYCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgRmluYWwgc3RhdHVzOiBPcHRpbWl6YXRpb25TdGF0dXM9JHtvcHRpbWl6YXRpb25TdGF0dXN9LCBTdGF0ZT0ke3N0YXRlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCA1OiBDcmVhdGUgb3IgdXBkYXRlIGFsaWFzXG4gICAgICAgIGNvbnNvbGUubG9nKGBbNS81XSBDcmVhdGluZy91cGRhdGluZyBhbGlhcyAnJHtjZmcuYWxpYXNOYW1lfScgLT4gdmVyc2lvbiAke3ZlcnNpb259Li4uYCk7XG4gICAgICAgIGxldCBhbGlhc0Fybjogc3RyaW5nO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IGV4aXN0aW5nIGFsaWFzXG4gICAgICAgICAgICBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgR2V0QWxpYXNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICBOYW1lOiBjZmcuYWxpYXNOYW1lLFxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAvLyBBbGlhcyBleGlzdHMsIHVwZGF0ZSBpdFxuICAgICAgICAgICAgY29uc3QgdXBkYXRlUmVzcG9uc2UgPSBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgVXBkYXRlQWxpYXNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICBOYW1lOiBjZmcuYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uVmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogJ0xhbWJkYSBLYXRhIFNuYXBTdGFydC1lbmFibGVkIHZlcnNpb24nLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYWxpYXNBcm4gPSB1cGRhdGVSZXNwb25zZS5BbGlhc0FybiE7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgVXBkYXRlZCBleGlzdGluZyBhbGlhczogJHthbGlhc0Fybn1gKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGJ5IGVycm9yIG5hbWUgZm9yIGJldHRlciB0ZXN0YWJpbGl0eVxuICAgICAgICAgICAgY29uc3QgaXNSZXNvdXJjZU5vdEZvdW5kID0gZXJyb3IgaW5zdGFuY2VvZiBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHx8XG4gICAgICAgICAgICAgICAgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24nKTtcblxuICAgICAgICAgICAgaWYgKGlzUmVzb3VyY2VOb3RGb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIEFsaWFzIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZVJlc3BvbnNlID0gYXdhaXQgbGFtYmRhQ2xpZW50LnNlbmQobmV3IENyZWF0ZUFsaWFzQ29tbWFuZCh7XG4gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICBOYW1lOiBjZmcuYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblZlcnNpb246IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiAnTGFtYmRhIEthdGEgU25hcFN0YXJ0LWVuYWJsZWQgdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGFsaWFzQXJuID0gY3JlYXRlUmVzcG9uc2UuQWxpYXNBcm4hO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBDcmVhdGVkIG5ldyBhbGlhczogJHthbGlhc0Fybn1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnXFxuJyArICc9Jy5yZXBlYXQoNjApKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1NOQVBTVEFSVCBBQ1RJVkFUSU9OIENPTVBMRVRFJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCc9Jy5yZXBlYXQoNjApKTtcbiAgICAgICAgY29uc29sZS5sb2coYFZlcnNpb246ICR7dmVyc2lvbn1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYEFsaWFzOiAke2NmZy5hbGlhc05hbWV9IC0+ICR7YWxpYXNBcm59YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBPcHRpbWl6YXRpb25TdGF0dXM6ICR7b3B0aW1pemF0aW9uU3RhdHVzfWApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgICAgYWxpYXNOYW1lOiBjZmcuYWxpYXNOYW1lLFxuICAgICAgICAgICAgYWxpYXNBcm4sXG4gICAgICAgICAgICBvcHRpbWl6YXRpb25TdGF0dXMsXG4gICAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gQ2F0Y2ggQWNjZXNzRGVuaWVkRXhjZXB0aW9uIGZyb20gYW55IExhbWJkYSBBUEkgY2FsbCAoc2VuZCBjYWxscylcbiAgICAgICAgLy8gdGhhdCBpc24ndCBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHdhaXRlciB0cnktY2F0Y2ggYmxvY2tzXG4gICAgICAgIGlmIChpc0FjY2Vzc0RlbmllZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gYWN0aXZhdGUgU25hcFN0YXJ0IG9uICcke2Z1bmN0aW9uTmFtZX0nLiBgICtcbiAgICAgICAgICAgICAgICBgRW5zdXJlIHRoZSBleGVjdXRpb24gcm9sZSBoYXMgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uczogJHtSRVFVSVJFRF9QRVJNSVNTSU9OUy5qb2luKCcsICcpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuXG4vKipcbiAqIExhbWJkYSBoYW5kbGVyIGZvciBDbG91ZEZvcm1hdGlvbiBDdXN0b20gUmVzb3VyY2UuXG4gKlxuICogVGhpcyBoYW5kbGVyIGlzIGludm9rZWQgYnkgQ2xvdWRGb3JtYXRpb24gd2hlbiB0aGUgY3VzdG9tIHJlc291cmNlXG4gKiBpcyBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogQ3VzdG9tUmVzb3VyY2VFdmVudCk6IFByb21pc2U8Q3VzdG9tUmVzb3VyY2VSZXNwb25zZT4ge1xuICAgIGNvbnNvbGUubG9nKCdDdXN0b20gUmVzb3VyY2UgRXZlbnQ6JywgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcblxuICAgIGNvbnN0IHsgUmVxdWVzdFR5cGUsIFN0YWNrSWQsIFJlcXVlc3RJZCwgTG9naWNhbFJlc291cmNlSWQsIFJlc291cmNlUHJvcGVydGllcyB9ID0gZXZlbnQ7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gUmVzb3VyY2VQcm9wZXJ0aWVzLkZ1bmN0aW9uTmFtZTtcbiAgICBjb25zdCBhbGlhc05hbWUgPSBSZXNvdXJjZVByb3BlcnRpZXMuQWxpYXNOYW1lID8/ICdrYXRhJztcblxuICAgIC8vIFBoeXNpY2FsIHJlc291cmNlIElEIGZvcm1hdDoge2Z1bmN0aW9uTmFtZX06c25hcHN0YXJ0OnthbGlhc05hbWV9XG4gICAgY29uc3QgcGh5c2ljYWxSZXNvdXJjZUlkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkID8/IGAke2Z1bmN0aW9uTmFtZX06c25hcHN0YXJ0OiR7YWxpYXNOYW1lfWA7XG5cbiAgICBjb25zdCBiYXNlUmVzcG9uc2U6IE9taXQ8Q3VzdG9tUmVzb3VyY2VSZXNwb25zZSwgJ1N0YXR1cycgfCAnUmVhc29uJyB8ICdEYXRhJz4gPSB7XG4gICAgICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgICAgICBTdGFja0lkLFxuICAgICAgICBSZXF1ZXN0SWQsXG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoUmVxdWVzdFR5cGUgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICAvLyBPbiBkZWxldGUsIHdlIGRvbid0IHJlbW92ZSBTbmFwU3RhcnQgb3IgdGhlIGFsaWFzXG4gICAgICAgICAgICAvLyBUaGUgTGFtYmRhIGZ1bmN0aW9uIGl0c2VsZiB3aWxsIGJlIGRlbGV0ZWQgYnkgQ2xvdWRGb3JtYXRpb25cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgcmVxdWVzdCAtIG5vIGFjdGlvbiBuZWVkZWQgKExhbWJkYSB3aWxsIGJlIGRlbGV0ZWQgYnkgQ2xvdWRGb3JtYXRpb24pJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgICAgICAgICAgICBTdGF0dXM6ICdTVUNDRVNTJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgb3IgVXBkYXRlIC0gYWN0aXZhdGUgU25hcFN0YXJ0XG4gICAgICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoe30pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGl2YXRlU25hcFN0YXJ0KGxhbWJkYUNsaWVudCwgZnVuY3Rpb25OYW1lLCB7IGFsaWFzTmFtZSB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgICAgICAgU3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgICAgICAgVmVyc2lvbjogcmVzdWx0LnZlcnNpb24sXG4gICAgICAgICAgICAgICAgQWxpYXNOYW1lOiByZXN1bHQuYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgIEFsaWFzQXJuOiByZXN1bHQuYWxpYXNBcm4sXG4gICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uU3RhdHVzOiByZXN1bHQub3B0aW1pemF0aW9uU3RhdHVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NuYXBTdGFydCBhY3RpdmF0aW9uIGZhaWxlZDonLCBlcnJvck1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIE9uIFVwZGF0ZSByZXF1ZXN0cywgcmV0dXJuIFNVQ0NFU1MgZXZlbiBvbiBmYWlsdXJlIHRvIHByZXZlbnRcbiAgICAgICAgLy8gQ2xvdWRGb3JtYXRpb24gcm9sbGJhY2sgZnJvbSBnZXR0aW5nIHN0dWNrIGluIFVQREFURV9ST0xMQkFDS19GQUlMRUQuXG4gICAgICAgIC8vIFJldHVybmluZyBGQUlMRUQgZnJvbSBhbiBVcGRhdGUgZHVyaW5nIHJvbGxiYWNrIGJsb2NrcyB0aGUgZW50aXJlIHN0YWNrLlxuICAgICAgICAvLyBUaGUgZnVuY3Rpb24gcmVtYWlucyBvcGVyYXRpb25hbCB3aXRoIGl0cyBwcmV2aW91cyBjb25maWd1cmF0aW9uLlxuICAgICAgICBpZiAoUmVxdWVzdFR5cGUgPT09ICdVcGRhdGUnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmV0dXJuaW5nIFNVQ0NFU1MgZm9yIFVwZGF0ZSByZXF1ZXN0IHRvIHByZXZlbnQgcm9sbGJhY2sgZGVhZGxvY2suJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVGhlIGZ1bmN0aW9uIHdpbGwgY29udGludWUgd2l0aCBpdHMgcHJldmlvdXMgU25hcFN0YXJ0IGNvbmZpZ3VyYXRpb24uJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgICAgICAgICAgICBTdGF0dXM6ICdTVUNDRVNTJyxcbiAgICAgICAgICAgICAgICBSZWFzb246IGBTbmFwU3RhcnQgYWN0aXZhdGlvbiBmYWlsZWQgKG5vbi1ibG9ja2luZyk6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgICAgICAgIFN0YXR1czogJ0ZBSUxFRCcsXG4gICAgICAgICAgICBSZWFzb246IGBTbmFwU3RhcnQgYWN0aXZhdGlvbiBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgIH07XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogInlhQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSxlQUFBRSxFQUFBLHNCQUFBQyxFQUFBLFlBQUFDLElBQUEsZUFBQUMsRUFBQUwsR0E4QkEsSUFBQU0sRUFXTyxrQ0F5R0RDLEVBQXNCLEVBTXRCQyxFQUFpQixLQU9qQkMsRUFBdUIs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OiBbInNuYXBzdGFydF9hY3RpdmF0b3JfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJfdGVzdGFibGUiLCAiYWN0aXZhdGVTbmFwU3RhcnQiLCAiaGFuZGxlciIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X2NsaWVudF9sYW1iZGEiLCAiTUFYX1BVQkxJU0hfUkVUUklFUyIsICJSRVRSWV9ERUxBWV9NUyIsICJQUkVfUFVCTElTSF9ERUxBWV9NUyIsICJERUZBVUxUX0NPTkZJRyIsICJtcyIsICJyZXNvbHZlIiwgImlzUmVzb3VyY2VOb3RGb3VuZEVycm9yIiwgImVycm9yIiwgImNhdXNlIiwgIlJFUVVJUkVEX1BFUk1JU1NJT05TIiwgImlzQWNjZXNzRGVuaWVkRXJyb3IiLCAibGFtYmRhQ2xpZW50IiwgImZ1bmN0aW9uTmFtZSIsICJjb25maWciLCAiY2ZnIiwgIm1heEF0dGVtcHRzIiwgInZlcnNpb24iLCAib3B0aW1pemF0aW9uU3RhdHVzIiwgInN0YXRlIiwgImxhc3RGYWlsUmVhc29uIiwgInB1Ymxpc2hBdHRlbXB0IiwgImF0dGVtcHQiLCAidmVyc2lvbkNvbmZpZyIsICJlbGFwc2VkIiwgImFsaWFzQXJuIiwgImV2ZW50IiwgIlJlcXVlc3RUeXBlIiwgIlN0YWNrSWQiLCAiUmVxdWVzdElkIiwgIkxvZ2ljYWxSZXNvdXJjZUlkIiwgIlJlc291cmNlUHJvcGVydGllcyIsICJhbGlhc05hbWUiLCAiYmFzZVJlc3BvbnNlIiwgInJlc3VsdCIsICJlcnJvck1lc3NhZ2UiXQp9Cg==
|
|
1
|
+
"use strict";var R=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var v=(t,e)=>{for(var u in e)R(t,u,{get:e[u],enumerable:!0})},C=(t,e,u,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of $(e))!y.call(t,c)&&c!==u&&R(t,c,{get:()=>e[c],enumerable:!(a=F(e,c))||a.enumerable});return t};var I=t=>C(R({},"__esModule",{value:!0}),t);var x={};v(x,{_testable:()=>g,activateSnapStart:()=>A,handler:()=>P});module.exports=I(x);var o=require("@aws-sdk/client-lambda"),S=5,N=15e3,L=3e3,D={snapshotTimeoutSeconds:180,pollingIntervalSeconds:2,aliasName:"kata",_prePublishDelayMs:L,_retryDelayMs:N},g={sleep(t){return new Promise(e=>setTimeout(e,t))}};function b(t){if(t instanceof o.ResourceNotFoundException)return!0;if(t instanceof Error){if(t.name==="ResourceNotFoundException")return!0;let e=t.cause;if(e instanceof o.ResourceNotFoundException||e instanceof Error&&e.name==="ResourceNotFoundException")return!0}return!1}var h=["lambda:GetFunction","lambda:GetFunctionConfiguration","lambda:UpdateFunctionConfiguration","lambda:PublishVersion","lambda:GetAlias","lambda:CreateAlias","lambda:UpdateAlias"];function w(t){if(t instanceof Error){if(t.name==="AccessDeniedException")return!0;let e=t.cause;if(e instanceof Error&&e.name==="AccessDeniedException")return!0}return!1}async function A(t,e,u){let a={...D,...u},c=Math.ceil(a.snapshotTimeoutSeconds/a.pollingIntervalSeconds);console.log("[Lambda Kata] Deterministic initialization"),console.log(`Function: ${e}`),console.log(`Timeout: ${a.snapshotTimeoutSeconds}s, Polling: ${a.pollingIntervalSeconds}s`),console.log(`Max publish retries: ${S}`);try{try{await(0,o.waitUntilFunctionActiveV2)({client:t,maxWaitTime:60},{FunctionName:e})}catch(n){throw b(n)?new Error(`Lambda function '${e}' does not exist. Verify the function name or ARN is correct.`):w(n)?new Error(`Insufficient permissions to activate SnapStart on '${e}'. Ensure the execution role has the following permissions: ${h.join(", ")}`):n}console.log(`
|
|
2
|
+
[Lambda Kata] Preparing low-latency cold-start runtime...`),await t.send(new o.UpdateFunctionConfigurationCommand({FunctionName:e,SnapStart:{ApplyOn:"PublishedVersions"}}));try{await(0,o.waitUntilFunctionUpdatedV2)({client:t,maxWaitTime:120},{FunctionName:e})}catch(n){throw b(n)?new Error(`Lambda function '${e}' does not exist. Verify the function name or ARN is correct.`):w(n)?new Error(`Insufficient permissions to activate SnapStart on '${e}'. Ensure the execution role has the following permissions: ${h.join(", ")}`):n}await g.sleep(a._prePublishDelayMs);let i="",p="Unknown",s="Unknown",m="";for(let n=1;n<=S;n++){console.log(`[Lambda Kata] Publishing optimized runtime version (attempt ${n}/${S})...`),n>1&&(console.log(` Waiting ${a._retryDelayMs/1e3}s before retry...`),await g.sleep(a._retryDelayMs),console.log(" Ensuring function is Active before re-publish..."),await(0,o.waitUntilFunctionActiveV2)({client:t,maxWaitTime:60},{FunctionName:e}),console.log(" Re-applying SnapStart config to force new version..."),await t.send(new o.UpdateFunctionConfigurationCommand({FunctionName:e,SnapStart:{ApplyOn:"PublishedVersions"}})),await(0,o.waitUntilFunctionUpdatedV2)({client:t,maxWaitTime:120},{FunctionName:e}),await g.sleep(a._prePublishDelayMs)),i=(await t.send(new o.PublishVersionCommand({FunctionName:e,Description:`SnapStart enabled - ${new Date().toISOString()} (attempt ${n})`}))).Version,console.log(` Published version: ${i}`),console.log("[Lambda Kata] Preparing pre-initialized runtime image..."),s="Unknown";for(let d=0;d<c;d++){let f=await t.send(new o.GetFunctionConfigurationCommand({FunctionName:e,Qualifier:i}));if(p=(f.SnapStart??{}).OptimizationStatus??"Unknown",s=f.State??"Unknown",s==="Active"){console.log(" SnapStart snapshot ready!"),console.log(` OptimizationStatus: ${p}`),console.log(` State: ${s}`);break}else if(s==="Failed"){m=f.StateReason??"Unknown",console.log(` Snapshot creation failed: ${m}`),console.log(` Snapshot creation failed: ${f.StateReasonCode}`);break}else if(d%10===0||d<5){let E=d*a.pollingIntervalSeconds;console.log(` Creating snapshot... Status: ${p}, State: ${s} (${E}s elapsed)`)}await g.sleep(a.pollingIntervalSeconds*1e3)}if(s==="Active"||s!=="Failed")break;n<S&&(console.log(` Snapshot failed on attempt ${n}, will retry with new version...`),console.log(` Reason: ${m}`))}if(s==="Failed")throw console.log(` All ${S} snapshot attempts failed.`),console.log(` Reason: ${m}`),console.log(""),console.log(" [Lambda Kata] SnapStart optimization failed. Cannot create alias on Failed version."),console.log(" Review CloudWatch logs for initialization errors."),console.log(" Common causes: missing Lambda layers, import errors, or runtime issues."),new Error(`SnapStart activation failed: All ${S} snapshot attempts failed. Reason: ${m}. Cannot create alias on a Failed version. Check CloudWatch logs for the Lambda function to diagnose initialization errors.`);s!=="Active"&&s!=="Failed"&&(console.log(` Warning: Snapshot creation timeout after ${a.snapshotTimeoutSeconds}s`),console.log(` Final status: OptimizationStatus=${p}, State=${s}`));let r;try{await t.send(new o.GetAliasCommand({FunctionName:e,Name:a.aliasName})),r=(await t.send(new o.UpdateAliasCommand({FunctionName:e,Name:a.aliasName,FunctionVersion:i,Description:"Lambda Kata SnapStart-enabled version"}))).AliasArn,console.log(` Updated existing alias: ${r}`)}catch(n){if(n instanceof o.ResourceNotFoundException||n instanceof Error&&n.name==="ResourceNotFoundException")r=(await t.send(new o.CreateAliasCommand({FunctionName:e,Name:a.aliasName,FunctionVersion:i,Description:"Lambda Kata SnapStart-enabled version"}))).AliasArn,console.log(` Created new alias: ${r}`);else throw n}return console.log(`[Lambda Kata] Version: ${i}`),console.log(`[Lambda Kata] Alias: ${a.aliasName} | ${r}`),{version:i,aliasName:a.aliasName,aliasArn:r,optimizationStatus:p}}catch(i){throw w(i)?new Error(`Insufficient permissions to activate SnapStart on '${e}'. Ensure the execution role has the following permissions: ${h.join(", ")}`):i}}async function P(t){console.log("[Lambda Kata] Custom Resource Event:",JSON.stringify(t,null,2));let{RequestType:e,StackId:u,RequestId:a,LogicalResourceId:c,ResourceProperties:i}=t,p=i.FunctionName,s=i.AliasName??"kata",r={PhysicalResourceId:t.PhysicalResourceId??`${p}:snapstart:${s}`,StackId:u,RequestId:a,LogicalResourceId:c};try{if(e==="Delete")return console.log("Delete request - no action needed (Lambda will be deleted by CloudFormation)"),{...r,Status:"SUCCESS"};let n=new o.LambdaClient({}),l=await A(n,p,{aliasName:s});return{...r,Status:"SUCCESS",Data:{Version:l.version,AliasName:l.aliasName,AliasArn:l.aliasArn,OptimizationStatus:l.optimizationStatus}}}catch(n){let l=n instanceof Error?n.message:String(n);return console.error("[Lambda Kata] Optimization error:",l),e==="Update"?{...r,Status:"SUCCESS",Reason:`SnapStart activation failed (non-blocking): ${l}`}:{...r,Status:"FAILED",Reason:`SnapStart activation failed: ${l}`}}}0&&(module.exports={_testable,activateSnapStart,handler});
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3NuYXBzdGFydC1hY3RpdmF0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qXG4gKiBBcGFjaGUtMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBsYW1iZGFfa2F0YV9ucG1fY2RrLCA8d29ya3RpZl9sYW1iZGFfa2F0YV9ucG1fY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBBcGFjaGUtMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBmb3IgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qKlxuICogU25hcFN0YXJ0IEFjdGl2YXRvciAtIEN1c3RvbSBSZXNvdXJjZSBIYW5kbGVyXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIExhbWJkYSBoYW5kbGVyIGZvciBhIENsb3VkRm9ybWF0aW9uIEN1c3RvbSBSZXNvdXJjZVxuICogdGhhdCBlbmFibGVzIFNuYXBTdGFydCBvbiBMYW1iZGEgZnVuY3Rpb25zIGFmdGVyIGRlcGxveW1lbnQuIFNuYXBTdGFydCByZXF1aXJlc1xuICogYXN5bmNocm9ub3VzIHdhaXRpbmcgZm9yIHNuYXBzaG90IGNyZWF0aW9uLCB3aGljaCBjYW5ub3QgYmUgZG9uZSBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAqXG4gKiBUaGUgYWN0aXZhdGlvbiBwcm9jZXNzOlxuICogMS4gV2FpdCBmb3IgZnVuY3Rpb24gdG8gYmUgQWN0aXZlXG4gKiAyLiBFbmFibGUgU25hcFN0YXJ0IGNvbmZpZ3VyYXRpb25cbiAqIDMuIFdhaXQgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlXG4gKiA0LiBQdWJsaXNoIG5ldyB2ZXJzaW9uICh0cmlnZ2VycyBzbmFwc2hvdCBjcmVhdGlvbilcbiAqIDUuIFdhaXQgZm9yIHNuYXBzaG90IHRvIGJlIHJlYWR5ICh1cCB0byAzIG1pbnV0ZXMpXG4gKiA2LiBDcmVhdGUvdXBkYXRlICdrYXRhJyBhbGlhcyBwb2ludGluZyB0byB0aGUgbmV3IHZlcnNpb25cbiAqXG4gKiBAbW9kdWxlIHNuYXBzdGFydC1hY3RpdmF0b3JcbiAqL1xuXG5pbXBvcnQge1xuICAgIExhbWJkYUNsaWVudCxcbiAgICBVcGRhdGVGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kLFxuICAgIFB1Ymxpc2hWZXJzaW9uQ29tbWFuZCxcbiAgICBHZXRGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kLFxuICAgIENyZWF0ZUFsaWFzQ29tbWFuZCxcbiAgICBVcGRhdGVBbGlhc0NvbW1hbmQsXG4gICAgR2V0QWxpYXNDb21tYW5kLFxuICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sXG4gICAgd2FpdFVudGlsRnVuY3Rpb25VcGRhdGVkVjIsXG4gICAgd2FpdFVudGlsRnVuY3Rpb25BY3RpdmVWMixcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5cbi8qKlxuICogQ3VzdG9tIFJlc291cmNlIGV2ZW50IGZyb20gQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VFdmVudCB7XG4gICAgUmVxdWVzdFR5cGU6ICdDcmVhdGUnIHwgJ1VwZGF0ZScgfCAnRGVsZXRlJztcbiAgICBTZXJ2aWNlVG9rZW46IHN0cmluZztcbiAgICBSZXNwb25zZVVSTDogc3RyaW5nO1xuICAgIFN0YWNrSWQ6IHN0cmluZztcbiAgICBSZXF1ZXN0SWQ6IHN0cmluZztcbiAgICBSZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgICBMb2dpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xuICAgIFBoeXNpY2FsUmVzb3VyY2VJZD86IHN0cmluZztcbiAgICBSZXNvdXJjZVByb3BlcnRpZXM6IHtcbiAgICAgICAgU2VydmljZVRva2VuOiBzdHJpbmc7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAgICAgICBBbGlhc05hbWU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBPbGRSZXNvdXJjZVByb3BlcnRpZXM/OiB7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICAgICAgICBBbGlhc05hbWU/OiBzdHJpbmc7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgcmVzcG9uc2UgdG8gQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VSZXNwb25zZSB7XG4gICAgU3RhdHVzOiAnU1VDQ0VTUycgfCAnRkFJTEVEJztcbiAgICBSZWFzb24/OiBzdHJpbmc7XG4gICAgUGh5c2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgU3RhY2tJZDogc3RyaW5nO1xuICAgIFJlcXVlc3RJZDogc3RyaW5nO1xuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgRGF0YT86IHtcbiAgICAgICAgVmVyc2lvbj86IHN0cmluZztcbiAgICAgICAgQWxpYXNOYW1lPzogc3RyaW5nO1xuICAgICAgICBBbGlhc0Fybj86IHN0cmluZztcbiAgICAgICAgT3B0aW1pemF0aW9uU3RhdHVzPzogc3RyaW5nO1xuICAgIH07XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgc3VjY2Vzc2Z1bCBTbmFwU3RhcnQgYWN0aXZhdGlvbiBjeWNsZS5cbiAqXG4gKiBSZXR1cm5lZCBieSB7QGxpbmsgYWN0aXZhdGVTbmFwU3RhcnR9IGFmdGVyIGVuYWJsaW5nIFNuYXBTdGFydCxcbiAqIHB1Ymxpc2hpbmcgYSB2ZXJzaW9uLCB3YWl0aW5nIGZvciBzbmFwc2hvdCByZWFkaW5lc3MsIGFuZCBjcmVhdGluZy91cGRhdGluZyBhbiBhbGlhcy5cbiAqXG4gKiBAc2VlIHtAbGluayBTbmFwU3RhcnRBY3RpdmF0b3JDb25maWd9IGZvciBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbmFwU3RhcnRBY3RpdmF0aW9uUmVzdWx0IHtcbiAgICAvKiogVGhlIHB1Ymxpc2hlZCBMYW1iZGEgdmVyc2lvbiBudW1iZXIgKGUuZy4gXCI0MlwiKS4gKi9cbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhbGlhcyBuYW1lIHRoYXQgd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCAoZS5nLiBcImthdGFcIikuICovXG4gICAgYWxpYXNOYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBmdWxsIEFSTiBvZiB0aGUgYWxpYXMgKGUuZy4gXCJhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOm15LWZuOmthdGFcIikuICovXG4gICAgYWxpYXNBcm46IHN0cmluZztcbiAgICAvKiogVGhlIFNuYXBTdGFydCBvcHRpbWl6YXRpb24gc3RhdHVzIG9mIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiAoXCJPblwiLCBcIk9mZlwiLCBvciBcIlVua25vd25cIikuICovXG4gICAgb3B0aW1pemF0aW9uU3RhdHVzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgU25hcFN0YXJ0IGFjdGl2YXRpb24gY3ljbGUuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIGFuZCBmYWxsIGJhY2sgdG8gc2Vuc2libGUgZGVmYXVsdHMuXG4gKlxuICogQHNlZSB7QGxpbmsgYWN0aXZhdGVTbmFwU3RhcnR9IGZvciB0aGUgZnVuY3Rpb24gdGhhdCBjb25zdW1lcyB0aGlzIGNvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBTdGFydEFjdGl2YXRvckNvbmZpZyB7XG4gICAgLyoqXG4gICAgICogTWF4aW11bSB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3Igc25hcHNob3QgY3JlYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuXG4gICAgICogSWYgZXhjZWVkZWQsIGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIGFsaWFzIGNyZWF0aW9uIGNvbnRpbnVlcy5cbiAgICAgKiBAZGVmYXVsdCAxODBcbiAgICAgKi9cbiAgICBzbmFwc2hvdFRpbWVvdXRTZWNvbmRzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEludGVydmFsIGluIHNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGF0dGVtcHRzIGZvciBzbmFwc2hvdCByZWFkaW5lc3MuXG4gICAgICogQGRlZmF1bHQgMlxuICAgICAqL1xuICAgIHBvbGxpbmdJbnRlcnZhbFNlY29uZHM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBhbGlhcyBuYW1lIHRvIGNyZWF0ZSBvciB1cGRhdGUgYWZ0ZXIgcHVibGlzaGluZyBhIHZlcnNpb24uXG4gICAgICogQGRlZmF1bHQgJ2thdGEnXG4gICAgICovXG4gICAgYWxpYXNOYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbCBPdmVycmlkZSBwcmUtcHVibGlzaCBkZWxheSBpbiBtaWxsaXNlY29uZHMgKGZvciB0ZXN0aW5nIG9ubHkpLlxuICAgICAqIEBkZWZhdWx0IDMwMDBcbiAgICAgKi9cbiAgICBfcHJlUHVibGlzaERlbGF5TXM/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsIE92ZXJyaWRlIHJldHJ5IGRlbGF5IGluIG1pbGxpc2Vjb25kcyAoZm9yIHRlc3Rpbmcgb25seSkuXG4gICAgICogQGRlZmF1bHQgNTAwMFxuICAgICAqL1xuICAgIF9yZXRyeURlbGF5TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTWF4aW11bSBudW1iZXIgb2YgUHVibGlzaFZlcnNpb24gKyBzbmFwc2hvdCBwb2xsaW5nIGF0dGVtcHRzLlxuICogRWFjaCByZXRyeSBwdWJsaXNoZXMgYSBORVcgdmVyc2lvbiAobmV3IHNuYXBzaG90IGF0dGVtcHQpLlxuICogQm91bmRlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzOyB0b3RhbCB3b3JzdC1jYXNlIHRpbWU6XG4gKiA1ICogKDE1cyBkZWxheSArIHB1Ymxpc2ggKyAxODBzIHBvbGwpIFx1MjI0OCAxNm1pbiwgd2l0aGluIExhbWJkYSAxNW1pbiBsaW1pdFxuICogKGJ1dCBzbmFwc2hvdCB0aW1lb3V0IGlzIHR5cGljYWxseSBtdWNoIHNob3J0ZXIgdGhhbiAxODBzIHBlciBhdHRlbXB0KS5cbiAqL1xuY29uc3QgTUFYX1BVQkxJU0hfUkVUUklFUyA9IDU7XG5cbi8qKlxuICogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyBhIGZhaWxlZCBzbmFwc2hvdCBjcmVhdGlvbi5cbiAqIFNldCB0byAxNXMgdG8gZ2l2ZSB0cmFuc2llbnQgTGFtYmRhIGluaXQgZmFpbHVyZXMgdGltZSB0byBjbGVhci5cbiAqL1xuY29uc3QgUkVUUllfREVMQVlfTVMgPSAxNTAwMDtcblxuLyoqXG4gKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2FpdFVudGlsRnVuY3Rpb25VcGRhdGVkVjIgY29tcGxldGVzLFxuICogYmVmb3JlIHRoZSBmaXJzdCBQdWJsaXNoVmVyc2lvbiBjYWxsLiBNaXRpZ2F0ZXMgZXZlbnR1YWwgY29uc2lzdGVuY3lcbiAqIGJldHdlZW4gTGFtYmRhIGNvbmZpZyB1cGRhdGUgcHJvcGFnYXRpb24gYW5kIFB1Ymxpc2hWZXJzaW9uIGluaXQgcGhhc2UuXG4gKi9cbmNvbnN0IFBSRV9QVUJMSVNIX0RFTEFZX01TID0gMzAwMDtcblxuY29uc3QgREVGQVVMVF9DT05GSUc6IFJlcXVpcmVkPFNuYXBTdGFydEFjdGl2YXRvckNvbmZpZz4gPSB7XG4gICAgc25hcHNob3RUaW1lb3V0U2Vjb25kczogMTgwLFxuICAgIHBvbGxpbmdJbnRlcnZhbFNlY29uZHM6IDIsXG4gICAgYWxpYXNOYW1lOiAna2F0YScsXG4gICAgX3ByZVB1Ymxpc2hEZWxheU1zOiBQUkVfUFVCTElTSF9ERUxBWV9NUyxcbiAgICBfcmV0cnlEZWxheU1zOiBSRVRSWV9ERUxBWV9NUyxcbn07XG5cbi8qKlxuICogU2xlZXAgZm9yIHNwZWNpZmllZCBtaWxsaXNlY29uZHMuXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0ZXN0cyBjYW4gamVzdC5zcHlPbiB0byBhdm9pZCByZWFsIGRlbGF5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IF90ZXN0YWJsZSA9IHtcbiAgICBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgICB9LFxufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBlcnJvciAob3IgaXRzIGNhdXNlIGNoYWluKSBpcyBhIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24uXG4gKlxuICogQVdTIFNESyB2MyB3YWl0ZXJzIG1heSB0aHJvdyB0aGUgdW5kZXJseWluZyBzZXJ2aWNlIGV4Y2VwdGlvbiBkaXJlY3RseSxcbiAqIG9yIHdyYXAgaXQgaW4gYSB3YWl0ZXItc3RhdGUgZXJyb3IuIFRoaXMgaGVscGVyIGluc3BlY3RzIGJvdGggdGhlIGVycm9yXG4gKiBpdHNlbGYgYW5kIGl0cyBgY2F1c2VgIHByb3BlcnR5IHRvIGRldGVjdCBlaXRoZXIgY2FzZS5cbiAqL1xuZnVuY3Rpb24gaXNSZXNvdXJjZU5vdEZvdW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWl0ZXJzIG1heSB3cmFwIHRoZSBzZXJ2aWNlIGV4Y2VwdGlvbiBpbiBhIGNhdXNlIGNoYWluXG4gICAgICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yICYmIGNhdXNlLm5hbWUgPT09ICdSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcXVpcmVkIElBTSBwZXJtaXNzaW9ucyBmb3IgU25hcFN0YXJ0IGFjdGl2YXRpb24uXG4gKiBVc2VkIGluIGVycm9yIG1lc3NhZ2VzIHRvIGd1aWRlIHVzZXJzIHdoZW4gQWNjZXNzRGVuaWVkRXhjZXB0aW9uIG9jY3Vycy5cbiAqL1xuY29uc3QgUkVRVUlSRURfUEVSTUlTU0lPTlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgICdsYW1iZGE6R2V0RnVuY3Rpb24nLFxuICAgICdsYW1iZGE6R2V0RnVuY3Rpb25Db25maWd1cmF0aW9uJyxcbiAgICAnbGFtYmRhOlVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgJ2xhbWJkYTpQdWJsaXNoVmVyc2lvbicsXG4gICAgJ2xhbWJkYTpHZXRBbGlhcycsXG4gICAgJ2xhbWJkYTpDcmVhdGVBbGlhcycsXG4gICAgJ2xhbWJkYTpVcGRhdGVBbGlhcycsXG5dO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGVycm9yIGlzIGFuIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbi5cbiAqXG4gKiBBV1MgU0RLIHYzIG1heSB0aHJvdyBBY2Nlc3NEZW5pZWRFeGNlcHRpb24gZGlyZWN0bHkgb3Igd3JhcCBpdC5cbiAqIFRoaXMgaGVscGVyIGluc3BlY3RzIGJvdGggdGhlIGVycm9yIGl0c2VsZiBhbmQgaXRzIGBjYXVzZWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGlzQWNjZXNzRGVuaWVkRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yICYmIGNhdXNlLm5hbWUgPT09ICdBY2Nlc3NEZW5pZWRFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBBY3RpdmF0ZXMgU25hcFN0YXJ0IG9uIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZ1bGwgU25hcFN0YXJ0IGFjdGl2YXRpb24gY3ljbGU6XG4gKiAxLiBFbnN1cmVzIGZ1bmN0aW9uIGlzIEFjdGl2ZVxuICogMi4gRW5hYmxlcyBTbmFwU3RhcnQgY29uZmlndXJhdGlvblxuICogMy4gV2FpdHMgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlXG4gKiA0LiBQdWJsaXNoZXMgbmV3IHZlcnNpb24gKHdpdGggcmV0cnkgb24gc25hcHNob3QgZmFpbHVyZSlcbiAqIDUuIFdhaXRzIGZvciBzbmFwc2hvdCBjcmVhdGlvblxuICogNi4gQ3JlYXRlcy91cGRhdGVzIGFsaWFzXG4gKlxuICogU3RlcHMgMys0IGFyZSB3cmFwcGVkIGluIGEgcmV0cnkgbG9vcDogb24gU3RhdGU6IEZhaWxlZCwgYSBuZXcgdmVyc2lvblxuICogaXMgcHVibGlzaGVkICh1cCB0byBNQVhfUFVCTElTSF9SRVRSSUVTIGF0dGVtcHRzKSB0byBoYW5kbGUgdHJhbnNpZW50XG4gKiBpbml0aWFsaXphdGlvbiBmYWlsdXJlcyBkdXJpbmcgc25hcHNob3QgY3JlYXRpb24uXG4gKlxuICogQHBhcmFtIGxhbWJkYUNsaWVudCAtIEFXUyBMYW1iZGEgY2xpZW50XG4gKiBAcGFyYW0gZnVuY3Rpb25OYW1lIC0gTmFtZSBvciBBUk4gb2YgdGhlIExhbWJkYSBmdW5jdGlvblxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEFjdGl2YXRpb24gcmVzdWx0IHdpdGggdmVyc2lvbiBhbmQgYWxpYXMgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlU25hcFN0YXJ0KFxuICAgIGxhbWJkYUNsaWVudDogTGFtYmRhQ2xpZW50LFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFNuYXBTdGFydEFjdGl2YXRvckNvbmZpZyxcbik6IFByb21pc2U8U25hcFN0YXJ0QWN0aXZhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGNmZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gTWF0aC5jZWlsKGNmZy5zbmFwc2hvdFRpbWVvdXRTZWNvbmRzIC8gY2ZnLnBvbGxpbmdJbnRlcnZhbFNlY29uZHMpO1xuXG4gICAgY29uc29sZS5sb2coJ1tMYW1iZGEgS2F0YV0gRGV0ZXJtaW5pc3RpYyBpbml0aWFsaXphdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKGBGdW5jdGlvbjogJHtmdW5jdGlvbk5hbWV9YCk7XG4gICAgY29uc29sZS5sb2coYFRpbWVvdXQ6ICR7Y2ZnLnNuYXBzaG90VGltZW91dFNlY29uZHN9cywgUG9sbGluZzogJHtjZmcucG9sbGluZ0ludGVydmFsU2Vjb25kc31zYCk7XG4gICAgY29uc29sZS5sb2coYE1heCBwdWJsaXNoIHJldHJpZXM6ICR7TUFYX1BVQkxJU0hfUkVUUklFU31gKTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIFN0ZXAgMDogRW5zdXJlIGZ1bmN0aW9uIGlzIEFjdGl2ZSBiZWZvcmUgc3RhcnRpbmdcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1xcblswLzVdIEVuc3VyaW5nIGZ1bmN0aW9uIGlzIEFjdGl2ZS4uLicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd2FpdFVudGlsRnVuY3Rpb25BY3RpdmVWMihcbiAgICAgICAgICAgICAgICB7IGNsaWVudDogbGFtYmRhQ2xpZW50LCBtYXhXYWl0VGltZTogNjAgfSxcbiAgICAgICAgICAgICAgICB7IEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNSZXNvdXJjZU5vdEZvdW5kRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYW1iZGEgZnVuY3Rpb24gJyR7ZnVuY3Rpb25OYW1lfScgZG9lcyBub3QgZXhpc3QuIFZlcmlmeSB0aGUgZnVuY3Rpb24gbmFtZSBvciBBUk4gaXMgY29ycmVjdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FjY2Vzc0RlbmllZEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEluc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0byBhY3RpdmF0ZSBTbmFwU3RhcnQgb24gJyR7ZnVuY3Rpb25OYW1lfScuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgRW5zdXJlIHRoZSBleGVjdXRpb24gcm9sZSBoYXMgdGhlIGZvbGxvd2luZyBwZXJtaXNzaW9uczogJHtSRVFVSVJFRF9QRVJNSVNTSU9OUy5qb2luKCcsICcpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJyAgICAgIEZ1bmN0aW9uIGlzIEFjdGl2ZScpO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogRW5hYmxlIFNuYXBTdGFydCBvbiB0aGUgZnVuY3Rpb25cbiAgICAgICAgY29uc29sZS5sb2coJ1xcbltMYW1iZGEgS2F0YV0gUHJlcGFyaW5nIGxvdy1sYXRlbmN5IGNvbGQtc3RhcnQgcnVudGltZS4uLicpO1xuICAgICAgICBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgVXBkYXRlRnVuY3Rpb25Db25maWd1cmF0aW9uQ29tbWFuZCh7XG4gICAgICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIFNuYXBTdGFydDogeyBBcHBseU9uOiAnUHVibGlzaGVkVmVyc2lvbnMnIH0sXG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJyAgICAgIFNuYXBTdGFydCBjb25maWd1cmF0aW9uIHNlbnQnKTtcblxuICAgICAgICAvLyBTdGVwIDI6IFdhaXQgZm9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlIHRvIGNvbXBsZXRlXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdbMi81XSBXYWl0aW5nIGZvciBjb25maWd1cmF0aW9uIHVwZGF0ZS4uLicpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgd2FpdFVudGlsRnVuY3Rpb25VcGRhdGVkVjIoXG4gICAgICAgICAgICAgICAgeyBjbGllbnQ6IGxhbWJkYUNsaWVudCwgbWF4V2FpdFRpbWU6IDEyMCB9LFxuICAgICAgICAgICAgICAgIHsgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc1Jlc291cmNlTm90Rm91bmRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhbWJkYSBmdW5jdGlvbiAnJHtmdW5jdGlvbk5hbWV9JyBkb2VzIG5vdCBleGlzdC4gVmVyaWZ5IHRoZSBmdW5jdGlvbiBuYW1lIG9yIEFSTiBpcyBjb3JyZWN0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQWNjZXNzRGVuaWVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSW5zdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGFjdGl2YXRlIFNuYXBTdGFydCBvbiAnJHtmdW5jdGlvbk5hbWV9Jy4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBFbnN1cmUgdGhlIGV4ZWN1dGlvbiByb2xlIGhhcyB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zOiAke1JFUVVJUkVEX1BFUk1JU1NJT05TLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZygnICAgICAgQ29uZmlndXJhdGlvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICAgIC8vIFByZS1wdWJsaXNoIGRlbGF5OiBtaXRpZ2F0ZSBldmVudHVhbCBjb25zaXN0ZW5jeSBiZXR3ZWVuXG4gICAgICAgIC8vIExhbWJkYSBjb25maWcgdXBkYXRlIHByb3BhZ2F0aW9uIGFuZCBQdWJsaXNoVmVyc2lvbiBpbml0IHBoYXNlXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGAgICAgICBXYWl0aW5nICR7Y2ZnLl9wcmVQdWJsaXNoRGVsYXlNcyAvIDEwMDB9cyBmb3IgY29uZmlndXJhdGlvbiBwcm9wYWdhdGlvbi4uLmApO1xuICAgICAgICBhd2FpdCBfdGVzdGFibGUuc2xlZXAoY2ZnLl9wcmVQdWJsaXNoRGVsYXlNcyk7XG5cbiAgICAgICAgLy8gU3RlcHMgMys0OiBQdWJsaXNoIHZlcnNpb24gYW5kIHdhaXQgZm9yIHNuYXBzaG90IChXSVRIIFJFVFJZKVxuICAgICAgICBsZXQgdmVyc2lvbjogc3RyaW5nID0gJyc7XG4gICAgICAgIGxldCBvcHRpbWl6YXRpb25TdGF0dXMgPSAnVW5rbm93bic7XG4gICAgICAgIGxldCBzdGF0ZSA9ICdVbmtub3duJztcbiAgICAgICAgbGV0IGxhc3RGYWlsUmVhc29uID0gJyc7XG5cbiAgICAgICAgZm9yIChsZXQgcHVibGlzaEF0dGVtcHQgPSAxOyBwdWJsaXNoQXR0ZW1wdCA8PSBNQVhfUFVCTElTSF9SRVRSSUVTOyBwdWJsaXNoQXR0ZW1wdCsrKSB7XG4gICAgICAgICAgICAvLyBTdGVwIDM6IFB1Ymxpc2ggbmV3IHZlcnNpb24gdG8gY3JlYXRlIHNuYXBzaG90XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW0xhbWJkYSBLYXRhXSBQdWJsaXNoaW5nIG9wdGltaXplZCBydW50aW1lIHZlcnNpb24gKGF0dGVtcHQgJHtwdWJsaXNoQXR0ZW1wdH0vJHtNQVhfUFVCTElTSF9SRVRSSUVTfSkuLi5gKTtcblxuICAgICAgICAgICAgLy8gQmVmb3JlIHJlLXB1Ymxpc2ggKGF0dGVtcHQgPiAxKSwgd2FpdCBhbmQgZW5zdXJlIGZ1bmN0aW9uIGlzIHJlYWR5XG4gICAgICAgICAgICBpZiAocHVibGlzaEF0dGVtcHQgPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIFdhaXRpbmcgJHtjZmcuX3JldHJ5RGVsYXlNcyAvIDEwMDB9cyBiZWZvcmUgcmV0cnkuLi5gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBfdGVzdGFibGUuc2xlZXAoY2ZnLl9yZXRyeURlbGF5TXMpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgICAgICBFbnN1cmluZyBmdW5jdGlvbiBpcyBBY3RpdmUgYmVmb3JlIHJlLXB1Ymxpc2guLi4nKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0VW50aWxGdW5jdGlvbkFjdGl2ZVYyKFxuICAgICAgICAgICAgICAgICAgICB7IGNsaWVudDogbGFtYmRhQ2xpZW50LCBtYXhXYWl0VGltZTogNjAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyBGb3JjZSBhIGNvbmZpZyB1cGRhdGUgc28gUHVibGlzaFZlcnNpb24gY3JlYXRlcyBhIGdlbnVpbmVseSBuZXcgdmVyc2lvbi5cbiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIFB1Ymxpc2hWZXJzaW9uIHJldHVybnMgdGhlIHNhbWUgKEZhaWxlZCkgdmVyc2lvbiBudW1iZXJcbiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIExhbWJkYSBkZWR1cGxpY2F0ZXMgaWRlbnRpY2FsIGNvbmZpZ3VyYXRpb25zLlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgICAgICBSZS1hcHBseWluZyBTbmFwU3RhcnQgY29uZmlnIHRvIGZvcmNlIG5ldyB2ZXJzaW9uLi4uJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgbGFtYmRhQ2xpZW50LnNlbmQobmV3IFVwZGF0ZUZ1bmN0aW9uQ29uZmlndXJhdGlvbkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgU25hcFN0YXJ0OiB7IEFwcGx5T246ICdQdWJsaXNoZWRWZXJzaW9ucycgfSxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FpdFVudGlsRnVuY3Rpb25VcGRhdGVkVjIoXG4gICAgICAgICAgICAgICAgICAgIHsgY2xpZW50OiBsYW1iZGFDbGllbnQsIG1heFdhaXRUaW1lOiAxMjAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgICAgICAgV2FpdGluZyAke2NmZy5fcHJlUHVibGlzaERlbGF5TXMgLyAxMDAwfXMgZm9yIGNvbmZpZ3VyYXRpb24gcHJvcGFnYXRpb24uLi5gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBfdGVzdGFibGUuc2xlZXAoY2ZnLl9wcmVQdWJsaXNoRGVsYXlNcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHB1Ymxpc2hSZXNwb25zZSA9IGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBQdWJsaXNoVmVyc2lvbkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiBgU25hcFN0YXJ0IGVuYWJsZWQgLSAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX0gKGF0dGVtcHQgJHtwdWJsaXNoQXR0ZW1wdH0pYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHZlcnNpb24gPSBwdWJsaXNoUmVzcG9uc2UuVmVyc2lvbiE7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgUHVibGlzaGVkIHZlcnNpb246ICR7dmVyc2lvbn1gKTtcblxuICAgICAgICAgICAgLy8gU3RlcCA0OiBXYWl0IGZvciBzbmFwc2hvdCBvcHRpbWl6YXRpb24gYW5kIHZlcmlmeSBzdGF0dXNcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbTGFtYmRhIEthdGFdICAgUHJlcGFyaW5nIHByZS1pbml0aWFsaXplZCBydW50aW1lIGltYWdlLi4uJyk7XG4gICAgICAgICAgICBzdGF0ZSA9ICdVbmtub3duJztcblxuICAgICAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbkNvbmZpZyA9IGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBHZXRGdW5jdGlvbkNvbmZpZ3VyYXRpb25Db21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIFF1YWxpZmllcjogdmVyc2lvbixcbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzbmFwU3RhcnRTdGF0dXMgPSB2ZXJzaW9uQ29uZmlnLlNuYXBTdGFydCA/PyB7fTtcbiAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25TdGF0dXMgPSBzbmFwU3RhcnRTdGF0dXMuT3B0aW1pemF0aW9uU3RhdHVzID8/ICdVbmtub3duJztcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHZlcnNpb25Db25maWcuU3RhdGUgPz8gJ1Vua25vd24nO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAnQWN0aXZlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnICAgICAgU25hcFN0YXJ0IHNuYXBzaG90IHJlYWR5IScpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgT3B0aW1pemF0aW9uU3RhdHVzOiAke29wdGltaXphdGlvblN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIFN0YXRlOiAke3N0YXRlfWApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnRmFpbGVkJykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0RmFpbFJlYXNvbiA9IHZlcnNpb25Db25maWcuU3RhdGVSZWFzb24gPz8gJ1Vua25vd24nO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgU25hcHNob3QgY3JlYXRpb24gZmFpbGVkOiAke2xhc3RGYWlsUmVhc29ufWApO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgU25hcHNob3QgY3JlYXRpb24gZmFpbGVkOiAke3ZlcnNpb25Db25maWcuU3RhdGVSZWFzb25Db2RlfWApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHByb2dyZXNzIGV2ZXJ5IDEwIGF0dGVtcHRzIG9yIGZpcnN0IDVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgJSAxMCA9PT0gMCB8fCBhdHRlbXB0IDwgNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IGF0dGVtcHQgKiBjZmcucG9sbGluZ0ludGVydmFsU2Vjb25kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBDcmVhdGluZyBzbmFwc2hvdC4uLiBTdGF0dXM6ICR7b3B0aW1pemF0aW9uU3RhdHVzfSwgU3RhdGU6ICR7c3RhdGV9ICgke2VsYXBzZWR9cyBlbGFwc2VkKWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgX3Rlc3RhYmxlLnNsZWVwKGNmZy5wb2xsaW5nSW50ZXJ2YWxTZWNvbmRzICogMTAwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHNuYXBzaG90IHN1Y2NlZWRlZCwgYnJlYWsgb3V0IG9mIHJldHJ5IGxvb3BcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ0FjdGl2ZScpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSByZXRyeSBvbiBGYWlsZWQgc3RhdGUgXHUyMDE0IHRpbWVvdXQgKFBlbmRpbmcpIHNob3VsZCBub3QgcmV0cnlcbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gJ0ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgZmFpbGVkIGFuZCB3ZSBoYXZlIHJldHJpZXMgbGVmdCwgbG9nIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgaWYgKHB1Ymxpc2hBdHRlbXB0IDwgTUFYX1BVQkxJU0hfUkVUUklFUykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBTbmFwc2hvdCBmYWlsZWQgb24gYXR0ZW1wdCAke3B1Ymxpc2hBdHRlbXB0fSwgd2lsbCByZXRyeSB3aXRoIG5ldyB2ZXJzaW9uLi4uYCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIFJlYXNvbjogJHtsYXN0RmFpbFJlYXNvbn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFmdGVyIGFsbCByZXRyaWVzLCBjaGVjayBmaW5hbCBzdGF0ZVxuICAgICAgICBpZiAoc3RhdGUgPT09ICdGYWlsZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgQWxsICR7TUFYX1BVQkxJU0hfUkVUUklFU30gc25hcHNob3QgYXR0ZW1wdHMgZmFpbGVkLmApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIFJlYXNvbjogJHtsYXN0RmFpbFJlYXNvbn1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgICAgICBbTGFtYmRhIEthdGFdIFNuYXBTdGFydCBvcHRpbWl6YXRpb24gZmFpbGVkLiBDYW5ub3QgY3JlYXRlIGFsaWFzIG9uIEZhaWxlZCB2ZXJzaW9uLicpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyAgICAgIFJldmlldyBDbG91ZFdhdGNoIGxvZ3MgZm9yIGluaXRpYWxpemF0aW9uIGVycm9ycy4nKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgICAgICBDb21tb24gY2F1c2VzOiBtaXNzaW5nIExhbWJkYSBsYXllcnMsIGltcG9ydCBlcnJvcnMsIG9yIHJ1bnRpbWUgaXNzdWVzLicpO1xuXG4gICAgICAgICAgICAvLyBDYW5ub3QgY3JlYXRlIGFsaWFzIG9uIEZhaWxlZCB2ZXJzaW9uIC0gQVdTIExhbWJkYSByZWplY3RzIHRoaXMgb3BlcmF0aW9uLlxuICAgICAgICAgICAgLy8gVGhyb3cgZXJyb3IgdG8gc2lnbmFsIHRoZSBmYWlsdXJlIGNsZWFybHkuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFNuYXBTdGFydCBhY3RpdmF0aW9uIGZhaWxlZDogQWxsICR7TUFYX1BVQkxJU0hfUkVUUklFU30gc25hcHNob3QgYXR0ZW1wdHMgZmFpbGVkLiBgICtcbiAgICAgICAgICAgICAgICBgUmVhc29uOiAke2xhc3RGYWlsUmVhc29ufS4gYCArXG4gICAgICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgYWxpYXMgb24gYSBGYWlsZWQgdmVyc2lvbi4gYCArXG4gICAgICAgICAgICAgICAgYENoZWNrIENsb3VkV2F0Y2ggbG9ncyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbiB0byBkaWFnbm9zZSBpbml0aWFsaXphdGlvbiBlcnJvcnMuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIHRpbWVkIG91dFxuICAgICAgICBpZiAoc3RhdGUgIT09ICdBY3RpdmUnICYmIHN0YXRlICE9PSAnRmFpbGVkJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIFdhcm5pbmc6IFNuYXBzaG90IGNyZWF0aW9uIHRpbWVvdXQgYWZ0ZXIgJHtjZmcuc25hcHNob3RUaW1lb3V0U2Vjb25kc31zYCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgICAgRmluYWwgc3RhdHVzOiBPcHRpbWl6YXRpb25TdGF0dXM9JHtvcHRpbWl6YXRpb25TdGF0dXN9LCBTdGF0ZT0ke3N0YXRlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCA1OiBDcmVhdGUgb3IgdXBkYXRlIGFsaWFzIChvbmx5IGlmIHZlcnNpb24gaXMgQWN0aXZlIG9yIFBlbmRpbmcpXG4gICAgICAgIC8vIE5vdGU6IEFXUyBMYW1iZGEgZG9lcyBub3QgYWxsb3cgY3JlYXRpbmcgYWxpYXNlcyBvbiBGYWlsZWQgdmVyc2lvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtMYW1iZGEgS2F0YV0gIENyZWF0aW5nL3VwZGF0aW5nIGFsaWFzICcke2NmZy5hbGlhc05hbWV9JyAtPiB2ZXJzaW9uICR7dmVyc2lvbn0uLi5gKTtcbiAgICAgICAgbGV0IGFsaWFzQXJuOiBzdHJpbmc7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgZXhpc3RpbmcgYWxpYXNcbiAgICAgICAgICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBHZXRBbGlhc0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgIE5hbWU6IGNmZy5hbGlhc05hbWUsXG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIC8vIEFsaWFzIGV4aXN0cywgdXBkYXRlIGl0XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVSZXNwb25zZSA9IGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBVcGRhdGVBbGlhc0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgIE5hbWU6IGNmZy5hbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgRnVuY3Rpb25WZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiAnTGFtYmRhIEthdGEgU25hcFN0YXJ0LWVuYWJsZWQgdmVyc2lvbicsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBhbGlhc0FybiA9IHVwZGF0ZVJlc3BvbnNlLkFsaWFzQXJuITtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgICBVcGRhdGVkIGV4aXN0aW5nIGFsaWFzOiAke2FsaWFzQXJufWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgYnkgZXJyb3IgbmFtZSBmb3IgYmV0dGVyIHRlc3RhYmlsaXR5XG4gICAgICAgICAgICBjb25zdCBpc1Jlc291cmNlTm90Rm91bmQgPSBlcnJvciBpbnN0YW5jZW9mIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgICAgICAgICAgICAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbicpO1xuXG4gICAgICAgICAgICBpZiAoaXNSZXNvdXJjZU5vdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxpYXMgZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlUmVzcG9uc2UgPSBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgQ3JlYXRlQWxpYXNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIE5hbWU6IGNmZy5hbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdMYW1iZGEgS2F0YSBTbmFwU3RhcnQtZW5hYmxlZCB2ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgYWxpYXNBcm4gPSBjcmVhdGVSZXNwb25zZS5BbGlhc0FybiE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCAgICAgIENyZWF0ZWQgbmV3IGFsaWFzOiAke2FsaWFzQXJufWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdcXG4nICsgJz0nLnJlcGVhdCg2MCkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnU05BUFNUQVJUIEFDVElWQVRJT04gQ09NUExFVEUnKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg2MCkpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW0xhbWJkYSBLYXRhXSBWZXJzaW9uOiAke3ZlcnNpb259YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbTGFtYmRhIEthdGFdIEFsaWFzOiAke2NmZy5hbGlhc05hbWV9IHwgJHthbGlhc0Fybn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtMYW1iZGEgS2F0YV0gT3B0aW1pemF0aW9uU3RhdHVzOiAke29wdGltaXphdGlvblN0YXR1c31gKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIGFsaWFzTmFtZTogY2ZnLmFsaWFzTmFtZSxcbiAgICAgICAgICAgIGFsaWFzQXJuLFxuICAgICAgICAgICAgb3B0aW1pemF0aW9uU3RhdHVzLFxuICAgICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIENhdGNoIEFjY2Vzc0RlbmllZEV4Y2VwdGlvbiBmcm9tIGFueSBMYW1iZGEgQVBJIGNhbGwgKHNlbmQgY2FsbHMpXG4gICAgICAgIC8vIHRoYXQgaXNuJ3QgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSB3YWl0ZXIgdHJ5LWNhdGNoIGJsb2Nrc1xuICAgICAgICBpZiAoaXNBY2Nlc3NEZW5pZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgSW5zdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGFjdGl2YXRlIFNuYXBTdGFydCBvbiAnJHtmdW5jdGlvbk5hbWV9Jy4gYCArXG4gICAgICAgICAgICAgICAgYEVuc3VyZSB0aGUgZXhlY3V0aW9uIHJvbGUgaGFzIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnM6ICR7UkVRVUlSRURfUEVSTUlTU0lPTlMuam9pbignLCAnKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cblxuLyoqXG4gKiBMYW1iZGEgaGFuZGxlciBmb3IgQ2xvdWRGb3JtYXRpb24gQ3VzdG9tIFJlc291cmNlLlxuICpcbiAqIFRoaXMgaGFuZGxlciBpcyBpbnZva2VkIGJ5IENsb3VkRm9ybWF0aW9uIHdoZW4gdGhlIGN1c3RvbSByZXNvdXJjZVxuICogaXMgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEN1c3RvbVJlc291cmNlRXZlbnQpOiBQcm9taXNlPEN1c3RvbVJlc291cmNlUmVzcG9uc2U+IHtcbiAgICBjb25zb2xlLmxvZygnW0xhbWJkYSBLYXRhXSBDdXN0b20gUmVzb3VyY2UgRXZlbnQ6JywgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcblxuICAgIGNvbnN0IHsgUmVxdWVzdFR5cGUsIFN0YWNrSWQsIFJlcXVlc3RJZCwgTG9naWNhbFJlc291cmNlSWQsIFJlc291cmNlUHJvcGVydGllcyB9ID0gZXZlbnQ7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gUmVzb3VyY2VQcm9wZXJ0aWVzLkZ1bmN0aW9uTmFtZTtcbiAgICBjb25zdCBhbGlhc05hbWUgPSBSZXNvdXJjZVByb3BlcnRpZXMuQWxpYXNOYW1lID8/ICdrYXRhJztcblxuICAgIC8vIFBoeXNpY2FsIHJlc291cmNlIElEIGZvcm1hdDoge2Z1bmN0aW9uTmFtZX06c25hcHN0YXJ0OnthbGlhc05hbWV9XG4gICAgY29uc3QgcGh5c2ljYWxSZXNvdXJjZUlkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkID8/IGAke2Z1bmN0aW9uTmFtZX06c25hcHN0YXJ0OiR7YWxpYXNOYW1lfWA7XG5cbiAgICBjb25zdCBiYXNlUmVzcG9uc2U6IE9taXQ8Q3VzdG9tUmVzb3VyY2VSZXNwb25zZSwgJ1N0YXR1cycgfCAnUmVhc29uJyB8ICdEYXRhJz4gPSB7XG4gICAgICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcGh5c2ljYWxSZXNvdXJjZUlkLFxuICAgICAgICBTdGFja0lkLFxuICAgICAgICBSZXF1ZXN0SWQsXG4gICAgICAgIExvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoUmVxdWVzdFR5cGUgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICAvLyBPbiBkZWxldGUsIHdlIGRvbid0IHJlbW92ZSBTbmFwU3RhcnQgb3IgdGhlIGFsaWFzXG4gICAgICAgICAgICAvLyBUaGUgTGFtYmRhIGZ1bmN0aW9uIGl0c2VsZiB3aWxsIGJlIGRlbGV0ZWQgYnkgQ2xvdWRGb3JtYXRpb25cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgcmVxdWVzdCAtIG5vIGFjdGlvbiBuZWVkZWQgKExhbWJkYSB3aWxsIGJlIGRlbGV0ZWQgYnkgQ2xvdWRGb3JtYXRpb24pJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgICAgICAgICAgICBTdGF0dXM6ICdTVUNDRVNTJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgb3IgVXBkYXRlIC0gYWN0aXZhdGUgU25hcFN0YXJ0XG4gICAgICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoe30pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGl2YXRlU25hcFN0YXJ0KGxhbWJkYUNsaWVudCwgZnVuY3Rpb25OYW1lLCB7IGFsaWFzTmFtZSB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgICAgICAgU3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICAgICAgICBEYXRhOiB7XG4gICAgICAgICAgICAgICAgVmVyc2lvbjogcmVzdWx0LnZlcnNpb24sXG4gICAgICAgICAgICAgICAgQWxpYXNOYW1lOiByZXN1bHQuYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgIEFsaWFzQXJuOiByZXN1bHQuYWxpYXNBcm4sXG4gICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uU3RhdHVzOiByZXN1bHQub3B0aW1pemF0aW9uU3RhdHVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tMYW1iZGEgS2F0YV0gT3B0aW1pemF0aW9uIGVycm9yOicsIGVycm9yTWVzc2FnZSk7XG5cbiAgICAgICAgLy8gT24gVXBkYXRlIHJlcXVlc3RzLCByZXR1cm4gU1VDQ0VTUyBldmVuIG9uIGZhaWx1cmUgdG8gcHJldmVudFxuICAgICAgICAvLyBDbG91ZEZvcm1hdGlvbiByb2xsYmFjayBmcm9tIGdldHRpbmcgc3R1Y2sgaW4gVVBEQVRFX1JPTExCQUNLX0ZBSUxFRC5cbiAgICAgICAgLy8gUmV0dXJuaW5nIEZBSUxFRCBmcm9tIGFuIFVwZGF0ZSBkdXJpbmcgcm9sbGJhY2sgYmxvY2tzIHRoZSBlbnRpcmUgc3RhY2suXG4gICAgICAgIC8vIFRoZSBmdW5jdGlvbiByZW1haW5zIG9wZXJhdGlvbmFsIHdpdGggaXRzIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgIGlmIChSZXF1ZXN0VHlwZSA9PT0gJ1VwZGF0ZScpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdSZXR1cm5pbmcgU1VDQ0VTUyBmb3IgVXBkYXRlIHJlcXVlc3QgdG8gcHJldmVudCByb2xsYmFjayBkZWFkbG9jay4nKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdUaGUgZnVuY3Rpb24gd2lsbCBjb250aW51ZSB3aXRoIGl0cyBwcmV2aW91cyBTbmFwU3RhcnQgY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIFN0YXR1czogJ1NVQ0NFU1MnLFxuICAgICAgICAgICAgICAgIFJlYXNvbjogYFNuYXBTdGFydCBhY3RpdmF0aW9uIGZhaWxlZCAobm9uLWJsb2NraW5nKTogJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgICAgICAgU3RhdHVzOiAnRkFJTEVEJyxcbiAgICAgICAgICAgIFJlYXNvbjogYFNuYXBTdGFydCBhY3RpdmF0aW9uIGZhaWxlZDogJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAieWFBQUEsSUFBQUEsRUFBQSxHQUFBQyxFQUFBRCxFQUFBLGVBQUFFLEVBQUEsc0JBQUFDLEVBQUEsWUFBQUMsSUFBQSxlQUFBQyxFQUFBTCxHQThCQSxJQUFBTSxFQVdPLGtDQXlHREMsRUFBc0IsRUFNdEJDLEVBQWlCLEtBT2pCQyxFQUF1QixJQUV2QkMsRUFBcUQsQ0FDdkQsdUJBQXdCLElBQ3hCLHVCQUF3QixFQUN4QixVQUFXLE9BQ1gsbUJBQW9CRCxF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QmUsRUFBY0MsRUFBYyxDQUFFLFVBQUFtQixDQUFVLENBQUMsRUFFaEYsTUFBTyxDQUNILEdBQUdDLEVBQ0gsT0FBUSxVQUNSLEtBQU0sQ0FDRixRQUFTQyxFQUFPLFFBQ2hCLFVBQVdBLEVBQU8sVUFDbEIsU0FBVUEsRUFBTyxTQUNqQixtQkFBb0JBLEVBQU8sa0JBQy9CLENBQ0osQ0FDSixPQUFTMUIsRUFBTyxDQUNaLElBQU0yQixFQUFlM0IsYUFBaUIsTUFBUUEsRUFBTSxRQUFVLE9BQU9BLENBQUssRUFPMUUsT0FOQSxRQUFRLE1BQU0sb0NBQXFDMkIsQ0FBWSxFQU0zRFIsSUFBZ0IsU0FHVCxDQUNILEdBQUdNLEVBQ0gsT0FBUSxVQUNSLE9BQVEsK0NBQStDRSxDQUFZLEVBQ3ZFLEVBR0csQ0FDSCxHQUFHRixFQUNILE9BQVEsU0FDUixPQUFRLGdDQUFnQ0UsQ0FBWSxFQUN4RCxDQUNKLENBQ0oiLAogICJuYW1lcyI6IFsic25hcHN0YXJ0X2FjdGl2YXRvcl9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIl90ZXN0YWJsZSIsICJhY3RpdmF0ZVNuYXBTdGFydCIsICJoYW5kbGVyIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfY2xpZW50X2xhbWJkYSIsICJNQVhfUFVCTElTSF9SRVRSSUVTIiwgIlJFVFJZX0RFTEFZX01TIiwgIlBSRV9QVUJMSVNIX0RFTEFZX01TIiwgIkRFRkFVTFRfQ09ORklHIiwgIm1zIiwgInJlc29sdmUiLCAiaXNSZXNvdXJjZU5vdEZvdW5kRXJyb3IiLCAiZXJyb3IiLCAiY2F1c2UiLCAiUkVRVUlSRURfUEVSTUlTU0lPTlMiLCAiaXNBY2Nlc3NEZW5pZWRFcnJvciIsICJsYW1iZGFDbGllbnQiLCAiZnVuY3Rpb25OYW1lIiwgImNvbmZpZyIsICJjZmciLCAibWF4QXR0ZW1wdHMiLCAidmVyc2lvbiIsICJvcHRpbWl6YXRpb25TdGF0dXMiLCAic3RhdGUiLCAibGFzdEZhaWxSZWFzb24iLCAicHVibGlzaEF0dGVtcHQiLCAiYXR0ZW1wdCIsICJ2ZXJzaW9uQ29uZmlnIiwgImVsYXBzZWQiLCAiYWxpYXNBcm4iLCAiZXZlbnQiLCAiUmVxdWVzdFR5cGUiLCAiU3RhY2tJZCIsICJSZXF1ZXN0SWQiLCAiTG9naWNhbFJlc291cmNlSWQiLCAiUmVzb3VyY2VQcm9wZXJ0aWVzIiwgImFsaWFzTmFtZSIsICJiYXNlUmVzcG9uc2UiLCAicmVzdWx0IiwgImVycm9yTWVzc2FnZSJdCn0K
|
package/out/tsc/src/index.d.ts
CHANGED
|
@@ -18,11 +18,9 @@
|
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
20
|
export { KataProps, LicensingResponse, TransformationConfig } from './types';
|
|
21
|
-
export { LicensingService, LicenseCheckParams, HttpLicensingService, createLicensingService, isValidAccountId, } from './licensing';
|
|
22
|
-
export { MockLicensingService, createMockLicensingService, } from './mock-licensing';
|
|
23
21
|
export { resolveAccountId, resolveAccountIdWithSource, isValidAccountIdFormat, AccountResolutionError, AccountResolutionResult, AccountResolverOptions, } from './account-resolver';
|
|
24
22
|
export { resolveAccountIdSync, resolveAccountIdSyncWithSource, resolveRegionSync, SyncAccountResolutionError, SyncAccountResolutionResult, SyncAccountResolverOptions, } from './sync-account-resolver';
|
|
25
|
-
export { kata,
|
|
23
|
+
export { kata, applyTransformation, handleUnlicensed, isKataTransformed, getKataPromise, extractBundlePathFromHandler, extractNodeVersion, KataWrapperOptions, KataResult, } from './kata-wrapper';
|
|
26
24
|
export { SnapStartActivator, SnapStartActivatorProps, } from './snapstart-construct';
|
|
27
25
|
export { activateSnapStart, SnapStartActivationResult, SnapStartActivatorConfig, } from './snapstart-activator';
|
|
28
26
|
export { createKataConfigLayer, generateConfigContent, KataConfigLayerProps, CONFIG_DIR_NAME, CONFIG_FILE_NAME, HANDLER_CONFIG_KEY, } from './config-layer';
|
|
@@ -1,24 +1,10 @@
|
|
|
1
1
|
import { Function as LambdaFunction } from 'aws-cdk-lib/aws-lambda';
|
|
2
2
|
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
3
3
|
import { KataProps, LicensingResponse, TransformationConfig } from './types';
|
|
4
|
-
import { LicensingService } from './licensing';
|
|
5
|
-
import { LicensingService as NativeLicensingServiceInterface } from '@lambda-kata/licensing';
|
|
6
4
|
/**
|
|
7
5
|
* Options for the kata wrapper, extending KataProps with internal options.
|
|
8
6
|
*/
|
|
9
7
|
export interface KataWrapperOptions extends KataProps {
|
|
10
|
-
/**
|
|
11
|
-
* Optional: Custom licensing service for testing.
|
|
12
|
-
* If not provided, the default HTTP licensing service will be used.
|
|
13
|
-
* @internal
|
|
14
|
-
*/
|
|
15
|
-
licensingService?: LicensingService;
|
|
16
|
-
/**
|
|
17
|
-
* Optional: Custom synchronous licensing service for testing.
|
|
18
|
-
* Must implement checkEntitlementSync(accountId: string): LicensingResponse
|
|
19
|
-
* @internal
|
|
20
|
-
*/
|
|
21
|
-
syncLicensingService?: NativeLicensingServiceInterface;
|
|
22
8
|
/**
|
|
23
9
|
* Custom bundle path.
|
|
24
10
|
* If not specified, uses the default /opt/js_runtime/bundle.js
|
|
@@ -133,6 +119,8 @@ export declare function kata<T extends NodejsFunction | LambdaFunction>(lambda:
|
|
|
133
119
|
* @param props - Optional configuration for the transformation
|
|
134
120
|
* @returns Promise resolving to the transformation result
|
|
135
121
|
*
|
|
122
|
+
* @deprecated
|
|
123
|
+
*
|
|
136
124
|
* @internal
|
|
137
125
|
*/
|
|
138
126
|
export declare function kataWithAccountId<T extends NodejsFunction | LambdaFunction>(lambda: T, accountId: string, region: string, props?: KataWrapperOptions): Promise<KataResult>;
|
|
@@ -224,7 +212,7 @@ export declare function applyTransformation(lambda: NodejsFunction | LambdaFunct
|
|
|
224
212
|
*
|
|
225
213
|
* @internal
|
|
226
214
|
*/
|
|
227
|
-
export declare function handleUnlicensed(lambda: NodejsFunction | LambdaFunction, props:
|
|
215
|
+
export declare function handleUnlicensed(lambda: NodejsFunction | LambdaFunction, props: KataProps | undefined, licensingResponse: LicensingResponse): void;
|
|
228
216
|
/**
|
|
229
217
|
* Checks if a Lambda function has been transformed by kata().
|
|
230
218
|
*
|
package/out/tsc/src/types.d.ts
CHANGED
|
@@ -12,16 +12,10 @@ import { Runtime } from 'aws-cdk-lib/aws-lambda';
|
|
|
12
12
|
* ```typescript
|
|
13
13
|
* kata(myFunction, {
|
|
14
14
|
* unlicensedBehavior: 'fail',
|
|
15
|
-
* licensingEndpoint: 'https://custom-endpoint.example.com'
|
|
16
15
|
* });
|
|
17
16
|
* ```
|
|
18
17
|
*/
|
|
19
18
|
export interface KataProps {
|
|
20
|
-
/**
|
|
21
|
-
* Optional: Override the licensing service endpoint
|
|
22
|
-
* Default: Lambda Kata production licensing endpoint
|
|
23
|
-
*/
|
|
24
|
-
licensingEndpoint?: string;
|
|
25
19
|
/**
|
|
26
20
|
* Optional: Behavior when account is not licensed
|
|
27
21
|
* 'warn' - Keep original Lambda, emit warning (default)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lambda-kata/cdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "AWS CDK integration for Lambda Kata - Node.js Lambdas running via Lambda Kata runtime",
|
|
5
5
|
"main": "out/dist/index.js",
|
|
6
6
|
"types": "out/tsc/src/index.d.ts",
|
|
@@ -84,4 +84,4 @@
|
|
|
84
84
|
"optional": true
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
}
|
|
87
|
+
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Licensing Service for Lambda Kata CDK Integration
|
|
3
|
-
*
|
|
4
|
-
* This module provides the interface and implementation for validating
|
|
5
|
-
* AWS Marketplace entitlements at CDK synthesis/deploy time.
|
|
6
|
-
*
|
|
7
|
-
* @module licensing
|
|
8
|
-
*/
|
|
9
|
-
import { LicensingResponse } from './types';
|
|
10
|
-
/**
|
|
11
|
-
* Supported Node.js versions for licensing requests.
|
|
12
|
-
* Valid values: "18", "20", "22", "24"
|
|
13
|
-
*/
|
|
14
|
-
export type NodeVersion = '18' | '20' | '22' | '24';
|
|
15
|
-
/**
|
|
16
|
-
* Supported architectures for licensing requests.
|
|
17
|
-
* Valid values: "x86_64", "arm64"
|
|
18
|
-
*/
|
|
19
|
-
export type LicenseArchitecture = 'x86_64' | 'arm64';
|
|
20
|
-
/**
|
|
21
|
-
* Parameters for license entitlement check.
|
|
22
|
-
*/
|
|
23
|
-
export interface LicenseCheckParams {
|
|
24
|
-
/**
|
|
25
|
-
* AWS account ID (12-digit string)
|
|
26
|
-
*/
|
|
27
|
-
accountId: string;
|
|
28
|
-
/**
|
|
29
|
-
* Node.js version number.
|
|
30
|
-
* Valid values: "18", "20", "22", "24"
|
|
31
|
-
* @default "20"
|
|
32
|
-
*/
|
|
33
|
-
nodeVersion?: NodeVersion;
|
|
34
|
-
/**
|
|
35
|
-
* Lambda architecture.
|
|
36
|
-
* Valid values: "x86_64", "arm64"
|
|
37
|
-
* @default "x86_64"
|
|
38
|
-
*/
|
|
39
|
-
architecture?: LicenseArchitecture;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Interface for the Lambda Kata licensing service.
|
|
43
|
-
*
|
|
44
|
-
* Implementations of this interface are responsible for validating
|
|
45
|
-
* AWS account entitlements and returning customer-specific Layer ARNs.
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```typescript
|
|
49
|
-
* const licensingService = new HttpLicensingService();
|
|
50
|
-
* const response = await licensingService.checkEntitlement({
|
|
51
|
-
* accountId: '123456789012',
|
|
52
|
-
* nodeVersion: '20',
|
|
53
|
-
* architecture: 'x86_64'
|
|
54
|
-
* });
|
|
55
|
-
* if (response.entitled) {
|
|
56
|
-
* console.log(`Layer ARN: ${response.layerVersionArn}`);
|
|
57
|
-
* }
|
|
58
|
-
* ```
|
|
59
|
-
*/
|
|
60
|
-
export interface LicensingService {
|
|
61
|
-
/**
|
|
62
|
-
* Check if an AWS account is entitled to use Lambda Kata.
|
|
63
|
-
*
|
|
64
|
-
* @param params - License check parameters (accountId, nodeVersion, architecture)
|
|
65
|
-
* For backward compatibility, can also be just accountId string
|
|
66
|
-
* @returns Promise resolving to entitlement status and Layer ARN if entitled
|
|
67
|
-
*
|
|
68
|
-
* @remarks
|
|
69
|
-
* - If the account is entitled, the response will include the customer-specific Layer ARN
|
|
70
|
-
* - If the account is not entitled, the response will have `entitled: false`
|
|
71
|
-
* - Network errors are handled gracefully and treated as unlicensed (Requirement 6.5)
|
|
72
|
-
*/
|
|
73
|
-
checkEntitlement(params: LicenseCheckParams | string): Promise<LicensingResponse>;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* HTTP-based implementation of the LicensingService interface.
|
|
77
|
-
*
|
|
78
|
-
* This implementation calls the Lambda Kata licensing backend to validate
|
|
79
|
-
* AWS Marketplace entitlements. Network errors are handled gracefully
|
|
80
|
-
* by treating unreachable services as unlicensed (per Requirement 6.5).
|
|
81
|
-
*
|
|
82
|
-
* @example
|
|
83
|
-
* ```typescript
|
|
84
|
-
* // Use default endpoint
|
|
85
|
-
* const service = new HttpLicensingService();
|
|
86
|
-
*
|
|
87
|
-
* // Use custom endpoint
|
|
88
|
-
* const customService = new HttpLicensingService('https://custom.endpoint.com');
|
|
89
|
-
* ```
|
|
90
|
-
*/
|
|
91
|
-
export declare class HttpLicensingService implements LicensingService {
|
|
92
|
-
private readonly endpoint;
|
|
93
|
-
private readonly timeoutMs;
|
|
94
|
-
/**
|
|
95
|
-
* Creates a new HttpLicensingService instance.
|
|
96
|
-
*
|
|
97
|
-
* @param endpoint - Optional custom licensing endpoint URL
|
|
98
|
-
* @param timeoutMs - Optional request timeout in milliseconds (default: 5000)
|
|
99
|
-
*/
|
|
100
|
-
constructor(endpoint?: string, timeoutMs?: number);
|
|
101
|
-
/**
|
|
102
|
-
* Check if an AWS account is entitled to use Lambda Kata.
|
|
103
|
-
*
|
|
104
|
-
* Makes an HTTP request to the licensing service to validate the account's
|
|
105
|
-
* AWS Marketplace entitlement. If the service is unreachable or returns
|
|
106
|
-
* an error, the account is treated as unlicensed (Requirement 6.5).
|
|
107
|
-
*
|
|
108
|
-
* @param params - License check parameters or accountId string for backward compatibility
|
|
109
|
-
* @returns Promise resolving to entitlement status and Layer ARN if entitled
|
|
110
|
-
*
|
|
111
|
-
* @remarks
|
|
112
|
-
* Validates: Requirements 3.2, 3.3, 6.5
|
|
113
|
-
* - 3.2: Calls the Licensing_Service to validate the account's entitlement
|
|
114
|
-
* - 3.3: Returns the customer-specific Layer_ARN if entitled
|
|
115
|
-
* - 6.5: Treats unreachable service as unlicensed with appropriate warning
|
|
116
|
-
*/
|
|
117
|
-
checkEntitlement(params: LicenseCheckParams | string): Promise<LicensingResponse>;
|
|
118
|
-
/**
|
|
119
|
-
* Makes the HTTP request to the licensing service.
|
|
120
|
-
*
|
|
121
|
-
* @param accountId - The AWS account ID to check
|
|
122
|
-
* @param nodeVersion - Optional Node.js version (defaults to "20")
|
|
123
|
-
* @param architecture - Optional architecture (defaults to "x86_64")
|
|
124
|
-
* @returns Promise resolving to the licensing response
|
|
125
|
-
* @throws Error if the request fails or times out
|
|
126
|
-
*/
|
|
127
|
-
private makeRequest;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Validates that an AWS account ID is in the correct format.
|
|
131
|
-
*
|
|
132
|
-
* @param accountId - The account ID to validate
|
|
133
|
-
* @returns true if the account ID is a valid 12-digit string
|
|
134
|
-
*/
|
|
135
|
-
export declare function isValidAccountId(accountId: string): boolean;
|
|
136
|
-
/**
|
|
137
|
-
* Creates a default LicensingService instance.
|
|
138
|
-
*
|
|
139
|
-
* This factory function provides a convenient way to create a licensing
|
|
140
|
-
* service with default configuration.
|
|
141
|
-
*
|
|
142
|
-
* @param endpoint - Optional custom licensing endpoint URL
|
|
143
|
-
* @returns A new LicensingService instance
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* ```typescript
|
|
147
|
-
* const service = createLicensingService();
|
|
148
|
-
* const response = await service.checkEntitlement('123456789012');
|
|
149
|
-
* ```
|
|
150
|
-
*/
|
|
151
|
-
export declare function createLicensingService(endpoint?: string): LicensingService;
|