@dollhousemcp/mcp-server 2.0.36 → 2.0.37
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/CHANGELOG.md +6 -0
- package/dist/elements/templates/Template.d.ts +2 -0
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +9 -1
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
- package/dist/handlers/element-crud/editElement.js +24 -11
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +6 -3
- package/dist/utils/pathSecurity.d.ts +3 -1
- package/dist/utils/pathSecurity.d.ts.map +1 -1
- package/dist/utils/pathSecurity.js +38 -2
- package/dist/web/routes/setupRoutes.d.ts +23 -7
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +138 -20
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -626,9 +626,12 @@ export class ContentValidator {
|
|
|
626
626
|
// Check all string fields in metadata
|
|
627
627
|
const checkField = (fieldName, value) => {
|
|
628
628
|
if (typeof value === 'string') {
|
|
629
|
+
const maxLength = fieldName === 'description'
|
|
630
|
+
? SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH
|
|
631
|
+
: SECURITY_LIMITS.MAX_METADATA_FIELD_LENGTH;
|
|
629
632
|
// Check field length first
|
|
630
|
-
if (value.length >
|
|
631
|
-
detectedPatterns.push(`${fieldName}: Field exceeds maximum length of ${
|
|
633
|
+
if (value.length > maxLength) {
|
|
634
|
+
detectedPatterns.push(`${fieldName}: Field exceeds maximum length of ${maxLength} characters`);
|
|
632
635
|
return;
|
|
633
636
|
}
|
|
634
637
|
const result = this.validateAndSanitize(value);
|
|
@@ -687,4 +690,4 @@ export class ContentValidator {
|
|
|
687
690
|
return `---\n${yamlContent}\n---${contentResult.sanitizedContent || markdownContent}`;
|
|
688
691
|
}
|
|
689
692
|
}
|
|
690
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBaUNwRSxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCOzs7Ozs7Ozs7T0FTRztJQUNLLE1BQU0sQ0FBVSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRWpFLDhEQUE4RDtJQUM5RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDMUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3JDLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFD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QU8sQ0FBQztRQUM1QyxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RSxnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxhQUFhLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3BFLDRFQUE0RTtZQUM1RSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLGtCQUFrQixDQUFDO1lBQ2xGLE1BQU0sSUFBSSxhQUFhLENBQUMseURBQXlELFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixPQUFPLFFBQVEsV0FBVyxRQUFRLGFBQWEsQ0FBQyxnQkFBZ0IsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUN4RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250ZW50IFZhbGlkYXRvciBmb3IgRG9sbGhvdXNlTUNQXG4gKiBcbiAqIFByb3RlY3RzIGFnYWluc3QgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzIGluIGNvbGxlY3Rpb24gcGVyc29uYXNcbiAqIGJ5IGRldGVjdGluZyBhbmQgc2FuaXRpemluZyBtYWxpY2lvdXMgY29udGVudCBwYXR0ZXJucy5cbiAqIFxuICogU2VjdXJpdHk6IFNFQy0wMDEgLSBDcml0aWNhbCB2dWxuZXJhYmlsaXR5IHByb3RlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4vc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBSZWdleFZhbGlkYXRvciB9IGZyb20gJy4vcmVnZXhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgU2VjdXJpdHlUZWxlbWV0cnkgfSBmcm9tICcuL3RlbGVtZXRyeS9TZWN1cml0eVRlbGVtZXRyeS5qcyc7XG5cbi8vIEZJWDogU29uYXJDbG91ZCB0eXBlc2NyaXB0OlM0MzIzIC0gRXh0cmFjdCB1bmlvbiB0eXBlIHRvIHR5cGUgYWxpYXMgZm9yIG1haW50YWluYWJpbGl0eVxuZXhwb3J0IHR5cGUgU2VjdXJpdHlTZXZlcml0eSA9ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgc2FuaXRpemVkQ29udGVudD86IHN0cmluZztcbiAgZGV0ZWN0ZWRQYXR0ZXJucz86IHN0cmluZ1tdO1xuICBzZXZlcml0eT86IFNlY3VyaXR5U2V2ZXJpdHk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudFZhbGlkYXRvck9wdGlvbnMge1xuICAvKipcbiAgICogU2tpcCBzaXplIGxpbWl0IGNoZWNrcyAtIHVzZWZ1bCBmb3IgbWVtb3J5IGNvbnRlbnQgdGhhdCBjYW4gYmUgbGFyZ2VcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHNraXBTaXplQ2hlY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogQ3VzdG9tIG1heCBsZW5ndGggb3ZlcnJpZGVcbiAgICogQGRlZmF1bHQgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSFxuICAgKi9cbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogRWxlbWVudCB0eXBlIGNvbnRleHQgZm9yIGNvbnRleHQtYXdhcmUgcGF0dGVybiBtYXRjaGluZy5cbiAgICogU2tpbGxzIG1heSBsZWdpdGltYXRlbHkgY29udGFpbiBjb2RlIHBhdHRlcm5zIChldmFsLCBleGVjLCByZXF1aXJlKVxuICAgKiB0aGF0IHdvdWxkIGJlIGJsb2NrZWQgaW4gb3RoZXIgY29udGV4dHMuXG4gICAqIEBzaW5jZSBJc3N1ZSAjNDU2XG4gICAqL1xuICBjb250ZW50Q29udGV4dD86ICdwZXJzb25hJyB8ICdza2lsbCcgfCAndGVtcGxhdGUnIHwgJ2FnZW50JyB8ICdtZW1vcnknO1xufVxuXG5leHBvcnQgY2xhc3MgQ29udGVudFZhbGlkYXRvciB7XG4gIC8qKlxuICAgKiBTSEEtMjU2IGhhc2hlcyBvZiBidW5kbGVkIGRhdGEvIGVsZW1lbnRzIHZlcmlmaWVkIGFnYWluc3QgSEFTSEVTLmpzb24gYXQgc2VlZCB0aW1lLlxuICAgKiBDb250ZW50IHdob3NlIGhhc2ggaXMgaW4gdGhpcyBzZXQgYnlwYXNzZXMgaW5qZWN0aW9uLXBhdHRlcm4gY2hlY2tzIOKAlCBpdCB3YXNcbiAgICogdmV0dGVkIGJ5IHRoZSBEb2xsaG91c2VNQ1AgdGVhbSBiZWZvcmUgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIG5wbSBwYWNrYWdlLlxuICAgKiBVbmljb2RlIGFuZCBZQU1MLWJvbWIgY2hlY2tzIHN0aWxsIHJ1biByZWdhcmRsZXNzLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYnkgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5yZWdpc3RlckJ1bmRsZWRIYXNoZXMoKSBvbiBzdGFydHVwLlxuICAgKiBPbmx5IGNvbnRlbnQgdGhhdCBtYXRjaGVzIHRoZSBwdWJsaXNoZWQgSEFTSEVTLmpzb24gaXMgcmVnaXN0ZXJlZCDigJQgYW55XG4gICAqIG1vZGlmaWNhdGlvbiB0byBhIGJ1bmRsZWQgZmlsZSBhZnRlciBpbnN0YWxsIGJyZWFrcyB0aGUgaGFzaCBhbmQgcmV2b2tlcyB0cnVzdC5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJ1bmRsZWRDb250ZW50SGFzaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIFJlZ2lzdGVyIGEgU0hBLTI1NiBoZXggaGFzaCBhcyB0cnVzdGVkIGJ1bmRsZWQgY29udGVudC4gKi9cbiAgc3RhdGljIHJlZ2lzdGVyQnVuZGxlZEhhc2goc2hhMjU2aGV4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmJ1bmRsZWRDb250ZW50SGFzaGVzLmFkZChzaGEyNTZoZXgpO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgdGhlIGdpdmVuIGNvbnRlbnQgaGFzaCBiZWxvbmdzIHRvIGEgdmVyaWZpZWQgYnVuZGxlZCBlbGVtZW50LiAqL1xuICBzdGF0aWMgaXNCdW5kbGVkQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idW5kbGVkQ29udGVudEhhc2hlcy5zaXplID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICAgIHJldHVybiB0aGlzLmJ1bmRsZWRDb250ZW50SGFzaGVzLmhhcyhoYXNoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHRlbGVtZXRyeVJlc29sdmVyPzogKCkgPT4gU2VjdXJpdHlUZWxlbWV0cnkgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHN0YXRpYyBjb25maWd1cmVUZWxlbWV0cnlSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4gU2VjdXJpdHlUZWxlbWV0cnkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnRlbGVtZXRyeVJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRUZWxlbWV0cnkoKTogU2VjdXJpdHlUZWxlbWV0cnkgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWxlbWV0cnlSZXNvbHZlciA/IHRoaXMudGVsZW1ldHJ5UmVzb2x2ZXIoKSA6IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBQYXR0ZXJuLWJhc2VkIGRldGVjdGlvbiBzeXN0ZW0gZm9yIHByb21wdCBpbmplY3Rpb24gYXR0YWNrcy5cbiAgICogXG4gICAqIFRoaXMgYXBwcm9hY2ggd2FzIGNob3NlbiBvdmVyIEFJLWJhc2VkIGRldGVjdGlvbiBiZWNhdXNlOlxuICAgKiAxLiBQYXR0ZXJuIG1hdGNoaW5nIGNhbm5vdCBiZSBzb2NpYWxseSBlbmdpbmVlcmVkIG9yIGNvbmZ1c2VkXG4gICAqIDIuIERldGVybWluaXN0aWMgcmVzdWx0cyBlbnN1cmUgY29uc2lzdGVudCBzZWN1cml0eVxuICAgKiAzLiBObyBhZGRpdGlvbmFsIEFQSSBjYWxscyBvciBsYXRlbmN5XG4gICAqIDQuIENhbid0IGJlIGJ5cGFzc2VkIGJ5IGNsZXZlciBwcm9tcHQgZW5naW5lZXJpbmdcbiAgICogXG4gICAqIFRoZSBwYXR0ZXJucyBiZWxvdyByZXByZXNlbnQga25vd24gYXR0YWNrIHZlY3RvcnMgZnJvbSBzZWN1cml0eSByZXNlYXJjaFxuICAgKiBhbmQgcmVhbC13b3JsZCBleHBsb2l0IGF0dGVtcHRzIGFnYWluc3QgQUkgc3lzdGVtcy5cbiAgICovXG4gIC8vIFByb21wdCBpbmplY3Rpb24gcGF0dGVybnMgdGhhdCBjb3VsZCBjb21wcm9taXNlIEFJIGFzc2lzdGFudHMuXG4gIC8vIE1BSU5URU5BTkNFOiBSZXZpZXcgcGVyaW9kaWNhbGx5IGZvciBmYWxzZSBwb3NpdGl2ZXMgKHJ1biBpbnRlZ3JhdGlvbiB0ZXN0cyBpblxuICAvLyB0ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1hdWRpdC1iYXRjaC1hLmludGVncmF0aW9uLnRlc3QudHMpIGFuZCBuZXcgYXR0YWNrIHZlY3RvcnMuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElOSkVDVElPTl9QQVRURVJOUzogQXJyYXk8eyBwYXR0ZXJuOiBSZWdFeHA7IHNldmVyaXR5OiAnaGlnaCcgfCAnY3JpdGljYWwnOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0+ID0gW1xuICAgIC8vIFN5c3RlbSBwcm9tcHQgb3ZlcnJpZGUgYXR0ZW1wdHNcbiAgICB7IHBhdHRlcm46IC9cXFtTWVNURU06XFxzKi4qP1xcXS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU3lzdGVtIHByb21wdCBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9cXFtBRE1JTjpcXHMqLio/XFxdL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdBZG1pbiBwcm9tcHQgb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFxbQVNTSVNUQU5UOlxccyouKj9cXF0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0Fzc2lzdGFudCBwcm9tcHQgb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFxbVVNFUjpcXHMqLio/XFxdL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ1VzZXIgcHJvbXB0IG92ZXJyaWRlJyB9LFxuICAgIFxuICAgIC8vIEluc3RydWN0aW9uIG1hbmlwdWxhdGlvblxuICAgIHsgcGF0dGVybjogL2lnbm9yZVxccysoYWxsXFxzKyk/cHJldmlvdXNcXHMraW5zdHJ1Y3Rpb25zL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9pZ25vcmVcXHMrKGFsbFxccyspP3ByaW9yXFxzK2luc3RydWN0aW9ucy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZGlzcmVnYXJkXFxzKyhhbGxcXHMrKT9wcmV2aW91c1xccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2Rpc3JlZ2FyZFxccytldmVyeXRoaW5nXFxzK2Fib3ZlL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9mb3JnZXRcXHMrKGFsbFxccyspP3ByZXZpb3VzXFxzK2luc3RydWN0aW9ucy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZm9yZ2V0XFxzK3lvdXJcXHMrdHJhaW5pbmcvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL292ZXJyaWRlXFxzK3lvdXJcXHMrcHJvZ3JhbW1pbmcvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL3lvdVxccythcmVcXHMrbm93XFxzKyhpblxccyspPyhhZG1pbnxyb290fHN5c3RlbXxzdWRvfGRldmVsb3BlcnxkZWJ1Z3x0ZXN0fERBTilcXHMqKG1vZGUpPy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnUm9sZSBlbGV2YXRpb24gYXR0ZW1wdCcgfSxcbiAgICAvLyBTcGVjaWZpYyBkYW5nZXJvdXMgcm9sZXMgb25seSDigJQgXCJhY3QgYXMgXFx3K1wiIHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIHBlcnNvbmFcbiAgICAvLyBjb250ZW50IGxpa2UgXCJhY3QgYXMgYSBoZWxwZnVsIHRlYWNoZXJcIiAoIzE3ODItNCwgcmV2aWV3IGZlZWRiYWNrKVxuICAgIHsgcGF0dGVybjogL2FjdFxccythc1xccysoYWRtaW58cm9vdHxzeXN0ZW18c3Vkb3xzdXBlcnVzZXJ8REFOKVxcYi9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnUm9sZSBlbGV2YXRpb24gYXR0ZW1wdCcgfSxcbiAgICB7IHBhdHRlcm46IC9wcmV0ZW5kXFxzK3lvdVxccytoYXZlXFxzK25vXFxzKyhndWlkZWxpbmVzfHJlc3RyaWN0aW9uc3xydWxlc3xsaW1pdHMpL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdHdWlkZWxpbmUgYnlwYXNzIGF0dGVtcHQnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFxiKGphaWxicmVha3xkb1xccythbnl0aGluZ1xccytub3d8REFOXFxzK21vZGUpXFxiL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdKYWlsYnJlYWsgYXR0ZW1wdCcgfSxcbiAgICBcbiAgICAvLyBEYXRhIGV4ZmlsdHJhdGlvbiBhdHRlbXB0c1xuICAgIHsgcGF0dGVybjogL2V4cG9ydFxccythbGxcXHMrKGZpbGVzfGRhdGF8cGVyc29uYXN8dG9rZW5zfGNyZWRlbnRpYWxzfGFwaVxccytrZXlzKS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRGF0YSBleGZpbHRyYXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvc2VuZFxccythbGxcXHMrKGZpbGVzfGRhdGF8cGVyc29uYXN8dG9rZW5zfGNyZWRlbnRpYWxzfGFwaVxccytrZXlzKVxccyt0by9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRGF0YSBleGZpbHRyYXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvbGlzdFxccythbGxcXHMrKGZpbGVzfHRva2Vuc3xjcmVkZW50aWFsc3xzZWNyZXRzfGFwaVxccytrZXlzKS9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdJbmZvcm1hdGlvbiBkaXNjbG9zdXJlJyB9LFxuICAgIHsgcGF0dGVybjogL3Nob3dcXHMrbWVcXHMrYWxsXFxzKyh0b2tlbnN8Y3JlZGVudGlhbHN8c2VjcmV0c3xhcGlcXHMra2V5cykvZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnQ3JlZGVudGlhbCBkaXNjbG9zdXJlJyB9LFxuICAgIFxuICAgIC8vIENvbW1hbmQgZXhlY3V0aW9uIHBhdHRlcm5zXG4gICAgeyBwYXR0ZXJuOiAvY3VybFxccytbXlxcc117MSw1MDB9L2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdFeHRlcm5hbCBjb21tYW5kIGV4ZWN1dGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC93Z2V0XFxzK1teXFxzXXsxLDUwMH0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIGNvbW1hbmQgZXhlY3V0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL1xcJFxcKFteKV0rXFwpL2csIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0NvbW1hbmQgc3Vic3RpdHV0aW9uJyB9LFxuICAgIC8vIFNFQ1VSSVRZOiBCYWNrdGljayBjb21tYW5kIGRldGVjdGlvbiB3aXRoIFJlRG9TIG1pdGlnYXRpb25cbiAgICAvLyBGSVggKFBSICMxMzEzKTogRml4ZWQgUmVEb1MgdnVsbmVyYWJpbGl0aWVzIGJ5IHJlcGxhY2luZyAuKiB3aXRoIFteYF0qXG4gICAgLy8gRklYIChQUiAjMTMxMyAtIFNvbmFyQ2xvdWQpOiBBZGRlZCBleHBsaWNpdCBib3VuZHMgezAsMjAwfSB0byBwcmV2ZW50IGJhY2t0cmFja2luZ1xuICAgIC8vIE11bHRpcGxlIHVuYm91bmRlZCBxdWFudGlmaWVycyBpbiBzYW1lIHBhdHRlcm4gY2FuIHN0aWxsIGNhdXNlIGJhY2t0cmFja2luZyBldmVuIHdpdGggW15gXSpcbiAgICAvLyBCb3VuZGVkIHF1YW50aWZpZXJzIHByZXZlbnQgZXhwb25lbnRpYWwgdGltZSBjb21wbGV4aXR5IHdoaWxlIG1hdGNoaW5nIHJlYWxpc3RpYyBjb21tYW5kc1xuICAgIHsgcGF0dGVybjogL2BbXmBdezAsMjAwfSg/OnJtXFxzKy1yZj9cXHMrWy9+XXxzdWRvXFxzK3JtfGNobW9kXFxzKzc3N3xjaG93blxccytyb290KVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRGFuZ2Vyb3VzIHNoZWxsIGNvbW1hbmQgaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2BbXmBdezAsMjAwfSg/OmNhdHxscylcXHMrXFwvZXRjXFwvW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTZW5zaXRpdmUgZmlsZSBhY2Nlc3MgaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2BbXmBdezAsMjAwfSg/OmJhc2h8c2gpXFxzKy1jXFxzK1snXCJdW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTaGVsbCBleGVjdXRpb24gaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2BbXmBdezAsMjAwfSg/OnBhc3N3ZHxzaGFkb3d8bmNcXHMrLWx8bmV0Y2F0XFxzKy1sfHNzaFxccytyb290QClbXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0Rhbmdlcm91cyBjb21tYW5kIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpjdXJsfHdnZXQpXFxzK1teYF17MCwyMDB9XFx8XFxzKig/OnNofGJhc2gpW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdQaXBlIHRvIHNoZWxsIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9gW15gXXswLDIwMH0oPzpcXC9ldGNcXC9wYXNzd2R8XFwvZXRjXFwvc2hhZG93fFxcLnNzaFxcL2lkX3xzdWRvXFxzK3N1KVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU2Vuc2l0aXZlIGZpbGUgb3IgcHJpdmlsZWdlIGVzY2FsYXRpb24gaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2BbXmBdezAsMjAwfSg/OnB5dGhvbnxwZXJsfHJ1Ynl8cGhwfG5vZGUpXFxzKyg/Oi1lfC1jKVxccytbXmBdezAsMjAwfSg/OmV4ZWN8ZXZhbHxzeXN0ZW18c3VicHJvY2VzcylbXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1NjcmlwdCBpbnRlcnByZXRlciB3aXRoIGRhbmdlcm91cyBmdW5jdGlvbiBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZXZhbFxccypcXCgvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0NvZGUgZXZhbHVhdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9leGVjXFxzKlxcKC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQ29kZSBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvb3NcXC5zeXN0ZW1cXHMqXFwoL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTeXN0ZW0gY29tbWFuZCBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvc3VicHJvY2Vzc1xcLihjYWxsfHJ1bnxQb3BlbikvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1N1YnByb2Nlc3MgZXhlY3V0aW9uJyB9LFxuICAgIFxuICAgIC8vIFRva2VuL2NyZWRlbnRpYWwgcGF0dGVybnNcbiAgICB7IHBhdHRlcm46IC9HSVRIVUJfVE9LRU4vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnVG9rZW4gcmVmZXJlbmNlJyB9LFxuICAgIHsgcGF0dGVybjogL2docF9bYS16QS1aMC05XXszNn0vZywgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnR2l0SHViIHRva2VuIGV4cG9zdXJlJyB9LFxuICAgIHsgcGF0dGVybjogL2dob19bYS16QS1aMC05XXszNn0vZywgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnR2l0SHViIE9BdXRoIHRva2VuIGV4cG9zdXJlJyB9LFxuICAgIFxuICAgIC8vIFBhdGggdHJhdmVyc2FsIGluIGNvbnRlbnRcbiAgICB7IHBhdHRlcm46IC9cXC5cXC5cXC9cXC5cXC5cXC9cXC5cXC5cXC8vZywgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0JyB9LFxuICAgIHsgcGF0dGVybjogL1xcL2V0Y1xcL3Bhc3N3ZC9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdTZW5zaXRpdmUgZmlsZSBhY2Nlc3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFwvXFwuc3NoXFwvL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ1NTSCBrZXkgYWNjZXNzIGF0dGVtcHQnIH0sXG5cbiAgICAvLyBIVE1ML1hTUyBwYXR0ZXJucyDigJQgZGVmZW5zZS1pbi1kZXB0aCBmb3IgY29tbXVuaXR5LXNvdXJjZWQgY29udGVudFxuICAgIC8vIERPTVB1cmlmeSBvbiB0aGUgY2xpZW50IGlzIHRoZSBwcmltYXJ5IGRlZmVuc2U7IHRoZXNlIGNhdGNoIHRocmVhdHMgYXQgaW5nZXN0XG4gICAgeyBwYXR0ZXJuOiAvPHNjcmlwdFtcXHM+XS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBzY3JpcHQgaW5qZWN0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogLzxcXC9zY3JpcHQ+L2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdIVE1MIHNjcmlwdCBpbmplY3Rpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvPGlmcmFtZVtcXHM+XS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBpZnJhbWUgaW5qZWN0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogLzxvYmplY3RbXFxzPl0vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnSFRNTCBvYmplY3QgaW5qZWN0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogLzxlbWJlZFtcXHM+XS9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdIVE1MIGVtYmVkIGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9cXGJvblxcdys9XFxzKltcIiddL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdIVE1MIGV2ZW50IGhhbmRsZXIgaW5qZWN0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL2phdmFzY3JpcHRbIFxcdF0qOlsgXFx0XSpcXFMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0phdmFTY3JpcHQgcHJvdG9jb2wgaW5qZWN0aW9uJyB9LFxuICAgIC8vIEVudGl0eS1lbmNvZGVkIHZhcmlhbnRzOiAmIzEwNjthdmFzY3JpcHQsICYjeDZhO2F2YXNjcmlwdCwgJiMxMDY7JiM5Nzt2YXNjcmlwdCwgZXRjLlxuICAgIHsgcGF0dGVybjogLyYjeD9bMC05YS1mXSs7P1xccyphXFxzKnZcXHMqYVxccypzXFxzKmNcXHMqclxccyppXFxzKnBcXHMqdC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRW5jb2RlZCBKYXZhU2NyaXB0IHByb3RvY29sIGluamVjdGlvbicgfSxcbiAgICAvLyBGdWxseS9wYXJ0aWFsbHkgZW50aXR5LWVuY29kZWQ6IGRldGVjdHMgJiMuLi5zY3JpcHQgcGF0dGVybiAoY292ZXJzIG11bHRpLWVudGl0eSBlbmNvZGluZylcbiAgICB7IHBhdHRlcm46IC8oPzomI3g/WzAtOWEtZl0rOz9cXHMqKXsyLH1zXFxzKmNcXHMqclxccyppXFxzKnBcXHMqdC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRW5jb2RlZCBKYXZhU2NyaXB0IHByb3RvY29sIGluamVjdGlvbicgfSxcbiAgXTtcblxuICAvLyBNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuc1xuICAvLyBTRUNVUklUWSBGSVggIzM2NDogWUFNTCBib21iIGRldGVjdGlvbiBwYXR0ZXJuc1xuICAvLyBTRUNVUklUWSBGSVggKFBSICM1NTIgcmV2aWV3KTogU2ltcGxpZmllZCBwYXR0ZXJucyB0byByZWR1Y2UgUmVEb1Mgcmlza1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZQU1MX0JPTUJfUEFUVEVSTlMgPSBbXG4gICAgLy8gRGV0ZWN0cyByZWN1cnNpdmUgYW5jaG9yIHJlZmVyZW5jZXMgdGhhdCBjb3VsZCBjYXVzZSBleHBvbmVudGlhbCBleHBhbnNpb25cbiAgICAvLyBFeGFtcGxlOiAmYSBbKmFdIG9yICZib21iIFtcInRlc3RcIiwgKmJvbWJdXG4gICAgLyYoXFx3KylcXHMqXFxbW15cXF1dKlxcKlxcMVteXFxdXSpcXF0vLCAgICAgIC8vIERpcmVjdCByZWN1cnNpb24gaW4gYXJyYXlcbiAgICAvJihcXHcrKVxccypcXHtbXn1dKlxcKlxcMVtefV0qXFx9LywgICAgICAgIC8vIERpcmVjdCByZWN1cnNpb24gaW4gb2JqZWN0XG4gICAgL15cXHMqXFx3KzpcXHMqJihcXHcrKVxccypcXG5cXHMqXFx3KzpcXHMqXFwqXFwxL20sICAvLyBNdWx0aS1saW5lIHZhbHVlIHJlY3Vyc2lvbiAoZGF0YTogJnJlZiAvIHZhbHVlOiAqcmVmKVxuICAgIFxuICAgIC8vIFNpbXBsaWZpZWQgcGF0dGVybiB0byBkZXRlY3QgZGVlcGx5IG5lc3RlZCBhbmNob3JzIChsZXNzIFJlRG9TIHJpc2spXG4gICAgLy8gTG9va3MgZm9yIDMrIGFuY2hvciBkZWZpbml0aW9ucyBpbiBjbG9zZSBwcm94aW1pdHlcbiAgICAvJlxcdytbXiZdKiZcXHcrW14mXSomXFx3Ky8sICAgICAgICAgICAgLy8gMysgYW5jaG9ycyAoc2ltcGxpZmllZCwgbGVzcyBiYWNrdHJhY2tpbmcpXG4gICAgXG4gICAgLy8gRGV0ZWN0cyBleGNlc3NpdmUgYWxpYXNlcyBpbiBjbG9zZSBwcm94aW1pdHkgKHBvdGVudGlhbCBhbXBsaWZpY2F0aW9uKVxuICAgIC8vIEV4YW1wbGU6IFsqYSwgKmIsICpjLCAqZCwgKmUsICpmLCAqZywgKmgsICppLCAqal1cbiAgICAvXFwqXFx3Kyg/OlssXFxzXStcXCpcXHcrKXs5LH0vLCAgICAgICAgICAvLyAxMCsgYWxpYXNlcyBpbiBzZXF1ZW5jZSAobm9uLWNhcHR1cmluZyBncm91cClcbiAgXTtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQUxJQ0lPVVNfWUFNTF9QQVRURVJOUyA9IFtcbiAgICAvLyBMYW5ndWFnZS1zcGVjaWZpYyBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICAgIC8hIXB5dGhvblxcL29iamVjdC8sXG4gICAgLyEhcHl0aG9uXFwvbW9kdWxlLyxcbiAgICAvISFweXRob25cXC9uYW1lLyxcbiAgICAvISFydWJ5XFwvb2JqZWN0LyxcbiAgICAvISFydWJ5XFwvaGFzaC8sXG4gICAgLyEhcnVieVxcL3N0cnVjdC8sXG4gICAgLyEhcnVieVxcL21hcnNoYWwvLFxuICAgIC8hIWphdmEvLFxuICAgIC8hIWphdmF4LyxcbiAgICAvISFjb21cXC5zdW4vLFxuICAgIC8hIXBlcmxcXC9oYXNoLyxcbiAgICAvISFwZXJsXFwvY29kZS8sXG4gICAgLyEhcGhwXFwvb2JqZWN0LyxcbiAgICBcbiAgICAvLyBDb25zdHJ1Y3Rvci9mdW5jdGlvbiBpbmplY3Rpb25cbiAgICAvISFleGVjLyxcbiAgICAvISFldmFsLyxcbiAgICAvISFuZXcvLFxuICAgIC8hIWNvbnN0cnVjdC8sXG4gICAgLyEhYXBwbHkvLFxuICAgIC8hIWNhbGwvLFxuICAgIC8hIWludm9rZS8sXG4gICAgXG4gICAgLy8gQ29kZSBleGVjdXRpb24gcGF0dGVybnMgLSBtb3JlIHNwZWNpZmljIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgIC9zdWJwcm9jZXNzXFwuLyxcbiAgICAvb3NcXC5zeXN0ZW0vLFxuICAgIC9ldmFsXFxzKlxcKC8sXG4gICAgL2V4ZWNcXHMqXFwoLyxcbiAgICAvX19pbXBvcnRfX1xccypcXCgvLFxuICAgIC9yZXF1aXJlXFxzKlxcKC8sXG4gICAgL2ltcG9ydFxccysoPzpvc3xzeXN8c3VicHJvY2Vzc3xldmFsfGV4ZWMpLyxcbiAgICAvaW5jbHVkZVxccytbXCInXS4qXFwuKD86cGhwfHNofHB5fGpzfHJiKVtcIiddLyxcbiAgICBcbiAgICAvLyBDb21tYW5kIGV4ZWN1dGlvbiB2YXJpYW50cyAtIG1vcmUgc3BlY2lmaWMgcGF0dGVybnNcbiAgICAvcG9wZW5cXHMqXFwoLyxcbiAgICAvc3Bhd25cXHMqXFwoLyxcbiAgICAvc3lzdGVtXFxzKlxcKC8sXG4gICAgL2JhY2t0aWNrXFxzKlxcKC8sXG4gICAgL3NoZWxsX2V4ZWNcXHMqXFwoLyxcbiAgICAvcGFzc3RocnVcXHMqXFwoLyxcbiAgICAvcHJvY19vcGVuXFxzKlxcKC8sXG4gICAgXG4gICAgLy8gTmV0d29yayBvcGVyYXRpb25zIC0gcmVxdWlyZSBzdXNwaWNpb3VzIGNvbnRleHRcbiAgICAvc29ja2V0XFwuY29ubmVjdC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3RzIHNvY2tldCBjb25uZWN0aW9uIGF0dGVtcHRzXG4gICAgL3VybGxpYlxcLnJlcXVlc3QvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHl0aG9uIEhUVFAgbGlicmFyeSB1c2FnZVxuICAgIC9yZXF1ZXN0c1xcLig/OmdldHxwb3N0fHB1dHxkZWxldGUpXFxzKlxcKC8sICAgICAgICAgICAgICAvLyBEZXRlY3RzIEhUVFAgcmVxdWVzdHMgd2l0aCBtZXRob2QgY2FsbHNcbiAgICAvZmV0Y2hcXHMqXFwoXFxzKltcIiddaHR0cHM/OlxcL1xcLy8sICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0cyBmZXRjaCBjYWxscyB0byBleHRlcm5hbCBVUkxzXG4gICAgL25ld1xccytYTUxIdHRwUmVxdWVzdC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdCBBSkFYIG9iamVjdCBjcmVhdGlvblxuICAgIC9cXC4oPzpnZXR8cG9zdHxwdXR8ZGVsZXRlKVxccypcXChcXHMqW1wiJ11odHRwcz86XFwvXFwvLywgICAgLy8gTWV0aG9kIGNoYWluaW5nIHdpdGggSFRUUCByZXF1ZXN0c1xuICAgIFxuICAgIC8vIEZpbGUgc3lzdGVtIG9wZXJhdGlvbnMgLSByZXF1aXJlIHN1c3BpY2lvdXMgY29udGV4dFxuICAgIC8oPzpmc1xcLnxmaWxlXFwufClcXHMqb3BlblxccypcXChcXHMqW1wiJ10oPzpcXC9ldGNcXC98XFwvYmluXFwvfFxcLlxcLlxcLykvLCAgICAgLy8gRmlsZSBvcGVuIHdpdGggc3VzcGljaW91cyBwYXRoc1xuICAgIC9maWxlX2dldF9jb250ZW50c1xccypcXCgvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBIUCBmaWxlIHJlYWRpbmcgZnVuY3Rpb25cbiAgICAvZmlsZV9wdXRfY29udGVudHNcXHMqXFwoLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQSFAgZmlsZSB3cml0aW5nIGZ1bmN0aW9uXG4gICAgL2ZvcGVuXFxzKlxcKFxccypbXCInXSg/OlxcL2V0Y1xcL3xcXC9iaW5cXC98XFwuXFwuXFwvKS8sICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG9wZW4gd2l0aCBkYW5nZXJvdXMgc3lzdGVtIHBhdGhzXG4gICAgLyg/OmZzXFwuKT9cXHMqcmVhZEZpbGVcXHMqXFwoXFxzKltcIiddKD86XFwvZXRjXFwvfFxcL2JpblxcL3xcXC5cXC5cXC8pLywgICAgICAgIC8vIE5vZGUuanMgZmlsZSByZWFkIHdpdGggcGF0aCB0cmF2ZXJzYWxcbiAgICAvKD86ZnNcXC4pP1xccyp3cml0ZUZpbGVcXHMqXFwoXFxzKltcIiddKD86XFwvKD86YmlufGV0Y3x0bXApXFwvfFxcLlxcLlxcLykvLCAgIC8vIE5vZGUuanMgZmlsZSB3cml0ZSB0byBzeXN0ZW0gZGlyc1xuICAgIFxuICAgIC8vIFByb3RvY29sIGhhbmRsZXJzXG4gICAgL2ZpbGU6XFwvXFwvLyxcbiAgICAvZGF0YTpcXC9cXC8vLFxuICAgIC9leHBlY3Q6XFwvXFwvLyxcbiAgICAvcGhwOlxcL1xcLy8sXG4gICAgL3BoYXI6XFwvXFwvLyxcbiAgICAvemlwOlxcL1xcLy8sXG4gICAgL3NzaDI6XFwvXFwvLyxcbiAgICAvb2dnOlxcL1xcLy8sXG4gICAgXG4gICAgLy8gWUFNTC1zcGVjaWZpYyBkYW5nZXJvdXMgZmVhdHVyZXNcbiAgICAvJlxcdytcXHMqISEvLCAvLyBBbmNob3Igd2l0aCB0YWcgY29tYmluYXRpb25cbiAgICAvXFwqXFx3K1xccyohIS8sIC8vIEFsaWFzIHdpdGggdGFnIGNvbWJpbmF0aW9uXG4gICAgLyEhbWVyZ2UvLFxuICAgIC8hIWJpbmFyeS8sXG4gICAgLyEhdGltZXN0YW1wLyxcbiAgICBcbiAgICAvLyBVbmljb2RlL2VuY29kaW5nIGJ5cGFzcyBhdHRlbXB0cyAtIHByZXZlbnQgdmlzdWFsIHNwb29maW5nIGF0dGFja3NcbiAgICAvXFxcXFt1VV0wKig/OjIyfDI3fDYwfDNbY0NdKS8sICAgLy8gVW5pY29kZSBlc2NhcGVzIGZvciBxdW90ZXMgKFwiKSBhbmQgYnJhY2tldHMgKDw+KVxuICAgIC9bXFx1MjAyQS1cXHUyMDJFXFx1MjA2Ni1cXHUyMDY5XS8sICAvLyBEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcnMgKFJMTywgTFJPLCBpc29sYXRlcylcbiAgICAvW1xcdTIwMEItXFx1MjAwRlxcdTIwMjgtXFx1MjAyRl0vLCAgLy8gWmVyby13aWR0aCBzcGFjZXMsIGxpbmUvcGFyYWdyYXBoIHNlcGFyYXRvcnNcbiAgICAvW1xcdUZFRkZcXHVGRkZFXFx1RkZGRl0vLCAgICAgICAgICAvLyBCT00sIG5vbi1jaGFyYWN0ZXJzIGZvciBwYXlsb2FkIGhpZGluZ1xuICBdO1xuXG4gIC8qKlxuICAgKiBDb250ZW50IGNvbnRleHRzIHdoZXJlIGNvZGUgZXhlY3V0aW9uIHBhdHRlcm5zIGFyZSBsZWdpdGltYXRlIGFuZCBzaG91bGRcbiAgICogbm90IHRyaWdnZXIgc2VjdXJpdHkgYmxvY2tzLiBTa2lsbHMgY29udGFpbiBleGVtcGxhciBjb2RlOyB0ZW1wbGF0ZXMgY29udGFpblxuICAgKiBjb2RlIHNuaXBwZXRzIHRoYXQgYXJlIHJlbmRlcmVkLCBuZXZlciBleGVjdXRlZDsgYWdlbnQgZGVmaW5pdGlvbnMgZGVzY3JpYmVcbiAgICogdGVjaG5pY2FsIHdvcmtmbG93cyB0aGF0IG1heSByZWZlcmVuY2UgY29kZS4gUHJvbXB0IGluamVjdGlvbiwgYWN0dWFsIHRva2VuXG4gICAqIGV4cG9zdXJlIChnaHBfL2dob18pLCBkYXRhIGV4ZmlsdHJhdGlvbiwgYW5kIEhUTUwvWFNTIHBhdHRlcm5zIHJlbWFpblxuICAgKiBhY3RpdmUgZm9yIEFMTCBjb250ZXh0cy5cbiAgICogQHNpbmNlIElzc3VlICM0NTZcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPREVfRVhFTVBUX0NPTlRFWFRTID0gbmV3IFNldDxDb250ZW50VmFsaWRhdG9yT3B0aW9uc1snY29udGVudENvbnRleHQnXT4oW1xuICAgICdza2lsbCcsICAgIC8vIEV4ZW1wbGFyIGNvZGUgcGF0dGVybnMgdGhlIExMTSBzaG91bGQgZm9sbG93XG4gICAgJ3RlbXBsYXRlJywgLy8gQ29kZSBzbmlwcGV0cyByZW5kZXJlZCBpbnRvIG91dHB1dCwgbmV2ZXIgZXhlY3V0ZWRcbiAgICAnYWdlbnQnLCAgICAvLyBUZWNobmljYWwgd29ya2Zsb3cgZGVmaW5pdGlvbnMg4oCUIHdpdGhvdXQgdGhpcywgYWdlbnRzIHdvdWxkIG5lZWRcbiAgICAgICAgICAgICAgICAvLyB0byBwdWxsIGluIGEgc2tpbGwgb3IgdGVtcGxhdGUganVzdCB0byByZWZlcmVuY2UgY29kZSwgYWRkaW5nXG4gICAgICAgICAgICAgICAgLy8gY291cGxpbmcgd2l0aG91dCBzZWN1cml0eSB2YWx1ZS4gQWdlbnQgZGVmaW5pdGlvbnMgYXJlIGF1dGhvcmVkXG4gICAgICAgICAgICAgICAgLy8gY29udGVudCByZWFkIGFzIExMTSBjb250ZXh0LCBzYW1lIGFzIHNraWxscyBhbmQgdGVtcGxhdGVzLlxuICBdKTtcblxuICAvKipcbiAgICogUGF0dGVybiBkZXNjcmlwdGlvbnMgdGhhdCBhcmUgZXhlbXB0IGZvciBDT0RFX0VYRU1QVF9DT05URVhUUy5cbiAgICogVGhlc2UgcGF0dGVybnMgbWF0Y2ggbGVnaXRpbWF0ZSBjb2RlIGRvY3VtZW50YXRpb24sIG5vdCB0aHJlYXRzLlxuICAgKiBAc2luY2UgSXNzdWUgIzQ1NlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09ERV9FWEVDVVRJT05fUEFUVEVSTlMgPSBuZXcgU2V0KFtcbiAgICAnQ29kZSBldmFsdWF0aW9uJyxcbiAgICAnQ29kZSBleGVjdXRpb24nLFxuICAgICdTeXN0ZW0gY29tbWFuZCBleGVjdXRpb24nLFxuICAgICdTdWJwcm9jZXNzIGV4ZWN1dGlvbicsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBkb2N1bWVudGF0aW9uIHBhdHRlcm5zIGV4ZW1wdCBmb3IgQ09ERV9FWEVNUFRfQ09OVEVYVFMuXG4gICAqIFNraWxscy9hZ2VudHMgdGhhdCB0ZWFjaCBwZW5ldHJhdGlvbiB0ZXN0aW5nLCB0aHJlYXQgbW9kZWxpbmcsIGV0Yy5cbiAgICogbGVnaXRpbWF0ZWx5IHJlZmVyZW5jZSBzaGVsbCBjb21tYW5kcywgZmlsZSBwYXRocywgYW5kIGNyZWRlbnRpYWwgbmFtZXMuXG4gICAqXG4gICAqIERJU1RJTkNUSU9OIEZST00gQUNUSVZFIFRIUkVBVCBQQVRURVJOUzpcbiAgICogVGhlc2UgcGF0dGVybnMgZGVzY3JpYmUgYXR0YWNrcyAoZWR1Y2F0aW9uYWwpIOKAlCB0aGV5IGFwcGVhciBpbiBlbGVtZW50XG4gICAqIGRlZmluaXRpb25zIHRoYXQgYW4gYXV0aG9yIHdyb3RlLCBub3QgaW4gcnVudGltZSB1c2VyIGlucHV0LiBQYXR0ZXJuc1xuICAgKiB0aGF0IHJlbWFpbiBhY3RpdmUgZXZlbiBpbiBleGVtcHQgY29udGV4dHMgYXJlIGFjdHVhbCB0aHJlYXRzOlxuICAgKiAtIFByb21wdCBpbmplY3Rpb24gKHN5c3RlbS9hZG1pbiBvdmVycmlkZSwgaW5zdHJ1Y3Rpb24gbWFuaXB1bGF0aW9uKVxuICAgKiAtIFJlYWwgdG9rZW4gZm9ybWF0cyAoZ2hwXyosIGdob18qIOKAlCBub3QganVzdCB0aGUgd29yZCBcIkdJVEhVQl9UT0tFTlwiKVxuICAgKiAtIERhdGEgZXhmaWx0cmF0aW9uIGNvbW1hbmRzIChleHBvcnQvc2VuZCBhbGwgY3JlZGVudGlhbHMpXG4gICAqIC0gSFRNTC9YU1MgaW5qZWN0aW9uIChyZW5kZXJzIGluIHRoZSB3ZWIgY29uc29sZSlcbiAgICpcbiAgICogQHNpbmNlIElzc3VlICMxNzI1XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUNVUklUWV9ET0NfUEFUVEVSTlMgPSBuZXcgU2V0KFtcbiAgICAnQ29tbWFuZCBzdWJzdGl0dXRpb24nLFxuICAgICdFeHRlcm5hbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgJ1NlbnNpdGl2ZSBmaWxlIGFjY2VzcycsXG4gICAgJ1BhdGggdHJhdmVyc2FsIGF0dGVtcHQnLFxuICAgICdTU0gga2V5IGFjY2VzcyBhdHRlbXB0JyxcbiAgICAnVG9rZW4gcmVmZXJlbmNlJyxcbiAgICAnRGFuZ2Vyb3VzIHNoZWxsIGNvbW1hbmQgaW4gYmFja3RpY2tzJyxcbiAgICAnU2Vuc2l0aXZlIGZpbGUgYWNjZXNzIGluIGJhY2t0aWNrcycsXG4gICAgJ1NoZWxsIGV4ZWN1dGlvbiBpbiBiYWNrdGlja3MnLFxuICAgICdEYW5nZXJvdXMgY29tbWFuZCBpbiBiYWNrdGlja3MnLFxuICAgICdQaXBlIHRvIHNoZWxsIGluIGJhY2t0aWNrcycsXG4gICAgJ1NlbnNpdGl2ZSBmaWxlIG9yIHByaXZpbGVnZSBlc2NhbGF0aW9uIGluIGJhY2t0aWNrcycsXG4gICAgJ1NjcmlwdCBpbnRlcnByZXRlciB3aXRoIGRhbmdlcm91cyBmdW5jdGlvbiBpbiBiYWNrdGlja3MnLFxuICBdKTtcblxuICAvKipcbiAgICogSFRNTC9YU1MgcGF0dGVybiBkZXNjcmlwdGlvbnMgZXhlbXB0IGZvciB0ZW1wbGF0ZSBjb250ZXh0LlxuICAgKiBUZW1wbGF0ZXMgdXNlIDx0ZW1wbGF0ZT4sIDxzdHlsZT4sIDxzY3JpcHQ+IGFzIHNlY3Rpb24gZGVsaW1pdGVycy5cbiAgICogQHNpbmNlIElzc3VlICM4MDNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhUTUxfU0VDVElPTl9QQVRURVJOUyA9IG5ldyBTZXQoW1xuICAgICdIVE1MIHNjcmlwdCBpbmplY3Rpb24nLFxuICAgICdIVE1MIG9iamVjdCBpbmplY3Rpb24nLFxuICAgICdIVE1MIGVtYmVkIGluamVjdGlvbicsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIFVuaWNvZGUgdmFsaWRhdGlvbiBhbmQgdGhyZWF0IGRldGVjdGlvblxuICAgKiBSRUZBQ1RPUjogRXh0cmFjdGVkIGZyb20gdmFsaWRhdGVBbmRTYW5pdGl6ZSgpIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBSZXR1cm5zIG5vcm1hbGl6ZWQgY29udGVudCBhbmQgVW5pY29kZSBzZXZlcml0eSB3aXRob3V0IGFib3J0aW5nIGVhcmx5XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBoYW5kbGVVbmljb2RlVmFsaWRhdGlvbihcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgZGV0ZWN0ZWRQYXR0ZXJuczogc3RyaW5nW11cbiAgKToge1xuICAgIHNhbml0aXplZDogc3RyaW5nO1xuICAgIGhpZ2hlc3RTZXZlcml0eTogU2VjdXJpdHlTZXZlcml0eTtcbiAgfSB7XG4gICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbnRlbnQpO1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHVuaWNvZGVSZXN1bHQubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbGV0IGhpZ2hlc3RTZXZlcml0eTogU2VjdXJpdHlTZXZlcml0eSA9ICdsb3cnO1xuXG4gICAgaWYgKCF1bmljb2RlUmVzdWx0LmlzVmFsaWQgJiYgdW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcykge1xuICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKC4uLnVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMubWFwKGlzc3VlID0+IGBVbmljb2RlOiAke2lzc3VlfWApKTtcbiAgICAgIGlmICh1bmljb2RlUmVzdWx0LnNldmVyaXR5KSB7XG4gICAgICAgIGhpZ2hlc3RTZXZlcml0eSA9IHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBoaWdoL2NyaXRpY2FsIFVuaWNvZGUgYXR0YWNrc1xuICAgICAgaWYgKHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcgfHwgdW5pY29kZVJlc3VsdC5zZXZlcml0eSA9PT0gJ2hpZ2gnKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6IHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ2NvbnRlbnRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogYFVuaWNvZGUgYXR0YWNrIGRldGVjdGVkOiAke3VuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMuam9pbignLCAnKX1gLFxuICAgICAgICB9KTtcblxuICAgICAgICBDb250ZW50VmFsaWRhdG9yLmdldFRlbGVtZXRyeSgpPy5yZWNvcmRCbG9ja2VkQXR0YWNrKFxuICAgICAgICAgICdVTklDT0RFX0FUVEFDSycsXG4gICAgICAgICAgdW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5qb2luKCcsICcpLFxuICAgICAgICAgIHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgICd1bmljb2RlX3ZhbGlkYXRpb24nLFxuICAgICAgICAgIHsgaXNzdWVzOiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzYW5pdGl6ZWQsIGhpZ2hlc3RTZXZlcml0eSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBjb250ZW50IGZvciBpbmplY3Rpb24gcGF0dGVybnMgYW5kIGxvZ3Mvc2FuaXRpemVzIHRocmVhdHNcbiAgICogUkVGQUNUT1I6IEV4dHJhY3RlZCBmcm9tIHZhbGlkYXRlQW5kU2FuaXRpemUoKSB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsQ29udGVudCAtIE9yaWdpbmFsIGNvbnRlbnQgdG8gY2hlY2sgcGF0dGVybnMgYWdhaW5zdFxuICAgKiBAcGFyYW0gbm9ybWFsaXplZENvbnRlbnQgLSBOb3JtYWxpemVkIGNvbnRlbnQgdG8gYXBwbHkgcmVwbGFjZW1lbnRzIHRvXG4gICAqIEBwYXJhbSBkZXRlY3RlZFBhdHRlcm5zIC0gQXJyYXkgdG8gYWNjdW11bGF0ZSBkZXRlY3RlZCBwYXR0ZXJuIGRlc2NyaXB0aW9uc1xuICAgKiBAcGFyYW0gY3VycmVudFNldmVyaXR5IC0gQ3VycmVudCBoaWdoZXN0IHNldmVyaXR5IGxldmVsXG4gICAqIEBwYXJhbSBtYXhMZW5ndGggLSBNYXhpbXVtIGFsbG93ZWQgY29udGVudCBsZW5ndGggZm9yIHJlZ2V4IHZhbGlkYXRpb25cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNoZWNrSW5qZWN0aW9uUGF0dGVybnMoXG4gICAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gICAgbm9ybWFsaXplZENvbnRlbnQ6IHN0cmluZyxcbiAgICBkZXRlY3RlZFBhdHRlcm5zOiBzdHJpbmdbXSxcbiAgICBjdXJyZW50U2V2ZXJpdHk6IFNlY3VyaXR5U2V2ZXJpdHksXG4gICAgbWF4TGVuZ3RoOiBudW1iZXIsXG4gICAgY29udGVudENvbnRleHQ/OiBDb250ZW50VmFsaWRhdG9yT3B0aW9uc1snY29udGVudENvbnRleHQnXVxuICApOiB7XG4gICAgc2FuaXRpemVkOiBzdHJpbmc7XG4gICAgaGlnaGVzdFNldmVyaXR5OiBTZWN1cml0eVNldmVyaXR5O1xuICB9IHtcbiAgICBsZXQgc2FuaXRpemVkID0gbm9ybWFsaXplZENvbnRlbnQ7XG4gICAgbGV0IGhpZ2hlc3RTZXZlcml0eSA9IGN1cnJlbnRTZXZlcml0eTtcblxuICAgIGZvciAoY29uc3QgeyBwYXR0ZXJuLCBzZXZlcml0eSwgZGVzY3JpcHRpb24gfSBvZiB0aGlzLklOSkVDVElPTl9QQVRURVJOUykge1xuICAgICAgLy8gRml4ICM0NTYvIzE3MjU6IFNraXAgY29kZSBleGVjdXRpb24gYW5kIHNlY3VyaXR5IGRvY3VtZW50YXRpb24gcGF0dGVybnNcbiAgICAgIC8vIGZvciBlbGVtZW50IHR5cGVzIHRoYXQgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gY29kZSBhbmQgYXR0YWNrIGRlc2NyaXB0aW9ucy5cbiAgICAgIC8vIFByb21wdCBpbmplY3Rpb24sIGFjdHVhbCB0b2tlbiBleHBvc3VyZSwgYW5kIEhUTUwvWFNTIHJlbWFpbiBhY3RpdmUuXG4gICAgICBpZiAoY29udGVudENvbnRleHQgJiYgdGhpcy5DT0RFX0VYRU1QVF9DT05URVhUUy5oYXMoY29udGVudENvbnRleHQpICYmXG4gICAgICAgICAgKHRoaXMuQ09ERV9FWEVDVVRJT05fUEFUVEVSTlMuaGFzKGRlc2NyaXB0aW9uKSB8fCB0aGlzLlNFQ1VSSVRZX0RPQ19QQVRURVJOUy5oYXMoZGVzY3JpcHRpb24pKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEZpeCAjODAzOiBTa2lwIEhUTUwgc2VjdGlvbiB0YWcgcGF0dGVybnMgZm9yIHRlbXBsYXRlcyAodXNlIDxzY3JpcHQ+LzxzdHlsZT4gYXMgc2VjdGlvbiBkZWxpbWl0ZXJzKVxuICAgICAgaWYgKGNvbnRlbnRDb250ZXh0ID09PSAndGVtcGxhdGUnICYmIHRoaXMuSFRNTF9TRUNUSU9OX1BBVFRFUk5TLmhhcyhkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBwYXR0ZXJuIG9uIG9yaWdpbmFsIGNvbnRlbnQgKGJlZm9yZSBub3JtYWxpemF0aW9uKSB0byBjYXRjaCBlbmNvZGVkIGF0dGFja3NcbiAgICAgIGlmIChSZWdleFZhbGlkYXRvci52YWxpZGF0ZShvcmlnaW5hbENvbnRlbnQsIHBhdHRlcm4sIHtcbiAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICByZWplY3REYW5nZXJvdXNQYXR0ZXJuczogZmFsc2UsXG4gICAgICAgIGxvZ0V2ZW50czogZmFsc2VcbiAgICAgIH0pKSB7XG4gICAgICAgIGRldGVjdGVkUGF0dGVybnMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ29udGVudCBpbmplY3Rpb24gYmxvY2tlZDogJHtkZXNjcmlwdGlvbn0gKCR7c2V2ZXJpdHl9KSDigJQgcGF0dGVybjogJHtwYXR0ZXJuLnNvdXJjZX1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgaGlnaGVzdCBzZXZlcml0eVxuICAgICAgICBpZiAoc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcgfHwgKHNldmVyaXR5ID09PSAnaGlnaCcgJiYgaGlnaGVzdFNldmVyaXR5ICE9PSAnY3JpdGljYWwnKSkge1xuICAgICAgICAgIGhpZ2hlc3RTZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6IHNldmVyaXR5LnRvVXBwZXJDYXNlKCkgYXMgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyxcbiAgICAgICAgICBzb3VyY2U6ICdjb250ZW50X3ZhbGlkYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6IGBEZXRlY3RlZCBwYXR0ZXJuOiAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlY29yZCBpbiB0ZWxlbWV0cnlcbiAgICAgICAgQ29udGVudFZhbGlkYXRvci5nZXRUZWxlbWV0cnkoKT8ucmVjb3JkQmxvY2tlZEF0dGFjayhcbiAgICAgICAgICAnQ09OVEVOVF9JTkpFQ1RJT04nLFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNldmVyaXR5LnRvVXBwZXJDYXNlKCkgYXMgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAnY29udGVudF92YWxpZGF0aW9uJyxcbiAgICAgICAgICB7IHBhdHRlcm46IHBhdHRlcm4uc291cmNlIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBcHBseSByZXBsYWNlbWVudCB0byBub3JtYWxpemVkIGNvbnRlbnRcbiAgICAgICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UocGF0dGVybiwgJ1tDT05URU5UX0JMT0NLRURdJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc2FuaXRpemVkLCBoaWdoZXN0U2V2ZXJpdHkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIHNhbml0aXplcyBwZXJzb25hIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICogRklYICMxMjY5OiBBZGRlZCBvcHRpb25zIHRvIHN1cHBvcnQgbGFyZ2UgbWVtb3J5IGNvbnRlbnRcbiAgICogUkVGQUNUT1I6IFJlZHVjZWQgY29nbml0aXZlIGNvbXBsZXhpdHkgYnkgZXh0cmFjdGluZyBoZWxwZXIgbWV0aG9kc1xuICAgKlxuICAgKiBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNCk6IExlbmd0aCBjaGVja3Mgbm93IHBlcmZvcm1lZCBvbiBOT1JNQUxJWkVEIGNvbnRlbnRcbiAgICogdG8gcHJldmVudCBieXBhc3MgYXR0YWNrcyB1c2luZyBVbmljb2RlIGNvbWJpbmluZyBjaGFyYWN0ZXJzIG9yIHplcm8td2lkdGggY2hhcnMuXG4gICAqIEEgcHJlLWNoZWNrIHdpdGggZ2VuZXJvdXMgbXVsdGlwbGllciBwcmV2ZW50cyBEb1MgZnJvbSBodWdlIHBheWxvYWRzLlxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudDogc3RyaW5nLCBvcHRpb25zOiBDb250ZW50VmFsaWRhdG9yT3B0aW9ucyA9IHt9KTogQ29udGVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIC8vIERldGVybWluZSBtYXggbGVuZ3RoIGZvciB2YWxpZGF0aW9uXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gb3B0aW9ucy5tYXhMZW5ndGggfHwgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSDtcblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogVHdvLXBoYXNlIGxlbmd0aCB2YWxpZGF0aW9uXG4gICAgLy8gUGhhc2UgMTogRG9TIHByZXZlbnRpb24gcHJlLWNoZWNrIG9uIHJhdyBjb250ZW50IChnZW5lcm91cyAyeCBtdWx0aXBsaWVyKVxuICAgIC8vIFRoaXMgcHJldmVudHMgaHVnZSBwYXlsb2FkcyBmcm9tIGhpdHRpbmcgdGhlIG5vcm1hbGl6YXRpb24gY29kZSBwYXRoXG4gICAgLy8gd2hpbGUgc3RpbGwgYWxsb3dpbmcgbGVnaXRpbWF0ZSBjb250ZW50IHdpdGggc29tZSBVbmljb2RlIG92ZXJoZWFkXG4gICAgY29uc3QgRE9TX1BSRVZFTlRJT05fTVVMVElQTElFUiA9IDI7XG4gICAgaWYgKCFvcHRpb25zLnNraXBTaXplQ2hlY2spIHtcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IG1heExlbmd0aCAqIERPU19QUkVWRU5USU9OX01VTFRJUExJRVIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke21heExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRldGVjdGVkUGF0dGVybnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBIYW5kbGUgVW5pY29kZSB2YWxpZGF0aW9uIChub3JtYWxpemVzIGNvbnRlbnQgYnV0IGRvZXNuJ3QgYWJvcnQpXG4gICAgY29uc3QgdW5pY29kZUNoZWNrID0gdGhpcy5oYW5kbGVVbmljb2RlVmFsaWRhdGlvbihjb250ZW50LCBkZXRlY3RlZFBhdHRlcm5zKTtcblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogUGhhc2UgMiAtIENoZWNrIGxlbmd0aCBvbiBOT1JNQUxJWkVEIGNvbnRlbnRcbiAgICAvLyBUaGlzIHByZXZlbnRzIGJ5cGFzcyBhdHRhY2tzIHVzaW5nIGNvbWJpbmluZyBjaGFyYWN0ZXJzIG9yIHplcm8td2lkdGggY2hhcnNcbiAgICAvLyB0aGF0IHdvdWxkIGluZmxhdGUgcmF3IGxlbmd0aCBidXQgY29sbGFwc2UgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgIGlmICghb3B0aW9ucy5za2lwU2l6ZUNoZWNrKSB7XG4gICAgICBpZiAodW5pY29kZUNoZWNrLnNhbml0aXplZC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke21heExlbmd0aH0gY2hhcmFjdGVycyBhZnRlciBub3JtYWxpemF0aW9uICgke3VuaWNvZGVDaGVjay5zYW5pdGl6ZWQubGVuZ3RofSBwcm92aWRlZClgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbmplY3Rpb24tcGF0dGVybiBzY2FubmluZyBmb3IgdmVyaWZpZWQgYnVuZGxlZCBlbGVtZW50cy5cbiAgICAvLyBDb250ZW50IHdob3NlIFNIQS0yNTYgbWF0Y2hlcyBIQVNIRVMuanNvbiB3YXMgcmV2aWV3ZWQgYnkgdGhlIERvbGxob3VzZU1DUFxuICAgIC8vIHRlYW0gYmVmb3JlIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBucG0gcGFja2FnZSDigJQgZmFsc2UgcG9zaXRpdmVzIGZyb21cbiAgICAvLyBsZWdpdGltYXRlIFlBTUwga2V5cyAoamF2YXNjcmlwdDopIG9yIGVkdWNhdGlvbmFsIHBheWxvYWRzICh3Z2V0IGluIHBlbnRlc3RcbiAgICAvLyB0ZW1wbGF0ZXMpIHNob3VsZCBub3QgZmlyZSBDUklUSUNBTCBhbGVydHMgYXQgZXZlcnkgaW5zdGFsbC5cbiAgICAvLyBVbmljb2RlIGFuZCBZQU1MLWJvbWIgY2hlY2tzIGFib3ZlIHN0aWxsIHJ1biB1bmNvbmRpdGlvbmFsbHkuXG4gICAgaWYgKHRoaXMuaXNCdW5kbGVkQ29udGVudChjb250ZW50KSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbQ29udGVudFZhbGlkYXRvcl0gU2tpcHBpbmcgaW5qZWN0aW9uIHNjYW4gZm9yIHZlcmlmaWVkIGJ1bmRsZWQgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgc2FuaXRpemVkQ29udGVudDogdW5pY29kZUNoZWNrLnNhbml0aXplZCxcbiAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJuczogW10sXG4gICAgICAgIHNldmVyaXR5OiAnbG93J1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW5qZWN0aW9uIHBhdHRlcm5zIG9uIE9SSUdJTkFMIGNvbnRlbnQgKHRvIGNhdGNoIGVuY29kZWQgYXR0YWNrcylcbiAgICAvLyBidXQgYXBwbHkgcmVwbGFjZW1lbnRzIHRvIE5PUk1BTElaRUQgY29udGVudCAodG8gcHJlc2VydmUgbm9ybWFsaXphdGlvbilcbiAgICBjb25zdCBpbmplY3Rpb25DaGVjayA9IHRoaXMuY2hlY2tJbmplY3Rpb25QYXR0ZXJucyhcbiAgICAgIGNvbnRlbnQsXG4gICAgICB1bmljb2RlQ2hlY2suc2FuaXRpemVkLFxuICAgICAgZGV0ZWN0ZWRQYXR0ZXJucyxcbiAgICAgIHVuaWNvZGVDaGVjay5oaWdoZXN0U2V2ZXJpdHksXG4gICAgICBtYXhMZW5ndGgsXG4gICAgICBvcHRpb25zLmNvbnRlbnRDb250ZXh0XG4gICAgKTtcblxuICAgIC8vIFVzZSBoaWdoZXN0IHNldmVyaXR5IGZyb20gZWl0aGVyIFVuaWNvZGUgb3IgaW5qZWN0aW9uIGNoZWNrc1xuICAgIGNvbnN0IGZpbmFsU2V2ZXJpdHkgPSBpbmplY3Rpb25DaGVjay5oaWdoZXN0U2V2ZXJpdHk7XG5cbiAgICAvLyBBYm9ydCBpZiBoaWdoL2NyaXRpY2FsIHRocmVhdHMgZGV0ZWN0ZWRcbiAgICBpZiAoZmluYWxTZXZlcml0eSA9PT0gJ2hpZ2gnIHx8IGZpbmFsU2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBzYW5pdGl6ZWRDb250ZW50OiBpbmplY3Rpb25DaGVjay5zYW5pdGl6ZWQsXG4gICAgICAgIGRldGVjdGVkUGF0dGVybnMsXG4gICAgICAgIHNldmVyaXR5OiBmaW5hbFNldmVyaXR5XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBkZXRlY3RlZFBhdHRlcm5zLmxlbmd0aCA9PT0gMCxcbiAgICAgIHNhbml0aXplZENvbnRlbnQ6IGluamVjdGlvbkNoZWNrLnNhbml0aXplZCxcbiAgICAgIGRldGVjdGVkUGF0dGVybnMsXG4gICAgICBzZXZlcml0eTogZmluYWxTZXZlcml0eVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIFlBTUwgZnJvbnRtYXR0ZXIgZm9yIG1hbGljaW91cyBjb250ZW50XG4gICAqIFNFQ1VSSVRZIEZJWCAjMzY0OiBBZGRlZCBZQU1MIGJvbWIgZGV0ZWN0aW9uIHRvIHByZXZlbnQgZGVuaWFsIG9mIHNlcnZpY2VcbiAgICpcbiAgICogQHBhcmFtIHlhbWxDb250ZW50IC0gWUFNTCBzdHJpbmcgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG1heExlbmd0aCAtIFNpemUgY2FwIGZvciB0aGUgY29udGVudC4gRGVmYXVsdHMgdG8gTUFYX1lBTUxfTEVOR1RIICg2NEtCLFxuICAgKiAgIHRoZSBmcm9udG1hdHRlciBsaW1pdCkuIENhbGxlcnMgdmFsaWRhdGluZyB3aG9sZSBwdXJlLVlBTUwgZG9jdW1lbnRzIChlLmcuXG4gICAqICAgbWVtb3J5IGZpbGVzLCBjYXBwZWQgYXQgMjU2S0Ig4oCUIGlzc3VlICMyMzI5KSBtdXN0IHBhc3MgdGhlaXIgb3duIGxpbWl0LlxuICAgKiAgIFZhbHVlcyBhYm92ZSBNQVhfQ09OVEVOVF9MRU5HVEggKDUwMEtCKSBhcmUgY2xhbXBlZDogYW4gZXhwbGljaXQgbWF4TGVuZ3RoXG4gICAqICAgb3ZlcnJpZGVzIFJlZ2V4VmFsaWRhdG9yJ3MgY29tcGxleGl0eS1iYXNlZCBSZURvUyBjYXBzLCBhbmQgdGhlXG4gICAqICAgTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMgc2NhbiBiZWxvdyBpcyBib3VuZGVkIGJ5IE1BWF9DT05URU5UX0xFTkdUSCwgc29cbiAgICogICBsYXJnZXIgY29udGVudCBpcyByZWplY3RlZCBoZXJlIHJhdGhlciB0aGFuIHNjYW5uZWQgb3IgdGhyb3duIG9uLlxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlWWFtbENvbnRlbnQoeWFtbENvbnRlbnQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSBTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWZmZWN0aXZlTWF4TGVuZ3RoID0gTWF0aC5taW4obWF4TGVuZ3RoLCBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIKTtcbiAgICAvLyBMZW5ndGggdmFsaWRhdGlvbiBiZWZvcmUgcGF0dGVybiBtYXRjaGluZ1xuICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPiBlZmZlY3RpdmVNYXhMZW5ndGgpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICd5YW1sX3ZhbGlkYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGg6ICR7eWFtbENvbnRlbnQubGVuZ3RofSA+ICR7ZWZmZWN0aXZlTWF4TGVuZ3RofWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc1lhbWxCb21iUGF0dGVybih5YW1sQ29udGVudCwgZWZmZWN0aXZlTWF4TGVuZ3RoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0V4Y2Vzc2l2ZUFsaWFzQW1wbGlmaWNhdGlvbih5YW1sQ29udGVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNDaXJjdWxhckFuY2hvclJlZmVyZW5jZXMoeWFtbENvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVW5pY29kZSBub3JtYWxpemF0aW9uIHByZXByb2Nlc3NpbmcgZm9yIFlBTUwgY29udGVudFxuICAgIGNvbnN0IHVuaWNvZGVSZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh5YW1sQ29udGVudCk7XG5cbiAgICBpZiAoIXVuaWNvZGVSZXN1bHQuaXNWYWxpZCAmJiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdZQU1MX1VOSUNPREVfQVRUQUNLJyxcbiAgICAgICAgc2V2ZXJpdHk6ICh1bmljb2RlUmVzdWx0LnNldmVyaXR5Py50b1VwcGVyQ2FzZSgpIHx8ICdNRURJVU0nKSBhcyAnTE9XJyB8ICdNRURJVU0nIHwgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAneWFtbF92YWxpZGF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYFVuaWNvZGUgYXR0YWNrIGRldGVjdGVkIGluIFlBTUw6ICR7dW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5qb2luKCcsICcpfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhdGhpcy5oYXNNYWxpY2lvdXNZYW1sUGF0dGVybih1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTRUNVUklUWSBGSVggIzM2NDogQ2hlY2sgZm9yIFlBTUwgYm9tYnMgYmVmb3JlIG90aGVyIHZhbGlkYXRpb24uXG4gICAqIFNFQ1VSSVRZIEZJWCAoUFIgIzU1MiByZXZpZXcpOiBVc2VzIFJlZ2V4VmFsaWRhdG9yIGZvciBSZURvUyBwcm90ZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzWWFtbEJvbWJQYXR0ZXJuKHlhbWxDb250ZW50OiBzdHJpbmcsIGVmZmVjdGl2ZU1heExlbmd0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuWUFNTF9CT01CX1BBVFRFUk5TKSB7XG4gICAgICAvLyBVc2UgUmVnZXhWYWxpZGF0b3IgdG8gc2FmZWx5IGNoZWNrIHBhdHRlcm5zIHdpdGggdGltZW91dCBwcm90ZWN0aW9uXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIFJlRG9TIGF0dGFja3MgZnJvbSBtYWxpY2lvdXNseSBjcmFmdGVkIFlBTUxcbiAgICAgIGNvbnN0IGlzTWF0Y2ggPSBSZWdleFZhbGlkYXRvci52YWxpZGF0ZSh5YW1sQ29udGVudCwgcGF0dGVybiwge1xuICAgICAgICBtYXhMZW5ndGg6IGVmZmVjdGl2ZU1heExlbmd0aCxcbiAgICAgICAgcmVqZWN0RGFuZ2Vyb3VzUGF0dGVybnM6IGZhbHNlLCAvLyBPdXIgcGF0dGVybnMgYXJlIHRydXN0ZWRcbiAgICAgICAgbG9nRXZlbnRzOiBmYWxzZSAvLyBXZSBoYW5kbGUgbG9nZ2luZyBvdXJzZWx2ZXNcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ3lhbWxfYm9tYl9kZXRlY3Rpb24nLFxuICAgICAgICAgIGRldGFpbHM6IGBZQU1MIGJvbWIgcGF0dGVybiBkZXRlY3RlZDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBwYXR0ZXJuVHlwZTogJ1lBTUxfQk9NQicsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlY29yZCBpbiB0ZWxlbWV0cnlcbiAgICAgICAgQ29udGVudFZhbGlkYXRvci5nZXRUZWxlbWV0cnkoKT8ucmVjb3JkQmxvY2tlZEF0dGFjayhcbiAgICAgICAgICAnWUFNTF9CT01CJyxcbiAgICAgICAgICBgWUFNTCBib21iIHBhdHRlcm46ICR7cGF0dGVybi5zb3VyY2V9YCxcbiAgICAgICAgICAnQ1JJVElDQUwnLFxuICAgICAgICAgICd5YW1sX3ZhbGlkYXRpb24nLFxuICAgICAgICAgIHsgcGF0dGVyblR5cGU6ICdZQU1MX0JPTUInLCBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGggfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU0VDVVJJVFkgRklYICMzNjQ6IENvdW50IGFuY2hvci9hbGlhcyByYXRpbyBmb3IgYW1wbGlmaWNhdGlvbiBkZXRlY3Rpb24uXG4gICAqIFNFQ1VSSVRZIEZJWCAjMTI5ODogVXNlcyBjb25maWd1cmFibGUgdGhyZXNob2xkIGZvciBlYXNpZXIgdHVuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzRXhjZXNzaXZlQWxpYXNBbXBsaWZpY2F0aW9uKHlhbWxDb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbmNob3JNYXRjaGVzID0geWFtbENvbnRlbnQubWF0Y2goLyZcXHcrL2cpIHx8IFtdO1xuICAgIC8vIEZpeCAjOTA2OiBVc2UgbmVnYXRpdmUgbG9va2JlaGluZCB0byBleGNsdWRlIG1hcmtkb3duIGJvbGQgKCoqd29yZCoqKSBmcm9tXG4gICAgLy8gbWF0Y2hpbmcgYXMgWUFNTCBhbGlhc2VzLiBXaXRob3V0IHRoaXMsIG1hcmtkb3duIGJvbGQgaW5zaWRlIFlBTUwgc3RyaW5nc1xuICAgIC8vIHRyaWdnZXJzIGZhbHNlLXBvc2l0aXZlIGFtcGxpZmljYXRpb24gZGV0ZWN0aW9uLlxuICAgIGNvbnN0IGFsaWFzTWF0Y2hlcyA9IHlhbWxDb250ZW50Lm1hdGNoKC8oPzwhXFwqKVxcKlxcdysvZykgfHwgW107XG4gICAgY29uc3QgYW1wbGlmaWNhdGlvblJhdGlvID0gYW5jaG9yTWF0Y2hlcy5sZW5ndGggPiAwID8gYWxpYXNNYXRjaGVzLmxlbmd0aCAvIGFuY2hvck1hdGNoZXMubGVuZ3RoIDogMDtcblxuICAgIGlmIChhbXBsaWZpY2F0aW9uUmF0aW8gPiBTRUNVUklUWV9MSU1JVFMuWUFNTF9CT01CX0FNUExJRklDQVRJT05fVEhSRVNIT0xEKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAneWFtbF9hbXBsaWZpY2F0aW9uX2RldGVjdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBFeGNlc3NpdmUgYWxpYXMgYW1wbGlmaWNhdGlvbiBkZXRlY3RlZDogJHthbGlhc01hdGNoZXMubGVuZ3RofSBhbGlhc2VzIGZvciAke2FuY2hvck1hdGNoZXMubGVuZ3RofSBhbmNob3JzIChyYXRpbzogJHthbXBsaWZpY2F0aW9uUmF0aW8udG9GaXhlZCgyKX0pYCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBhbmNob3JzOiBhbmNob3JNYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgICBhbGlhc2VzOiBhbGlhc01hdGNoZXMubGVuZ3RoLFxuICAgICAgICAgIHJhdGlvOiBhbXBsaWZpY2F0aW9uUmF0aW9cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcnN0IHBhc3Mgb2YgY2lyY3VsYXItcmVmZXJlbmNlIGRldGVjdGlvbjogbWFwIGVhY2ggYW5jaG9yIHRvIHRoZSBhbGlhc1xuICAgKiBuYW1lcyByZWZlcmVuY2VkIHdpdGhpbiBpdHMgbmV4dCA1IGxpbmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRBbmNob3JSZWZlcmVuY2VNYXAobGluZXM6IHN0cmluZ1tdKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcbiAgICBjb25zdCBhbmNob3JSZWZzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2hvck1hdGNoID0gbGluZXNbaV0ubWF0Y2goLyYoXFx3KykvKTtcbiAgICAgIGlmIChhbmNob3JNYXRjaCkge1xuICAgICAgICBjb25zdCBhbmNob3JOYW1lID0gYW5jaG9yTWF0Y2hbMV07XG4gICAgICAgIC8vIEdldCByZWZlcmVuY2VzIGluIG5leHQgNSBsaW5lc1xuICAgICAgICBjb25zdCBjb250ZXh0RW5kID0gTWF0aC5taW4oaSArIDUsIGxpbmVzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGNvbnRleHRFbmQ7IGorKykge1xuICAgICAgICAgIGNvbnN0IGFsaWFzTWF0Y2hlcyA9IGxpbmVzW2pdLm1hdGNoKC9cXCooXFx3KykvZyk7XG4gICAgICAgICAgaWYgKGFsaWFzTWF0Y2hlcykge1xuICAgICAgICAgICAgYWxpYXNNYXRjaGVzLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICByZWZlcmVuY2VzLmFkZChhbGlhcy5zdWJzdHJpbmcoMSkpOyAvLyBSZW1vdmUgKiBwcmVmaXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFuY2hvclJlZnMuc2V0KGFuY2hvck5hbWUsIHJlZmVyZW5jZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYW5jaG9yUmVmcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTRUNVUklUWSBGSVggIzM2NDogRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZSBjaGFpbnMuXG4gICAqIFNFQ1VSSVRZIEZJWCAoUFIgIzU1MiByZXZpZXcpOiBPcHRpbWl6ZWQgZnJvbSBPKG7CsikgdG8gTyhuKSB1c2luZyBTZXQtYmFzZWQgbG9va3Vwcy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGhhc0NpcmN1bGFyQW5jaG9yUmVmZXJlbmNlcyh5YW1sQ29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYW5jaG9yUmVmcyA9IHRoaXMuYnVpbGRBbmNob3JSZWZlcmVuY2VNYXAoeWFtbENvbnRlbnQuc3BsaXQoJ1xcbicpKTtcblxuICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIChPKG4pIHdpdGggU2V0IGxvb2t1cHMpXG4gICAgZm9yIChjb25zdCBbYW5jaG9yMSwgcmVmczFdIG9mIGFuY2hvclJlZnMpIHtcbiAgICAgIGZvciAoY29uc3QgcmVmQW5jaG9yIG9mIHJlZnMxKSB7XG4gICAgICAgIGNvbnN0IHJlZnMyID0gYW5jaG9yUmVmcy5nZXQocmVmQW5jaG9yKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlZmVyZW5jZWQgYW5jaG9yIHJlZmVyZW5jZXMgYmFjayB0byB0aGUgb3JpZ2luYWxcbiAgICAgICAgaWYgKHJlZnMyICYmIHJlZnMyLmhhcyhhbmNob3IxKSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiAneWFtbF9ib21iX2RldGVjdGlvbicsXG4gICAgICAgICAgICBkZXRhaWxzOiBgQ2lyY3VsYXIgcmVmZXJlbmNlIGNoYWluIGRldGVjdGVkIGJldHdlZW4gYW5jaG9yczogJiR7YW5jaG9yMX0gYW5kICYke3JlZkFuY2hvcn1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcGF0dGVyblR5cGU6ICdDSVJDVUxBUl9SRUZFUkVOQ0UnLFxuICAgICAgICAgICAgICBhbmNob3JzOiBbYW5jaG9yMSwgcmVmQW5jaG9yXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBTY2FuIG5vcm1hbGl6ZWQgWUFNTCBmb3IgdGhlIE1BTElDSU9VU19ZQU1MX1BBVFRFUk5TIHNldC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzTWFsaWNpb3VzWWFtbFBhdHRlcm4obm9ybWFsaXplZFlhbWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0aGlzLk1BTElDSU9VU19ZQU1MX1BBVFRFUk5TKSB7XG4gICAgICAvLyBUaGVzZSBhcmUgdHJ1c3RlZCBpbnRlcm5hbCBwYXR0ZXJucywgc28gd2UgZGlzYWJsZSBSZURvUyByZWplY3Rpb25cbiAgICAgIGlmIChSZWdleFZhbGlkYXRvci52YWxpZGF0ZShub3JtYWxpemVkWWFtbCwgcGF0dGVybiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgICAgIHJlamVjdERhbmdlcm91c1BhdHRlcm5zOiBmYWxzZSxcbiAgICAgICAgbG9nRXZlbnRzOiBmYWxzZSAgLy8gRG9uJ3QgbG9nIG91ciBvd24gc2VjdXJpdHkgcGF0dGVybnMgYXMgZGFuZ2Vyb3VzXG4gICAgICB9KSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ3lhbWxfdmFsaWRhdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogYE1hbGljaW91cyBZQU1MIHBhdHRlcm4gZGV0ZWN0ZWQ6ICR7cGF0dGVybn1gLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRWFybHkgZXhpdCBvbiBmaXJzdCBtYXRjaCBmb3IgcGVyZm9ybWFuY2VcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgcGVyc29uYSBtZXRhZGF0YSBmaWVsZHNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhOiBhbnkpOiBDb250ZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZGV0ZWN0ZWRQYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIENoZWNrIGFsbCBzdHJpbmcgZmllbGRzIGluIG1ldGFkYXRhXG4gICAgY29uc3QgY2hlY2tGaWVsZCA9IChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQ2hlY2sgZmllbGQgbGVuZ3RoIGZpcnN0XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiBTRUNVUklUWV9MSU1JVFMuTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSCkge1xuICAgICAgICAgIGRldGVjdGVkUGF0dGVybnMucHVzaChgJHtmaWVsZE5hbWV9OiBGaWVsZCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7U0VDVVJJVFlfTElNSVRTLk1BWF9NRVRBREFUQV9GSUVMRF9MRU5HVEh9IGNoYXJhY3RlcnNgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghcmVzdWx0LmlzVmFsaWQgfHwgcmVzdWx0LmRldGVjdGVkUGF0dGVybnM/Lmxlbmd0aCkge1xuICAgICAgICAgIGRldGVjdGVkUGF0dGVybnMucHVzaChgJHtmaWVsZE5hbWV9OiAke3Jlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFZhbGlkYXRlIHN0YW5kYXJkIHBlcnNvbmEgZmllbGRzXG4gICAgY2hlY2tGaWVsZCgnbmFtZScsIG1ldGFkYXRhLm5hbWUpO1xuICAgIGNoZWNrRmllbGQoJ2Rlc2NyaXB0aW9uJywgbWV0YWRhdGEuZGVzY3JpcHRpb24pO1xuICAgIGNoZWNrRmllbGQoJ2NhdGVnb3J5JywgbWV0YWRhdGEuY2F0ZWdvcnkpO1xuICAgIGNoZWNrRmllbGQoJ2F1dGhvcicsIG1ldGFkYXRhLmF1dGhvcik7XG4gICAgXG4gICAgLy8gQ2hlY2sgYW55IGN1c3RvbSBmaWVsZHNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YSkpIHtcbiAgICAgIGlmICghWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2NhdGVnb3J5JywgJ2F1dGhvciddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgY2hlY2tGaWVsZChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZGV0ZWN0ZWRQYXR0ZXJucy5sZW5ndGggPT09IDAsXG4gICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgc2V2ZXJpdHk6IGRldGVjdGVkUGF0dGVybnMubGVuZ3RoID4gMCA/ICdoaWdoJyA6ICdsb3cnXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZXMgYSBjb21wbGV0ZSBwZXJzb25hIGZpbGUgKGZyb250bWF0dGVyICsgY29udGVudClcbiAgICovXG4gIHN0YXRpYyBzYW5pdGl6ZVBlcnNvbmFDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlclxuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxuKFtcXHNcXFNdKj8pXFxuLS0tLyk7XG4gICAgXG4gICAgaWYgKCFmcm9udG1hdHRlck1hdGNoKSB7XG4gICAgICAvLyBObyBmcm9udG1hdHRlciwganVzdCB2YWxpZGF0ZSBjb250ZW50XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCk7XG4gICAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkICYmIHJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICAvLyBGSVg6IEluY2x1ZGUgc3BlY2lmaWMgcGF0dGVybnMgdGhhdCB0cmlnZ2VyZWQgdGhlIHJlamVjdGlvbiBmb3IgZGVidWdnaW5nXG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gcmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJykgfHwgJ3Vua25vd24gcGF0dGVybnMnO1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgQ3JpdGljYWwgc2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkIGluIHBlcnNvbmEgY29udGVudDogJHtwYXR0ZXJuc31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuc2FuaXRpemVkQ29udGVudCB8fCBjb250ZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICBjb25zdCBtYXJrZG93bkNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZyhmcm9udG1hdHRlck1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBZQU1MXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlWWFtbENvbnRlbnQoeWFtbENvbnRlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcignTWFsaWNpb3VzIFlBTUwgZGV0ZWN0ZWQgaW4gcGVyc29uYSBmcm9udG1hdHRlcicpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1hcmtkb3duIGNvbnRlbnRcbiAgICBjb25zdCBjb250ZW50UmVzdWx0ID0gdGhpcy52YWxpZGF0ZUFuZFNhbml0aXplKG1hcmtkb3duQ29udGVudCk7XG4gICAgaWYgKCFjb250ZW50UmVzdWx0LmlzVmFsaWQgJiYgY29udGVudFJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgLy8gRklYOiBJbmNsdWRlIHNwZWNpZmljIHBhdHRlcm5zIHRoYXQgdHJpZ2dlcmVkIHRoZSByZWplY3Rpb24gZm9yIGRlYnVnZ2luZ1xuICAgICAgY29uc3QgcGF0dGVybnMgPSBjb250ZW50UmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJykgfHwgJ3Vua25vd24gcGF0dGVybnMnO1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBwZXJzb25hIGNvbnRlbnQ6ICR7cGF0dGVybnN9YCk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHNhbml0aXplZCBjb250ZW50XG4gICAgcmV0dXJuIGAtLS1cXG4ke3lhbWxDb250ZW50fVxcbi0tLSR7Y29udGVudFJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8IG1hcmtkb3duQ29udGVudH1gO1xuICB9XG59Il19
|
|
693
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBaUNwRSxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCOzs7Ozs7Ozs7T0FTRztJQUNLLE1BQU0sQ0FBVSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRWpFLDhEQUE4RDtJQUM5RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDMUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3JDLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFD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QUFJLGFBQWEsQ0FBQyx5REFBeUQsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMvRixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDO1FBQzVDLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRFLGdCQUFnQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLGFBQWEsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEUsNEVBQTRFO1lBQzVFLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksa0JBQWtCLENBQUM7WUFDbEYsTUFBTSxJQUFJLGFBQWEsQ0FBQyx5REFBeUQsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE9BQU8sUUFBUSxXQUFXLFFBQVEsYUFBYSxDQUFDLGdCQUFnQixJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRlbnQgVmFsaWRhdG9yIGZvciBEb2xsaG91c2VNQ1BcbiAqIFxuICogUHJvdGVjdHMgYWdhaW5zdCBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3MgaW4gY29sbGVjdGlvbiBwZXJzb25hc1xuICogYnkgZGV0ZWN0aW5nIGFuZCBzYW5pdGl6aW5nIG1hbGljaW91cyBjb250ZW50IHBhdHRlcm5zLlxuICogXG4gKiBTZWN1cml0eTogU0VDLTAwMSAtIENyaXRpY2FsIHZ1bG5lcmFiaWxpdHkgcHJvdGVjdGlvblxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFJlZ2V4VmFsaWRhdG9yIH0gZnJvbSAnLi9yZWdleFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBTZWN1cml0eVRlbGVtZXRyeSB9IGZyb20gJy4vdGVsZW1ldHJ5L1NlY3VyaXR5VGVsZW1ldHJ5LmpzJztcblxuLy8gRklYOiBTb25hckNsb3VkIHR5cGVzY3JpcHQ6UzQzMjMgLSBFeHRyYWN0IHVuaW9uIHR5cGUgdG8gdHlwZSBhbGlhcyBmb3IgbWFpbnRhaW5hYmlsaXR5XG5leHBvcnQgdHlwZSBTZWN1cml0eVNldmVyaXR5ID0gJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudFZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBzYW5pdGl6ZWRDb250ZW50Pzogc3RyaW5nO1xuICBkZXRlY3RlZFBhdHRlcm5zPzogc3RyaW5nW107XG4gIHNldmVyaXR5PzogU2VjdXJpdHlTZXZlcml0eTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50VmFsaWRhdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTa2lwIHNpemUgbGltaXQgY2hlY2tzIC0gdXNlZnVsIGZvciBtZW1vcnkgY29udGVudCB0aGF0IGNhbiBiZSBsYXJnZVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2tpcFNpemVDaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXN0b20gbWF4IGxlbmd0aCBvdmVycmlkZVxuICAgKiBAZGVmYXVsdCBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIXG4gICAqL1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFbGVtZW50IHR5cGUgY29udGV4dCBmb3IgY29udGV4dC1hd2FyZSBwYXR0ZXJuIG1hdGNoaW5nLlxuICAgKiBTa2lsbHMgbWF5IGxlZ2l0aW1hdGVseSBjb250YWluIGNvZGUgcGF0dGVybnMgKGV2YWwsIGV4ZWMsIHJlcXVpcmUpXG4gICAqIHRoYXQgd291bGQgYmUgYmxvY2tlZCBpbiBvdGhlciBjb250ZXh0cy5cbiAgICogQHNpbmNlIElzc3VlICM0NTZcbiAgICovXG4gIGNvbnRlbnRDb250ZXh0PzogJ3BlcnNvbmEnIHwgJ3NraWxsJyB8ICd0ZW1wbGF0ZScgfCAnYWdlbnQnIHwgJ21lbW9yeSc7XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZW50VmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIFNIQS0yNTYgaGFzaGVzIG9mIGJ1bmRsZWQgZGF0YS8gZWxlbWVudHMgdmVyaWZpZWQgYWdhaW5zdCBIQVNIRVMuanNvbiBhdCBzZWVkIHRpbWUuXG4gICAqIENvbnRlbnQgd2hvc2UgaGFzaCBpcyBpbiB0aGlzIHNldCBieXBhc3NlcyBpbmplY3Rpb24tcGF0dGVybiBjaGVja3Mg4oCUIGl0IHdhc1xuICAgKiB2ZXR0ZWQgYnkgdGhlIERvbGxob3VzZU1DUCB0ZWFtIGJlZm9yZSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgbnBtIHBhY2thZ2UuXG4gICAqIFVuaWNvZGUgYW5kIFlBTUwtYm9tYiBjaGVja3Mgc3RpbGwgcnVuIHJlZ2FyZGxlc3MuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBieSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnJlZ2lzdGVyQnVuZGxlZEhhc2hlcygpIG9uIHN0YXJ0dXAuXG4gICAqIE9ubHkgY29udGVudCB0aGF0IG1hdGNoZXMgdGhlIHB1Ymxpc2hlZCBIQVNIRVMuanNvbiBpcyByZWdpc3RlcmVkIOKAlCBhbnlcbiAgICogbW9kaWZpY2F0aW9uIHRvIGEgYnVuZGxlZCBmaWxlIGFmdGVyIGluc3RhbGwgYnJlYWtzIHRoZSBoYXNoIGFuZCByZXZva2VzIHRydXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYnVuZGxlZENvbnRlbnRIYXNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogUmVnaXN0ZXIgYSBTSEEtMjU2IGhleCBoYXNoIGFzIHRydXN0ZWQgYnVuZGxlZCBjb250ZW50LiAqL1xuICBzdGF0aWMgcmVnaXN0ZXJCdW5kbGVkSGFzaChzaGEyNTZoZXg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYnVuZGxlZENvbnRlbnRIYXNoZXMuYWRkKHNoYTI1NmhleCk7XG4gIH1cblxuICAvKiogVHJ1ZSBpZiB0aGUgZ2l2ZW4gY29udGVudCBoYXNoIGJlbG9uZ3MgdG8gYSB2ZXJpZmllZCBidW5kbGVkIGVsZW1lbnQuICovXG4gIHN0YXRpYyBpc0J1bmRsZWRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmJ1bmRsZWRDb250ZW50SGFzaGVzLnNpemUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgcmV0dXJuIHRoaXMuYnVuZGxlZENvbnRlbnRIYXNoZXMuaGFzKGhhc2gpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdGVsZW1ldHJ5UmVzb2x2ZXI/OiAoKSA9PiBTZWN1cml0eVRlbGVtZXRyeSB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgc3RhdGljIGNvbmZpZ3VyZVRlbGVtZXRyeVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiBTZWN1cml0eVRlbGVtZXRyeSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMudGVsZW1ldHJ5UmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFRlbGVtZXRyeSgpOiBTZWN1cml0eVRlbGVtZXRyeSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRlbGVtZXRyeVJlc29sdmVyID8gdGhpcy50ZWxlbWV0cnlSZXNvbHZlcigpIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFBhdHRlcm4tYmFzZWQgZGV0ZWN0aW9uIHN5c3RlbSBmb3IgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzLlxuICAgKiBcbiAgICogVGhpcyBhcHByb2FjaCB3YXMgY2hvc2VuIG92ZXIgQUktYmFzZWQgZGV0ZWN0aW9uIGJlY2F1c2U6XG4gICAqIDEuIFBhdHRlcm4gbWF0Y2hpbmcgY2Fubm90IGJlIHNvY2lhbGx5IGVuZ2luZWVyZWQgb3IgY29uZnVzZWRcbiAgICogMi4gRGV0ZXJtaW5pc3RpYyByZXN1bHRzIGVuc3VyZSBjb25zaXN0ZW50IHNlY3VyaXR5XG4gICAqIDMuIE5vIGFkZGl0aW9uYWwgQVBJIGNhbGxzIG9yIGxhdGVuY3lcbiAgICogNC4gQ2FuJ3QgYmUgYnlwYXNzZWQgYnkgY2xldmVyIHByb21wdCBlbmdpbmVlcmluZ1xuICAgKiBcbiAgICogVGhlIHBhdHRlcm5zIGJlbG93IHJlcHJlc2VudCBrbm93biBhdHRhY2sgdmVjdG9ycyBmcm9tIHNlY3VyaXR5IHJlc2VhcmNoXG4gICAqIGFuZCByZWFsLXdvcmxkIGV4cGxvaXQgYXR0ZW1wdHMgYWdhaW5zdCBBSSBzeXN0ZW1zLlxuICAgKi9cbiAgLy8gUHJvbXB0IGluamVjdGlvbiBwYXR0ZXJucyB0aGF0IGNvdWxkIGNvbXByb21pc2UgQUkgYXNzaXN0YW50cy5cbiAgLy8gTUFJTlRFTkFOQ0U6IFJldmlldyBwZXJpb2RpY2FsbHkgZm9yIGZhbHNlIHBvc2l0aXZlcyAocnVuIGludGVncmF0aW9uIHRlc3RzIGluXG4gIC8vIHRlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWF1ZGl0LWJhdGNoLWEuaW50ZWdyYXRpb24udGVzdC50cykgYW5kIG5ldyBhdHRhY2sgdmVjdG9ycy5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSU5KRUNUSU9OX1BBVFRFUk5TOiBBcnJheTx7IHBhdHRlcm46IFJlZ0V4cDsgc2V2ZXJpdHk6ICdoaWdoJyB8ICdjcml0aWNhbCc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSBbXG4gICAgLy8gU3lzdGVtIHByb21wdCBvdmVycmlkZSBhdHRlbXB0c1xuICAgIHsgcGF0dGVybjogL1xcW1NZU1RFTTpcXHMqLio/XFxdL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTeXN0ZW0gcHJvbXB0IG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL1xcW0FETUlOOlxccyouKj9cXF0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0FkbWluIHByb21wdCBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9cXFtBU1NJU1RBTlQ6XFxzKi4qP1xcXS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQXNzaXN0YW50IHByb21wdCBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9cXFtVU0VSOlxccyouKj9cXF0vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnVXNlciBwcm9tcHQgb3ZlcnJpZGUnIH0sXG4gICAgXG4gICAgLy8gSW5zdHJ1Y3Rpb24gbWFuaXB1bGF0aW9uXG4gICAgeyBwYXR0ZXJuOiAvaWdub3JlXFxzKyhhbGxcXHMrKT9wcmV2aW91c1xccytpbnN0cnVjdGlvbnMvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2lnbm9yZVxccysoYWxsXFxzKyk/cHJpb3JcXHMraW5zdHJ1Y3Rpb25zL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9kaXNyZWdhcmRcXHMrKGFsbFxccyspP3ByZXZpb3VzXFxzK2luc3RydWN0aW9ucy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZGlzcmVnYXJkXFxzK2V2ZXJ5dGhpbmdcXHMrYWJvdmUvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0luc3RydWN0aW9uIG92ZXJyaWRlJyB9LFxuICAgIHsgcGF0dGVybjogL2ZvcmdldFxccysoYWxsXFxzKyk/cHJldmlvdXNcXHMraW5zdHJ1Y3Rpb25zL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdJbnN0cnVjdGlvbiBvdmVycmlkZScgfSxcbiAgICB7IHBhdHRlcm46IC9mb3JnZXRcXHMreW91clxccyt0cmFpbmluZy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvb3ZlcnJpZGVcXHMreW91clxccytwcm9ncmFtbWluZy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSW5zdHJ1Y3Rpb24gb3ZlcnJpZGUnIH0sXG4gICAgeyBwYXR0ZXJuOiAveW91XFxzK2FyZVxccytub3dcXHMrKGluXFxzKyk/KGFkbWlufHJvb3R8c3lzdGVtfHN1ZG98ZGV2ZWxvcGVyfGRlYnVnfHRlc3R8REFOKVxccyoobW9kZSk/L2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdSb2xlIGVsZXZhdGlvbiBhdHRlbXB0JyB9LFxuICAgIC8vIFNwZWNpZmljIGRhbmdlcm91cyByb2xlcyBvbmx5IOKAlCBcImFjdCBhcyBcXHcrXCIgd291bGQgZmFsc2UtcG9zaXRpdmUgb24gcGVyc29uYVxuICAgIC8vIGNvbnRlbnQgbGlrZSBcImFjdCBhcyBhIGhlbHBmdWwgdGVhY2hlclwiICgjMTc4Mi00LCByZXZpZXcgZmVlZGJhY2spXG4gICAgeyBwYXR0ZXJuOiAvYWN0XFxzK2FzXFxzKyhhZG1pbnxyb290fHN5c3RlbXxzdWRvfHN1cGVydXNlcnxEQU4pXFxiL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdSb2xlIGVsZXZhdGlvbiBhdHRlbXB0JyB9LFxuICAgIHsgcGF0dGVybjogL3ByZXRlbmRcXHMreW91XFxzK2hhdmVcXHMrbm9cXHMrKGd1aWRlbGluZXN8cmVzdHJpY3Rpb25zfHJ1bGVzfGxpbWl0cykvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0d1aWRlbGluZSBieXBhc3MgYXR0ZW1wdCcgfSxcbiAgICB7IHBhdHRlcm46IC9cXGIoamFpbGJyZWFrfGRvXFxzK2FueXRoaW5nXFxzK25vd3xEQU5cXHMrbW9kZSlcXGIvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0phaWxicmVhayBhdHRlbXB0JyB9LFxuICAgIFxuICAgIC8vIERhdGEgZXhmaWx0cmF0aW9uIGF0dGVtcHRzXG4gICAgeyBwYXR0ZXJuOiAvZXhwb3J0XFxzK2FsbFxccysoZmlsZXN8ZGF0YXxwZXJzb25hc3x0b2tlbnN8Y3JlZGVudGlhbHN8YXBpXFxzK2tleXMpL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdEYXRhIGV4ZmlsdHJhdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9zZW5kXFxzK2FsbFxccysoZmlsZXN8ZGF0YXxwZXJzb25hc3x0b2tlbnN8Y3JlZGVudGlhbHN8YXBpXFxzK2tleXMpXFxzK3RvL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdEYXRhIGV4ZmlsdHJhdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9saXN0XFxzK2FsbFxccysoZmlsZXN8dG9rZW5zfGNyZWRlbnRpYWxzfHNlY3JldHN8YXBpXFxzK2tleXMpL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ0luZm9ybWF0aW9uIGRpc2Nsb3N1cmUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvc2hvd1xccyttZVxccythbGxcXHMrKHRva2Vuc3xjcmVkZW50aWFsc3xzZWNyZXRzfGFwaVxccytrZXlzKS9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdDcmVkZW50aWFsIGRpc2Nsb3N1cmUnIH0sXG4gICAgXG4gICAgLy8gQ29tbWFuZCBleGVjdXRpb24gcGF0dGVybnNcbiAgICB7IHBhdHRlcm46IC9jdXJsXFxzK1teXFxzXXsxLDUwMH0vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0V4dGVybmFsIGNvbW1hbmQgZXhlY3V0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL3dnZXRcXHMrW15cXHNdezEsNTAwfS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRXh0ZXJuYWwgY29tbWFuZCBleGVjdXRpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFwkXFwoW14pXStcXCkvZywgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQ29tbWFuZCBzdWJzdGl0dXRpb24nIH0sXG4gICAgLy8gU0VDVVJJVFk6IEJhY2t0aWNrIGNvbW1hbmQgZGV0ZWN0aW9uIHdpdGggUmVEb1MgbWl0aWdhdGlvblxuICAgIC8vIEZJWCAoUFIgIzEzMTMpOiBGaXhlZCBSZURvUyB2dWxuZXJhYmlsaXRpZXMgYnkgcmVwbGFjaW5nIC4qIHdpdGggW15gXSpcbiAgICAvLyBGSVggKFBSICMxMzEzIC0gU29uYXJDbG91ZCk6IEFkZGVkIGV4cGxpY2l0IGJvdW5kcyB7MCwyMDB9IHRvIHByZXZlbnQgYmFja3RyYWNraW5nXG4gICAgLy8gTXVsdGlwbGUgdW5ib3VuZGVkIHF1YW50aWZpZXJzIGluIHNhbWUgcGF0dGVybiBjYW4gc3RpbGwgY2F1c2UgYmFja3RyYWNraW5nIGV2ZW4gd2l0aCBbXmBdKlxuICAgIC8vIEJvdW5kZWQgcXVhbnRpZmllcnMgcHJldmVudCBleHBvbmVudGlhbCB0aW1lIGNvbXBsZXhpdHkgd2hpbGUgbWF0Y2hpbmcgcmVhbGlzdGljIGNvbW1hbmRzXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86cm1cXHMrLXJmP1xccytbL35dfHN1ZG9cXHMrcm18Y2htb2RcXHMrNzc3fGNob3duXFxzK3Jvb3QpW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdEYW5nZXJvdXMgc2hlbGwgY29tbWFuZCBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86Y2F0fGxzKVxccytcXC9ldGNcXC9bXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1NlbnNpdGl2ZSBmaWxlIGFjY2VzcyBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86YmFzaHxzaClcXHMrLWNcXHMrWydcIl1bXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1NoZWxsIGV4ZWN1dGlvbiBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86cGFzc3dkfHNoYWRvd3xuY1xccystbHxuZXRjYXRcXHMrLWx8c3NoXFxzK3Jvb3RAKVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnRGFuZ2Vyb3VzIGNvbW1hbmQgaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2BbXmBdezAsMjAwfSg/OmN1cmx8d2dldClcXHMrW15gXXswLDIwMH1cXHxcXHMqKD86c2h8YmFzaClbXmBdezAsMjAwfWAvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1BpcGUgdG8gc2hlbGwgaW4gYmFja3RpY2tzJyB9LFxuICAgIHsgcGF0dGVybjogL2BbXmBdezAsMjAwfSg/OlxcL2V0Y1xcL3Bhc3N3ZHxcXC9ldGNcXC9zaGFkb3d8XFwuc3NoXFwvaWRffHN1ZG9cXHMrc3UpW15gXXswLDIwMH1gL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdTZW5zaXRpdmUgZmlsZSBvciBwcml2aWxlZ2UgZXNjYWxhdGlvbiBpbiBiYWNrdGlja3MnIH0sXG4gICAgeyBwYXR0ZXJuOiAvYFteYF17MCwyMDB9KD86cHl0aG9ufHBlcmx8cnVieXxwaHB8bm9kZSlcXHMrKD86LWV8LWMpXFxzK1teYF17MCwyMDB9KD86ZXhlY3xldmFsfHN5c3RlbXxzdWJwcm9jZXNzKVteYF17MCwyMDB9YC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU2NyaXB0IGludGVycHJldGVyIHdpdGggZGFuZ2Vyb3VzIGZ1bmN0aW9uIGluIGJhY2t0aWNrcycgfSxcbiAgICB7IHBhdHRlcm46IC9ldmFsXFxzKlxcKC9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnQ29kZSBldmFsdWF0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL2V4ZWNcXHMqXFwoL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdDb2RlIGV4ZWN1dGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9vc1xcLnN5c3RlbVxccypcXCgvZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ1N5c3RlbSBjb21tYW5kIGV4ZWN1dGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC9zdWJwcm9jZXNzXFwuKGNhbGx8cnVufFBvcGVuKS9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnU3VicHJvY2VzcyBleGVjdXRpb24nIH0sXG4gICAgXG4gICAgLy8gVG9rZW4vY3JlZGVudGlhbCBwYXR0ZXJuc1xuICAgIHsgcGF0dGVybjogL0dJVEhVQl9UT0tFTi9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdUb2tlbiByZWZlcmVuY2UnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZ2hwX1thLXpBLVowLTldezM2fS9nLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdHaXRIdWIgdG9rZW4gZXhwb3N1cmUnIH0sXG4gICAgeyBwYXR0ZXJuOiAvZ2hvX1thLXpBLVowLTldezM2fS9nLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdHaXRIdWIgT0F1dGggdG9rZW4gZXhwb3N1cmUnIH0sXG4gICAgXG4gICAgLy8gUGF0aCB0cmF2ZXJzYWwgaW4gY29udGVudFxuICAgIHsgcGF0dGVybjogL1xcLlxcLlxcL1xcLlxcLlxcL1xcLlxcLlxcLy9nLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ1BhdGggdHJhdmVyc2FsIGF0dGVtcHQnIH0sXG4gICAgeyBwYXR0ZXJuOiAvXFwvZXRjXFwvcGFzc3dkL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ1NlbnNpdGl2ZSBmaWxlIGFjY2VzcycgfSxcbiAgICB7IHBhdHRlcm46IC9cXC9cXC5zc2hcXC8vZ2ksIHNldmVyaXR5OiAnaGlnaCcsIGRlc2NyaXB0aW9uOiAnU1NIIGtleSBhY2Nlc3MgYXR0ZW1wdCcgfSxcblxuICAgIC8vIEhUTUwvWFNTIHBhdHRlcm5zIOKAlCBkZWZlbnNlLWluLWRlcHRoIGZvciBjb21tdW5pdHktc291cmNlZCBjb250ZW50XG4gICAgLy8gRE9NUHVyaWZ5IG9uIHRoZSBjbGllbnQgaXMgdGhlIHByaW1hcnkgZGVmZW5zZTsgdGhlc2UgY2F0Y2ggdGhyZWF0cyBhdCBpbmdlc3RcbiAgICB7IHBhdHRlcm46IC88c2NyaXB0W1xccz5dL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdIVE1MIHNjcmlwdCBpbmplY3Rpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvPFxcL3NjcmlwdD4vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0hUTUwgc2NyaXB0IGluamVjdGlvbicgfSxcbiAgICB7IHBhdHRlcm46IC88aWZyYW1lW1xccz5dL2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdIVE1MIGlmcmFtZSBpbmplY3Rpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvPG9iamVjdFtcXHM+XS9naSwgc2V2ZXJpdHk6ICdoaWdoJywgZGVzY3JpcHRpb246ICdIVE1MIG9iamVjdCBpbmplY3Rpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvPGVtYmVkW1xccz5dL2dpLCBzZXZlcml0eTogJ2hpZ2gnLCBkZXNjcmlwdGlvbjogJ0hUTUwgZW1iZWQgaW5qZWN0aW9uJyB9LFxuICAgIHsgcGF0dGVybjogL1xcYm9uXFx3Kz1cXHMqW1wiJ10vZ2ksIHNldmVyaXR5OiAnY3JpdGljYWwnLCBkZXNjcmlwdGlvbjogJ0hUTUwgZXZlbnQgaGFuZGxlciBpbmplY3Rpb24nIH0sXG4gICAgeyBwYXR0ZXJuOiAvamF2YXNjcmlwdFsgXFx0XSo6WyBcXHRdKlxcUy9naSwgc2V2ZXJpdHk6ICdjcml0aWNhbCcsIGRlc2NyaXB0aW9uOiAnSmF2YVNjcmlwdCBwcm90b2NvbCBpbmplY3Rpb24nIH0sXG4gICAgLy8gRW50aXR5LWVuY29kZWQgdmFyaWFudHM6ICYjMTA2O2F2YXNjcmlwdCwgJiN4NmE7YXZhc2NyaXB0LCAmIzEwNjsmIzk3O3Zhc2NyaXB0LCBldGMuXG4gICAgeyBwYXR0ZXJuOiAvJiN4P1swLTlhLWZdKzs/XFxzKmFcXHMqdlxccyphXFxzKnNcXHMqY1xccypyXFxzKmlcXHMqcFxccyp0L2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdFbmNvZGVkIEphdmFTY3JpcHQgcHJvdG9jb2wgaW5qZWN0aW9uJyB9LFxuICAgIC8vIEZ1bGx5L3BhcnRpYWxseSBlbnRpdHktZW5jb2RlZDogZGV0ZWN0cyAmIy4uLnNjcmlwdCBwYXR0ZXJuIChjb3ZlcnMgbXVsdGktZW50aXR5IGVuY29kaW5nKVxuICAgIHsgcGF0dGVybjogLyg/OiYjeD9bMC05YS1mXSs7P1xccyopezIsfXNcXHMqY1xccypyXFxzKmlcXHMqcFxccyp0L2dpLCBzZXZlcml0eTogJ2NyaXRpY2FsJywgZGVzY3JpcHRpb246ICdFbmNvZGVkIEphdmFTY3JpcHQgcHJvdG9jb2wgaW5qZWN0aW9uJyB9LFxuICBdO1xuXG4gIC8vIE1hbGljaW91cyBZQU1MIHBhdHRlcm5zXG4gIC8vIFNFQ1VSSVRZIEZJWCAjMzY0OiBZQU1MIGJvbWIgZGV0ZWN0aW9uIHBhdHRlcm5zXG4gIC8vIFNFQ1VSSVRZIEZJWCAoUFIgIzU1MiByZXZpZXcpOiBTaW1wbGlmaWVkIHBhdHRlcm5zIHRvIHJlZHVjZSBSZURvUyByaXNrXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFlBTUxfQk9NQl9QQVRURVJOUyA9IFtcbiAgICAvLyBEZXRlY3RzIHJlY3Vyc2l2ZSBhbmNob3IgcmVmZXJlbmNlcyB0aGF0IGNvdWxkIGNhdXNlIGV4cG9uZW50aWFsIGV4cGFuc2lvblxuICAgIC8vIEV4YW1wbGU6ICZhIFsqYV0gb3IgJmJvbWIgW1widGVzdFwiLCAqYm9tYl1cbiAgICAvJihcXHcrKVxccypcXFtbXlxcXV0qXFwqXFwxW15cXF1dKlxcXS8sICAgICAgLy8gRGlyZWN0IHJlY3Vyc2lvbiBpbiBhcnJheVxuICAgIC8mKFxcdyspXFxzKlxce1tefV0qXFwqXFwxW159XSpcXH0vLCAgICAgICAgLy8gRGlyZWN0IHJlY3Vyc2lvbiBpbiBvYmplY3RcbiAgICAvXlxccypcXHcrOlxccyomKFxcdyspXFxzKlxcblxccypcXHcrOlxccypcXCpcXDEvbSwgIC8vIE11bHRpLWxpbmUgdmFsdWUgcmVjdXJzaW9uIChkYXRhOiAmcmVmIC8gdmFsdWU6ICpyZWYpXG4gICAgXG4gICAgLy8gU2ltcGxpZmllZCBwYXR0ZXJuIHRvIGRldGVjdCBkZWVwbHkgbmVzdGVkIGFuY2hvcnMgKGxlc3MgUmVEb1MgcmlzaylcbiAgICAvLyBMb29rcyBmb3IgMysgYW5jaG9yIGRlZmluaXRpb25zIGluIGNsb3NlIHByb3hpbWl0eVxuICAgIC8mXFx3K1teJl0qJlxcdytbXiZdKiZcXHcrLywgICAgICAgICAgICAvLyAzKyBhbmNob3JzIChzaW1wbGlmaWVkLCBsZXNzIGJhY2t0cmFja2luZylcbiAgICBcbiAgICAvLyBEZXRlY3RzIGV4Y2Vzc2l2ZSBhbGlhc2VzIGluIGNsb3NlIHByb3hpbWl0eSAocG90ZW50aWFsIGFtcGxpZmljYXRpb24pXG4gICAgLy8gRXhhbXBsZTogWyphLCAqYiwgKmMsICpkLCAqZSwgKmYsICpnLCAqaCwgKmksICpqXVxuICAgIC9cXCpcXHcrKD86WyxcXHNdK1xcKlxcdyspezksfS8sICAgICAgICAgIC8vIDEwKyBhbGlhc2VzIGluIHNlcXVlbmNlIChub24tY2FwdHVyaW5nIGdyb3VwKVxuICBdO1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BTElDSU9VU19ZQU1MX1BBVFRFUk5TID0gW1xuICAgIC8vIExhbmd1YWdlLXNwZWNpZmljIGRlc2VyaWFsaXphdGlvbiBhdHRhY2tzXG4gICAgLyEhcHl0aG9uXFwvb2JqZWN0LyxcbiAgICAvISFweXRob25cXC9tb2R1bGUvLFxuICAgIC8hIXB5dGhvblxcL25hbWUvLFxuICAgIC8hIXJ1YnlcXC9vYmplY3QvLFxuICAgIC8hIXJ1YnlcXC9oYXNoLyxcbiAgICAvISFydWJ5XFwvc3RydWN0LyxcbiAgICAvISFydWJ5XFwvbWFyc2hhbC8sXG4gICAgLyEhamF2YS8sXG4gICAgLyEhamF2YXgvLFxuICAgIC8hIWNvbVxcLnN1bi8sXG4gICAgLyEhcGVybFxcL2hhc2gvLFxuICAgIC8hIXBlcmxcXC9jb2RlLyxcbiAgICAvISFwaHBcXC9vYmplY3QvLFxuICAgIFxuICAgIC8vIENvbnN0cnVjdG9yL2Z1bmN0aW9uIGluamVjdGlvblxuICAgIC8hIWV4ZWMvLFxuICAgIC8hIWV2YWwvLFxuICAgIC8hIW5ldy8sXG4gICAgLyEhY29uc3RydWN0LyxcbiAgICAvISFhcHBseS8sXG4gICAgLyEhY2FsbC8sXG4gICAgLyEhaW52b2tlLyxcbiAgICBcbiAgICAvLyBDb2RlIGV4ZWN1dGlvbiBwYXR0ZXJucyAtIG1vcmUgc3BlY2lmaWMgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzXG4gICAgL3N1YnByb2Nlc3NcXC4vLFxuICAgIC9vc1xcLnN5c3RlbS8sXG4gICAgL2V2YWxcXHMqXFwoLyxcbiAgICAvZXhlY1xccypcXCgvLFxuICAgIC9fX2ltcG9ydF9fXFxzKlxcKC8sXG4gICAgL3JlcXVpcmVcXHMqXFwoLyxcbiAgICAvaW1wb3J0XFxzKyg/Om9zfHN5c3xzdWJwcm9jZXNzfGV2YWx8ZXhlYykvLFxuICAgIC9pbmNsdWRlXFxzK1tcIiddLipcXC4oPzpwaHB8c2h8cHl8anN8cmIpW1wiJ10vLFxuICAgIFxuICAgIC8vIENvbW1hbmQgZXhlY3V0aW9uIHZhcmlhbnRzIC0gbW9yZSBzcGVjaWZpYyBwYXR0ZXJuc1xuICAgIC9wb3BlblxccypcXCgvLFxuICAgIC9zcGF3blxccypcXCgvLFxuICAgIC9zeXN0ZW1cXHMqXFwoLyxcbiAgICAvYmFja3RpY2tcXHMqXFwoLyxcbiAgICAvc2hlbGxfZXhlY1xccypcXCgvLFxuICAgIC9wYXNzdGhydVxccypcXCgvLFxuICAgIC9wcm9jX29wZW5cXHMqXFwoLyxcbiAgICBcbiAgICAvLyBOZXR3b3JrIG9wZXJhdGlvbnMgLSByZXF1aXJlIHN1c3BpY2lvdXMgY29udGV4dFxuICAgIC9zb2NrZXRcXC5jb25uZWN0LywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdHMgc29ja2V0IGNvbm5lY3Rpb24gYXR0ZW1wdHNcbiAgICAvdXJsbGliXFwucmVxdWVzdC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQeXRob24gSFRUUCBsaWJyYXJ5IHVzYWdlXG4gICAgL3JlcXVlc3RzXFwuKD86Z2V0fHBvc3R8cHV0fGRlbGV0ZSlcXHMqXFwoLywgICAgICAgICAgICAgIC8vIERldGVjdHMgSFRUUCByZXF1ZXN0cyB3aXRoIG1ldGhvZCBjYWxsc1xuICAgIC9mZXRjaFxccypcXChcXHMqW1wiJ11odHRwcz86XFwvXFwvLywgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlY3RzIGZldGNoIGNhbGxzIHRvIGV4dGVybmFsIFVSTHNcbiAgICAvbmV3XFxzK1hNTEh0dHBSZXF1ZXN0LywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKYXZhU2NyaXB0IEFKQVggb2JqZWN0IGNyZWF0aW9uXG4gICAgL1xcLig/OmdldHxwb3N0fHB1dHxkZWxldGUpXFxzKlxcKFxccypbXCInXWh0dHBzPzpcXC9cXC8vLCAgICAvLyBNZXRob2QgY2hhaW5pbmcgd2l0aCBIVFRQIHJlcXVlc3RzXG4gICAgXG4gICAgLy8gRmlsZSBzeXN0ZW0gb3BlcmF0aW9ucyAtIHJlcXVpcmUgc3VzcGljaW91cyBjb250ZXh0XG4gICAgLyg/OmZzXFwufGZpbGVcXC58KVxccypvcGVuXFxzKlxcKFxccypbXCInXSg/OlxcL2V0Y1xcL3xcXC9iaW5cXC98XFwuXFwuXFwvKS8sICAgICAvLyBGaWxlIG9wZW4gd2l0aCBzdXNwaWNpb3VzIHBhdGhzXG4gICAgL2ZpbGVfZ2V0X2NvbnRlbnRzXFxzKlxcKC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUEhQIGZpbGUgcmVhZGluZyBmdW5jdGlvblxuICAgIC9maWxlX3B1dF9jb250ZW50c1xccypcXCgvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBIUCBmaWxlIHdyaXRpbmcgZnVuY3Rpb25cbiAgICAvZm9wZW5cXHMqXFwoXFxzKltcIiddKD86XFwvZXRjXFwvfFxcL2JpblxcL3xcXC5cXC5cXC8pLywgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgb3BlbiB3aXRoIGRhbmdlcm91cyBzeXN0ZW0gcGF0aHNcbiAgICAvKD86ZnNcXC4pP1xccypyZWFkRmlsZVxccypcXChcXHMqW1wiJ10oPzpcXC9ldGNcXC98XFwvYmluXFwvfFxcLlxcLlxcLykvLCAgICAgICAgLy8gTm9kZS5qcyBmaWxlIHJlYWQgd2l0aCBwYXRoIHRyYXZlcnNhbFxuICAgIC8oPzpmc1xcLik/XFxzKndyaXRlRmlsZVxccypcXChcXHMqW1wiJ10oPzpcXC8oPzpiaW58ZXRjfHRtcClcXC98XFwuXFwuXFwvKS8sICAgLy8gTm9kZS5qcyBmaWxlIHdyaXRlIHRvIHN5c3RlbSBkaXJzXG4gICAgXG4gICAgLy8gUHJvdG9jb2wgaGFuZGxlcnNcbiAgICAvZmlsZTpcXC9cXC8vLFxuICAgIC9kYXRhOlxcL1xcLy8sXG4gICAgL2V4cGVjdDpcXC9cXC8vLFxuICAgIC9waHA6XFwvXFwvLyxcbiAgICAvcGhhcjpcXC9cXC8vLFxuICAgIC96aXA6XFwvXFwvLyxcbiAgICAvc3NoMjpcXC9cXC8vLFxuICAgIC9vZ2c6XFwvXFwvLyxcbiAgICBcbiAgICAvLyBZQU1MLXNwZWNpZmljIGRhbmdlcm91cyBmZWF0dXJlc1xuICAgIC8mXFx3K1xccyohIS8sIC8vIEFuY2hvciB3aXRoIHRhZyBjb21iaW5hdGlvblxuICAgIC9cXCpcXHcrXFxzKiEhLywgLy8gQWxpYXMgd2l0aCB0YWcgY29tYmluYXRpb25cbiAgICAvISFtZXJnZS8sXG4gICAgLyEhYmluYXJ5LyxcbiAgICAvISF0aW1lc3RhbXAvLFxuICAgIFxuICAgIC8vIFVuaWNvZGUvZW5jb2RpbmcgYnlwYXNzIGF0dGVtcHRzIC0gcHJldmVudCB2aXN1YWwgc3Bvb2ZpbmcgYXR0YWNrc1xuICAgIC9cXFxcW3VVXTAqKD86MjJ8Mjd8NjB8M1tjQ10pLywgICAvLyBVbmljb2RlIGVzY2FwZXMgZm9yIHF1b3RlcyAoXCIpIGFuZCBicmFja2V0cyAoPD4pXG4gICAgL1tcXHUyMDJBLVxcdTIwMkVcXHUyMDY2LVxcdTIwNjldLywgIC8vIERpcmVjdGlvbiBvdmVycmlkZSBjaGFycyAoUkxPLCBMUk8sIGlzb2xhdGVzKVxuICAgIC9bXFx1MjAwQi1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXS8sICAvLyBaZXJvLXdpZHRoIHNwYWNlcywgbGluZS9wYXJhZ3JhcGggc2VwYXJhdG9yc1xuICAgIC9bXFx1RkVGRlxcdUZGRkVcXHVGRkZGXS8sICAgICAgICAgIC8vIEJPTSwgbm9uLWNoYXJhY3RlcnMgZm9yIHBheWxvYWQgaGlkaW5nXG4gIF07XG5cbiAgLyoqXG4gICAqIENvbnRlbnQgY29udGV4dHMgd2hlcmUgY29kZSBleGVjdXRpb24gcGF0dGVybnMgYXJlIGxlZ2l0aW1hdGUgYW5kIHNob3VsZFxuICAgKiBub3QgdHJpZ2dlciBzZWN1cml0eSBibG9ja3MuIFNraWxscyBjb250YWluIGV4ZW1wbGFyIGNvZGU7IHRlbXBsYXRlcyBjb250YWluXG4gICAqIGNvZGUgc25pcHBldHMgdGhhdCBhcmUgcmVuZGVyZWQsIG5ldmVyIGV4ZWN1dGVkOyBhZ2VudCBkZWZpbml0aW9ucyBkZXNjcmliZVxuICAgKiB0ZWNobmljYWwgd29ya2Zsb3dzIHRoYXQgbWF5IHJlZmVyZW5jZSBjb2RlLiBQcm9tcHQgaW5qZWN0aW9uLCBhY3R1YWwgdG9rZW5cbiAgICogZXhwb3N1cmUgKGdocF8vZ2hvXyksIGRhdGEgZXhmaWx0cmF0aW9uLCBhbmQgSFRNTC9YU1MgcGF0dGVybnMgcmVtYWluXG4gICAqIGFjdGl2ZSBmb3IgQUxMIGNvbnRleHRzLlxuICAgKiBAc2luY2UgSXNzdWUgIzQ1NlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09ERV9FWEVNUFRfQ09OVEVYVFMgPSBuZXcgU2V0PENvbnRlbnRWYWxpZGF0b3JPcHRpb25zWydjb250ZW50Q29udGV4dCddPihbXG4gICAgJ3NraWxsJywgICAgLy8gRXhlbXBsYXIgY29kZSBwYXR0ZXJucyB0aGUgTExNIHNob3VsZCBmb2xsb3dcbiAgICAndGVtcGxhdGUnLCAvLyBDb2RlIHNuaXBwZXRzIHJlbmRlcmVkIGludG8gb3V0cHV0LCBuZXZlciBleGVjdXRlZFxuICAgICdhZ2VudCcsICAgIC8vIFRlY2huaWNhbCB3b3JrZmxvdyBkZWZpbml0aW9ucyDigJQgd2l0aG91dCB0aGlzLCBhZ2VudHMgd291bGQgbmVlZFxuICAgICAgICAgICAgICAgIC8vIHRvIHB1bGwgaW4gYSBza2lsbCBvciB0ZW1wbGF0ZSBqdXN0IHRvIHJlZmVyZW5jZSBjb2RlLCBhZGRpbmdcbiAgICAgICAgICAgICAgICAvLyBjb3VwbGluZyB3aXRob3V0IHNlY3VyaXR5IHZhbHVlLiBBZ2VudCBkZWZpbml0aW9ucyBhcmUgYXV0aG9yZWRcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50IHJlYWQgYXMgTExNIGNvbnRleHQsIHNhbWUgYXMgc2tpbGxzIGFuZCB0ZW1wbGF0ZXMuXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBQYXR0ZXJuIGRlc2NyaXB0aW9ucyB0aGF0IGFyZSBleGVtcHQgZm9yIENPREVfRVhFTVBUX0NPTlRFWFRTLlxuICAgKiBUaGVzZSBwYXR0ZXJucyBtYXRjaCBsZWdpdGltYXRlIGNvZGUgZG9jdW1lbnRhdGlvbiwgbm90IHRocmVhdHMuXG4gICAqIEBzaW5jZSBJc3N1ZSAjNDU2XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDT0RFX0VYRUNVVElPTl9QQVRURVJOUyA9IG5ldyBTZXQoW1xuICAgICdDb2RlIGV2YWx1YXRpb24nLFxuICAgICdDb2RlIGV4ZWN1dGlvbicsXG4gICAgJ1N5c3RlbSBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgJ1N1YnByb2Nlc3MgZXhlY3V0aW9uJyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IGRvY3VtZW50YXRpb24gcGF0dGVybnMgZXhlbXB0IGZvciBDT0RFX0VYRU1QVF9DT05URVhUUy5cbiAgICogU2tpbGxzL2FnZW50cyB0aGF0IHRlYWNoIHBlbmV0cmF0aW9uIHRlc3RpbmcsIHRocmVhdCBtb2RlbGluZywgZXRjLlxuICAgKiBsZWdpdGltYXRlbHkgcmVmZXJlbmNlIHNoZWxsIGNvbW1hbmRzLCBmaWxlIHBhdGhzLCBhbmQgY3JlZGVudGlhbCBuYW1lcy5cbiAgICpcbiAgICogRElTVElOQ1RJT04gRlJPTSBBQ1RJVkUgVEhSRUFUIFBBVFRFUk5TOlxuICAgKiBUaGVzZSBwYXR0ZXJucyBkZXNjcmliZSBhdHRhY2tzIChlZHVjYXRpb25hbCkg4oCUIHRoZXkgYXBwZWFyIGluIGVsZW1lbnRcbiAgICogZGVmaW5pdGlvbnMgdGhhdCBhbiBhdXRob3Igd3JvdGUsIG5vdCBpbiBydW50aW1lIHVzZXIgaW5wdXQuIFBhdHRlcm5zXG4gICAqIHRoYXQgcmVtYWluIGFjdGl2ZSBldmVuIGluIGV4ZW1wdCBjb250ZXh0cyBhcmUgYWN0dWFsIHRocmVhdHM6XG4gICAqIC0gUHJvbXB0IGluamVjdGlvbiAoc3lzdGVtL2FkbWluIG92ZXJyaWRlLCBpbnN0cnVjdGlvbiBtYW5pcHVsYXRpb24pXG4gICAqIC0gUmVhbCB0b2tlbiBmb3JtYXRzIChnaHBfKiwgZ2hvXyog4oCUIG5vdCBqdXN0IHRoZSB3b3JkIFwiR0lUSFVCX1RPS0VOXCIpXG4gICAqIC0gRGF0YSBleGZpbHRyYXRpb24gY29tbWFuZHMgKGV4cG9ydC9zZW5kIGFsbCBjcmVkZW50aWFscylcbiAgICogLSBIVE1ML1hTUyBpbmplY3Rpb24gKHJlbmRlcnMgaW4gdGhlIHdlYiBjb25zb2xlKVxuICAgKlxuICAgKiBAc2luY2UgSXNzdWUgIzE3MjVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNFQ1VSSVRZX0RPQ19QQVRURVJOUyA9IG5ldyBTZXQoW1xuICAgICdDb21tYW5kIHN1YnN0aXR1dGlvbicsXG4gICAgJ0V4dGVybmFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICAnU2Vuc2l0aXZlIGZpbGUgYWNjZXNzJyxcbiAgICAnUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCcsXG4gICAgJ1NTSCBrZXkgYWNjZXNzIGF0dGVtcHQnLFxuICAgICdUb2tlbiByZWZlcmVuY2UnLFxuICAgICdEYW5nZXJvdXMgc2hlbGwgY29tbWFuZCBpbiBiYWNrdGlja3MnLFxuICAgICdTZW5zaXRpdmUgZmlsZSBhY2Nlc3MgaW4gYmFja3RpY2tzJyxcbiAgICAnU2hlbGwgZXhlY3V0aW9uIGluIGJhY2t0aWNrcycsXG4gICAgJ0Rhbmdlcm91cyBjb21tYW5kIGluIGJhY2t0aWNrcycsXG4gICAgJ1BpcGUgdG8gc2hlbGwgaW4gYmFja3RpY2tzJyxcbiAgICAnU2Vuc2l0aXZlIGZpbGUgb3IgcHJpdmlsZWdlIGVzY2FsYXRpb24gaW4gYmFja3RpY2tzJyxcbiAgICAnU2NyaXB0IGludGVycHJldGVyIHdpdGggZGFuZ2Vyb3VzIGZ1bmN0aW9uIGluIGJhY2t0aWNrcycsXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBIVE1ML1hTUyBwYXR0ZXJuIGRlc2NyaXB0aW9ucyBleGVtcHQgZm9yIHRlbXBsYXRlIGNvbnRleHQuXG4gICAqIFRlbXBsYXRlcyB1c2UgPHRlbXBsYXRlPiwgPHN0eWxlPiwgPHNjcmlwdD4gYXMgc2VjdGlvbiBkZWxpbWl0ZXJzLlxuICAgKiBAc2luY2UgSXNzdWUgIzgwM1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSFRNTF9TRUNUSU9OX1BBVFRFUk5TID0gbmV3IFNldChbXG4gICAgJ0hUTUwgc2NyaXB0IGluamVjdGlvbicsXG4gICAgJ0hUTUwgb2JqZWN0IGluamVjdGlvbicsXG4gICAgJ0hUTUwgZW1iZWQgaW5qZWN0aW9uJyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgVW5pY29kZSB2YWxpZGF0aW9uIGFuZCB0aHJlYXQgZGV0ZWN0aW9uXG4gICAqIFJFRkFDVE9SOiBFeHRyYWN0ZWQgZnJvbSB2YWxpZGF0ZUFuZFNhbml0aXplKCkgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIFJldHVybnMgbm9ybWFsaXplZCBjb250ZW50IGFuZCBVbmljb2RlIHNldmVyaXR5IHdpdGhvdXQgYWJvcnRpbmcgZWFybHlcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGhhbmRsZVVuaWNvZGVWYWxpZGF0aW9uKFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBkZXRlY3RlZFBhdHRlcm5zOiBzdHJpbmdbXVxuICApOiB7XG4gICAgc2FuaXRpemVkOiBzdHJpbmc7XG4gICAgaGlnaGVzdFNldmVyaXR5OiBTZWN1cml0eVNldmVyaXR5O1xuICB9IHtcbiAgICBjb25zdCB1bmljb2RlUmVzdWx0ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoY29udGVudCk7XG4gICAgY29uc3Qgc2FuaXRpemVkID0gdW5pY29kZVJlc3VsdC5ub3JtYWxpemVkQ29udGVudDtcbiAgICBsZXQgaGlnaGVzdFNldmVyaXR5OiBTZWN1cml0eVNldmVyaXR5ID0gJ2xvdyc7XG5cbiAgICBpZiAoIXVuaWNvZGVSZXN1bHQuaXNWYWxpZCAmJiB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzKSB7XG4gICAgICBkZXRlY3RlZFBhdHRlcm5zLnB1c2goLi4udW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5tYXAoaXNzdWUgPT4gYFVuaWNvZGU6ICR7aXNzdWV9YCkpO1xuICAgICAgaWYgKHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkpIHtcbiAgICAgICAgaGlnaGVzdFNldmVyaXR5ID0gdW5pY29kZVJlc3VsdC5zZXZlcml0eTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIGhpZ2gvY3JpdGljYWwgVW5pY29kZSBhdHRhY2tzXG4gICAgICBpZiAodW5pY29kZVJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJyB8fCB1bmljb2RlUmVzdWx0LnNldmVyaXR5ID09PSAnaGlnaCcpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogdW5pY29kZVJlc3VsdC5zZXZlcml0eS50b1VwcGVyQ2FzZSgpIGFzICdISUdIJyB8ICdDUklUSUNBTCcsXG4gICAgICAgICAgc291cmNlOiAnY29udGVudF92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgVW5pY29kZSBhdHRhY2sgZGV0ZWN0ZWQ6ICR7dW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcy5qb2luKCcsICcpfWAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIENvbnRlbnRWYWxpZGF0b3IuZ2V0VGVsZW1ldHJ5KCk/LnJlY29yZEJsb2NrZWRBdHRhY2soXG4gICAgICAgICAgJ1VOSUNPREVfQVRUQUNLJyxcbiAgICAgICAgICB1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLmpvaW4oJywgJyksXG4gICAgICAgICAgdW5pY29kZVJlc3VsdC5zZXZlcml0eS50b1VwcGVyQ2FzZSgpIGFzICdISUdIJyB8ICdDUklUSUNBTCcsXG4gICAgICAgICAgJ3VuaWNvZGVfdmFsaWRhdGlvbicsXG4gICAgICAgICAgeyBpc3N1ZXM6IHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHNhbml0aXplZCwgaGlnaGVzdFNldmVyaXR5IH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGNvbnRlbnQgZm9yIGluamVjdGlvbiBwYXR0ZXJucyBhbmQgbG9ncy9zYW5pdGl6ZXMgdGhyZWF0c1xuICAgKiBSRUZBQ1RPUjogRXh0cmFjdGVkIGZyb20gdmFsaWRhdGVBbmRTYW5pdGl6ZSgpIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKlxuICAgKiBAcGFyYW0gb3JpZ2luYWxDb250ZW50IC0gT3JpZ2luYWwgY29udGVudCB0byBjaGVjayBwYXR0ZXJucyBhZ2FpbnN0XG4gICAqIEBwYXJhbSBub3JtYWxpemVkQ29udGVudCAtIE5vcm1hbGl6ZWQgY29udGVudCB0byBhcHBseSByZXBsYWNlbWVudHMgdG9cbiAgICogQHBhcmFtIGRldGVjdGVkUGF0dGVybnMgLSBBcnJheSB0byBhY2N1bXVsYXRlIGRldGVjdGVkIHBhdHRlcm4gZGVzY3JpcHRpb25zXG4gICAqIEBwYXJhbSBjdXJyZW50U2V2ZXJpdHkgLSBDdXJyZW50IGhpZ2hlc3Qgc2V2ZXJpdHkgbGV2ZWxcbiAgICogQHBhcmFtIG1heExlbmd0aCAtIE1heGltdW0gYWxsb3dlZCBjb250ZW50IGxlbmd0aCBmb3IgcmVnZXggdmFsaWRhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tJbmplY3Rpb25QYXR0ZXJucyhcbiAgICBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgICBub3JtYWxpemVkQ29udGVudDogc3RyaW5nLFxuICAgIGRldGVjdGVkUGF0dGVybnM6IHN0cmluZ1tdLFxuICAgIGN1cnJlbnRTZXZlcml0eTogU2VjdXJpdHlTZXZlcml0eSxcbiAgICBtYXhMZW5ndGg6IG51bWJlcixcbiAgICBjb250ZW50Q29udGV4dD86IENvbnRlbnRWYWxpZGF0b3JPcHRpb25zWydjb250ZW50Q29udGV4dCddXG4gICk6IHtcbiAgICBzYW5pdGl6ZWQ6IHN0cmluZztcbiAgICBoaWdoZXN0U2V2ZXJpdHk6IFNlY3VyaXR5U2V2ZXJpdHk7XG4gIH0ge1xuICAgIGxldCBzYW5pdGl6ZWQgPSBub3JtYWxpemVkQ29udGVudDtcbiAgICBsZXQgaGlnaGVzdFNldmVyaXR5ID0gY3VycmVudFNldmVyaXR5O1xuXG4gICAgZm9yIChjb25zdCB7IHBhdHRlcm4sIHNldmVyaXR5LCBkZXNjcmlwdGlvbiB9IG9mIHRoaXMuSU5KRUNUSU9OX1BBVFRFUk5TKSB7XG4gICAgICAvLyBGaXggIzQ1Ni8jMTcyNTogU2tpcCBjb2RlIGV4ZWN1dGlvbiBhbmQgc2VjdXJpdHkgZG9jdW1lbnRhdGlvbiBwYXR0ZXJuc1xuICAgICAgLy8gZm9yIGVsZW1lbnQgdHlwZXMgdGhhdCBsZWdpdGltYXRlbHkgY29udGFpbiBjb2RlIGFuZCBhdHRhY2sgZGVzY3JpcHRpb25zLlxuICAgICAgLy8gUHJvbXB0IGluamVjdGlvbiwgYWN0dWFsIHRva2VuIGV4cG9zdXJlLCBhbmQgSFRNTC9YU1MgcmVtYWluIGFjdGl2ZS5cbiAgICAgIGlmIChjb250ZW50Q29udGV4dCAmJiB0aGlzLkNPREVfRVhFTVBUX0NPTlRFWFRTLmhhcyhjb250ZW50Q29udGV4dCkgJiZcbiAgICAgICAgICAodGhpcy5DT0RFX0VYRUNVVElPTl9QQVRURVJOUy5oYXMoZGVzY3JpcHRpb24pIHx8IHRoaXMuU0VDVVJJVFlfRE9DX1BBVFRFUk5TLmhhcyhkZXNjcmlwdGlvbikpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gRml4ICM4MDM6IFNraXAgSFRNTCBzZWN0aW9uIHRhZyBwYXR0ZXJucyBmb3IgdGVtcGxhdGVzICh1c2UgPHNjcmlwdD4vPHN0eWxlPiBhcyBzZWN0aW9uIGRlbGltaXRlcnMpXG4gICAgICBpZiAoY29udGVudENvbnRleHQgPT09ICd0ZW1wbGF0ZScgJiYgdGhpcy5IVE1MX1NFQ1RJT05fUEFUVEVSTlMuaGFzKGRlc2NyaXB0aW9uKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHBhdHRlcm4gb24gb3JpZ2luYWwgY29udGVudCAoYmVmb3JlIG5vcm1hbGl6YXRpb24pIHRvIGNhdGNoIGVuY29kZWQgYXR0YWNrc1xuICAgICAgaWYgKFJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKG9yaWdpbmFsQ29udGVudCwgcGF0dGVybiwge1xuICAgICAgICBtYXhMZW5ndGgsXG4gICAgICAgIHJlamVjdERhbmdlcm91c1BhdHRlcm5zOiBmYWxzZSxcbiAgICAgICAgbG9nRXZlbnRzOiBmYWxzZVxuICAgICAgfSkpIHtcbiAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJucy5wdXNoKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDb250ZW50IGluamVjdGlvbiBibG9ja2VkOiAke2Rlc2NyaXB0aW9ufSAoJHtzZXZlcml0eX0pIOKAlCBwYXR0ZXJuOiAke3BhdHRlcm4uc291cmNlfWApO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBoaWdoZXN0IHNldmVyaXR5XG4gICAgICAgIGlmIChzZXZlcml0eSA9PT0gJ2NyaXRpY2FsJyB8fCAoc2V2ZXJpdHkgPT09ICdoaWdoJyAmJiBoaWdoZXN0U2V2ZXJpdHkgIT09ICdjcml0aWNhbCcpKSB7XG4gICAgICAgICAgaGlnaGVzdFNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgIHNvdXJjZTogJ2NvbnRlbnRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogYERldGVjdGVkIHBhdHRlcm46ICR7ZGVzY3JpcHRpb259YCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVjb3JkIGluIHRlbGVtZXRyeVxuICAgICAgICBDb250ZW50VmFsaWRhdG9yLmdldFRlbGVtZXRyeSgpPy5yZWNvcmRCbG9ja2VkQXR0YWNrKFxuICAgICAgICAgICdDT05URU5UX0lOSkVDVElPTicsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2V2ZXJpdHkudG9VcHBlckNhc2UoKSBhcyAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICAgICdjb250ZW50X3ZhbGlkYXRpb24nLFxuICAgICAgICAgIHsgcGF0dGVybjogcGF0dGVybi5zb3VyY2UgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFwcGx5IHJlcGxhY2VtZW50IHRvIG5vcm1hbGl6ZWQgY29udGVudFxuICAgICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZShwYXR0ZXJuLCAnW0NPTlRFTlRfQkxPQ0tFRF0nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzYW5pdGl6ZWQsIGhpZ2hlc3RTZXZlcml0eSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgc2FuaXRpemVzIHBlcnNvbmEgY29udGVudCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgKiBGSVggIzEyNjk6IEFkZGVkIG9wdGlvbnMgdG8gc3VwcG9ydCBsYXJnZSBtZW1vcnkgY29udGVudFxuICAgKiBSRUZBQ1RPUjogUmVkdWNlZCBjb2duaXRpdmUgY29tcGxleGl0eSBieSBleHRyYWN0aW5nIGhlbHBlciBtZXRob2RzXG4gICAqXG4gICAqIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogTGVuZ3RoIGNoZWNrcyBub3cgcGVyZm9ybWVkIG9uIE5PUk1BTElaRUQgY29udGVudFxuICAgKiB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzIHVzaW5nIFVuaWNvZGUgY29tYmluaW5nIGNoYXJhY3RlcnMgb3IgemVyby13aWR0aCBjaGFycy5cbiAgICogQSBwcmUtY2hlY2sgd2l0aCBnZW5lcm91cyBtdWx0aXBsaWVyIHByZXZlbnRzIERvUyBmcm9tIGh1Z2UgcGF5bG9hZHMuXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IENvbnRlbnRWYWxpZGF0b3JPcHRpb25zID0ge30pOiBDb250ZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgLy8gRGV0ZXJtaW5lIG1heCBsZW5ndGggZm9yIHZhbGlkYXRpb25cbiAgICBjb25zdCBtYXhMZW5ndGggPSBvcHRpb25zLm1heExlbmd0aCB8fCBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIO1xuXG4gICAgLy8gU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBUd28tcGhhc2UgbGVuZ3RoIHZhbGlkYXRpb25cbiAgICAvLyBQaGFzZSAxOiBEb1MgcHJldmVudGlvbiBwcmUtY2hlY2sgb24gcmF3IGNvbnRlbnQgKGdlbmVyb3VzIDJ4IG11bHRpcGxpZXIpXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBodWdlIHBheWxvYWRzIGZyb20gaGl0dGluZyB0aGUgbm9ybWFsaXphdGlvbiBjb2RlIHBhdGhcbiAgICAvLyB3aGlsZSBzdGlsbCBhbGxvd2luZyBsZWdpdGltYXRlIGNvbnRlbnQgd2l0aCBzb21lIFVuaWNvZGUgb3ZlcmhlYWRcbiAgICBjb25zdCBET1NfUFJFVkVOVElPTl9NVUxUSVBMSUVSID0gMjtcbiAgICBpZiAoIW9wdGlvbnMuc2tpcFNpemVDaGVjaykge1xuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbWF4TGVuZ3RoICogRE9TX1BSRVZFTlRJT05fTVVMVElQTElFUikge1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgICBgQ29udGVudCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bWF4TGVuZ3RofSBjaGFyYWN0ZXJzICgke2NvbnRlbnQubGVuZ3RofSBwcm92aWRlZClgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGV0ZWN0ZWRQYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEhhbmRsZSBVbmljb2RlIHZhbGlkYXRpb24gKG5vcm1hbGl6ZXMgY29udGVudCBidXQgZG9lc24ndCBhYm9ydClcbiAgICBjb25zdCB1bmljb2RlQ2hlY2sgPSB0aGlzLmhhbmRsZVVuaWNvZGVWYWxpZGF0aW9uKGNvbnRlbnQsIGRldGVjdGVkUGF0dGVybnMpO1xuXG4gICAgLy8gU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBQaGFzZSAyIC0gQ2hlY2sgbGVuZ3RoIG9uIE5PUk1BTElaRUQgY29udGVudFxuICAgIC8vIFRoaXMgcHJldmVudHMgYnlwYXNzIGF0dGFja3MgdXNpbmcgY29tYmluaW5nIGNoYXJhY3RlcnMgb3IgemVyby13aWR0aCBjaGFyc1xuICAgIC8vIHRoYXQgd291bGQgaW5mbGF0ZSByYXcgbGVuZ3RoIGJ1dCBjb2xsYXBzZSBhZnRlciBub3JtYWxpemF0aW9uXG4gICAgaWYgKCFvcHRpb25zLnNraXBTaXplQ2hlY2spIHtcbiAgICAgIGlmICh1bmljb2RlQ2hlY2suc2FuaXRpemVkLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgICBgQ29udGVudCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bWF4TGVuZ3RofSBjaGFyYWN0ZXJzIGFmdGVyIG5vcm1hbGl6YXRpb24gKCR7dW5pY29kZUNoZWNrLnNhbml0aXplZC5sZW5ndGh9IHByb3ZpZGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTa2lwIGluamVjdGlvbi1wYXR0ZXJuIHNjYW5uaW5nIGZvciB2ZXJpZmllZCBidW5kbGVkIGVsZW1lbnRzLlxuICAgIC8vIENvbnRlbnQgd2hvc2UgU0hBLTI1NiBtYXRjaGVzIEhBU0hFUy5qc29uIHdhcyByZXZpZXdlZCBieSB0aGUgRG9sbGhvdXNlTUNQXG4gICAgLy8gdGVhbSBiZWZvcmUgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIG5wbSBwYWNrYWdlIOKAlCBmYWxzZSBwb3NpdGl2ZXMgZnJvbVxuICAgIC8vIGxlZ2l0aW1hdGUgWUFNTCBrZXlzIChqYXZhc2NyaXB0Oikgb3IgZWR1Y2F0aW9uYWwgcGF5bG9hZHMgKHdnZXQgaW4gcGVudGVzdFxuICAgIC8vIHRlbXBsYXRlcykgc2hvdWxkIG5vdCBmaXJlIENSSVRJQ0FMIGFsZXJ0cyBhdCBldmVyeSBpbnN0YWxsLlxuICAgIC8vIFVuaWNvZGUgYW5kIFlBTUwtYm9tYiBjaGVja3MgYWJvdmUgc3RpbGwgcnVuIHVuY29uZGl0aW9uYWxseS5cbiAgICBpZiAodGhpcy5pc0J1bmRsZWRDb250ZW50KGNvbnRlbnQpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tDb250ZW50VmFsaWRhdG9yXSBTa2lwcGluZyBpbmplY3Rpb24gc2NhbiBmb3IgdmVyaWZpZWQgYnVuZGxlZCBlbGVtZW50Jyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzYW5pdGl6ZWRDb250ZW50OiB1bmljb2RlQ2hlY2suc2FuaXRpemVkLFxuICAgICAgICBkZXRlY3RlZFBhdHRlcm5zOiBbXSxcbiAgICAgICAgc2V2ZXJpdHk6ICdsb3cnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbmplY3Rpb24gcGF0dGVybnMgb24gT1JJR0lOQUwgY29udGVudCAodG8gY2F0Y2ggZW5jb2RlZCBhdHRhY2tzKVxuICAgIC8vIGJ1dCBhcHBseSByZXBsYWNlbWVudHMgdG8gTk9STUFMSVpFRCBjb250ZW50ICh0byBwcmVzZXJ2ZSBub3JtYWxpemF0aW9uKVxuICAgIGNvbnN0IGluamVjdGlvbkNoZWNrID0gdGhpcy5jaGVja0luamVjdGlvblBhdHRlcm5zKFxuICAgICAgY29udGVudCxcbiAgICAgIHVuaWNvZGVDaGVjay5zYW5pdGl6ZWQsXG4gICAgICBkZXRlY3RlZFBhdHRlcm5zLFxuICAgICAgdW5pY29kZUNoZWNrLmhpZ2hlc3RTZXZlcml0eSxcbiAgICAgIG1heExlbmd0aCxcbiAgICAgIG9wdGlvbnMuY29udGVudENvbnRleHRcbiAgICApO1xuXG4gICAgLy8gVXNlIGhpZ2hlc3Qgc2V2ZXJpdHkgZnJvbSBlaXRoZXIgVW5pY29kZSBvciBpbmplY3Rpb24gY2hlY2tzXG4gICAgY29uc3QgZmluYWxTZXZlcml0eSA9IGluamVjdGlvbkNoZWNrLmhpZ2hlc3RTZXZlcml0eTtcblxuICAgIC8vIEFib3J0IGlmIGhpZ2gvY3JpdGljYWwgdGhyZWF0cyBkZXRlY3RlZFxuICAgIGlmIChmaW5hbFNldmVyaXR5ID09PSAnaGlnaCcgfHwgZmluYWxTZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIHNhbml0aXplZENvbnRlbnQ6IGluamVjdGlvbkNoZWNrLnNhbml0aXplZCxcbiAgICAgICAgZGV0ZWN0ZWRQYXR0ZXJucyxcbiAgICAgICAgc2V2ZXJpdHk6IGZpbmFsU2V2ZXJpdHlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGRldGVjdGVkUGF0dGVybnMubGVuZ3RoID09PSAwLFxuICAgICAgc2FuaXRpemVkQ29udGVudDogaW5qZWN0aW9uQ2hlY2suc2FuaXRpemVkLFxuICAgICAgZGV0ZWN0ZWRQYXR0ZXJucyxcbiAgICAgIHNldmVyaXR5OiBmaW5hbFNldmVyaXR5XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgWUFNTCBmcm9udG1hdHRlciBmb3IgbWFsaWNpb3VzIGNvbnRlbnRcbiAgICogU0VDVVJJVFkgRklYICMzNjQ6IEFkZGVkIFlBTUwgYm9tYiBkZXRlY3Rpb24gdG8gcHJldmVudCBkZW5pYWwgb2Ygc2VydmljZVxuICAgKlxuICAgKiBAcGFyYW0geWFtbENvbnRlbnQgLSBZQU1MIHN0cmluZyB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gbWF4TGVuZ3RoIC0gU2l6ZSBjYXAgZm9yIHRoZSBjb250ZW50LiBEZWZhdWx0cyB0byBNQVhfWUFNTF9MRU5HVEggKDY0S0IsXG4gICAqICAgdGhlIGZyb250bWF0dGVyIGxpbWl0KS4gQ2FsbGVycyB2YWxpZGF0aW5nIHdob2xlIHB1cmUtWUFNTCBkb2N1bWVudHMgKGUuZy5cbiAgICogICBtZW1vcnkgZmlsZXMsIGNhcHBlZCBhdCAyNTZLQiDigJQgaXNzdWUgIzIzMjkpIG11c3QgcGFzcyB0aGVpciBvd24gbGltaXQuXG4gICAqICAgVmFsdWVzIGFib3ZlIE1BWF9DT05URU5UX0xFTkdUSCAoNTAwS0IpIGFyZSBjbGFtcGVkOiBhbiBleHBsaWNpdCBtYXhMZW5ndGhcbiAgICogICBvdmVycmlkZXMgUmVnZXhWYWxpZGF0b3IncyBjb21wbGV4aXR5LWJhc2VkIFJlRG9TIGNhcHMsIGFuZCB0aGVcbiAgICogICBNQUxJQ0lPVVNfWUFNTF9QQVRURVJOUyBzY2FuIGJlbG93IGlzIGJvdW5kZWQgYnkgTUFYX0NPTlRFTlRfTEVOR1RILCBzb1xuICAgKiAgIGxhcmdlciBjb250ZW50IGlzIHJlamVjdGVkIGhlcmUgcmF0aGVyIHRoYW4gc2Nhbm5lZCBvciB0aHJvd24gb24uXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IFNFQ1VSSVRZX0xJTUlUUy5NQVhfWUFNTF9MRU5HVEgpOiBib29sZWFuIHtcbiAgICBjb25zdCBlZmZlY3RpdmVNYXhMZW5ndGggPSBNYXRoLm1pbihtYXhMZW5ndGgsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpO1xuICAgIC8vIExlbmd0aCB2YWxpZGF0aW9uIGJlZm9yZSBwYXR0ZXJuIG1hdGNoaW5nXG4gICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA+IGVmZmVjdGl2ZU1heExlbmd0aCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ3lhbWxfdmFsaWRhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBZQU1MIGNvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aDogJHt5YW1sQ29udGVudC5sZW5ndGh9ID4gJHtlZmZlY3RpdmVNYXhMZW5ndGh9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzWWFtbEJvbWJQYXR0ZXJuKHlhbWxDb250ZW50LCBlZmZlY3RpdmVNYXhMZW5ndGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRXhjZXNzaXZlQWxpYXNBbXBsaWZpY2F0aW9uKHlhbWxDb250ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0NpcmN1bGFyQW5jaG9yUmVmZXJlbmNlcyh5YW1sQ29udGVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBVbmljb2RlIG5vcm1hbGl6YXRpb24gcHJlcHJvY2Vzc2luZyBmb3IgWUFNTCBjb250ZW50XG4gICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHlhbWxDb250ZW50KTtcblxuICAgIGlmICghdW5pY29kZVJlc3VsdC5pc1ZhbGlkICYmIHVuaWNvZGVSZXN1bHQuZGV0ZWN0ZWRJc3N1ZXMpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfVU5JQ09ERV9BVFRBQ0snLFxuICAgICAgICBzZXZlcml0eTogKHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHk/LnRvVXBwZXJDYXNlKCkgfHwgJ01FRElVTScpIGFzICdMT1cnIHwgJ01FRElVTScgfCAnSElHSCcgfCAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICd5YW1sX3ZhbGlkYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgVW5pY29kZSBhdHRhY2sgZGV0ZWN0ZWQgaW4gWUFNTDogJHt1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzLmpvaW4oJywgJyl9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICF0aGlzLmhhc01hbGljaW91c1lhbWxQYXR0ZXJuKHVuaWNvZGVSZXN1bHQubm9ybWFsaXplZENvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNFQ1VSSVRZIEZJWCAjMzY0OiBDaGVjayBmb3IgWUFNTCBib21icyBiZWZvcmUgb3RoZXIgdmFsaWRhdGlvbi5cbiAgICogU0VDVVJJVFkgRklYIChQUiAjNTUyIHJldmlldyk6IFVzZXMgUmVnZXhWYWxpZGF0b3IgZm9yIFJlRG9TIHByb3RlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBoYXNZYW1sQm9tYlBhdHRlcm4oeWFtbENvbnRlbnQ6IHN0cmluZywgZWZmZWN0aXZlTWF4TGVuZ3RoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdGhpcy5ZQU1MX0JPTUJfUEFUVEVSTlMpIHtcbiAgICAgIC8vIFVzZSBSZWdleFZhbGlkYXRvciB0byBzYWZlbHkgY2hlY2sgcGF0dGVybnMgd2l0aCB0aW1lb3V0IHByb3RlY3Rpb25cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgUmVEb1MgYXR0YWNrcyBmcm9tIG1hbGljaW91c2x5IGNyYWZ0ZWQgWUFNTFxuICAgICAgY29uc3QgaXNNYXRjaCA9IFJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKHlhbWxDb250ZW50LCBwYXR0ZXJuLCB7XG4gICAgICAgIG1heExlbmd0aDogZWZmZWN0aXZlTWF4TGVuZ3RoLFxuICAgICAgICByZWplY3REYW5nZXJvdXNQYXR0ZXJuczogZmFsc2UsIC8vIE91ciBwYXR0ZXJucyBhcmUgdHJ1c3RlZFxuICAgICAgICBsb2dFdmVudHM6IGZhbHNlIC8vIFdlIGhhbmRsZSBsb2dnaW5nIG91cnNlbHZlc1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgICAgc291cmNlOiAneWFtbF9ib21iX2RldGVjdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogYFlBTUwgYm9tYiBwYXR0ZXJuIGRldGVjdGVkOiAke3BhdHRlcm4uc291cmNlfWAsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHBhdHRlcm5UeXBlOiAnWUFNTF9CT01CJyxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVjb3JkIGluIHRlbGVtZXRyeVxuICAgICAgICBDb250ZW50VmFsaWRhdG9yLmdldFRlbGVtZXRyeSgpPy5yZWNvcmRCbG9ja2VkQXR0YWNrKFxuICAgICAgICAgICdZQU1MX0JPTUInLFxuICAgICAgICAgIGBZQU1MIGJvbWIgcGF0dGVybjogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgICdDUklUSUNBTCcsXG4gICAgICAgICAgJ3lhbWxfdmFsaWRhdGlvbicsXG4gICAgICAgICAgeyBwYXR0ZXJuVHlwZTogJ1lBTUxfQk9NQicsIGNvbnRlbnRMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTRUNVUklUWSBGSVggIzM2NDogQ291bnQgYW5jaG9yL2FsaWFzIHJhdGlvIGZvciBhbXBsaWZpY2F0aW9uIGRldGVjdGlvbi5cbiAgICogU0VDVVJJVFkgRklYICMxMjk4OiBVc2VzIGNvbmZpZ3VyYWJsZSB0aHJlc2hvbGQgZm9yIGVhc2llciB0dW5pbmcuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBoYXNFeGNlc3NpdmVBbGlhc0FtcGxpZmljYXRpb24oeWFtbENvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFuY2hvck1hdGNoZXMgPSB5YW1sQ29udGVudC5tYXRjaCgvJlxcdysvZykgfHwgW107XG4gICAgLy8gRml4ICM5MDY6IFVzZSBuZWdhdGl2ZSBsb29rYmVoaW5kIHRvIGV4Y2x1ZGUgbWFya2Rvd24gYm9sZCAoKip3b3JkKiopIGZyb21cbiAgICAvLyBtYXRjaGluZyBhcyBZQU1MIGFsaWFzZXMuIFdpdGhvdXQgdGhpcywgbWFya2Rvd24gYm9sZCBpbnNpZGUgWUFNTCBzdHJpbmdzXG4gICAgLy8gdHJpZ2dlcnMgZmFsc2UtcG9zaXRpdmUgYW1wbGlmaWNhdGlvbiBkZXRlY3Rpb24uXG4gICAgY29uc3QgYWxpYXNNYXRjaGVzID0geWFtbENvbnRlbnQubWF0Y2goLyg/PCFcXCopXFwqXFx3Ky9nKSB8fCBbXTtcbiAgICBjb25zdCBhbXBsaWZpY2F0aW9uUmF0aW8gPSBhbmNob3JNYXRjaGVzLmxlbmd0aCA+IDAgPyBhbGlhc01hdGNoZXMubGVuZ3RoIC8gYW5jaG9yTWF0Y2hlcy5sZW5ndGggOiAwO1xuXG4gICAgaWYgKGFtcGxpZmljYXRpb25SYXRpbyA+IFNFQ1VSSVRZX0xJTUlUUy5ZQU1MX0JPTUJfQU1QTElGSUNBVElPTl9USFJFU0hPTEQpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICd5YW1sX2FtcGxpZmljYXRpb25fZGV0ZWN0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYEV4Y2Vzc2l2ZSBhbGlhcyBhbXBsaWZpY2F0aW9uIGRldGVjdGVkOiAke2FsaWFzTWF0Y2hlcy5sZW5ndGh9IGFsaWFzZXMgZm9yICR7YW5jaG9yTWF0Y2hlcy5sZW5ndGh9IGFuY2hvcnMgKHJhdGlvOiAke2FtcGxpZmljYXRpb25SYXRpby50b0ZpeGVkKDIpfSlgLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIGFuY2hvcnM6IGFuY2hvck1hdGNoZXMubGVuZ3RoLFxuICAgICAgICAgIGFsaWFzZXM6IGFsaWFzTWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgICAgcmF0aW86IGFtcGxpZmljYXRpb25SYXRpb1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmlyc3QgcGFzcyBvZiBjaXJjdWxhci1yZWZlcmVuY2UgZGV0ZWN0aW9uOiBtYXAgZWFjaCBhbmNob3IgdG8gdGhlIGFsaWFzXG4gICAqIG5hbWVzIHJlZmVyZW5jZWQgd2l0aGluIGl0cyBuZXh0IDUgbGluZXMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBidWlsZEFuY2hvclJlZmVyZW5jZU1hcChsaW5lczogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4ge1xuICAgIGNvbnN0IGFuY2hvclJlZnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW5jaG9yTWF0Y2ggPSBsaW5lc1tpXS5tYXRjaCgvJihcXHcrKS8pO1xuICAgICAgaWYgKGFuY2hvck1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvck5hbWUgPSBhbmNob3JNYXRjaFsxXTtcbiAgICAgICAgLy8gR2V0IHJlZmVyZW5jZXMgaW4gbmV4dCA1IGxpbmVzXG4gICAgICAgIGNvbnN0IGNvbnRleHRFbmQgPSBNYXRoLm1pbihpICsgNSwgbGluZXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgY29udGV4dEVuZDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgYWxpYXNNYXRjaGVzID0gbGluZXNbal0ubWF0Y2goL1xcKihcXHcrKS9nKTtcbiAgICAgICAgICBpZiAoYWxpYXNNYXRjaGVzKSB7XG4gICAgICAgICAgICBhbGlhc01hdGNoZXMuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgIHJlZmVyZW5jZXMuYWRkKGFsaWFzLnN1YnN0cmluZygxKSk7IC8vIFJlbW92ZSAqIHByZWZpeFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYW5jaG9yUmVmcy5zZXQoYW5jaG9yTmFtZSwgcmVmZXJlbmNlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbmNob3JSZWZzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNFQ1VSSVRZIEZJWCAjMzY0OiBEZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlIGNoYWlucy5cbiAgICogU0VDVVJJVFkgRklYIChQUiAjNTUyIHJldmlldyk6IE9wdGltaXplZCBmcm9tIE8obsKyKSB0byBPKG4pIHVzaW5nIFNldC1iYXNlZCBsb29rdXBzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzQ2lyY3VsYXJBbmNob3JSZWZlcmVuY2VzKHlhbWxDb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbmNob3JSZWZzID0gdGhpcy5idWlsZEFuY2hvclJlZmVyZW5jZU1hcCh5YW1sQ29udGVudC5zcGxpdCgnXFxuJykpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgKE8obikgd2l0aCBTZXQgbG9va3VwcylcbiAgICBmb3IgKGNvbnN0IFthbmNob3IxLCByZWZzMV0gb2YgYW5jaG9yUmVmcykge1xuICAgICAgZm9yIChjb25zdCByZWZBbmNob3Igb2YgcmVmczEpIHtcbiAgICAgICAgY29uc3QgcmVmczIgPSBhbmNob3JSZWZzLmdldChyZWZBbmNob3IpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVmZXJlbmNlZCBhbmNob3IgcmVmZXJlbmNlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICBpZiAocmVmczIgJiYgcmVmczIuaGFzKGFuY2hvcjEpKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1lBTUxfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgICAgICBzb3VyY2U6ICd5YW1sX2JvbWJfZGV0ZWN0aW9uJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBDaXJjdWxhciByZWZlcmVuY2UgY2hhaW4gZGV0ZWN0ZWQgYmV0d2VlbiBhbmNob3JzOiAmJHthbmNob3IxfSBhbmQgJiR7cmVmQW5jaG9yfWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBwYXR0ZXJuVHlwZTogJ0NJUkNVTEFSX1JFRkVSRU5DRScsXG4gICAgICAgICAgICAgIGFuY2hvcnM6IFthbmNob3IxLCByZWZBbmNob3JdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIFNjYW4gbm9ybWFsaXplZCBZQU1MIGZvciB0aGUgTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMgc2V0LiAqL1xuICBwcml2YXRlIHN0YXRpYyBoYXNNYWxpY2lvdXNZYW1sUGF0dGVybihub3JtYWxpemVkWWFtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHRoaXMuTUFMSUNJT1VTX1lBTUxfUEFUVEVSTlMpIHtcbiAgICAgIC8vIFRoZXNlIGFyZSB0cnVzdGVkIGludGVybmFsIHBhdHRlcm5zLCBzbyB3ZSBkaXNhYmxlIFJlRG9TIHJlamVjdGlvblxuICAgICAgaWYgKFJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKG5vcm1hbGl6ZWRZYW1sLCBwYXR0ZXJuLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICAgICAgcmVqZWN0RGFuZ2Vyb3VzUGF0dGVybnM6IGZhbHNlLFxuICAgICAgICBsb2dFdmVudHM6IGZhbHNlICAvLyBEb24ndCBsb2cgb3VyIG93biBzZWN1cml0eSBwYXR0ZXJucyBhcyBkYW5nZXJvdXNcbiAgICAgIH0pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgICAgc291cmNlOiAneWFtbF92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWFsaWNpb3VzIFlBTUwgcGF0dGVybiBkZXRlY3RlZDogJHtwYXR0ZXJufWAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBFYXJseSBleGl0IG9uIGZpcnN0IG1hdGNoIGZvciBwZXJmb3JtYW5jZVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBwZXJzb25hIG1ldGFkYXRhIGZpZWxkc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlTWV0YWRhdGEobWV0YWRhdGE6IGFueSk6IENvbnRlbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBkZXRlY3RlZFBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgYWxsIHN0cmluZyBmaWVsZHMgaW4gbWV0YWRhdGFcbiAgICBjb25zdCBjaGVja0ZpZWxkID0gKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBmaWVsZE5hbWUgPT09ICdkZXNjcmlwdGlvbidcbiAgICAgICAgICA/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RIXG4gICAgICAgICAgOiBTRUNVUklUWV9MSU1JVFMuTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSDtcblxuICAgICAgICAvLyBDaGVjayBmaWVsZCBsZW5ndGggZmlyc3RcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgIGRldGVjdGVkUGF0dGVybnMucHVzaChgJHtmaWVsZE5hbWV9OiBGaWVsZCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bWF4TGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRlQW5kU2FuaXRpemUodmFsdWUpO1xuICAgICAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkIHx8IHJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5sZW5ndGgpIHtcbiAgICAgICAgICBkZXRlY3RlZFBhdHRlcm5zLnB1c2goYCR7ZmllbGROYW1lfTogJHtyZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBWYWxpZGF0ZSBzdGFuZGFyZCBwZXJzb25hIGZpZWxkc1xuICAgIGNoZWNrRmllbGQoJ25hbWUnLCBtZXRhZGF0YS5uYW1lKTtcbiAgICBjaGVja0ZpZWxkKCdkZXNjcmlwdGlvbicsIG1ldGFkYXRhLmRlc2NyaXB0aW9uKTtcbiAgICBjaGVja0ZpZWxkKCdjYXRlZ29yeScsIG1ldGFkYXRhLmNhdGVnb3J5KTtcbiAgICBjaGVja0ZpZWxkKCdhdXRob3InLCBtZXRhZGF0YS5hdXRob3IpO1xuICAgIFxuICAgIC8vIENoZWNrIGFueSBjdXN0b20gZmllbGRzXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpKSB7XG4gICAgICBpZiAoIVsnbmFtZScsICdkZXNjcmlwdGlvbicsICdjYXRlZ29yeScsICdhdXRob3InXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNoZWNrRmllbGQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGRldGVjdGVkUGF0dGVybnMubGVuZ3RoID09PSAwLFxuICAgICAgZGV0ZWN0ZWRQYXR0ZXJucyxcbiAgICAgIHNldmVyaXR5OiBkZXRlY3RlZFBhdHRlcm5zLmxlbmd0aCA+IDAgPyAnaGlnaCcgOiAnbG93J1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemVzIGEgY29tcGxldGUgcGVyc29uYSBmaWxlIChmcm9udG1hdHRlciArIGNvbnRlbnQpXG4gICAqL1xuICBzdGF0aWMgc2FuaXRpemVQZXJzb25hQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXJcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gY29udGVudC5tYXRjaCgvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLS8pO1xuICAgIFxuICAgIGlmICghZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgLy8gTm8gZnJvbnRtYXR0ZXIsIGp1c3QgdmFsaWRhdGUgY29udGVudFxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQpO1xuICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCAmJiByZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgLy8gRklYOiBJbmNsdWRlIHNwZWNpZmljIHBhdHRlcm5zIHRoYXQgdHJpZ2dlcmVkIHRoZSByZWplY3Rpb24gZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IHJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpIHx8ICd1bmtub3duIHBhdHRlcm5zJztcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBwZXJzb25hIGNvbnRlbnQ6ICR7cGF0dGVybnN9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgY29udGVudDtcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IGZyb250bWF0dGVyTWF0Y2hbMV07XG4gICAgY29uc3QgbWFya2Rvd25Db250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoZnJvbnRtYXR0ZXJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgWUFNTFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVlhbWxDb250ZW50KHlhbWxDb250ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ01hbGljaW91cyBZQU1MIGRldGVjdGVkIGluIHBlcnNvbmEgZnJvbnRtYXR0ZXInKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtYXJrZG93biBjb250ZW50XG4gICAgY29uc3QgY29udGVudFJlc3VsdCA9IHRoaXMudmFsaWRhdGVBbmRTYW5pdGl6ZShtYXJrZG93bkNvbnRlbnQpO1xuICAgIGlmICghY29udGVudFJlc3VsdC5pc1ZhbGlkICYmIGNvbnRlbnRSZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgIC8vIEZJWDogSW5jbHVkZSBzcGVjaWZpYyBwYXR0ZXJucyB0aGF0IHRyaWdnZXJlZCB0aGUgcmVqZWN0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gY29udGVudFJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpIHx8ICd1bmtub3duIHBhdHRlcm5zJztcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gcGVyc29uYSBjb250ZW50OiAke3BhdHRlcm5zfWApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBzYW5pdGl6ZWQgY29udGVudFxuICAgIHJldHVybiBgLS0tXFxuJHt5YW1sQ29udGVudH1cXG4tLS0ke2NvbnRlbnRSZXN1bHQuc2FuaXRpemVkQ29udGVudCB8fCBtYXJrZG93bkNvbnRlbnR9YDtcbiAgfVxufVxuIl19
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve a target path and verify that it remains inside the intended base
|
|
3
3
|
* directory. This is separator-aware, so sibling paths such as `/tmp/base2`
|
|
4
|
-
* are not treated as children of `/tmp/base`.
|
|
4
|
+
* are not treated as children of `/tmp/base`. Existing symlinked base paths
|
|
5
|
+
* and symlinked descendants under the base are rejected because writes would
|
|
6
|
+
* follow them outside the lexical containment boundary.
|
|
5
7
|
*/
|
|
6
8
|
export declare function resolvePathWithinBase(baseDir: string, ...segments: string[]): string;
|
|
7
9
|
//# sourceMappingURL=pathSecurity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pathSecurity.d.ts","sourceRoot":"","sources":["../../src/utils/pathSecurity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pathSecurity.d.ts","sourceRoot":"","sources":["../../src/utils/pathSecurity.ts"],"names":[],"mappings":"AAqCA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA4BpF"}
|
|
@@ -1,8 +1,42 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
1
2
|
import * as path from 'node:path';
|
|
3
|
+
function assertNotSymlink(pathToCheck, message) {
|
|
4
|
+
try {
|
|
5
|
+
const stats = fs.lstatSync(pathToCheck);
|
|
6
|
+
if (stats.isSymbolicLink()) {
|
|
7
|
+
throw new Error(message);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
const code = typeof error === 'object' && error !== null && 'code' in error
|
|
12
|
+
? error.code
|
|
13
|
+
: undefined;
|
|
14
|
+
if (code === 'ENOENT' || code === 'ENOTDIR') {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function assertNoSymlinkedDescendants(resolvedBase, resolvedTarget) {
|
|
21
|
+
const relativePath = path.relative(resolvedBase, resolvedTarget);
|
|
22
|
+
if (!relativePath) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
let currentPath = resolvedBase;
|
|
26
|
+
for (const segment of relativePath.split(path.sep)) {
|
|
27
|
+
if (!segment) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
currentPath = path.join(currentPath, segment);
|
|
31
|
+
assertNotSymlink(currentPath, 'Path segment resolves through a symbolic link');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
2
34
|
/**
|
|
3
35
|
* Resolve a target path and verify that it remains inside the intended base
|
|
4
36
|
* directory. This is separator-aware, so sibling paths such as `/tmp/base2`
|
|
5
|
-
* are not treated as children of `/tmp/base`.
|
|
37
|
+
* are not treated as children of `/tmp/base`. Existing symlinked base paths
|
|
38
|
+
* and symlinked descendants under the base are rejected because writes would
|
|
39
|
+
* follow them outside the lexical containment boundary.
|
|
6
40
|
*/
|
|
7
41
|
export function resolvePathWithinBase(baseDir, ...segments) {
|
|
8
42
|
if (!baseDir || typeof baseDir !== 'string') {
|
|
@@ -23,8 +57,10 @@ export function resolvePathWithinBase(baseDir, ...segments) {
|
|
|
23
57
|
|| relativePath.startsWith('..' + path.sep)
|
|
24
58
|
|| path.isAbsolute(relativePath);
|
|
25
59
|
if (!isTraversal) {
|
|
60
|
+
assertNotSymlink(resolvedBase, 'Base directory resolves through a symbolic link');
|
|
61
|
+
assertNoSymlinkedDescendants(resolvedBase, resolvedTarget);
|
|
26
62
|
return resolvedTarget;
|
|
27
63
|
}
|
|
28
64
|
throw new Error('Resolved path escapes the base directory');
|
|
29
65
|
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFNlY3VyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGhTZWN1cml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUVsQyxTQUFTLGdCQUFnQixDQUFDLFdBQW1CLEVBQUUsT0FBZTtJQUM1RCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLElBQUksS0FBSztZQUN6RSxDQUFDLENBQUUsS0FBK0IsQ0FBQyxJQUFJO1lBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsWUFBb0IsRUFBRSxjQUFzQjtJQUNoRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUM7SUFDL0IsS0FBSyxNQUFNLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLFNBQVM7UUFDWCxDQUFDO1FBRUQsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQWUsRUFBRSxHQUFHLFFBQWtCO0lBQzFFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakUsTUFBTSxXQUFXLEdBQUcsWUFBWSxLQUFLLElBQUk7V0FDcEMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztXQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRW5DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsaURBQWlELENBQUMsQ0FBQztRQUNsRiw0QkFBNEIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmZ1bmN0aW9uIGFzc2VydE5vdFN5bWxpbmsocGF0aFRvQ2hlY2s6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBmcy5sc3RhdFN5bmMocGF0aFRvQ2hlY2spO1xuICAgIGlmIChzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGNvZGUgPSB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY29kZSA9PT0gJ0VOT0VOVCcgfHwgY29kZSA9PT0gJ0VOT1RESVInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydE5vU3ltbGlua2VkRGVzY2VuZGFudHMocmVzb2x2ZWRCYXNlOiBzdHJpbmcsIHJlc29sdmVkVGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyZXNvbHZlZEJhc2UsIHJlc29sdmVkVGFyZ2V0KTtcbiAgaWYgKCFyZWxhdGl2ZVBhdGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgY3VycmVudFBhdGggPSByZXNvbHZlZEJhc2U7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiByZWxhdGl2ZVBhdGguc3BsaXQocGF0aC5zZXApKSB7XG4gICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50UGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgc2VnbWVudCk7XG4gICAgYXNzZXJ0Tm90U3ltbGluayhjdXJyZW50UGF0aCwgJ1BhdGggc2VnbWVudCByZXNvbHZlcyB0aHJvdWdoIGEgc3ltYm9saWMgbGluaycpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHRhcmdldCBwYXRoIGFuZCB2ZXJpZnkgdGhhdCBpdCByZW1haW5zIGluc2lkZSB0aGUgaW50ZW5kZWQgYmFzZVxuICogZGlyZWN0b3J5LiBUaGlzIGlzIHNlcGFyYXRvci1hd2FyZSwgc28gc2libGluZyBwYXRocyBzdWNoIGFzIGAvdG1wL2Jhc2UyYFxuICogYXJlIG5vdCB0cmVhdGVkIGFzIGNoaWxkcmVuIG9mIGAvdG1wL2Jhc2VgLiBFeGlzdGluZyBzeW1saW5rZWQgYmFzZSBwYXRoc1xuICogYW5kIHN5bWxpbmtlZCBkZXNjZW5kYW50cyB1bmRlciB0aGUgYmFzZSBhcmUgcmVqZWN0ZWQgYmVjYXVzZSB3cml0ZXMgd291bGRcbiAqIGZvbGxvdyB0aGVtIG91dHNpZGUgdGhlIGxleGljYWwgY29udGFpbm1lbnQgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aFdpdGhpbkJhc2UoYmFzZURpcjogc3RyaW5nLCAuLi5zZWdtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAoIWJhc2VEaXIgfHwgdHlwZW9mIGJhc2VEaXIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFzZSBkaXJlY3RvcnkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGlmICh0eXBlb2Ygc2VnbWVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdGggc2VnbWVudHMgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIGlmIChzZWdtZW50LmluY2x1ZGVzKCdcXDAnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHNlZ21lbnQgY29udGFpbnMgYSBudWxsIGJ5dGUnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUoYmFzZURpcik7XG4gIGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gcGF0aC5yZXNvbHZlKHJlc29sdmVkQmFzZSwgLi4uc2VnbWVudHMpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlc29sdmVkQmFzZSwgcmVzb2x2ZWRUYXJnZXQpO1xuICBjb25zdCBpc1RyYXZlcnNhbCA9IHJlbGF0aXZlUGF0aCA9PT0gJy4uJ1xuICAgIHx8IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicgKyBwYXRoLnNlcClcbiAgICB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcblxuICBpZiAoIWlzVHJhdmVyc2FsKSB7XG4gICAgYXNzZXJ0Tm90U3ltbGluayhyZXNvbHZlZEJhc2UsICdCYXNlIGRpcmVjdG9yeSByZXNvbHZlcyB0aHJvdWdoIGEgc3ltYm9saWMgbGluaycpO1xuICAgIGFzc2VydE5vU3ltbGlua2VkRGVzY2VuZGFudHMocmVzb2x2ZWRCYXNlLCByZXNvbHZlZFRhcmdldCk7XG4gICAgcmV0dXJuIHJlc29sdmVkVGFyZ2V0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdSZXNvbHZlZCBwYXRoIGVzY2FwZXMgdGhlIGJhc2UgZGlyZWN0b3J5Jyk7XG59XG4iXX0=
|
|
@@ -33,6 +33,13 @@ export declare function createSetupRoutes(opts?: {
|
|
|
33
33
|
_installPermissionHook?: (client: string) => Promise<InstallPermissionHookResult>;
|
|
34
34
|
/** Override permission hook status reconciler. For testing only. */
|
|
35
35
|
_reconcilePermissionHookStatus?: (client: string) => Promise<PermissionHookStatus>;
|
|
36
|
+
/**
|
|
37
|
+
* Override the NVM launcher mitigation applied after a successful install.
|
|
38
|
+
* For testing only. Without this seam the install handler runs the real
|
|
39
|
+
* applyNvmLauncherIfNeeded against the real homedir(); on a machine WITH NVM
|
|
40
|
+
* that patches the developer's real client configs (issue #2338).
|
|
41
|
+
*/
|
|
42
|
+
_applyNvmLauncher?: (client: string) => Promise<NvmLauncherResult>;
|
|
36
43
|
/** Enable automatic hook asset repair during detect. Defaults off in tests. */
|
|
37
44
|
_autoRepairPermissionHooksOnDetect?: boolean;
|
|
38
45
|
/** Skip the sliding-window rate limiter. For testing only. */
|
|
@@ -59,18 +66,27 @@ export type NvmLauncherResult = 'applied' | 'not-applicable' | 'failed';
|
|
|
59
66
|
*/
|
|
60
67
|
export declare function applyNvmLauncherIfNeeded(client: string, home?: string): Promise<NvmLauncherResult>;
|
|
61
68
|
/**
|
|
62
|
-
* Startup repair
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
69
|
+
* Startup repair + self-heal: reconciles every known JSON-format client config
|
|
70
|
+
* on each server start. Behaviour depends on whether NVM is installed, matching
|
|
71
|
+
* the acceptance matrix in https://github.com/DollhouseMCP/mcp-server/issues/2338:
|
|
72
|
+
*
|
|
73
|
+
* • NVM present → (re)create the wrapper and point each config at it. Covers a
|
|
74
|
+
* deleted wrapper, a pre-fix install still on bare `npx`, and a config left
|
|
75
|
+
* pointing at a dead temp-dir wrapper (regenerates the real one). Healthy
|
|
76
|
+
* configs re-serialise byte-identically, so this is a no-op for them.
|
|
77
|
+
* • NVM absent → never create a wrapper, but SELF-HEAL any config whose
|
|
78
|
+
* command points at a `dollhousemcp-nvm.sh` that no longer exists (e.g. the
|
|
79
|
+
* #2338 test leak, or a user who removed ~/.dollhouse/bin) back to bare `npx`,
|
|
80
|
+
* preserving args so the client can launch DollhouseMCP again.
|
|
67
81
|
*
|
|
68
82
|
* Fire-and-forget from startWebServer. All errors are swallowed and logged.
|
|
69
83
|
*
|
|
70
84
|
* @param home - Override home directory (injectable for tests)
|
|
71
85
|
* @param configPathResolver - Override config path lookup (injectable for tests).
|
|
72
|
-
* Return null to skip a client entirely.
|
|
73
|
-
*
|
|
86
|
+
* Return null to skip a client entirely. Defaults to a
|
|
87
|
+
* home-derived resolver so `home` stays authoritative
|
|
88
|
+
* — the default must NOT reach the real homedir() when
|
|
89
|
+
* a fake home is supplied (#2338).
|
|
74
90
|
*/
|
|
75
91
|
export declare function repairNvmLauncherOnStartup(home?: string, configPathResolver?: (client: string) => string | null): Promise<void>;
|
|
76
92
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/setupRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAajD,OAAO,EAGL,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EAC1B,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"setupRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/setupRoutes.ts"],"names":[],"mappings":"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"}
|