UNPKG

cdk-athena-log

Version:

A CDK construct to create an Athena table for querying ALB logs.

94 lines 16.8 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AthenaTableForCloudFront = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs_1 = require("constructs"); /** * Creates a Glue table for querying Parquet-formatted, partitioned CloudFront logs. * NOTE: This construct assumes an ETL process converts raw CloudFront logs into * a partitioned Parquet format in S3. */ class AthenaTableForCloudFront extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); const { logBucketName, databaseName, tableName, projectionStartDate, logPrefix } = props; const stack = aws_cdk_lib_1.Stack.of(this); const s3LocationPrefix = logPrefix ? `${logPrefix}/` : ''; const s3LocationTemplate = `s3://${logBucketName}/${s3LocationPrefix}year=\${year}/month=\${month}/day=\${day}/`; const s3BaseLocation = `s3://${logBucketName}/${s3LocationPrefix}`; this.table = new aws_cdk_lib_1.aws_glue.CfnTable(this, 'Default', { catalogId: stack.account, databaseName: databaseName, tableInput: { name: tableName, description: 'Table for partitioned, Parquet-formatted CloudFront logs', tableType: 'EXTERNAL_TABLE', parameters: { 'projection.enabled': 'true', 'projection.year.type': 'integer', 'projection.year.range': projectionStartDate.substring(0, 4) + ',2200', 'projection.month.type': 'integer', 'projection.month.range': '01,12', 'projection.day.type': 'integer', 'projection.day.range': '01,31', 'storage.location.template': s3LocationTemplate, }, partitionKeys: [ { name: 'year', type: 'integer' }, { name: 'month', type: 'integer' }, { name: 'day', type: 'integer' }, ], storageDescriptor: { columns: [ { name: 'timestamp', type: 'timestamp' }, { name: 'c_ip', type: 'string' }, { name: 'time_to_first_byte', type: 'double' }, { name: 'sc_status', type: 'int' }, { name: 'sc_bytes', type: 'bigint' }, { name: 'cs_method', type: 'string' }, { name: 'cs_protocol', type: 'string' }, { name: 'cs_host', type: 'string' }, { name: 'cs_uri_stem', type: 'string' }, { name: 'cs_bytes', type: 'bigint' }, { name: 'x_edge_location', type: 'string' }, { name: 'x_edge_request_id', type: 'string' }, { name: 'x_host_header', type: 'string' }, { name: 'time_taken', type: 'double' }, { name: 'cs_protocol_version', type: 'string' }, { name: 'c_ip_version', type: 'string' }, { name: 'cs_user_agent', type: 'string' }, { name: 'cs_referer', type: 'string' }, { name: 'cs_cookie', type: 'string' }, { name: 'cs_uri_query', type: 'string' }, { name: 'x_edge_response_result_type', type: 'string' }, { name: 'x_forwarded_for', type: 'string' }, { name: 'ssl_protocol', type: 'string' }, { name: 'ssl_cipher', type: 'string' }, { name: 'x_edge_result_type', type: 'string' }, { name: 'fle_encrypted_fields', type: 'int' }, { name: 'fle_status', type: 'string' }, { name: 'sc_content_type', type: 'string' }, { name: 'sc_content_len', type: 'bigint' }, { name: 'sc_range_start', type: 'bigint' }, { name: 'sc_range_end', type: 'bigint' }, ], location: s3BaseLocation, inputFormat: 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat', outputFormat: 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat', serdeInfo: { serializationLibrary: 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe', parameters: { path: 'timestamp, c_ip, time_to_first_byte, sc_status, sc_bytes, cs_method, cs_protocol, cs_host, cs_uri_stem, cs_bytes, x_edge_location, x_edge_request_id, x_host_header, time_taken, cs_protocol_version, c_ip_version, cs_user_agent, cs_referer, cs_cookie, cs_uri_query, x_edge_response_result_type, x_forwarded_for, ssl_protocol, ssl_cipher, x_edge_result_type, fle_encrypted_fields, fle_status, sc_content_type, sc_content_len, sc_range_start, sc_range_end', }, }, }, }, }); } } exports.AthenaTableForCloudFront = AthenaTableForCloudFront; _a = JSII_RTTI_SYMBOL_1; AthenaTableForCloudFront[_a] = { fqn: "cdk-athena-log.AthenaTableForCloudFront", version: "0.0.14" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRoZW5hLXRhYmxlLWZvci1jbG91ZGZyb250LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2F0aGVuYS10YWJsZS1mb3ItY2xvdWRmcm9udC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFzRDtBQUN0RCwyQ0FBdUM7QUErQnZDOzs7O0dBSUc7QUFDSCxNQUFhLHdCQUF5QixTQUFRLHNCQUFTO0lBR3JELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0M7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRXpGLE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUQsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLGFBQWEsSUFBSSxnQkFBZ0IsNENBQTRDLENBQUM7UUFDakgsTUFBTSxjQUFjLEdBQUcsUUFBUSxhQUFhLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUVuRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksc0JBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUM5QyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDeEIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxTQUFTO2dCQUNmLFdBQVcsRUFBRSwwREFBMEQ7Z0JBQ3ZFLFNBQVMsRUFBRSxnQkFBZ0I7Z0JBQzNCLFVBQVUsRUFBRTtvQkFDVixvQkFBb0IsRUFBRSxNQUFNO29CQUM1QixzQkFBc0IsRUFBRSxTQUFT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QUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7d0JBQ3RDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7d0JBQzNDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7d0JBQzFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7d0JBQzFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO3FCQUN6QztvQkFDRCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsV0FBVyxFQUFFLCtEQUErRDtvQkFDNUUsWUFBWSxFQUFFLGdFQUFnRTtvQkFDOUUsU0FBUyxFQUFFO3dCQUNULG9CQUFvQixFQUFFLDZEQUE2RDt3QkFDbkYsVUFBVSxFQUFFOzRCQUNWLElBQUksRUFBRSxxY0FBcWM7eUJBQzVjO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQWpGSCw0REFrRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NfZ2x1ZSBhcyBnbHVlLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0aGVuYVRhYmxlRm9yQ2xvdWRGcm9udFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIHByb2Nlc3NlZCwgUGFycXVldC1mb3JtYXR0ZWQgQ2xvdWRGcm9udCBsb2dzIGFyZSBzdG9yZWQuXG4gICAqL1xuICByZWFkb25seSBsb2dCdWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBHbHVlIGRhdGFiYXNlIGZvciB0aGlzIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIGZvciB0aGUgR2x1ZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhcnQgZGF0ZSBmb3IgdGhlIHBhcnRpdGlvbiBwcm9qZWN0aW9uLCBpbiAnWVlZWS9NTS9ERCcgZm9ybWF0LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdGlvblN0YXJ0RGF0ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHdpdGhpbiB0aGUgUzMgYnVja2V0IHdoZXJlIHRoZSBwYXJ0aXRpb25lZCBQYXJxdWV0IGZpbGVzIGFyZSBsb2NhdGVkLlxuICAgKiBlLmcuLCBgczM6Ly95b3VyLWJ1Y2tldC9teS1wYXJxdWV0LXByZWZpeC95ZWFyPS4uLmBcbiAgICogQGRlZmF1bHQgTm8gcHJlZml4IGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBsb2dQcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIEdsdWUgdGFibGUgZm9yIHF1ZXJ5aW5nIFBhcnF1ZXQtZm9ybWF0dGVkLCBwYXJ0aXRpb25lZCBDbG91ZEZyb250IGxvZ3MuXG4gKiBOT1RFOiBUaGlzIGNvbnN0cnVjdCBhc3N1bWVzIGFuIEVUTCBwcm9jZXNzIGNvbnZlcnRzIHJhdyBDbG91ZEZyb250IGxvZ3MgaW50b1xuICogYSBwYXJ0aXRpb25lZCBQYXJxdWV0IGZvcm1hdCBpbiBTMy5cbiAqL1xuZXhwb3J0IGNsYXNzIEF0aGVuYVRhYmxlRm9yQ2xvdWRGcm9udCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSB0YWJsZTogZ2x1ZS5DZm5UYWJsZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXRoZW5hVGFibGVGb3JDbG91ZEZyb250UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgeyBsb2dCdWNrZXROYW1lLCBkYXRhYmFzZU5hbWUsIHRhYmxlTmFtZSwgcHJvamVjdGlvblN0YXJ0RGF0ZSwgbG9nUHJlZml4IH0gPSBwcm9wcztcblxuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgczNMb2NhdGlvblByZWZpeCA9IGxvZ1ByZWZpeCA/IGAke2xvZ1ByZWZpeH0vYCA6ICcnO1xuICAgIGNvbnN0IHMzTG9jYXRpb25UZW1wbGF0ZSA9IGBzMzovLyR7bG9nQnVja2V0TmFtZX0vJHtzM0xvY2F0aW9uUHJlZml4fXllYXI9XFwke3llYXJ9L21vbnRoPVxcJHttb250aH0vZGF5PVxcJHtkYXl9L2A7XG4gICAgY29uc3QgczNCYXNlTG9jYXRpb24gPSBgczM6Ly8ke2xvZ0J1Y2tldE5hbWV9LyR7czNMb2NhdGlvblByZWZpeH1gO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBnbHVlLkNmblRhYmxlKHRoaXMsICdEZWZhdWx0Jywge1xuICAgICAgY2F0YWxvZ0lkOiBzdGFjay5hY2NvdW50LFxuICAgICAgZGF0YWJhc2VOYW1lOiBkYXRhYmFzZU5hbWUsXG4gICAgICB0YWJsZUlucHV0OiB7XG4gICAgICAgIG5hbWU6IHRhYmxlTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUYWJsZSBmb3IgcGFydGl0aW9uZWQsIFBhcnF1ZXQtZm9ybWF0dGVkIENsb3VkRnJvbnQgbG9ncycsXG4gICAgICAgIHRhYmxlVHlwZTogJ0VYVEVSTkFMX1RBQkxFJyxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICdwcm9qZWN0aW9uLmVuYWJsZWQnOiAndHJ1ZScsXG4gICAgICAgICAgJ3Byb2plY3Rpb24ueWVhci50eXBlJzogJ2ludGVnZXInLFxuICAgICAgICAgICdwcm9qZWN0aW9uLnllYXIucmFuZ2UnOiBwcm9qZWN0aW9uU3RhcnREYXRlLnN1YnN0cmluZygwLCA0KSArICcsMjIwMCcsXG4gICAgICAgICAgJ3Byb2plY3Rpb24ubW9udGgudHlwZSc6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAncHJvamVjdGlvbi5tb250aC5yYW5nZSc6ICcwMSwxMicsXG4gICAgICAgICAgJ3Byb2plY3Rpb24uZGF5LnR5cGUnOiAnaW50ZWdlcicsXG4gICAgICAgICAgJ3Byb2plY3Rpb24uZGF5LnJhbmdlJzogJzAxLDMxJyxcbiAgICAgICAgICAnc3RvcmFnZS5sb2NhdGlvbi50ZW1wbGF0ZSc6IHMzTG9jYXRpb25UZW1wbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFydGl0aW9uS2V5czogW1xuICAgICAgICAgIHsgbmFtZTogJ3llYXInLCB0eXBlOiAnaW50ZWdlcicgfSxcbiAgICAgICAgICB7IG5hbWU6ICdtb250aCcsIHR5cGU6ICdpbnRlZ2VyJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ2RheScsIHR5cGU6ICdpbnRlZ2VyJyB9LFxuICAgICAgICBdLFxuICAgICAgICBzdG9yYWdlRGVzY3JpcHRvcjoge1xuICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ3RpbWVzdGFtcCcsIHR5cGU6ICd0aW1lc3RhbXAnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdjX2lwJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3RpbWVfdG9fZmlyc3RfYnl0ZScsIHR5cGU6ICdkb3VibGUnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdzY19zdGF0dXMnLCB0eXBlOiAnaW50JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnc2NfYnl0ZXMnLCB0eXBlOiAnYmlnaW50JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnY3NfbWV0aG9kJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NzX3Byb3RvY29sJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NzX2hvc3QnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnY3NfdXJpX3N0ZW0nLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnY3NfYnl0ZXMnLCB0eXBlOiAnYmlnaW50JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAneF9lZGdlX2xvY2F0aW9uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3hfZWRnZV9yZXF1ZXN0X2lkJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3hfaG9zdF9oZWFkZXInLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAndGltZV90YWtlbicsIHR5cGU6ICdkb3VibGUnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdjc19wcm90b2NvbF92ZXJzaW9uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NfaXBfdmVyc2lvbicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdjc191c2VyX2FnZW50JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NzX3JlZmVyZXInLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnY3NfY29va2llJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NzX3VyaV9xdWVyeScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICd4X2VkZ2VfcmVzcG9uc2VfcmVzdWx0X3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAneF9mb3J3YXJkZWRfZm9yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3NzbF9wcm90b2NvbCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdzc2xfY2lwaGVyJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3hfZWRnZV9yZXN1bHRfdHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdmbGVfZW5jcnlwdGVkX2ZpZWxkcycsIHR5cGU6ICdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdmbGVfc3RhdHVzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3NjX2NvbnRlbnRfdHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdzY19jb250ZW50X2xlbicsIHR5cGU6ICdiaWdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdzY19yYW5nZV9zdGFydCcsIHR5cGU6ICdiaWdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdzY19yYW5nZV9lbmQnLCB0eXBlOiAnYmlnaW50JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9jYXRpb246IHMzQmFzZUxvY2F0aW9uLFxuICAgICAgICAgIGlucHV0Rm9ybWF0OiAnb3JnLmFwYWNoZS5oYWRvb3AuaGl2ZS5xbC5pby5wYXJxdWV0Lk1hcHJlZFBhcnF1ZXRJbnB1dEZvcm1hdCcsXG4gICAgICAgICAgb3V0cHV0Rm9ybWF0OiAnb3JnLmFwYWNoZS5oYWRvb3AuaGl2ZS5xbC5pby5wYXJxdWV0Lk1hcHJlZFBhcnF1ZXRPdXRwdXRGb3JtYXQnLFxuICAgICAgICAgIHNlcmRlSW5mbzoge1xuICAgICAgICAgICAgc2VyaWFsaXphdGlvbkxpYnJhcnk6ICdvcmcuYXBhY2hlLmhhZG9vcC5oaXZlLnFsLmlvLnBhcnF1ZXQuc2VyZGUuUGFycXVldEhpdmVTZXJEZScsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd0aW1lc3RhbXAsIGNfaXAsIHRpbWVfdG9fZmlyc3RfYnl0ZSwgc2Nfc3RhdHVzLCBzY19ieXRlcywgY3NfbWV0aG9kLCBjc19wcm90b2NvbCwgY3NfaG9zdCwgY3NfdXJpX3N0ZW0sIGNzX2J5dGVzLCB4X2VkZ2VfbG9jYXRpb24sIHhfZWRnZV9yZXF1ZXN0X2lkLCB4X2hvc3RfaGVhZGVyLCB0aW1lX3Rha2VuLCBjc19wcm90b2NvbF92ZXJzaW9uLCBjX2lwX3ZlcnNpb24sIGNzX3VzZXJfYWdlbnQsIGNzX3JlZmVyZXIsIGNzX2Nvb2tpZSwgY3NfdXJpX3F1ZXJ5LCB4X2VkZ2VfcmVzcG9uc2VfcmVzdWx0X3R5cGUsIHhfZm9yd2FyZGVkX2Zvciwgc3NsX3Byb3RvY29sLCBzc2xfY2lwaGVyLCB4X2VkZ2VfcmVzdWx0X3R5cGUsIGZsZV9lbmNyeXB0ZWRfZmllbGRzLCBmbGVfc3RhdHVzLCBzY19jb250ZW50X3R5cGUsIHNjX2NvbnRlbnRfbGVuLCBzY19yYW5nZV9zdGFydCwgc2NfcmFuZ2VfZW5kJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==