@dollhousemcp/mcp-server 2.0.0 → 2.0.2
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/README.md +282 -222
- package/README.npm.md +282 -222
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -6
- package/dist/persona/PersonaManager.d.ts.map +1 -1
- package/dist/persona/PersonaManager.js +1 -2
- package/dist/security/commandValidator.d.ts.map +1 -1
- package/dist/security/commandValidator.js +15 -3
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +2 -5
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +7 -5
- package/package.json +3 -3
- package/server.json +2 -2
|
@@ -766,7 +766,6 @@ export class PersonaManager extends BaseElementManager {
|
|
|
766
766
|
});
|
|
767
767
|
return persona;
|
|
768
768
|
}
|
|
769
|
-
// REMOVED: createPersona() and createNewPersona() - use create() instead (v2 breaking change)
|
|
770
769
|
/**
|
|
771
770
|
* Edit an existing persona
|
|
772
771
|
*/
|
|
@@ -1440,4 +1439,4 @@ export class PersonaManager extends BaseElementManager {
|
|
|
1440
1439
|
// Path validation handled by BaseElementManager.save() before this hook is called
|
|
1441
1440
|
}
|
|
1442
1441
|
}
|
|
1443
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc29uYS9QZXJzb25hTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUFFLGNBQWMsRUFBMEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFtQixlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRixPQUFPLEVBQW9CLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFrQyxNQUFNLHdDQUF3QyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBcUJwRyxNQUFNLE9BQU8sY0FBZSxTQUFRLGtCQUFrQztJQUNwRTs7O09BR0c7SUFDSyxjQUFjLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDeEMsV0FBVyxHQUFrQixJQUFJLENBQUM7SUFDbEMsZUFBZSxDQUFrQjtJQUN0QixnQkFBZ0IsQ0FBbUI7SUFDbkMsZUFBZSxDQUFrQjtJQUM1QyxlQUFlLENBQW1CO0lBQ2xDLFFBQVEsQ0FBdUI7SUFDdEIsV0FBVyxDQUFTO0lBQzdCLHdCQUF3QixHQUFHLEtBQUssQ0FBQztJQUNqQyx3QkFBd0IsQ0FBMkI7SUFDbkQsaUJBQWlCLENBQW9CO0lBQ3JDLGVBQWUsQ0FBa0I7SUFDeEIsb0JBQW9CLENBQXVCO0lBRTVELFlBQ0UsZ0JBQWtDLEVBQ2xDLGVBQWdDLEVBQ2hDLGVBQWdDLEVBQ2hDLHFCQUE0QyxFQUM1QyxrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsZUFBaUMsRUFDakMsUUFBOEIsRUFDOUIsY0FBcUMsRUFBRTtRQUV2QyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDdEgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBRXZDLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUM7UUFDdEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQztRQUNqRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxrQkFBa0IsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ2pGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ2dCLGVBQWU7UUFDaEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixxQ0FBcUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQU07UUFDVixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUUvQiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXBDLG9EQUFvRDtRQUNwRCwrQ0FBK0M7UUFDL0MsS0FBSyxNQUFNLGNBQWMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDdEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsT0FBdUI7UUFDNUMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLElBQUksR0FDUixPQUFPLENBQUMsUUFBUSxFQUFFLFNBQVM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO0lBQ3BELENBQUM7SUFHTyxZQUFZLENBQUMsV0FBMkIsRUFBRSxVQUFzQyxFQUFFO1FBQ3hGLE1BQU0sUUFBUSxHQUFvQjtZQUNoQyxHQUFHLFdBQVcsQ0FBQyxRQUFRO1lBQ3ZCLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDeEYsYUFBYSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUN4RyxDQUFDO1FBRUYsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUM5QixJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1FBRXBDLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ25ELFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELFFBQVEsR0FBRyxHQUFHLFFBQVEsS0FBSyxDQUFDO1lBRTVCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQzlCLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFFRCwyRkFBMkY7UUFDM0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQy9CO1lBQ0UsR0FBRyxRQUFRO1lBQ1gsSUFBSSxFQUFFLFdBQVcsQ0FBQyxPQUFPO1lBQ3pCLFNBQVMsRUFBRSxRQUFRO1NBQ2UsRUFDcEMsV0FBVyxDQUFDLFlBQVksRUFDeEIsUUFBUSxFQUNSLElBQUksQ0FBQyxlQUFlLEVBQ3BCLFdBQVcsQ0FBQyxPQUFPLENBQ3BCLENBQUM7UUFFRixhQUFhO1FBQ2IsTUFBTSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFFckIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLHVCQUF1QixDQUFDLE9BQXVCO1FBQ3JELE1BQU0sUUFBUSxHQUFvQixFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFbEUsK0NBQStDO1FBQy9DLE1BQU0sYUFBYSxHQUNqQixhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLFdBQVcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ2hHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBRTlCLG9FQUFvRTtRQUNwRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUN2RCxRQUFRLEVBQ1IsV0FBVyxDQUFDLE9BQU8sRUFDbkI7WUFDRSxZQUFZLEVBQUU7Z0JBQ1osUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLGFBQWEsRUFBRSxDQUFDLGNBQWMsQ0FBQztnQkFDL0IsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxnQ0FBZ0M7YUFDdkY7U0FDRixDQUNGLENBQUM7UUFFRixzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixVQUFVLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsSUFBSSxVQUFVLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixDQUNyRSxVQUFVLENBQUMsUUFBUSxFQUNuQixXQUFXLENBQUMsT0FBTyxFQUNuQixVQUFVLENBQUMsSUFBSSxDQUNoQixDQUFDO1lBQ0YsK0RBQStEO1lBQy9ELFVBQVUsQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUM3RCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtnQkFDaEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUUsT0FBTyxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QyxPQUFPLENBQUMsUUFBUSxHQUFHLFVBQW9DLENBQUM7UUFDeEQsT0FBTyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBR0Q7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYztRQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztRQUN2QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7UUFDdkMsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDN0MsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDTSxLQUFLLENBQUMsSUFBSTtRQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxzREFBc0Q7UUFDdEQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN0QixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYztRQUNsQixNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUM7b0JBQ1IsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLGVBQWUsUUFBUSxDQUFDLE1BQU0sV0FBVztpQkFDaEQsQ0FBQztTQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDJFQUEyRTtJQUNuRSxnQkFBZ0IsR0FBRztRQUN6QixTQUFTLEVBQUUsQ0FBQztRQUNaLFdBQVcsRUFBRSxDQUFDO1FBQ2QsY0FBYyxFQUFFLENBQUM7UUFDakIsWUFBWSxFQUFFLENBQUM7UUFDZixRQUFRLEVBQUUsQ0FBQztRQUNYLG1CQUFtQixFQUFFLENBQUM7S0FDdkIsQ0FBQztJQUVGLDREQUE0RDtJQUM1RCxtQkFBbUI7UUFDakIsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFDLE9BQXVCLEVBQUUsVUFBa0I7UUFDbkUsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxLQUFLLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5Qyx5REFBeUQ7UUFDekQsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxlQUFlO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEUsNENBQTRDO1FBQzVDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hFLDhCQUE4QjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxFQUFFLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUVsRixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXLENBQUMsVUFBa0I7UUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxnRkFBZ0Y7SUFDeEUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUErQyxDQUFDO0lBRWhGOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQWtCO1FBQ3ZDLDBEQUEwRDtRQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQyw4REFBOEQ7UUFDOUQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLDJFQUEyRSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZHLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxNQUFNLENBQUM7UUFDdEIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBa0I7UUFDaEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25ELElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxVQUFVLHdCQUF3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxnQkFBZ0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUNwUSxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLFVBQVUsaUNBQWlDLENBQUMsQ0FBQztZQUNqRyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOERBQThELFVBQVUsNEJBQTRCLENBQUMsQ0FBQztZQUNuSCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQWtCO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLHVCQUF1QixVQUFVLEdBQUc7YUFDOUMsQ0FBQztRQUNKLENBQUM7UUFFRCw4Q0FBOEM7UUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsT0FBTyxFQUFFLFlBQVksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLHFCQUFxQjtnQkFDL0QsT0FBTzthQUNSLENBQUM7UUFDSixDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRWhDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0RSxxREFBcUQ7UUFDckQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSxpQkFBaUI7WUFDdkIsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsZ0NBQWdDO1lBQ3hDLE9BQU8sRUFBRSxzQkFBc0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDdEQsY0FBYyxFQUFFO2dCQUNkLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUk7Z0JBQ3JDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTthQUMzQjtTQUNGLENBQUMsQ0FBQztRQUVILHdDQUF3QztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDbEIsa0JBQWtCLEVBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN0QixhQUFhLEVBQUUsVUFBVSxFQUFFO1lBQzNCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtTQUMzQixDQUFDLENBQ0gsQ0FBQztRQUVGLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSxzQkFBc0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDdEQsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsVUFBbUI7UUFDbkMsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxPQUFPO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSxnQ0FBZ0M7aUJBQzFDLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsbUdBQW1HO2FBQzdHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSx1QkFBdUIsVUFBVSxHQUFHO2FBQzlDLENBQUM7UUFDSixDQUFDO1FBRUQscUZBQXFGO1FBQ3JGLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE9BQU8sRUFBRSxZQUFZLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSx1QkFBdUI7YUFDbEUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsT0FBTyxlQUFlLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RyxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV4RSwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ2xCLG9CQUFvQixFQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDdEIsYUFBYSxFQUFFLFVBQVUsRUFBRTtZQUMzQixPQUFPLEVBQUUsT0FBTztZQUNoQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7U0FDM0IsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsd0JBQXdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1NBQ3pELENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDOUQsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQjtRQUNmLE1BQU0sUUFBUSxHQUFxQixFQUFFLENBQUM7UUFDdEMsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUI7UUFDakIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsVUFBa0I7UUFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFOUMsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1FBQ2hDLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDdEQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSTtvQkFDM0IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztvQkFDakMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFDL0IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUTtpQkFDcEMsQ0FBQyxDQUFDO2dCQUNILElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFJRDs7Ozs7O09BTUc7SUFDSyxvQkFBb0IsQ0FDMUIsZUFBdUMsRUFDdkMsaUJBQTRDO1FBRTVDLDZGQUE2RjtRQUM3RixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFvQjtZQUNoQyxHQUFHLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1lBQzVCLElBQUksRUFBRSxlQUFlLENBQUMsYUFBYTtZQUNuQyxXQUFXLEVBQUUsZUFBZSxDQUFDLFdBQVc7WUFDeEMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxRQUFRO1lBQ25DLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTTtZQUM5QixRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsRUFBRSxRQUFRO1lBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLElBQUksT0FBTztZQUM5QyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxJQUFJLEtBQUs7WUFDbEQsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNuRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxJQUFJLElBQUk7WUFDckQsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLElBQUksUUFBUTtZQUNuRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxJQUFJLE1BQU07WUFDekMsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsSUFBSSxPQUFPO1lBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLElBQUksY0FBYztZQUNyRCxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEYsUUFBUSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsSUFBSSxTQUFTO1NBQ25ELENBQUM7UUFFRixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxPQUFPLGlCQUFpQixDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbkQsc0VBQXNFO2dCQUN0RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNGLElBQUksY0FBYyxDQUFDLE9BQU8sSUFBSSxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQzVELFFBQVEsQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbEUsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdkYsMERBQTBEO2dCQUMxRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FDckUsaUJBQWlCLENBQUMsUUFBUSxFQUMxQixXQUFXLENBQUMsT0FBTyxFQUNuQixRQUFRLENBQUMsSUFBSSxDQUNkLENBQUM7Z0JBQ0Ysd0NBQXdDO2dCQUN4QyxRQUFRLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDM0QsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWE7b0JBQ2hDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEIsQ0FBQztZQUVELElBQUksT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3JELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO29CQUN2QixRQUFRLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN6RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNLLEtBQUssQ0FBQyxxQkFBcUIsQ0FDakMsSUFBWSxFQUNaLFdBQW1CLEVBQ25CLFlBQW9CLEVBQ3BCLFFBQWlCO1FBRWpCLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxzRUFBc0U7UUFDdEUsNEdBQTRHO1FBQzVHLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckUsbURBQW1EO1FBQ25ELDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxXQUFXLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEgsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLElBQUksbUJBQW1CLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELG1CQUFtQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hILENBQUM7UUFFRCxtRUFBbUU7UUFDbkUseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdHLENBQUM7UUFFRCxNQUFNLHNCQUFzQixHQUFHLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLGdEQUFnRDtZQUNoRCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSwyQkFBMkI7Z0JBQ2pDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUE0QyxJQUFJLFFBQVE7Z0JBQzlHLE1BQU0sRUFBRSxzQ0FBc0M7Z0JBQzlDLE9BQU8sRUFBRSw4QkFBOEIsc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM1RixjQUFjLEVBQUU7b0JBQ2QsS0FBSyxFQUFFLGNBQWM7b0JBQ3JCLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxRQUFRO2lCQUMxQzthQUNGLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELHlGQUF5RjtRQUN6RixvR0FBb0c7UUFDcEcsMkZBQTJGO1FBQzNGLCtGQUErRjtRQUMvRixNQUFNLGFBQWEsR0FBRyxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRyxNQUFNLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUM7UUFDOUYsTUFBTSxxQkFBcUIsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsSUFBSSxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQztRQUUvRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMvRSxtQkFBbUIsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixFQUFFLElBQUksU0FBUyxDQUFDLENBQUM7UUFDbkcsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFFMUUsdURBQXVEO1FBRXZELHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDNUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7aUJBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDbEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtpQkFDaEcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtpQkFDMUQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLEVBQUUsQ0FBQztRQUVMLE9BQU87WUFDTCxJQUFJLEVBQUUsYUFBYTtZQUNuQixhQUFhO1lBQ2IsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxZQUFZLEVBQUUscUJBQXFCO1lBQ25DLFFBQVE7WUFDUixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRO1lBQ1IsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG9CQUFvQixDQUFDLFFBQWE7UUFDeEMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoRSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUNyRCxHQUFHLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQ25DLENBQUM7UUFFRixJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFO2dCQUNuRCxhQUFhLEVBQUUsa0JBQWtCO2dCQUNqQyxNQUFNLEVBQUUscUNBQXFDO2FBQzlDLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQ2IscUNBQXFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNyRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdDRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBbUY7UUFDOUYsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsNkNBQTZDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDO1FBQ3hDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQzNDLGlGQUFpRjtRQUNqRiwrRUFBK0U7UUFDL0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFbkMsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JHLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELElBQUksSUFBSSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELGdHQUFnRztRQUNoRyxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDM0UsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTVELG1EQUFtRDtRQUNuRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFDM0QsSUFBSTtZQUNKLFdBQVc7WUFDWCxPQUFPLEVBQUUscUJBQXFCO1NBQy9CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsc0JBQXNCO1FBQ3RCLElBQUksZ0JBQWdCLENBQUMsUUFBUSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixJQUFJLGNBQWtDLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsQ0FBQztpQkFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0MsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7UUFFRCxrRUFBa0U7UUFDbEUsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVuSCxpRUFBaUU7UUFDakUsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixlQUFlLENBQUMsYUFBYSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7UUFFRCxzREFBc0Q7UUFDdEQsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRTlHLHNEQUFzRDtRQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxFQUFFLGlCQUE2QyxDQUFDLENBQUM7UUFFM0csMENBQTBDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRSxPQUFPLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDO1FBQ25DLE9BQU8sQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxPQUFPLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUNuRSxPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFFL0IsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsNkRBQTZEO1FBQzdELHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsZ0ZBQWdGO1FBRWhGLHVDQUF1QztRQUN2QyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsT0FBTyxFQUFFLG9CQUFvQixRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzVDLGNBQWMsRUFBRTtnQkFDZCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQzFCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDdkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMzQixZQUFZLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQzthQUM3QztTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCw4RkFBOEY7SUFFOUY7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUF5QixFQUFFLEtBQWEsRUFBRSxLQUFhO1FBQ3ZFLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBRUQsZ0VBQWdFO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsbUVBQW1FO1lBQ25FLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUUvQixnREFBZ0Q7UUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV4RixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBMkI7WUFDNUMsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQztRQUNGLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLG9CQUFvQixDQUFDO1FBRXBGLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdFLG1FQUFtRTtZQUNuRSxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLGNBQWMsb0NBQW9DLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEcsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRTlFLElBQUksQ0FBQztZQUNILGdFQUFnRTtZQUNoRSxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksYUFBYSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVHLENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM5RixxRUFBcUU7WUFDckUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsZ0RBQWdEO2dCQUNoRCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLFFBQVEsRUFBRSxRQUFRO29CQUNsQixNQUFNLEVBQUUsNEJBQTRCO29CQUNwQyxPQUFPLEVBQUUsaUNBQWlDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3hGLGNBQWMsRUFBRTt3QkFDZCxLQUFLLEVBQUUsZUFBZTt3QkFDdEIsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO3FCQUNuQztpQkFDRixDQUFDLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsZUFBZSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUksQ0FBQztZQUVELElBQUksY0FBYyxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUM7WUFFekYsSUFBSSxlQUFlLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ3ZDLGVBQWUsQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sSUFBSSxlQUFlLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLGNBQWM7cUJBQy9DLEtBQUssQ0FBQyxHQUFHLENBQUM7cUJBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDO2lCQUFNLElBQUksZUFBZSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN0QyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7aUJBQU0sSUFBSSxlQUFlLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUTtvQkFDL0IsYUFBYSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxTQUFTLENBQUM7WUFDbEUsQ0FBQztpQkFBTSxJQUFJLGVBQWUsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDN0MsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO1lBQ3hELENBQUM7aUJBQU0sSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pDLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQztnQkFDbEQsZUFBZSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUM7WUFDM0MsQ0FBQztZQUVELGlFQUFpRTtZQUNqRSxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzVCLGlFQUFpRTtvQkFDakUsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7b0JBRXJFLElBQUksWUFBWSxFQUFFLENBQUM7d0JBQ2pCLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxHQUFHLFlBQVksQ0FBQzt3QkFFekQsSUFBSSxVQUFVLEVBQUUsQ0FBQzs0QkFDZixnQ0FBZ0M7NEJBQ2hDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQzs0QkFDcEUsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQ0FDcEIsTUFBTSxDQUFDLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxHQUFHLGVBQWUsQ0FBQztnQ0FDMUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUMxRCxlQUFlLENBQUMsT0FBTyxHQUFHLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksY0FBYyxJQUFJLE9BQU8sRUFBRSxDQUFDOzRCQUN0RixDQUFDO2lDQUFNLENBQUM7Z0NBQ04sZUFBZSxDQUFDLE9BQU8sR0FBRyxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDOUUsQ0FBQzt3QkFDSCxDQUFDOzZCQUFNLENBQUM7NEJBQ04sK0JBQStCOzRCQUMvQixlQUFlLENBQUMsT0FBTyxHQUFHLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM5RSxDQUFDO29CQUNILENBQUM7eUJBQU0sQ0FBQzt3QkFDTixlQUFlLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztvQkFDcEMsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sZUFBZSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ3BDLENBQUM7Z0JBQ0QsbUJBQW1CO2dCQUNuQixlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQzdELENBQUM7WUFFRCxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDO1lBRS9ELHVEQUF1RDtZQUN2RCxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1RCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVwQixNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxHQUFHLGVBQWUsWUFBWSxLQUFLLEdBQUc7Z0JBQ3hDLENBQUMsQ0FBQyxlQUFlLENBQUM7WUFFcEIsK0NBQStDO1lBQy9DLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDRCQUE0QjtnQkFDcEMsT0FBTyxFQUFFLG1CQUFtQixlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksWUFBWSxlQUFlLEdBQUc7Z0JBQ3ZGLGNBQWMsRUFBRTtvQkFDZCxLQUFLLEVBQUUsZUFBZTtvQkFDdEIsb0JBQW9CLEVBQUUsU0FBUztvQkFDL0IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzNDLFFBQVEsRUFBRSxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2lCQUNwRDthQUNGLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsT0FBTyxFQUFFLGdEQUFnRCxZQUFZLEVBQUU7Z0JBQ3ZFLFNBQVM7Z0JBQ1QsT0FBTyxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDL0QsT0FBTyxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTztnQkFDekMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUN6RCxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUF1QixFQUFFLEtBQWEsRUFBRSxLQUFhO1FBQzdFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RSxvRUFBb0U7UUFFcEUsc0VBQXNFO1FBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRTVGLDJCQUEyQjtRQUMzQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLG1FQUFtRTtZQUNuRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFHRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxpQkFBeUI7UUFDdkMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsbUVBQW1FO1lBQ25FLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztRQUVwRixnREFBZ0Q7UUFDaEQsTUFBTSxXQUFXLEdBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUzQyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xFLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDaEMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RFLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbEMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLGdCQUFnQixDQUFDLFdBQVcsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVFLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNyQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyRCxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsRUFBRTtZQUN6RCxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQzNCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO1NBQzlCLENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztZQUMvQixPQUFPLEVBQUUsZUFBZTtZQUN4QixNQUFNLEVBQUUsZ0JBQWdCO1NBQ3pCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZSxDQUFDLFFBQXVCLEVBQUUsS0FBYztRQUNyRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsMERBQTBEO1lBQzFELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sSUFBSSxlQUFlLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxlQUFlLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUVELDBHQUEwRztZQUMxRyxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQztZQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLDhGQUE4RixDQUMvRixDQUFDO1lBQ0osQ0FBQztZQUVELG9CQUFvQjtZQUNwQixNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTNFLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsMERBQTBEO2dCQUMxRCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ2xFLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLFlBQVksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0csQ0FBQztnQkFFRCxrRUFBa0U7Z0JBQ2xFLE1BQU0sVUFBVSxHQUFHLDRCQUE0QixDQUFDO2dCQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO29CQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQzFDLENBQUM7Z0JBRUQsaUJBQWlCO2dCQUNqQixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7WUFDM0MsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7WUFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1lBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUUsNEJBQTRCO1lBRWpGLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7WUFDbEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLDRCQUE0QjtZQUV4RSxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTztZQUNMLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJO1lBQzVDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxJQUFJO1NBQzNDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILHFCQUFxQixDQUFDLE1BQXVCO1FBQzNDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDRCQUE0QjtRQUNqQywwREFBMEQ7UUFDMUQsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFHRDs7O09BR0c7SUFDTSxPQUFPO1FBQ2QsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFeEIsa0VBQWtFO1FBQ2xFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHdCQUF3QjtRQUM5QixNQUFNLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUUscUNBQXFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQ1Qsa0NBQWtDLEdBQUcsS0FBSztnQkFDMUMsbUdBQW1HLENBQ3BHLENBQUM7WUFFRixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUseUNBQXlDO2dCQUNqRCxPQUFPLEVBQUUsa0NBQWtDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRTthQUM3RSxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsMERBQTBEO1FBQzFELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssMEJBQTBCO1FBQ2hDLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQzNDLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztZQUVwQyxLQUFLLE1BQU0sY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzNDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUVwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FDVCxjQUFjLE9BQU8sc0NBQXNDO29CQUMzRCxvQkFBb0IsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQy9ELENBQUM7Z0JBRUYsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsaUJBQWlCO29CQUN2QixRQUFRLEVBQUUsS0FBSztvQkFDZixNQUFNLEVBQUUsMkNBQTJDO29CQUNuRCxPQUFPLEVBQUUsV0FBVyxPQUFPLGtDQUFrQztvQkFDN0QsY0FBYyxFQUFFO3dCQUNkLFlBQVksRUFBRSxPQUFPO3dCQUNyQixXQUFXLEVBQUUsT0FBTzt3QkFDcEIsY0FBYyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUMxQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRWhFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDJDQUEyQztnQkFDbkQsT0FBTyxFQUFFLG1CQUFtQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDckYsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FDekIsSUFBNEIsRUFDNUIsYUFBNEIsRUFDNUIsUUFBdUI7UUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7WUFDaEMsSUFBSTtZQUNKLGFBQWE7WUFDYixRQUFRO1lBQ1IsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDdkMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFO2dCQUNqRSxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUM5RCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUNwQyw4Q0FBOEM7UUFDOUMsK0VBQStFO1FBQy9FLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRXBCLGtHQUFrRztRQUNsRyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsT0FBTyxFQUFFLG9CQUFvQixRQUFRLEVBQUU7WUFDdkMsY0FBYyxFQUFFO2dCQUNkLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixTQUFTO2FBQ1Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxpQkFBeUI7UUFDM0MsZ0VBQWdFO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksaUJBQWlCLGFBQWEsRUFBRSxDQUFDO1FBQ2pGLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxpQ0FBaUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzNGLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFjLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSwwRUFBMEU7YUFDcEYsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUUvQixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEYsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQywyREFBMkQ7WUFDM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFL0UsaUZBQWlGO1lBQ2pGLGdGQUFnRjtZQUNoRixtRkFBbUY7WUFDbkYsbUVBQW1FO1lBQ25FLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVELDRFQUE0RTtnQkFDNUUsd0ZBQXdGO2dCQUN4RixlQUFlLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxXQUFXLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQztZQUNyRixDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRixhQUFhLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDM0UsYUFBYSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUNuRCxhQUFhLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7WUFFM0MsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEQsNkRBQTZEO1lBQzdELDZEQUE2RDtZQUU3RCxPQUFPO2dCQUNMLEdBQUcsTUFBTTtnQkFDVCxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2FBQ2pDLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGlGQUFpRjtJQUVqRjs7OztPQUlHO0lBQ0ssd0JBQXdCLENBQUMsUUFBeUI7UUFDeEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLHVCQUF1QixFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsa0NBQWtDO1FBRTdGLE9BQU87WUFDTCxHQUFHLHVCQUF1QjtZQUMxQixJQUFJLEVBQUUsV0FBVyxDQUFDLE9BQU87WUFDekIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksa0JBQWtCO1lBQ3pDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUU7WUFDdkMsVUFBVSxFQUFHLFFBQVEsQ0FBQyxVQUFvQyxJQUFJLEtBQUs7WUFDbkUsaUJBQWlCLEVBQUcsUUFBUSxDQUFDLGlCQUErRCxJQUFJLE9BQU87U0FDeEcsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLHdCQUF3QixDQUFDLFFBQWE7UUFDNUMsT0FBTyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLE9BQU8sQ0FBQztJQUMzRixDQUFDO0lBRUQsZ0ZBQWdGO0lBRTdELEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBUztRQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUF1QixDQUFDO1FBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFUyxhQUFhLENBQUMsUUFBZ0MsRUFBRSxRQUFnQjtRQUN4RSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hGLGtHQUFrRztRQUNsRyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELDRGQUE0RjtRQUM1RixPQUFRLFFBQWdCLENBQUMsY0FBYyxDQUFDLENBQUUscUNBQXFDO1FBQy9FLE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNuRCxJQUFJLFlBQW9CLENBQUM7UUFDekIsSUFBSSxPQUFlLENBQUM7UUFDcEIsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ3pCLGtGQUFrRjtZQUNsRixZQUFZLEdBQUcsb0JBQW9CLENBQUM7WUFDcEMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUNyQixDQUFDO2FBQU0sQ0FBQztZQUNOLDhEQUE4RDtZQUM5RCxZQUFZLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDZixDQUFDO1FBRUQsdUZBQXVGO1FBQ3ZGLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsUUFBZSxDQUFDO1FBRXhFLGlHQUFpRztRQUNqRyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FDdkM7WUFDRSxHQUFHLGFBQWE7WUFDaEIsU0FBUyxFQUFFLFFBQVE7U0FDcEIsRUFDRCxZQUFZLEVBQ1osUUFBUSxFQUNSLElBQUksQ0FBQyxlQUFlLEVBQ3BCLE9BQU8sQ0FDUixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELGNBQWMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBRTdCLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFUyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBdUI7UUFDdEQsNkVBQTZFO1FBQzdFLE1BQU0sUUFBUSxHQUF3QixFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTlELCtEQUErRDtRQUMvRCxRQUFRLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsUUFBUSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsQ0FBRSxtQ0FBbUM7UUFDcEUsUUFBUSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBRWhDLDJEQUEyRDtRQUMzRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixRQUFRLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDL0MsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWhFLElBQUksSUFBWSxDQUFDO1FBQ2pCLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDdkIsSUFBSSxHQUFHLEtBQUssSUFBSSxPQUFPLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksR0FBRyxLQUFLLElBQUksT0FBTyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsaUZBQWlGO1FBQ2pGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBQ2pGLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsYUFBYSxFQUFFLElBQUk7WUFDbkIsZ0JBQWdCLEVBQUUsYUFBYTtZQUMvQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILG1CQUFtQixDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUU1RSxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFZLEVBQUUsU0FBdUMsVUFBVTtRQUNqRixJQUFJLFFBQXlCLENBQUM7UUFDOUIsSUFBSSxZQUFvQixDQUFDO1FBQ3pCLElBQUksT0FBZSxDQUFDO1FBRXBCLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQVksQ0FBQztZQUMzQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUMzQixZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDekMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sNkRBQTZEO1lBQzdELDhFQUE4RTtZQUM5RSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUNwQixlQUFlLENBQUMsZ0JBQWdCLENBQUM7NEJBQy9CLElBQUksRUFBRSx3QkFBd0I7NEJBQzlCLFFBQVEsRUFBRSxNQUFNOzRCQUNoQixNQUFNLEVBQUUsOEJBQThCOzRCQUN0QyxPQUFPLEVBQUUsaUNBQWlDO3lCQUMzQyxDQUFDLENBQUM7d0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO29CQUMvRSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpELGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXZDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBdUIsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBRWhDLDBFQUEwRTtZQUMxRSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDMUIsK0VBQStFO2dCQUMvRSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztnQkFDckMsT0FBTyxHQUFHLFFBQVEsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMEVBQTBFO2dCQUMxRSxZQUFZLEdBQUcsUUFBUSxDQUFDO2dCQUN4QixPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxtRkFBbUY7UUFDbkYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzFCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQXVCLEVBQUUsVUFBd0MsVUFBVTtRQUM3Riw0REFBNEQ7UUFDNUQsZ0VBQWdFO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0UsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUUsOEJBQThCO1FBQ2xFLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVrQixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQXVCO1FBQ3hELElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsNkVBQTZFO2FBQ3RGLENBQUM7UUFDSixDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxNQUFNLEVBQUUsdURBQXVEO2FBQ2hFLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRWtCLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBdUI7UUFDekQsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLGtGQUFrRjtJQUNwRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgcGVyc29uYSBtYW5hZ2VtZW50IG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgUGVyc29uYSwgUGVyc29uYU1ldGFkYXRhIH0gZnJvbSAnLi4vdHlwZXMvcGVyc29uYS5qcyc7XG5pbXBvcnQgeyBQZXJzb25hRWxlbWVudCwgUGVyc29uYUVsZW1lbnRNZXRhZGF0YSB9IGZyb20gJy4vUGVyc29uYUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWxlbmFtZSwgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVDb250ZW50U2l6ZSB9IGZyb20gJy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vc2VjdXJpdHkvZXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEluZGljYXRvckNvbmZpZywgZm9ybWF0SW5kaWNhdG9yIH0gZnJvbSAnLi4vY29uZmlnL2luZGljYXRvci1jb25maWcuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciwgRWxlbWVudFR5cGUgfSBmcm9tICcuLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgU3RhdGVDaGFuZ2VOb3RpZmllciwgdHlwZSBQZXJzb25hU3RhdGVDaGFuZ2VUeXBlIH0gZnJvbSAnLi4vc2VydmljZXMvU3RhdGVDaGFuZ2VOb3RpZmllci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaXNEZWZhdWx0UGVyc29uYSB9IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0UGVyc29uYXMuanMnO1xuaW1wb3J0IHsgUGVyc29uYUltcG9ydGVyLCBJbXBvcnRSZXN1bHQgfSBmcm9tICcuL2V4cG9ydC1pbXBvcnQvUGVyc29uYUltcG9ydGVyLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciwgdHlwZSBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zIH0gZnJvbSAnLi4vZWxlbWVudHMvYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgVkFMSURBVElPTl9DT05TVEFOVFMgfSBmcm9tICcuLi9lbGVtZW50cy9iYXNlL0VsZW1lbnRWYWxpZGF0aW9uLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVZlcnNpb24gfSBmcm9tICcuLi9lbGVtZW50cy9CYXNlRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1RyaWdnZXJWYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuLyoqXG4gKiBWYWxpZGF0ZWQgYW5kIHNhbml0aXplZCBwZXJzb25hIGlucHV0IGRhdGFcbiAqL1xuaW50ZXJmYWNlIFZhbGlkYXRlZFBlcnNvbmFJbnB1dHMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHNhbml0aXplZE5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIHRyaWdnZXJzOiBzdHJpbmdbXTtcbiAgdW5pcXVlSWQ6IHN0cmluZztcbiAgYXV0aG9yOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQZXJzb25hTWFuYWdlck9wdGlvbnMgZXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zIHtcbiAgcGVyc29uYUltcG9ydGVyPzogUGVyc29uYUltcG9ydGVyO1xuICBub3RpZmllcj86IFN0YXRlQ2hhbmdlTm90aWZpZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJzb25hTWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxQZXJzb25hRWxlbWVudD4ge1xuICAvKipcbiAgICogVHJhY2sgYWN0aXZlIHBlcnNvbmFzIGJ5IGZpbGVuYW1lIChzdGFibGUgaWRlbnRpZmllcilcbiAgICogSXNzdWUgIzI4MTogQ2hhbmdlZCBmcm9tIHNpbmdsZSBhY3RpdmUgcGVyc29uYSB0byBTZXQgZm9yIG11bHRpcGxlIGFjdGl2ZVxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVQZXJzb25hczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGluZGljYXRvckNvbmZpZzogSW5kaWNhdG9yQ29uZmlnO1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyO1xuICBwcml2YXRlIHBlcnNvbmFJbXBvcnRlcj86IFBlcnNvbmFJbXBvcnRlcjtcbiAgcHJpdmF0ZSBub3RpZmllcj86IFN0YXRlQ2hhbmdlTm90aWZpZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyc29uYXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBwYXRoVmFsaWRhdG9ySW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgaW5kaWNhdG9yQ29uZmlnOiBJbmRpY2F0b3JDb25maWcsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnksXG4gICAgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgcGVyc29uYUltcG9ydGVyPzogUGVyc29uYUltcG9ydGVyLFxuICAgIG5vdGlmaWVyPzogU3RhdGVDaGFuZ2VOb3RpZmllcixcbiAgICBiYXNlT3B0aW9uczogUGVyc29uYU1hbmFnZXJPcHRpb25zID0ge31cbiAgKSB7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuUEVSU09OQSwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCBiYXNlT3B0aW9ucywgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IHBvcnRmb2xpb01hbmFnZXI7XG4gICAgdGhpcy5maWxlTG9ja01hbmFnZXIgPSBmaWxlTG9ja01hbmFnZXI7XG5cbiAgICB0aGlzLmluZGljYXRvckNvbmZpZyA9IGluZGljYXRvckNvbmZpZztcbiAgICB0aGlzLnBlcnNvbmFJbXBvcnRlciA9IGJhc2VPcHRpb25zLnBlcnNvbmFJbXBvcnRlciA/PyBwZXJzb25hSW1wb3J0ZXI7XG4gICAgdGhpcy5ub3RpZmllciA9IGJhc2VPcHRpb25zLm5vdGlmaWVyID8/IG5vdGlmaWVyO1xuICAgIHRoaXMucGVyc29uYXNEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5QRVJTT05BKTtcbiAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy5tZXRhZGF0YVNlcnZpY2UgPSBtZXRhZGF0YVNlcnZpY2U7XG4gICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZSA9IG5ldyBTZXJpYWxpemF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhdGhWYWxpZGF0b3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0byByZXR1cm4gc2luZ3VsYXIgZm9ybSBmb3IgZWxlbWVudCB0eXBlIGxhYmVsaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAncGVyc29uYSc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhbmQgbG9hZCBhbGwgcGVyc29uYXNcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbml0aWFsaXplUGF0aFZhbGlkYXRvcigpO1xuICAgIC8vIEJhc2UgY2xhc3MgaGFuZGxlcyBlbGVtZW50IGxvYWRpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgcGVyc29uYXMgdXNpbmcgQmFzZUVsZW1lbnRNYW5hZ2VyIGNhY2hlc1xuICAgKi9cbiAgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhdGhWYWxpZGF0b3IoKTtcblxuICAgIC8vIENsZWFyIEJhc2VFbGVtZW50TWFuYWdlciBjYWNoZXMgYW5kIHJlbG9hZFxuICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgIGNvbnN0IHBlcnNvbmFzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYWN0aXZlIHBlcnNvbmFzIHN0aWxsIGV4aXN0IGFmdGVyIHJlbG9hZFxuICAgIC8vIElzc3VlICMyODE6IFN1cHBvcnQgbXVsdGlwbGUgYWN0aXZlIHBlcnNvbmFzXG4gICAgZm9yIChjb25zdCBhY3RpdmVGaWxlbmFtZSBvZiBbLi4udGhpcy5hY3RpdmVQZXJzb25hc10pIHtcbiAgICAgIGNvbnN0IHN0aWxsRXhpc3RzID0gcGVyc29uYXMuc29tZShwID0+IHRoaXMuZGVyaXZlRmlsZW5hbWUocCkgPT09IGFjdGl2ZUZpbGVuYW1lKTtcbiAgICAgIGlmICghc3RpbGxFeGlzdHMpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQZXJzb25hcy5kZWxldGUoYWN0aXZlRmlsZW5hbWUpO1xuICAgICAgICB0aGlzLm5vdGlmeVBlcnNvbmFDaGFuZ2UoJ3BlcnNvbmEtZGVhY3RpdmF0ZWQnLCBhY3RpdmVGaWxlbmFtZSwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXJpdmVGaWxlbmFtZShwZXJzb25hOiBQZXJzb25hRWxlbWVudCk6IHN0cmluZyB7XG4gICAgaWYgKHBlcnNvbmEuZmlsZW5hbWUpIHtcbiAgICAgIHJldHVybiBwZXJzb25hLmZpbGVuYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2UgPVxuICAgICAgcGVyc29uYS5tZXRhZGF0YT8udW5pcXVlX2lkIHx8XG4gICAgICB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKHBlcnNvbmEubWV0YWRhdGE/Lm5hbWUgfHwgJ3BlcnNvbmEnKTtcblxuICAgIHJldHVybiBiYXNlLmVuZHNXaXRoKCcubWQnKSA/IGJhc2UgOiBgJHtiYXNlfS5tZGA7XG4gIH1cblxuXG4gIHByaXZhdGUgY2xvbmVQZXJzb25hKGJhc2VQZXJzb25hOiBQZXJzb25hRWxlbWVudCwgb3B0aW9uczogeyB3cml0YWJsZUNvcHk/OiBib29sZWFuIH0gPSB7fSk6IFBlcnNvbmFFbGVtZW50IHtcbiAgICBjb25zdCBtZXRhZGF0YTogUGVyc29uYU1ldGFkYXRhID0ge1xuICAgICAgLi4uYmFzZVBlcnNvbmEubWV0YWRhdGEsXG4gICAgICB0cmlnZ2VyczogYmFzZVBlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnMgPyBbLi4uYmFzZVBlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnNdIDogdW5kZWZpbmVkLFxuICAgICAgY29udGVudF9mbGFnczogYmFzZVBlcnNvbmEubWV0YWRhdGEuY29udGVudF9mbGFncyA/IFsuLi5iYXNlUGVyc29uYS5tZXRhZGF0YS5jb250ZW50X2ZsYWdzXSA6IHVuZGVmaW5lZFxuICAgIH07XG5cbiAgICBsZXQgdW5pcXVlSWQgPSBiYXNlUGVyc29uYS5pZDtcbiAgICBsZXQgZmlsZW5hbWUgPSBiYXNlUGVyc29uYS5maWxlbmFtZTtcblxuICAgIGlmIChvcHRpb25zLndyaXRhYmxlQ29weSkge1xuICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQobWV0YWRhdGEubmFtZSwgYXV0aG9yKTtcbiAgICAgIGZpbGVuYW1lID0gYCR7dW5pcXVlSWR9Lm1kYDtcblxuICAgICAgbWV0YWRhdGEudW5pcXVlX2lkID0gdW5pcXVlSWQ7XG4gICAgICBpZiAoYXV0aG9yKSB7XG4gICAgICAgIG1ldGFkYXRhLmF1dGhvciA9IGF1dGhvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbmV3IFBlcnNvbmFFbGVtZW50IGluc3RhbmNlICh2Mi4wIGR1YWwtZmllbGQ6IHBhc3MgYm90aCBpbnN0cnVjdGlvbnMgYW5kIGNvbnRlbnQpXG4gICAgY29uc3QgY2xvbmVkID0gbmV3IFBlcnNvbmFFbGVtZW50KFxuICAgICAge1xuICAgICAgICAuLi5tZXRhZGF0YSxcbiAgICAgICAgdHlwZTogRWxlbWVudFR5cGUuUEVSU09OQSxcbiAgICAgICAgdW5pcXVlX2lkOiB1bmlxdWVJZFxuICAgICAgfSBhcyBQYXJ0aWFsPFBlcnNvbmFFbGVtZW50TWV0YWRhdGE+LFxuICAgICAgYmFzZVBlcnNvbmEuaW5zdHJ1Y3Rpb25zLFxuICAgICAgZmlsZW5hbWUsXG4gICAgICB0aGlzLm1ldGFkYXRhU2VydmljZSxcbiAgICAgIGJhc2VQZXJzb25hLmNvbnRlbnRcbiAgICApO1xuXG4gICAgLy8gU2V0IHRoZSBJRFxuICAgIGNsb25lZC5pZCA9IHVuaXF1ZUlkO1xuXG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplUGVyc29uYUZvclNhdmUocGVyc29uYTogUGVyc29uYUVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhZGF0YTogUGVyc29uYU1ldGFkYXRhID0geyAuLi4ocGVyc29uYS5tZXRhZGF0YSA/PyB7fSkgfTtcblxuICAgIC8vIFNhbml0aXplIG5hbWUgZmlyc3QgKGJlZm9yZSBNZXRhZGF0YVNlcnZpY2UpXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9XG4gICAgICBzYW5pdGl6ZUlucHV0KG1ldGFkYXRhLm5hbWUgfHwgcGVyc29uYS5maWxlbmFtZSB8fCBgcGVyc29uYS0ke0RhdGUubm93KCl9YCwgMTAwKSB8fCAnUGVyc29uYSc7XG4gICAgbWV0YWRhdGEubmFtZSA9IHNhbml0aXplZE5hbWU7XG5cbiAgICAvLyBVc2UgTWV0YWRhdGFTZXJ2aWNlIGZvciBjb21tb24gZmllbGRzICsgcGVyc29uYS1zcGVjaWZpYyBkZWZhdWx0c1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm1ldGFkYXRhU2VydmljZS5ub3JtYWxpemVNZXRhZGF0YTxQZXJzb25hTWV0YWRhdGE+KFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAge1xuICAgICAgICB0eXBlRGVmYXVsdHM6IHtcbiAgICAgICAgICBjYXRlZ29yeTogJ2dlbmVyYWwnLFxuICAgICAgICAgIGNvbnRlbnRfZmxhZ3M6IFsndXNlci1jcmVhdGVkJ10sXG4gICAgICAgICAgYWdlX3JhdGluZzogJ2FsbCcsXG4gICAgICAgICAgY3JlYXRlZF9kYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSAgLy8gUGVyc29uYSB1c2VzIGRhdGUtb25seSBmb3JtYXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgdW5pcXVlX2lkIChwZXJzb25hLXNwZWNpZmljKVxuICAgIGlmICghbm9ybWFsaXplZC51bmlxdWVfaWQpIHtcbiAgICAgIG5vcm1hbGl6ZWQudW5pcXVlX2lkID0gZ2VuZXJhdGVVbmlxdWVJZChub3JtYWxpemVkLm5hbWUsIG5vcm1hbGl6ZWQuYXV0aG9yKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdHJpZ2dlcnMgKGVsZW1lbnQtc3BlY2lmaWMgdmFsaWRhdGlvbilcbiAgICBpZiAobm9ybWFsaXplZC50cmlnZ2VycyAmJiBub3JtYWxpemVkLnRyaWdnZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZVRyaWdnZXJzKFxuICAgICAgICBub3JtYWxpemVkLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgICBub3JtYWxpemVkLm5hbWVcbiAgICAgICk7XG4gICAgICAvLyBDUklUSUNBTDogUHJlc2VydmUgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gbm8gdmFsaWQgdHJpZ2dlcnNcbiAgICAgIG5vcm1hbGl6ZWQudHJpZ2dlcnMgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnMubGVuZ3RoID4gMFxuICAgICAgICA/IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2Vyc1xuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9ybWFsaXplZC50cmlnZ2VycyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlbmFtZSA9IHBlcnNvbmEuZmlsZW5hbWUgfHwgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUobm9ybWFsaXplZC5uYW1lKTtcbiAgICBwZXJzb25hLmZpbGVuYW1lID0gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZSk7XG5cbiAgICBwZXJzb25hLm1ldGFkYXRhID0gbm9ybWFsaXplZCBhcyBQZXJzb25hRWxlbWVudE1ldGFkYXRhO1xuICAgIHBlcnNvbmEudW5pcXVlX2lkID0gbm9ybWFsaXplZC51bmlxdWVfaWQ7XG4gICAgcGVyc29uYS5pZCA9IG5vcm1hbGl6ZWQudW5pcXVlX2lkO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0IGFsbCBsb2FkZWQgcGVyc29uYXMgYXMgYSBNYXAgKHVzZWQgYnkgaW1wb3J0IG9wZXJhdGlvbnMpXG4gICAqL1xuICBhc3luYyBnZXRBbGxQZXJzb25hcygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFBlcnNvbmE+PiB7XG4gICAgY29uc3QgcGVyc29uYXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgUGVyc29uYT4oKTtcbiAgICBmb3IgKGNvbnN0IHBlcnNvbmEgb2YgcGVyc29uYXMpIHtcbiAgICAgIG1hcC5zZXQocGVyc29uYS5maWxlbmFtZSwgcGVyc29uYSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcnNvbmFzIGZyb20gY2FjaGUgYXMgYSBNYXAgKHN5bmNocm9ub3VzLCBmb3IgREkgY29uc3VtZXJzKVxuICAgKi9cbiAgZ2V0UGVyc29uYXMoKTogTWFwPHN0cmluZywgUGVyc29uYT4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBQZXJzb25hPigpO1xuICAgIGZvciAoY29uc3QgcGVyc29uYSBvZiB0aGlzLmVsZW1lbnRzLnZhbHVlcygpKSB7XG4gICAgICBtYXAuc2V0KHBlcnNvbmEuZmlsZW5hbWUsIHBlcnNvbmEpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHBlcnNvbmFzIGFzIGFuIGFycmF5XG4gICAqIEVuc3VyZXMgYWxsIHBlcnNvbmFzIGhhdmUgZmlsZW5hbWVzIHNldFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFBlcnNvbmFFbGVtZW50W10+IHtcbiAgICBjb25zdCBwZXJzb25hcyA9IGF3YWl0IHN1cGVyLmxpc3QoKTtcbiAgICAvLyBFbnN1cmUgZmlsZW5hbWVzIGFyZSBzZXQgdXNpbmcgZGVyaXZlRmlsZW5hbWUgbG9naWNcbiAgICBmb3IgKGNvbnN0IHBlcnNvbmEgb2YgcGVyc29uYXMpIHtcbiAgICAgIGlmICghcGVyc29uYS5maWxlbmFtZSkge1xuICAgICAgICBwZXJzb25hLmZpbGVuYW1lID0gdGhpcy5kZXJpdmVGaWxlbmFtZShwZXJzb25hKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcnNvbmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZCBwZXJzb25hcyBhbmQgcmV0dXJuIE1DUC1mb3JtYXR0ZWQgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIHJlbG9hZFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgY29uc3QgcGVyc29uYXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7cGVyc29uYXMubGVuZ3RofSBwZXJzb25hc2BcbiAgICAgIH1dXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgcGVyc29uYSBieSBpZGVudGlmaWVyIChmaWxlbmFtZSwgbmFtZSwgb3IgdW5pcXVlX2lkKVxuICAgKiBVc2VzIGNhY2hlZCBlbGVtZW50cyBmcm9tIEJhc2VFbGVtZW50TWFuYWdlciBmb3Igc3luY2hyb25vdXMgYWNjZXNzXG4gICAqIE11bHRpLXN0cmF0ZWd5IHNlYXJjaDogZmlsZW5hbWUgKHdpdGgvd2l0aG91dCAubWQpLCBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKSwgdW5pcXVlX2lkXG4gICAqL1xuICAvKiogQ2FjaGUgbWlzcyBtZXRyaWNzIGZvciBtb25pdG9yaW5nIHBlcnNvbmEgbG9va3VwIGhlYWx0aCAoSXNzdWUgIzg0MykgKi9cbiAgcHJpdmF0ZSBjYWNoZU1pc3NNZXRyaWNzID0ge1xuICAgIGNhY2hlSGl0czogMCxcbiAgICBjYWNoZU1pc3NlczogMCxcbiAgICBkaXNrUmVjb3ZlcmllczogMCxcbiAgICBkaXNrRmFpbHVyZXM6IDAsXG4gICAgbm90Rm91bmQ6IDAsXG4gICAgZGVkdXBsaWNhdGVkTG9va3VwczogMCxcbiAgfTtcblxuICAvKiogR2V0IGNhY2hlIG1pc3MgbWV0cmljcyBmb3IgbW9uaXRvcmluZyBhbmQgZGlhZ25vc3RpY3MgKi9cbiAgZ2V0Q2FjaGVNaXNzTWV0cmljcygpOiBSZWFkb25seTx0eXBlb2YgdGhpcy5jYWNoZU1pc3NNZXRyaWNzPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5jYWNoZU1pc3NNZXRyaWNzIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwZXJzb25hIG1hdGNoZXMgYW4gaWRlbnRpZmllciBieSBmaWxlbmFtZSwgbmFtZSwgb3IgSUQuXG4gICAqIFNoYXJlZCBtYXRjaGluZyBsb2dpYyB1c2VkIGJ5IGJvdGggZmluZFBlcnNvbmEoKSBhbmQgZmluZFBlcnNvbmFBc3luYygpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXRjaGVzSWRlbnRpZmllcihwZXJzb25hOiBQZXJzb25hRWxlbWVudCwgaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGlkZW50aWZpZXIudHJpbSgpO1xuICAgIGNvbnN0IGxvd2VyID0gdHJpbW1lZC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZpbGVuYW1lV2l0aEV4dCA9IHRyaW1tZWQuZW5kc1dpdGgoJy5tZCcpID8gdHJpbW1lZCA6IGAke3RyaW1tZWR9Lm1kYDtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZGVyaXZlRmlsZW5hbWUocGVyc29uYSk7XG5cbiAgICAvLyBTdHJhdGVneSAxOiBFeGFjdCBmaWxlbmFtZSBtYXRjaCAod2l0aCBvciB3aXRob3V0IC5tZClcbiAgICBpZiAoZmlsZW5hbWUgPT09IHRyaW1tZWQgfHwgZmlsZW5hbWUgPT09IGZpbGVuYW1lV2l0aEV4dCkgcmV0dXJuIHRydWU7XG4gICAgLy8gU3RyYXRlZ3kgMjogTmFtZSBtYXRjaCAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAgICBpZiAocGVyc29uYS5tZXRhZGF0YS5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBsb3dlcikgcmV0dXJuIHRydWU7XG4gICAgLy8gU3RyYXRlZ3kgMzogVW5pcXVlIElEIG1hdGNoXG4gICAgaWYgKHBlcnNvbmEuaWQgPT09IHRyaW1tZWQgfHwgcGVyc29uYS5tZXRhZGF0YS51bmlxdWVfaWQgPT09IHRyaW1tZWQpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmluZFBlcnNvbmEoaWRlbnRpZmllcjogc3RyaW5nKTogUGVyc29uYUVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy52YWx1ZXMoKS5maW5kKHAgPT4gdGhpcy5tYXRjaGVzSWRlbnRpZmllcihwLCBpZGVudGlmaWVyKSk7XG4gIH1cblxuICAvKiogSW4tZmxpZ2h0IGRpc2sgbG9va3VwcyB0byBwcmV2ZW50IGR1cGxpY2F0ZSByZWFkcyBmb3IgdGhlIHNhbWUgaWRlbnRpZmllciAqL1xuICBwcml2YXRlIHBlbmRpbmdMb29rdXBzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UGVyc29uYUVsZW1lbnQgfCB1bmRlZmluZWQ+PigpO1xuXG4gIC8qKlxuICAgKiBGaW5kIGEgcGVyc29uYSB3aXRoIGRpc2sgZmFsbGJhY2sgd2hlbiBjYWNoZSBtaXNzZXMuXG4gICAqXG4gICAqIElzc3VlICM4NDM6IGZpbmRQZXJzb25hKCkgaXMgc3luY2hyb25vdXMgYW5kIGNhY2hlLW9ubHkuIEFmdGVyIExSVSBldmljdGlvblxuICAgKiBvciBkaXJlY3QgZmlsZXN5c3RlbSBlZGl0cyBmb2xsb3dlZCBieSBzY2FuKCksIHBlcnNvbmFzIGJlY29tZSBpbnZpc2libGUgZXZlblxuICAgKiB0aG91Z2ggdGhlIGZpbGUgZXhpc3RzIG9uIGRpc2suIFRoaXMgYXN5bmMgbWV0aG9kIHRyaWVzIHRoZSBmYXN0IGNhY2hlIHBhdGhcbiAgICogZmlyc3QsIHRoZW4gZmFsbHMgYmFjayB0byBCYXNlRWxlbWVudE1hbmFnZXIuZmluZEJ5TmFtZSgpIHdoaWNoIGhhcyB0aGUgZnVsbFxuICAgKiBjYWNoZSDihpIgc3RvcmFnZSBpbmRleCDihpIgZGlyZWN0IGZpbGUgbG9hZCDihpIgbGlzdCBzY2FuIGZhbGxiYWNrIGNoYWluLlxuICAgKlxuICAgKiBJbmNsdWRlcyByZXF1ZXN0IGRlZHVwbGljYXRpb246IGNvbmN1cnJlbnQgbG9va3VwcyBmb3IgdGhlIHNhbWUgaWRlbnRpZmllclxuICAgKiBzaGFyZSBhIHNpbmdsZSBkaXNrIHJlYWQgdG8gYXZvaWQgcmVkdW5kYW50IEkvTyBpbiBicmlkZ2Uvc3dhcm0gc2NlbmFyaW9zLlxuICAgKi9cbiAgYXN5bmMgZmluZFBlcnNvbmFBc3luYyhpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFBlcnNvbmFFbGVtZW50IHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gRmFzdCBwYXRoOiBjaGVjayBMUlUgY2FjaGUgKHN5bmNocm9ub3VzLCBPKGNhY2hlIHNpemUpKVxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZmluZFBlcnNvbmEoaWRlbnRpZmllcik7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgdGhpcy5jYWNoZU1pc3NNZXRyaWNzLmNhY2hlSGl0cysrO1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICB0aGlzLmNhY2hlTWlzc01ldHJpY3MuY2FjaGVNaXNzZXMrKztcblxuICAgIC8vIERlZHVwbGljYXRlIGNvbmN1cnJlbnQgZGlzayBsb29rdXBzIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyXG4gICAgY29uc3QgbG9va3VwS2V5ID0gaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nTG9va3Vwcy5nZXQobG9va3VwS2V5KTtcbiAgICBpZiAocGVuZGluZykge1xuICAgICAgdGhpcy5jYWNoZU1pc3NNZXRyaWNzLmRlZHVwbGljYXRlZExvb2t1cHMrKztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BlcnNvbmFNYW5hZ2VyXSBmaW5kUGVyc29uYUFzeW5jOiBkZWR1cGxpY2F0aW5nIGNvbmN1cnJlbnQgbG9va3VwIGZvciBcIiR7aWRlbnRpZmllcn1cImApO1xuICAgICAgcmV0dXJuIHBlbmRpbmc7XG4gICAgfVxuXG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5wZXJmb3JtRGlza0xvb2t1cChpZGVudGlmaWVyKTtcbiAgICB0aGlzLnBlbmRpbmdMb29rdXBzLnNldChsb29rdXBLZXksIGxvb2t1cCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGxvb2t1cDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wZW5kaW5nTG9va3Vwcy5kZWxldGUobG9va3VwS2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIGRpc2sgbG9va3VwIGZvciBmaW5kUGVyc29uYUFzeW5jLlxuICAgKiBTZXBhcmF0ZWQgdG8gc3VwcG9ydCByZXF1ZXN0IGRlZHVwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1EaXNrTG9va3VwKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8UGVyc29uYUVsZW1lbnQgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnJvbURpc2sgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG4gICAgICBpZiAoZnJvbURpc2sgJiYgdGhpcy5tYXRjaGVzSWRlbnRpZmllcihmcm9tRGlzaywgaWRlbnRpZmllcikpIHtcbiAgICAgICAgdGhpcy5jYWNoZU1pc3NNZXRyaWNzLmRpc2tSZWNvdmVyaWVzKys7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbUGVyc29uYU1hbmFnZXJdIENhY2hlIG1pc3MgcmVjb3ZlcmVkIGZyb20gZGlzazogXCIke2lkZW50aWZpZXJ9XCIgKHRvdGFsIHJlY292ZXJpZXM6ICR7dGhpcy5jYWNoZU1pc3NNZXRyaWNzLmRpc2tSZWNvdmVyaWVzfSwgbWlzcyByYXRlOiAke3RoaXMuY2FjaGVNaXNzTWV0cmljcy5jYWNoZU1pc3Nlc30vJHt0aGlzLmNhY2hlTWlzc01ldHJpY3MuY2FjaGVIaXRzICsgdGhpcy5jYWNoZU1pc3NNZXRyaWNzLmNhY2hlTWlzc2VzfSlgKTtcbiAgICAgICAgcmV0dXJuIGZyb21EaXNrO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZU1pc3NNZXRyaWNzLm5vdEZvdW5kKys7XG4gICAgICBsb2dnZXIuZGVidWcoYFtQZXJzb25hTWFuYWdlcl0gZmluZFBlcnNvbmFBc3luYzogXCIke2lkZW50aWZpZXJ9XCIgbm90IGZvdW5kIGluIGNhY2hlIG9yIG9uIGRpc2tgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmNhY2hlTWlzc01ldHJpY3MuZGlza0ZhaWx1cmVzKys7XG4gICAgICBsb2dnZXIuZGVidWcoYFtQZXJzb25hTWFuYWdlcl0gZmluZFBlcnNvbmFBc3luYzogZGlzayBsb29rdXAgZmFpbGVkIGZvciBcIiR7aWRlbnRpZmllcn1cIiAocGFyc2UvdmFsaWRhdGlvbiBlcnJvcilgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGEgcGVyc29uYVxuICAgKiBJc3N1ZSAjMjgxOiBOb3cgc3VwcG9ydHMgbXVsdGlwbGUgYWN0aXZlIHBlcnNvbmFzIChhZGRzIHRvIHNldCBpbnN0ZWFkIG9mIHJlcGxhY2luZylcbiAgICogSXNzdWUgIzg0MzogTm93IGFzeW5jIOKAlCB1c2VzIGZpbmRQZXJzb25hQXN5bmMoKSB0byByZWNvdmVyIGZyb20gY2FjaGUgZXZpY3Rpb25cbiAgICovXG4gIGFzeW5jIGFjdGl2YXRlUGVyc29uYShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBwZXJzb25hPzogUGVyc29uYSB9PiB7XG4gICAgY29uc3QgcGVyc29uYSA9IGF3YWl0IHRoaXMuZmluZFBlcnNvbmFBc3luYyhpZGVudGlmaWVyKTtcblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBQZXJzb25hIG5vdCBmb3VuZDogXCIke2lkZW50aWZpZXJ9XCJgXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElzc3VlICMyODE6IEFkZCB0byBzZXQgaW5zdGVhZCBvZiByZXBsYWNpbmdcbiAgICBjb25zdCB3YXNBbHJlYWR5QWN0aXZlID0gdGhpcy5hY3RpdmVQZXJzb25hcy5oYXMocGVyc29uYS5maWxlbmFtZSk7XG4gICAgaWYgKHdhc0FscmVhZHlBY3RpdmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBQZXJzb25hICcke3BlcnNvbmEubWV0YWRhdGEubmFtZX0nIGlzIGFscmVhZHkgYWN0aXZlYCxcbiAgICAgICAgcGVyc29uYVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjODM6IENoZWNrIGlmIGNsZWFudXAgaXMgbmVlZGVkIGJlZm9yZSBhZGRpbmdcbiAgICB0aGlzLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpO1xuXG4gICAgdGhpcy5hY3RpdmVQZXJzb25hcy5hZGQocGVyc29uYS5maWxlbmFtZSk7XG4gICAgdGhpcy5ub3RpZnlQZXJzb25hQ2hhbmdlKCdwZXJzb25hLWFjdGl2YXRlZCcsIG51bGwsIHBlcnNvbmEuZmlsZW5hbWUpO1xuXG4gICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuNCAtIExvZyBwZXJzb25hIGFjdGl2YXRpb24gZXZlbnRcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLmFjdGl2YXRlUGVyc29uYScsXG4gICAgICBkZXRhaWxzOiBgUGVyc29uYSBhY3RpdmF0ZWQ6ICR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBhY3RpdmVDb3VudDogdGhpcy5hY3RpdmVQZXJzb25hcy5zaXplLFxuICAgICAgICBmaWxlbmFtZTogcGVyc29uYS5maWxlbmFtZVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRW1pdCBhY3RpdmF0aW9uIGV2ZW50IGZvciBzdWJzY3JpYmVyc1xuICAgIHRoaXMuZGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6YWN0aXZhdGUnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoe1xuICAgICAgICBjb3JyZWxhdGlvbklkOiByYW5kb21VVUlEKCksXG4gICAgICAgIGVsZW1lbnQ6IHBlcnNvbmEsXG4gICAgICAgIGZpbGVQYXRoOiBwZXJzb25hLmZpbGVuYW1lXG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBBY3RpdmF0ZWQgcGVyc29uYTogJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9YCxcbiAgICAgIHBlcnNvbmFcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhIHNwZWNpZmljIHBlcnNvbmEgYnkgbmFtZVxuICAgKiBJc3N1ZSAjMjgxOiBOb3cgcmVxdWlyZXMgYSBuYW1lIHBhcmFtZXRlciB0byBkZWFjdGl2YXRlIHNwZWNpZmljIHBlcnNvbmEgZnJvbSB0aGUgc2V0XG4gICAqL1xuICBkZWFjdGl2YXRlUGVyc29uYShpZGVudGlmaWVyPzogc3RyaW5nKTogeyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfSB7XG4gICAgLy8gSWYgbm8gaWRlbnRpZmllciBwcm92aWRlZCwgcmV0dXJuIGVycm9yIChicmVha2luZyBjaGFuZ2UgZnJvbSBzaW5nbGUtYWN0aXZlKVxuICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gcGVyc29uYSBpcyBjdXJyZW50bHkgYWN0aXZlXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBcIlBlcnNvbmEgbmFtZSBpcyByZXF1aXJlZCBmb3IgZGVhY3RpdmF0aW9uLiBVc2UgJ2RlYWN0aXZhdGVfZWxlbWVudCcgd2l0aCBhIHNwZWNpZmljIHBlcnNvbmEgbmFtZS5cIlxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5maW5kUGVyc29uYShpZGVudGlmaWVyKTtcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgUGVyc29uYSBub3QgZm91bmQ6IFwiJHtpZGVudGlmaWVyfVwiYFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjMjgxOiBSZXR1cm4gc3VjY2Vzcz10cnVlIGZvciBpZGVtcG90ZW50IGJlaGF2aW9yIChwZXJzb25hIGFscmVhZHkgaW5hY3RpdmUpXG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBlcnNvbmFzLmhhcyhwZXJzb25hLmZpbGVuYW1lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYFBlcnNvbmEgJyR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfScgaXMgYWxyZWFkeSBpbmFjdGl2ZWBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuYWN0aXZlUGVyc29uYXMuZGVsZXRlKHBlcnNvbmEuZmlsZW5hbWUpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1BlcnNvbmFNYW5hZ2VyLmRlYWN0aXZhdGVQZXJzb25hXSBkZWxldGVkOiAke2RlbGV0ZWR9LCBuZXcgc2l6ZTogJHt0aGlzLmFjdGl2ZVBlcnNvbmFzLnNpemV9YCk7XG4gICAgdGhpcy5ub3RpZnlQZXJzb25hQ2hhbmdlKCdwZXJzb25hLWRlYWN0aXZhdGVkJywgcGVyc29uYS5maWxlbmFtZSwgbnVsbCk7XG5cbiAgICAvLyBFbWl0IGRlYWN0aXZhdGlvbiBldmVudCBmb3Igc3Vic2NyaWJlcnNcbiAgICB0aGlzLmRpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmRlYWN0aXZhdGUnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoe1xuICAgICAgICBjb3JyZWxhdGlvbklkOiByYW5kb21VVUlEKCksXG4gICAgICAgIGVsZW1lbnQ6IHBlcnNvbmEsXG4gICAgICAgIGZpbGVQYXRoOiBwZXJzb25hLmZpbGVuYW1lXG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBEZWFjdGl2YXRlZCBwZXJzb25hOiAke3BlcnNvbmEubWV0YWRhdGEubmFtZX1gXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpcnN0IGFjdGl2ZSBwZXJzb25hIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICogSXNzdWUgIzI4MTogV2l0aCBtdWx0aXBsZSBhY3RpdmUgcGVyc29uYXMsIHJldHVybnMgdGhlIGZpcnN0IG9uZVxuICAgKi9cbiAgZ2V0QWN0aXZlUGVyc29uYSgpOiBQZXJzb25hRWxlbWVudCB8IG51bGwge1xuICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmFzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZpcnN0QWN0aXZlID0gdGhpcy5hY3RpdmVQZXJzb25hcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgcmV0dXJuIGZpcnN0QWN0aXZlID8gdGhpcy5maW5kUGVyc29uYShmaXJzdEFjdGl2ZSkgfHwgbnVsbCA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgcGVyc29uYXNcbiAgICogSXNzdWUgIzI4MTogTmV3IG1ldGhvZCB0byBnZXQgYWxsIGFjdGl2ZSBwZXJzb25hc1xuICAgKi9cbiAgZ2V0QWN0aXZlUGVyc29uYXMoKTogUGVyc29uYUVsZW1lbnRbXSB7XG4gICAgY29uc3QgcGVyc29uYXM6IFBlcnNvbmFFbGVtZW50W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHRoaXMuYWN0aXZlUGVyc29uYXMpIHtcbiAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLmZpbmRQZXJzb25hKGZpbGVuYW1lKTtcbiAgICAgIGlmIChwZXJzb25hKSB7XG4gICAgICAgIHBlcnNvbmFzLnB1c2gocGVyc29uYSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwZXJzb25hcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaWRlbnRpZmllciBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBwZXJzb25hIChmaWxlbmFtZSkuXG4gICAqIElzc3VlICMyODE6IEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCByZXR1cm5zIGZpcnN0IGFjdGl2ZSBwZXJzb25hIElEXG4gICAqL1xuICBnZXRBY3RpdmVQZXJzb25hSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlUGVyc29uYXMudmFsdWVzKCkubmV4dCgpLnZhbHVlID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgcGVyc29uYSBJRHMgKGZpbGVuYW1lcylcbiAgICogSXNzdWUgIzI4MTogTmV3IG1ldGhvZCB0byBnZXQgYWxsIGFjdGl2ZSBwZXJzb25hIElEc1xuICAgKi9cbiAgZ2V0QWN0aXZlUGVyc29uYUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFjdGl2ZVBlcnNvbmFzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHNwZWNpZmljIHBlcnNvbmEgaXMgYWN0aXZlXG4gICAqIElzc3VlICMyODE6IE5ldyBtZXRob2QgdG8gY2hlY2sgaWYgYSBwZXJzb25hIGlzIGFjdGl2ZVxuICAgKi9cbiAgaXNQZXJzb25hQWN0aXZlKGlkZW50aWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLmZpbmRQZXJzb25hKGlkZW50aWZpZXIpO1xuICAgIGlmICghcGVyc29uYSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZVBlcnNvbmFzLmhhcyhwZXJzb25hLmZpbGVuYW1lKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBwZXJzb25hIGluZGljYXRvciBmb3IgcmVzcG9uc2VzXG4gICAqIElzc3VlICMyODE6IE5vdyBzdXBwb3J0cyBtdWx0aXBsZSBhY3RpdmUgcGVyc29uYXMgLSBjb25jYXRlbmF0ZXMgYWxsIGluZGljYXRvcnNcbiAgICovXG4gIGdldFBlcnNvbmFJbmRpY2F0b3IoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hcy5zaXplID09PSAwKSByZXR1cm4gXCJcIjtcblxuICAgIGNvbnN0IGluZGljYXRvcnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiB0aGlzLmFjdGl2ZVBlcnNvbmFzKSB7XG4gICAgICBjb25zdCBwZXJzb25hID0gdGhpcy5maW5kUGVyc29uYShmaWxlbmFtZSk7XG4gICAgICBpZiAocGVyc29uYSkge1xuICAgICAgICBjb25zdCBpbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnlcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRpY2F0b3IpIHtcbiAgICAgICAgICBpbmRpY2F0b3JzLnB1c2goaW5kaWNhdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRpY2F0b3JzLmpvaW4oJycpO1xuICB9XG4gIFxuXG5cbiAgLyoqXG4gICAqIEJ1aWxkIHBlcnNvbmEgbWV0YWRhdGEgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgb3B0aW9uYWwgb3ZlcnJpZGVzXG4gICAqXG4gICAqIEBwYXJhbSB2YWxpZGF0ZWRJbnB1dHMgLSBWYWxpZGF0ZWQgaW5wdXQgZGF0YVxuICAgKiBAcGFyYW0gbWV0YWRhdGFPdmVycmlkZXMgLSBPcHRpb25hbCBtZXRhZGF0YSBvdmVycmlkZXMgZnJvbSB1c2VyXG4gICAqIEByZXR1cm5zIENvbXBsZXRlIFBlcnNvbmFNZXRhZGF0YSBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgYnVpbGRQZXJzb25hTWV0YWRhdGEoXG4gICAgdmFsaWRhdGVkSW5wdXRzOiBWYWxpZGF0ZWRQZXJzb25hSW5wdXRzLFxuICAgIG1ldGFkYXRhT3ZlcnJpZGVzPzogUGFydGlhbDxQZXJzb25hTWV0YWRhdGE+XG4gICk6IFBlcnNvbmFFbGVtZW50TWV0YWRhdGEge1xuICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBtZXRhZGF0YSBrZXlzIEJFRk9SRSBvYmplY3QgY29uc3RydWN0aW9uIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgIGlmIChtZXRhZGF0YU92ZXJyaWRlcykge1xuICAgICAgdGhpcy52YWxpZGF0ZU1ldGFkYXRhS2V5cyhtZXRhZGF0YU92ZXJyaWRlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YWRhdGE6IFBlcnNvbmFNZXRhZGF0YSA9IHtcbiAgICAgIC4uLihtZXRhZGF0YU92ZXJyaWRlcyB8fCB7fSksXG4gICAgICBuYW1lOiB2YWxpZGF0ZWRJbnB1dHMuc2FuaXRpemVkTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZGF0ZWRJbnB1dHMuZGVzY3JpcHRpb24sXG4gICAgICB1bmlxdWVfaWQ6IHZhbGlkYXRlZElucHV0cy51bmlxdWVJZCxcbiAgICAgIGF1dGhvcjogdmFsaWRhdGVkSW5wdXRzLmF1dGhvcixcbiAgICAgIHRyaWdnZXJzOiB2YWxpZGF0ZWRJbnB1dHMudHJpZ2dlcnMgfHwgbWV0YWRhdGFPdmVycmlkZXM/LnRyaWdnZXJzLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGFPdmVycmlkZXM/LnZlcnNpb24gfHwgXCIxLjAuMFwiLFxuICAgICAgYWdlX3JhdGluZzogbWV0YWRhdGFPdmVycmlkZXM/LmFnZV9yYXRpbmcgfHwgXCJhbGxcIixcbiAgICAgIGNvbnRlbnRfZmxhZ3M6IG1ldGFkYXRhT3ZlcnJpZGVzPy5jb250ZW50X2ZsYWdzIHx8IFtcInVzZXItY3JlYXRlZFwiXSxcbiAgICAgIGFpX2dlbmVyYXRlZDogbWV0YWRhdGFPdmVycmlkZXM/LmFpX2dlbmVyYXRlZCA/PyB0cnVlLFxuICAgICAgZ2VuZXJhdGlvbl9tZXRob2Q6IG1ldGFkYXRhT3ZlcnJpZGVzPy5nZW5lcmF0aW9uX21ldGhvZCB8fCBcIkNsYXVkZVwiLFxuICAgICAgcHJpY2U6IG1ldGFkYXRhT3ZlcnJpZGVzPy5wcmljZSB8fCBcImZyZWVcIixcbiAgICAgIHJldmVudWVfc3BsaXQ6IG1ldGFkYXRhT3ZlcnJpZGVzPy5yZXZlbnVlX3NwbGl0IHx8IFwiODAvMjBcIixcbiAgICAgIGxpY2Vuc2U6IG1ldGFkYXRhT3ZlcnJpZGVzPy5saWNlbnNlIHx8IFwiQ0MtQlktU0EtNC4wXCIsXG4gICAgICBjcmVhdGVkX2RhdGU6IG1ldGFkYXRhT3ZlcnJpZGVzPy5jcmVhdGVkX2RhdGUgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSxcbiAgICAgIGNhdGVnb3J5OiBtZXRhZGF0YU92ZXJyaWRlcz8uY2F0ZWdvcnkgfHwgJ2dlbmVyYWwnXG4gICAgfTtcblxuICAgIGlmIChtZXRhZGF0YU92ZXJyaWRlcykge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YU92ZXJyaWRlcy5jYXRlZ29yeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgdG8gdmFsaWRhdGUgQkVGT1JFIHNhbml0aXphdGlvblxuICAgICAgICBjb25zdCBjYXRlZ29yeVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVDYXRlZ29yeShtZXRhZGF0YU92ZXJyaWRlcy5jYXRlZ29yeSk7XG4gICAgICAgIGlmIChjYXRlZ29yeVJlc3VsdC5pc1ZhbGlkICYmIGNhdGVnb3J5UmVzdWx0LnNhbml0aXplZFZhbHVlKSB7XG4gICAgICAgICAgbWV0YWRhdGEuY2F0ZWdvcnkgPSBjYXRlZ29yeVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhT3ZlcnJpZGVzLnRyaWdnZXJzKSAmJiBtZXRhZGF0YU92ZXJyaWRlcy50cmlnZ2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFVzZSBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgdG8gYXBwbHkgcHJvcGVyIHZhbGlkYXRpb25cbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgICAgbWV0YWRhdGFPdmVycmlkZXMudHJpZ2dlcnMsXG4gICAgICAgICAgRWxlbWVudFR5cGUuUEVSU09OQSxcbiAgICAgICAgICBtZXRhZGF0YS5uYW1lXG4gICAgICAgICk7XG4gICAgICAgIC8vIENSSVRJQ0FMOiBQcmVzZXJ2ZSB1bmRlZmluZWQgYmVoYXZpb3JcbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnMubGVuZ3RoID4gMFxuICAgICAgICAgID8gdmFsaWRhdGlvblJlc3VsdC52YWxpZFRyaWdnZXJzXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGFPdmVycmlkZXMuYWdlX3JhdGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkQWdlUmF0aW5nID0gc2FuaXRpemVJbnB1dChtZXRhZGF0YU92ZXJyaWRlcy5hZ2VfcmF0aW5nLCAxMCk7XG4gICAgICAgIGlmIChzYW5pdGl6ZWRBZ2VSYXRpbmcpIHtcbiAgICAgICAgICBtZXRhZGF0YS5hZ2VfcmF0aW5nID0gc2FuaXRpemVkQWdlUmF0aW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGxlZ2FjeSBQZXJzb25hTWV0YWRhdGEgdG8gUGVyc29uYUVsZW1lbnRNZXRhZGF0YSBiZWZvcmUgcmV0dXJuaW5nXG4gICAgcmV0dXJuIHRoaXMudG9QZXJzb25hRWxlbWVudE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYWxsIHBlcnNvbmEgY3JlYXRpb24gaW5wdXRzXG4gICAqIFNFQ1VSSVRZOiBQaGFzZSA0LjMgLSBBZGRlZCBVbmljb2RlIHZhbGlkYXRpb24gdG8gYWxsIHRleHQgaW5wdXRzXG4gICAqIFNFQ1VSSVRZOiBQaGFzZSA0LjEgLSBCbG9jayBBTEwgaW52YWxpZCBjb250ZW50LCBub3QganVzdCBjcml0aWNhbFxuICAgKiBTRUNVUklUWTogUGhhc2UgNC43IC0gQWNjZXB0IG5vcm1hbGl6ZWQgY29udGVudCBldmVuIGlmIFVuaWNvZGUgaXNzdWVzIHdlcmUgZGV0ZWN0ZWQgYW5kIGZpeGVkXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gUmF3IHBlcnNvbmEgbmFtZVxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBSYXcgcGVyc29uYSBkZXNjcmlwdGlvblxuICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb25zIC0gUmF3IHBlcnNvbmEgaW5zdHJ1Y3Rpb25zXG4gICAqIEBwYXJhbSB0cmlnZ2VycyAtIE9wdGlvbmFsIGNvbW1hLXNlcGFyYXRlZCB0cmlnZ2VyIHdvcmRzXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBhbmQgc2FuaXRpemVkIGlucHV0cyByZWFkeSBmb3IgbWV0YWRhdGEgY29uc3RydWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVBlcnNvbmFJbnB1dHMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmcsXG4gICAgdHJpZ2dlcnM/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxWYWxpZGF0ZWRQZXJzb25hSW5wdXRzPiB7XG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCFuYW1lIHx8ICFkZXNjcmlwdGlvbiB8fCAhaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBuYW1lLCBkZXNjcmlwdGlvbiwgaW5zdHJ1Y3Rpb25zJyk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuMyAtIEFwcGx5IFVuaWNvZGUgbm9ybWFsaXphdGlvbiBCRUZPUkUgdmFsaWRhdGlvblxuICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjcgLSBPbmx5IHJlamVjdCBDUklUSUNBTCBVbmljb2RlIGlzc3VlczsgYWNjZXB0IG5vcm1hbGl6ZWQgY29udGVudCBmb3IgbG93ZXIgc2V2ZXJpdGllc1xuICAgIGNvbnN0IG5hbWVVbmljb2RlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSk7XG4gICAgY29uc3QgZGVzY1VuaWNvZGUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkZXNjcmlwdGlvbik7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zVW5pY29kZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGluc3RydWN0aW9ucyk7XG5cbiAgICAvLyBSZWplY3QgY29udGVudCB3aXRoIGNyaXRpY2FsIFVuaWNvZGUgaXNzdWVzIE9OTFlcbiAgICAvLyBMb3dlciBzZXZlcml0eSBpc3N1ZXMgKGNvbmZ1c2FibGUgY2hhcnMsIGV0Yy4pIGFyZSBub3JtYWxpemVkIGFuZCBhY2NlcHRlZFxuICAgIGlmICghbmFtZVVuaWNvZGUuaXNWYWxpZCAmJiBuYW1lVW5pY29kZS5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYW1lIGNvbnRhaW5zIGRhbmdlcm91cyBVbmljb2RlIHBhdHRlcm5zOiAke25hbWVVbmljb2RlLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBpZiAoIWRlc2NVbmljb2RlLmlzVmFsaWQgJiYgZGVzY1VuaWNvZGUuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGVzY3JpcHRpb24gY29udGFpbnMgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnM6ICR7ZGVzY1VuaWNvZGUuZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGlmICghaW5zdHJ1Y3Rpb25zVW5pY29kZS5pc1ZhbGlkICYmIGluc3RydWN0aW9uc1VuaWNvZGUuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdHJ1Y3Rpb25zIGNvbnRhaW4gZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnM6ICR7aW5zdHJ1Y3Rpb25zVW5pY29kZS5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWTogUGhhc2UgNC43IC0gQ1JJVElDQUwgRklYOiBWYWxpZGF0ZSBCRUZPUkUgc2FuaXRpemF0aW9uXG4gICAgLy8gSWYgd2Ugc2FuaXRpemUgZmlyc3QsIG1hbGljaW91cyBwYXR0ZXJucyBnZXQgcmVtb3ZlZCBiZWZvcmUgZGV0ZWN0aW9uIVxuICAgIC8vIERldGVjdGlvbiBvcmRlcjogVW5pY29kZSBub3JtYWxpemUg4oaSIFRocmVhdCBkZXRlY3Qg4oaSIFNhbml0aXplIOKGkiBBY2NlcHRcbiAgICBjb25zdCBuYW1lVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShuYW1lVW5pY29kZS5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgaWYgKCFuYW1lVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWUgY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OiAke25hbWVWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY1ZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoZGVzY1VuaWNvZGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGlmICghZGVzY1ZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXNjcmlwdGlvbiBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6ICR7ZGVzY1ZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvbnNWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGluc3RydWN0aW9uc1VuaWNvZGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGlmICghaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC40IC0gTG9nIHZhbGlkYXRpb24gZmFpbHVyZXNcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5zZXZlcml0eT8udG9VcHBlckNhc2UoKSBhcyAnTE9XJyB8ICdNRURJVU0nIHwgJ0hJR0gnIHwgJ0NSSVRJQ0FMJyB8fCAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnUGVyc29uYU1hbmFnZXIudmFsaWRhdGVQZXJzb25hSW5wdXRzJyxcbiAgICAgICAgZGV0YWlsczogYENvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7aW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgZmllbGQ6ICdpbnN0cnVjdGlvbnMnLFxuICAgICAgICAgIHNldmVyaXR5OiBpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLnNldmVyaXR5XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN0cnVjdGlvbnMgY29udGFpbiBzZWN1cml0eSB0aHJlYXRzOiAke2luc3RydWN0aW9uc1ZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgc2FuaXRpemUgdGhlIFZBTElEQVRFRCBjb250ZW50IChDb250ZW50VmFsaWRhdG9yIGFscmVhZHkgcmV0dXJucyBzYW5pdGl6ZWRDb250ZW50KVxuICAgIC8vIFNFQ1VSSVRZOiBVc2UgbnVsbGlzaCBjb2FsZXNjaW5nICg/PykgaW5zdGVhZCBvZiBsb2dpY2FsIE9SICh8fCkgdG8gcHJvcGVybHkgaGFuZGxlIGVtcHR5IHN0cmluZ3NcbiAgICAvLyBFbXB0eSBzdHJpbmcgJycgaXMgYSB2YWxpZCBzYW5pdGl6YXRpb24gcmVzdWx0IHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIG1pbmltdW0gbGVuZ3RoXG4gICAgLy8gU0VDVVJJVFk6IFRyaW0gd2hpdGVzcGFjZSBmcm9tIG5hbWUgdG8gcHJldmVudCB3aGl0ZXNwYWNlLW9ubHkgbmFtZXMgZnJvbSBwYXNzaW5nIHZhbGlkYXRpb25cbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gKG5hbWVWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgPz8gbmFtZVVuaWNvZGUubm9ybWFsaXplZENvbnRlbnQpLnRyaW0oKTtcbiAgICBjb25zdCBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9IGRlc2NWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgPz8gZGVzY1VuaWNvZGUubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50ID8/IGluc3RydWN0aW9uc1VuaWNvZGUubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICBpZiAoc2FuaXRpemVkTmFtZS5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BlcnNvbmEgbmFtZSBtdXN0IGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBsb25nJyk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVDb250ZW50U2l6ZShzYW5pdGl6ZWRJbnN0cnVjdGlvbnMsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpO1xuICAgIHZhbGlkYXRlQ29udGVudFNpemUoc2FuaXRpemVkRGVzY3JpcHRpb24sIDIwMDApO1xuXG4gICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKHNhbml0aXplZE5hbWUsIHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpIHx8IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB2YWxpZGF0ZUZpbGVuYW1lKHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKHNhbml0aXplZE5hbWUpKTtcblxuICAgIC8vIFBhdGggdmFsaWRhdGlvbiBoYW5kbGVkIGJ5IEJhc2VFbGVtZW50TWFuYWdlci5zYXZlKClcblxuICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBCRUZPUkUgc2FuaXRpemF0aW9uIHRvIHJlamVjdCBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAvLyBUaGlzIHByZXZlbnRzICdiYWQhdHJpZ2dlcicgZnJvbSBiZWNvbWluZyAnYmFkdHJpZ2dlcicgYW5kIHBhc3NpbmdcbiAgICBjb25zdCB0cmlnZ2VyTGlzdCA9IHRyaWdnZXJzID9cbiAgICAgIHRyaWdnZXJzLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcCh0ID0+IHQudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKHQgPT4gdCAmJiBWQUxJREFUSU9OX0NPTlNUQU5UUy5UUklHR0VSX1ZBTElEQVRJT05fUkVHRVgudGVzdCh0KSkgLy8gVmFsaWRhdGUgZm9ybWF0IEZJUlNUXG4gICAgICAgIC5tYXAodCA9PiBzYW5pdGl6ZUlucHV0KHQsIDUwKSkgLy8gVGhlbiBzYW5pdGl6ZSBmb3IgbGVuZ3RoXG4gICAgICAgIC5maWx0ZXIodCA9PiB0Lmxlbmd0aCA+IDApIDpcbiAgICAgIFtdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHNhbml0aXplZE5hbWUsXG4gICAgICBzYW5pdGl6ZWROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIHRyaWdnZXJzOiB0cmlnZ2VyTGlzdCxcbiAgICAgIHVuaXF1ZUlkLFxuICAgICAgYXV0aG9yXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgbWV0YWRhdGEga2V5cyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBkYW5nZXJvdXMga2V5cyBhcmUgZGV0ZWN0ZWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNZXRhZGF0YUtleXMobWV0YWRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghbWV0YWRhdGEgfHwgdHlwZW9mIG1ldGFkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhbmdlcm91c0tleXMgPSBbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXTtcbiAgICBjb25zdCBmb3VuZERhbmdlcm91c0tleXMgPSBPYmplY3Qua2V5cyhtZXRhZGF0YSkuZmlsdGVyKFxuICAgICAga2V5ID0+IGRhbmdlcm91c0tleXMuaW5jbHVkZXMoa2V5KVxuICAgICk7XG5cbiAgICBpZiAoZm91bmREYW5nZXJvdXNLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci5lcnJvcignUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IGRldGVjdGVkJywge1xuICAgICAgICBkYW5nZXJvdXNLZXlzOiBmb3VuZERhbmdlcm91c0tleXMsXG4gICAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLnZhbGlkYXRlTWV0YWRhdGFLZXlzJ1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZWplY3RlZCBkYW5nZXJvdXMgbWV0YWRhdGEga2V5czogJHtmb3VuZERhbmdlcm91c0tleXMuam9pbignLCAnKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwZXJzb25hIGZvbGxvd2luZyB0aGUgdW5pZmllZCBlbGVtZW50IG1hbmFnZXIgcGF0dGVybi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgcHJpbWFyeSBBUEkgZm9yIHBlcnNvbmEgY3JlYXRpb24sIHJlcGxhY2luZyB0aGUgZGVwcmVjYXRlZFxuICAgKiBgY3JlYXRlUGVyc29uYSgpYCBhbmQgYGNyZWF0ZU5ld1BlcnNvbmEoKWAgbWV0aG9kcyAodjIgYnJlYWtpbmcgY2hhbmdlKS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBQZXJzb25hIGNyZWF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIGRhdGEubmFtZSAtIERpc3BsYXkgbmFtZSBmb3IgdGhlIHBlcnNvbmEgKHJlcXVpcmVkKVxuICAgKiBAcGFyYW0gZGF0YS5kZXNjcmlwdGlvbiAtIFNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwZXJzb25hJ3MgcHVycG9zZVxuICAgKiBAcGFyYW0gZGF0YS5pbnN0cnVjdGlvbnMgLSBCZWhhdmlvcmFsIGluc3RydWN0aW9ucyAoYWxpYXM6IGNvbnRlbnQpXG4gICAqIEBwYXJhbSBkYXRhLmNhdGVnb3J5IC0gT3B0aW9uYWwgY2F0ZWdvcnkgZm9yIG9yZ2FuaXphdGlvblxuICAgKiBAcGFyYW0gZGF0YS50cmlnZ2VycyAtIE9wdGlvbmFsIGtleXdvcmRzIHRoYXQgYWN0aXZhdGUgdGhpcyBwZXJzb25hXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIFBlcnNvbmFFbGVtZW50XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB2YWxpZGF0aW9uIGZhaWxzIG9yIHBlcnNvbmEgYWxyZWFkeSBleGlzdHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gQmFzaWMgcGVyc29uYSBjcmVhdGlvblxuICAgKiBjb25zdCBwZXJzb25hID0gYXdhaXQgcGVyc29uYU1hbmFnZXIuY3JlYXRlKHtcbiAgICogICBuYW1lOiAnQ29kZSBSZXZpZXdlcicsXG4gICAqICAgZGVzY3JpcHRpb246ICdFeHBlcnQgYXQgcmV2aWV3aW5nIGNvZGUgZm9yIHF1YWxpdHknLFxuICAgKiAgIGluc3RydWN0aW9uczogJ1lvdSBhcmUgYSBtZXRpY3Vsb3VzIGNvZGUgcmV2aWV3ZXIuLi4nXG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBXaXRoIGNhdGVnb3J5IGFuZCB0cmlnZ2Vyc1xuICAgKiBjb25zdCBwZXJzb25hID0gYXdhaXQgcGVyc29uYU1hbmFnZXIuY3JlYXRlKHtcbiAgICogICBuYW1lOiAnVGVjaG5pY2FsIFdyaXRlcicsXG4gICAqICAgZGVzY3JpcHRpb246ICdTcGVjaWFsaXplcyBpbiBjbGVhciBkb2N1bWVudGF0aW9uJyxcbiAgICogICBpbnN0cnVjdGlvbnM6ICdZb3Ugd3JpdGUgY2xlYXIsIGNvbmNpc2UgZG9jdW1lbnRhdGlvbi4uLicsXG4gICAqICAgY2F0ZWdvcnk6ICdwcm9mZXNzaW9uYWwnLFxuICAgKiAgIHRyaWdnZXJzOiBbJ2RvY3MnLCAnZG9jdW1lbnRhdGlvbicsICdyZWFkbWUnXVxuICAgKiB9KTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTWluaW1hbCBjcmVhdGlvbiAoZGVmYXVsdHMgYXBwbGllZClcbiAgICogY29uc3QgcGVyc29uYSA9IGF3YWl0IHBlcnNvbmFNYW5hZ2VyLmNyZWF0ZSh7XG4gICAqICAgbmFtZTogJ1F1aWNrIEhlbHBlcidcbiAgICogfSk7XG4gICAqXG4gICAqIEBzaW5jZSB2Mi4wLjAgLSBSZXBsYWNlcyBjcmVhdGVQZXJzb25hKCkgYW5kIGNyZWF0ZU5ld1BlcnNvbmEoKVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IFBhcnRpYWw8UGVyc29uYUVsZW1lbnRNZXRhZGF0YT4gJiB7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZyB9KTogUHJvbWlzZTxQZXJzb25hRWxlbWVudD4ge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhdGhWYWxpZGF0b3IoKTtcblxuICAgIC8vIEV4dHJhY3QgbmFtZSBhbmQgZGVzY3JpcHRpb24gd2l0aCBkZWZhdWx0c1xuICAgIGNvbnN0IG5hbWUgPSBkYXRhLm5hbWUgfHwgJ25ldy1wZXJzb25hJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgLy8gRHVhbC1maWVsZDogaW5zdHJ1Y3Rpb25zID0gYmVoYXZpb3JhbCBkaXJlY3RpdmVzLCBjb250ZW50ID0gcmVmZXJlbmNlIG1hdGVyaWFsXG4gICAgLy8gQm90aCBhcmUgZmlyc3QtY2xhc3MgZmllbGRzLiBJbnN0cnVjdGlvbnMgaXMgdGhlIHByaW1hcnkgZmllbGQgZm9yIHBlcnNvbmFzLlxuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGRhdGEuaW5zdHJ1Y3Rpb25zID8/ICcnO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBkYXRhLmNvbnRlbnQgPz8gJyc7XG5cbiAgICAvLyBJZiBuZWl0aGVyIHByb3ZpZGVkLCBlcnJvclxuICAgIGlmICgoIWluc3RydWN0aW9ucyB8fCBpbnN0cnVjdGlvbnMudHJpbSgpLmxlbmd0aCA9PT0gMCkgJiYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGVyc29uYSBpbnN0cnVjdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGNyZWF0ZSAnJHtuYW1lfScuYCk7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSBjb250ZW50IHByb3ZpZGVkIChubyBpbnN0cnVjdGlvbnMpLCB0cmVhdCBjb250ZW50IGFzIGluc3RydWN0aW9ucyBmb3IgYmFja3dhcmQgY29tcGF0XG4gICAgY29uc3QgZWZmZWN0aXZlSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zLnRyaW0oKSA/IGluc3RydWN0aW9ucyA6IGNvbnRlbnQ7XG4gICAgY29uc3QgZWZmZWN0aXZlQ29udGVudCA9IGluc3RydWN0aW9ucy50cmltKCkgPyBjb250ZW50IDogJyc7XG5cbiAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBpbml0aWFsIHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUoe1xuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY29udGVudDogZWZmZWN0aXZlSW5zdHJ1Y3Rpb25zXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBQZXJzb25hIGNyZWF0aW9uIHdhcm5pbmdzOiAke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3Muam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0cmlnZ2VycyBmcm9tIGRhdGFcbiAgICBsZXQgdHJpZ2dlcnNTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZGF0YS50cmlnZ2Vycykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50cmlnZ2VycykpIHtcbiAgICAgICAgdHJpZ2dlcnNTdHJpbmcgPSBkYXRhLnRyaWdnZXJzLmpvaW4oJywgJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLnRyaWdnZXJzID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cmlnZ2Vyc1N0cmluZyA9IGRhdGEudHJpZ2dlcnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXplIGFsbCBpbnB1dHMgLSB0aHJvd3Mgb24gdmFsaWRhdGlvbiBmYWlsdXJlXG4gICAgY29uc3QgdmFsaWRhdGVkSW5wdXRzID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBlcnNvbmFJbnB1dHMobmFtZSwgZGVzY3JpcHRpb24sIGVmZmVjdGl2ZUluc3RydWN0aW9ucywgdHJpZ2dlcnNTdHJpbmcpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSAtIHRocm93IGluc3RlYWQgb2YgcmV0dXJuaW5nIHJlc3VsdCBvYmplY3RcbiAgICBhd2FpdCBzdXBlci5saXN0KCk7XG4gICAgY29uc3QgZXhpc3RpbmdQZXJzb25hID0gdGhpcy5maW5kUGVyc29uYSh2YWxpZGF0ZWRJbnB1dHMuZmlsZW5hbWUpO1xuICAgIGlmIChleGlzdGluZ1BlcnNvbmEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSBwZXJzb25hIG5hbWVkIFwiJHt2YWxpZGF0ZWRJbnB1dHMuc2FuaXRpemVkTmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIG1ldGFkYXRhIG92ZXJyaWRlcyBmcm9tIHJlbWFpbmluZyBkYXRhIGZpZWxkc1xuICAgIGNvbnN0IHsgbmFtZTogX24sIGRlc2NyaXB0aW9uOiBfZCwgY29udGVudDogX2MsIGluc3RydWN0aW9uczogX2ksIHRyaWdnZXJzOiBfdCwgLi4ubWV0YWRhdGFPdmVycmlkZXMgfSA9IGRhdGE7XG5cbiAgICAvLyBCdWlsZCBtZXRhZGF0YSB3aXRoIGRlZmF1bHRzIGFuZCBvcHRpb25hbCBvdmVycmlkZXNcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuYnVpbGRQZXJzb25hTWV0YWRhdGEodmFsaWRhdGVkSW5wdXRzLCBtZXRhZGF0YU92ZXJyaWRlcyBhcyBQYXJ0aWFsPFBlcnNvbmFNZXRhZGF0YT4pO1xuXG4gICAgLy8gQ3JlYXRlIHBlcnNvbmEgZWxlbWVudCB3aXRoIGR1YWwgZmllbGRzXG4gICAgY29uc3QgcGVyc29uYSA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgdmFsaWRhdGVkSW5wdXRzLmluc3RydWN0aW9ucyk7XG4gICAgcGVyc29uYS5jb250ZW50ID0gZWZmZWN0aXZlQ29udGVudDtcbiAgICBwZXJzb25hLmZpbGVuYW1lID0gdmFsaWRhdGVkSW5wdXRzLmZpbGVuYW1lO1xuICAgIHBlcnNvbmEudW5pcXVlX2lkID0gbWV0YWRhdGEudW5pcXVlX2lkID8/IHZhbGlkYXRlZElucHV0cy51bmlxdWVJZDtcbiAgICBwZXJzb25hLmlkID0gcGVyc29uYS51bmlxdWVfaWQ7XG5cbiAgICBhd2FpdCBzdXBlci5zYXZlKHBlcnNvbmEsIHBlcnNvbmEuZmlsZW5hbWUpO1xuICAgIC8vIE5vdGU6IHJlbG9hZCgpIGludGVudGlvbmFsbHkgTk9UIGNhbGxlZCBoZXJlIChJc3N1ZSAjNDkxKS5cbiAgICAvLyBzYXZlKCkgYWxyZWFkeSBjYWNoZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LiByZWxvYWQoKSB3b3VsZCBjbGVhciB0aGVcbiAgICAvLyBjYWNoZSBhbmQgcmVidWlsZCB3aXRoIGRpZmZlcmVudCBJRHMsIG1ha2luZyB0aGUgcGVyc29uYSBpbnZpc2libGUuXG4gICAgLy8gcmVsb2FkKCkgaXMgb25seSBuZWVkZWQgYWZ0ZXIgZWRpdC9kZWxldGUgd2hlcmUgZmlsZXMgbWF5IGJlIHJlbmFtZWQvcmVtb3ZlZC5cblxuICAgIC8vIFNFQ1VSSVRZOiBMb2cgcGVyc29uYSBjcmVhdGlvbiBldmVudFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnUGVyc29uYU1hbmFnZXIuY3JlYXRlJyxcbiAgICAgIGRldGFpbHM6IGBQZXJzb25hIGNyZWF0ZWQ6ICR7bWV0YWRhdGEubmFtZX1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgZmlsZW5hbWU6IHBlcnNvbmEuZmlsZW5hbWUsXG4gICAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBjYXRlZ29yeTogbWV0YWRhdGEuY2F0ZWdvcnksXG4gICAgICAgIHRyaWdnZXJDb3VudDogbWV0YWRhdGEudHJpZ2dlcnM/Lmxlbmd0aCB8fCAwXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGVyc29uYTtcbiAgfVxuXG4gIC8vIFJFTU9WRUQ6IGNyZWF0ZVBlcnNvbmEoKSBhbmQgY3JlYXRlTmV3UGVyc29uYSgpIC0gdXNlIGNyZWF0ZSgpIGluc3RlYWQgKHYyIGJyZWFraW5nIGNoYW5nZSlcblxuICAvKipcbiAgICogRWRpdCBhbiBleGlzdGluZyBwZXJzb25hXG4gICAqL1xuICBhc3luYyBlZGl0UGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCFwZXJzb25hSWRlbnRpZmllciB8fCAhZmllbGQgfHwgIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVycy4gVXNhZ2U6IGVkaXRQZXJzb25hIFwicGVyc29uYV9uYW1lXCIgXCJmaWVsZFwiIFwibmV3X3ZhbHVlXCInKTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjODQzOiBVc2UgYXN5bmMgZmFsbGJhY2sgdG8gcmVjb3ZlciBmcm9tIGNhY2hlIGV2aWN0aW9uXG4gICAgY29uc3QgcGVyc29uYSA9IGF3YWl0IHRoaXMuZmluZFBlcnNvbmFBc3luYyhwZXJzb25hSWRlbnRpZmllcik7XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBTYW5pdGl6ZSB1c2VyIGlucHV0IGJlZm9yZSBpbmNsdWRpbmcgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIGNvbnN0IHNhbml0aXplZElkID0gc2FuaXRpemVJbnB1dChwZXJzb25hSWRlbnRpZmllciwgMTAwKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGVyc29uYSBub3QgZm91bmQ6IFwiJHtzYW5pdGl6ZWRJZH1cImApO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZVBhdGhWYWxpZGF0b3IoKTtcblxuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGVkaXQgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUVkaXQocGVyc29uYSwgeyBbZmllbGRdOiB2YWx1ZSB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYFBlcnNvbmEgZWRpdCB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRBbGlhc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNvbnRlbnQ6ICdpbnN0cnVjdGlvbnMnXG4gICAgfTtcbiAgICBjb25zdCBub3JtYWxpemVkSW5wdXRGaWVsZCA9IGZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gZmllbGRBbGlhc01hcFtub3JtYWxpemVkSW5wdXRGaWVsZF0gPz8gbm9ybWFsaXplZElucHV0RmllbGQ7XG5cbiAgICBjb25zdCB2YWxpZEZpZWxkcyA9IFsnbmFtZScsICdkZXNjcmlwdGlvbicsICdpbnN0cnVjdGlvbnMnLCAndHJpZ2dlcnMnLCAndmVyc2lvbicsICdjYXRlZ29yeSddO1xuICAgIGlmICghdmFsaWRGaWVsZHMuaW5jbHVkZXMobm9ybWFsaXplZEZpZWxkKSkge1xuICAgICAgY29uc3QgZmllbGRMaXN0ID0gWy4uLnZhbGlkRmllbGRzLCAuLi5PYmplY3Qua2V5cyhmaWVsZEFsaWFzTWFwKV0uam9pbignLCAnKTtcbiAgICAgIC8vIFNFQ1VSSVRZOiBTYW5pdGl6ZSB1c2VyIGlucHV0IGJlZm9yZSBpbmNsdWRpbmcgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIGNvbnN0IHNhbml0aXplZEZpZWxkID0gc2FuaXRpemVJbnB1dChmaWVsZCwgNTApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpZWxkOiBcIiR7c2FuaXRpemVkRmllbGR9XCIgaXMgbm90IGVkaXRhYmxlLiBWYWxpZCBmaWVsZHM6ICR7ZmllbGRMaXN0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRGVmYXVsdCA9IGlzRGVmYXVsdFBlcnNvbmEocGVyc29uYS5maWxlbmFtZSk7XG4gICAgbGV0IGVkaXRhYmxlUGVyc29uYSA9IHRoaXMuY2xvbmVQZXJzb25hKHBlcnNvbmEsIHsgd3JpdGFibGVDb3B5OiBpc0RlZmF1bHQgfSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuMyAtIEFwcGx5IFVuaWNvZGUgdmFsaWRhdGlvbiB0byBlZGl0IHZhbHVlc1xuICAgICAgY29uc3QgdW5pY29kZVJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHZhbHVlKTtcbiAgICAgIGlmICghdW5pY29kZVJlc3VsdC5pc1ZhbGlkICYmIHVuaWNvZGVSZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZSBjb250YWlucyBkYW5nZXJvdXMgVW5pY29kZSBwYXR0ZXJuczogJHt1bmljb2RlUmVzdWx0LmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZVZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUodW5pY29kZVJlc3VsdC5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC4xIC0gQmxvY2sgQUxMIGludmFsaWQgY29udGVudCwgbm90IGp1c3QgY3JpdGljYWxcbiAgICAgIGlmICghdmFsdWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuNCAtIExvZyB2YWxpZGF0aW9uIGZhaWx1cmVzXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLmVkaXRQZXJzb25hJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRWRpdCB2YWx1ZSB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWx1ZVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICBmaWVsZDogbm9ybWFsaXplZEZpZWxkLFxuICAgICAgICAgICAgc2V2ZXJpdHk6IHZhbHVlVmFsaWRhdGlvbi5zZXZlcml0eVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VjdXJpdHkgVmFsaWRhdGlvbiBGYWlsZWQ6IFRoZSBuZXcgdmFsdWUgY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OiAke3ZhbHVlVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBsZXQgc2FuaXRpemVkVmFsdWUgPSB2YWx1ZVZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCB1bmljb2RlUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgICAgXG4gICAgICBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnaW5zdHJ1Y3Rpb25zJykge1xuICAgICAgICBlZGl0YWJsZVBlcnNvbmEuaW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVkVmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ3RyaWdnZXJzJykge1xuICAgICAgICBlZGl0YWJsZVBlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnMgPSBzYW5pdGl6ZWRWYWx1ZVxuICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgLm1hcCh0ID0+IHNhbml0aXplSW5wdXQodC50cmltKCksIDUwKSlcbiAgICAgICAgICAuZmlsdGVyKHQgPT4gdC5sZW5ndGggPiAwKTtcbiAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnbmFtZScpIHtcbiAgICAgICAgZWRpdGFibGVQZXJzb25hLm1ldGFkYXRhLm5hbWUgPSBzYW5pdGl6ZUlucHV0KHNhbml0aXplZFZhbHVlLCAxMDApO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICdjYXRlZ29yeScpIHtcbiAgICAgICAgZWRpdGFibGVQZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5ID1cbiAgICAgICAgICBzYW5pdGl6ZUlucHV0KHNhbml0aXplZFZhbHVlLCA1MCk/LnRvTG93ZXJDYXNlKCkgfHwgJ2dlbmVyYWwnO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICdkZXNjcmlwdGlvbicpIHtcbiAgICAgICAgZWRpdGFibGVQZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVkVmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ3ZlcnNpb24nKSB7XG4gICAgICAgIGVkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uID0gc2FuaXRpemVkVmFsdWU7XG4gICAgICAgIGVkaXRhYmxlUGVyc29uYS52ZXJzaW9uID0gc2FuaXRpemVkVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG8taW5jcmVtZW50IHZlcnNpb24gaWYgbm90IGV4cGxpY2l0bHkgc2V0dGluZyB2ZXJzaW9uIGZpZWxkXG4gICAgICBpZiAobm9ybWFsaXplZEZpZWxkICE9PSAndmVyc2lvbicpIHtcbiAgICAgICAgaWYgKGVkaXRhYmxlUGVyc29uYS52ZXJzaW9uKSB7XG4gICAgICAgICAgLy8gTm9ybWFsaXplIHRvIDMtcGFydCBmb3JtYXQgZmlyc3QgKGhhbmRsZXMgbGVnYWN5IFwiMS4wXCIgZm9ybWF0KVxuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVWZXJzaW9uKFN0cmluZyhlZGl0YWJsZVBlcnNvbmEudmVyc2lvbikpO1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5vcm1hbGl6ZWQubWF0Y2goL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykoLS4qKT8kLyk7XG5cbiAgICAgICAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBbLCBtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVSZWxlYXNlXSA9IHZlcnNpb25NYXRjaDtcblxuICAgICAgICAgICAgaWYgKHByZVJlbGVhc2UpIHtcbiAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IHByZS1yZWxlYXNlIHZlcnNpb25cbiAgICAgICAgICAgICAgY29uc3QgcHJlUmVsZWFzZU1hdGNoID0gcHJlUmVsZWFzZS5tYXRjaCgvXi0oW2EtekEtWl0rKVxcLj8oXFxkKyk/JC8pO1xuICAgICAgICAgICAgICBpZiAocHJlUmVsZWFzZU1hdGNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgWywgcHJlUmVsZWFzZVR5cGUsIHByZVJlbGVhc2VOdW1dID0gcHJlUmVsZWFzZU1hdGNoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHROdW0gPSBOdW1iZXIucGFyc2VJbnQocHJlUmVsZWFzZU51bSB8fCAnMCcpICsgMTtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZVBlcnNvbmEudmVyc2lvbiA9IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofS0ke3ByZVJlbGVhc2VUeXBlfS4ke25leHROdW19YDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZVBlcnNvbmEudmVyc2lvbiA9IGAke21ham9yfS4ke21pbm9yfS4ke051bWJlci5wYXJzZUludChwYXRjaCkgKyAxfWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFN0YW5kYXJkIHZlcnNpb24sIGJ1bXAgcGF0Y2hcbiAgICAgICAgICAgICAgZWRpdGFibGVQZXJzb25hLnZlcnNpb24gPSBgJHttYWpvcn0uJHttaW5vcn0uJHtOdW1iZXIucGFyc2VJbnQocGF0Y2gpICsgMX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZGl0YWJsZVBlcnNvbmEudmVyc2lvbiA9ICcxLjAuMSc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRhYmxlUGVyc29uYS52ZXJzaW9uID0gJzEuMC4wJztcbiAgICAgICAgfVxuICAgICAgICAvLyBTeW5jIHRvIG1ldGFkYXRhXG4gICAgICAgIGVkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uID0gZWRpdGFibGVQZXJzb25hLnZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGVkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS51bmlxdWVfaWQgPSBlZGl0YWJsZVBlcnNvbmEudW5pcXVlX2lkO1xuXG4gICAgICAvLyBQYXRoIHZhbGlkYXRpb24gaGFuZGxlZCBieSBCYXNlRWxlbWVudE1hbmFnZXIuc2F2ZSgpXG4gICAgICBhd2FpdCBzdXBlci5zYXZlKGVkaXRhYmxlUGVyc29uYSwgZWRpdGFibGVQZXJzb25hLmZpbGVuYW1lKTtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG5cbiAgICAgIGNvbnN0IGZpZWxkRGlzcGxheSA9IGZpZWxkQWxpYXNNYXBbbm9ybWFsaXplZElucHV0RmllbGRdXG4gICAgICAgID8gYCR7bm9ybWFsaXplZEZpZWxkfSAoYWxpYXM6ICR7ZmllbGR9KWBcbiAgICAgICAgOiBub3JtYWxpemVkRmllbGQ7XG5cbiAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjQgLSBMb2cgcGVyc29uYSBlZGl0IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLmVkaXRQZXJzb25hJyxcbiAgICAgICAgZGV0YWlsczogYFBlcnNvbmEgZWRpdGVkOiAke2VkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS5uYW1lfSAoZmllbGQ6ICR7bm9ybWFsaXplZEZpZWxkfSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGZpZWxkOiBub3JtYWxpemVkRmllbGQsXG4gICAgICAgICAgaXNEZWZhdWx0UGVyc29uYUNvcHk6IGlzRGVmYXVsdCxcbiAgICAgICAgICBvbGRWYWx1ZTogcGVyc29uYS5jb250ZW50Py5zdWJzdHJpbmcoMCwgNTApLFxuICAgICAgICAgIG5ld1ZhbHVlOiBlZGl0YWJsZVBlcnNvbmEuY29udGVudD8uc3Vic3RyaW5nKDAsIDUwKVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYFBlcnNvbmEgVXBkYXRlZCBTdWNjZXNzZnVsbHkuIEZpZWxkIFVwZGF0ZWQ6ICR7ZmllbGREaXNwbGF5fWAsXG4gICAgICAgIGlzRGVmYXVsdCxcbiAgICAgICAgbmV3TmFtZTogZWRpdGFibGVQZXJzb25hLm1ldGFkYXRhLm5hbWUgfHwgcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBlZGl0YWJsZVBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgbmV3SWQ6IGlzRGVmYXVsdCA/IGVkaXRhYmxlUGVyc29uYS51bmlxdWVfaWQgOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgVXBkYXRpbmcgUGVyc29uYTogJHtzYW5pdGl6ZWQubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWRpdCBleGlzdGluZyBwZXJzb25hIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgcGVyc29uYSAoZm9yIFBlcnNvbmFIYW5kbGVyIGNvbXBhdGliaWxpdHkpXG4gICAqL1xuICBhc3luYyBlZGl0RXhpc3RpbmdQZXJzb25hKHBlcnNvbmE6IFBlcnNvbmFFbGVtZW50LCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxQZXJzb25hRWxlbWVudD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdFBlcnNvbmEocGVyc29uYS5maWxlbmFtZSwgZmllbGQsIHZhbHVlKTtcbiAgICAvLyBOb3RlOiBlZGl0UGVyc29uYSBhbHJlYWR5IGNhbGxzIHJlbG9hZCgpLCBubyBuZWVkIHRvIHJlbG9hZCBhZ2FpblxuXG4gICAgLy8gRm9yIGNvcHktb24td3JpdGUsIHdlIG5lZWQgdG8gZmluZCBieSB0aGUgbmV3IElEIGlmIG9uZSB3YXMgY3JlYXRlZFxuICAgIGNvbnN0IGlkZW50aWZpZXJUb0ZpbmQgPSByZXN1bHQuaXNEZWZhdWx0ICYmIHJlc3VsdC5uZXdJZCA/IHJlc3VsdC5uZXdJZCA6IHBlcnNvbmEuZmlsZW5hbWU7XG5cbiAgICAvLyBGaW5kIHRoZSB1cGRhdGVkIHBlcnNvbmFcbiAgICBjb25zdCB1cGRhdGVkUGVyc29uYSA9IHRoaXMuZmluZFBlcnNvbmEoaWRlbnRpZmllclRvRmluZCk7XG4gICAgaWYgKCF1cGRhdGVkUGVyc29uYSkge1xuICAgICAgLy8gU0VDVVJJVFk6IERvbid0IGluY2x1ZGUgdW5zYW5pdGl6ZWQgdXNlciBpbnB1dCBpbiBlcnJvciBtZXNzYWdlc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmV0cmlldmUgdXBkYXRlZCBwZXJzb25hJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWRQZXJzb25hO1xuICB9XG5cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwZXJzb25hIGFuZCByZXR1cm4gYSBmb3JtYXR0ZWQgcmVwb3J0XG4gICAqL1xuICB2YWxpZGF0ZVBlcnNvbmEocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIGlmICghcGVyc29uYUlkZW50aWZpZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBQZXJzb25hIElkZW50aWZpZXIuIFVzYWdlOiB2YWxpZGF0ZV9wZXJzb25hIFwicGVyc29uYV9uYW1lXCInKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5maW5kUGVyc29uYShwZXJzb25hSWRlbnRpZmllcik7XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBTYW5pdGl6ZSB1c2VyIGlucHV0IGJlZm9yZSBpbmNsdWRpbmcgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIGNvbnN0IHNhbml0aXplZElkID0gc2FuaXRpemVJbnB1dChwZXJzb25hSWRlbnRpZmllciwgMTAwKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGVyc29uYSBub3QgZm91bmQ6IFwiJHtzYW5pdGl6ZWRJZH1cImApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBwZXJzb25hLnZhbGlkYXRlKCk7XG4gICAgY29uc3Qgc3RhdHVzTGluZSA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWQgPyAn4pyFIFN0YXR1czogVmFsaWQnIDogJ+KdjCBTdGF0dXM6IEludmFsaWQnO1xuXG4gICAgLy8gQnVpbGQgZm9ybWF0dGVkIHJlcG9ydCBmcm9tIHZhbGlkYXRpb24gcmVzdWx0XG4gICAgY29uc3QgcmVwb3J0UGFydHM6IHN0cmluZ1tdID0gW3N0YXR1c0xpbmVdO1xuXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzICYmIHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydFBhcnRzLnB1c2goJ1xcblxcbkVycm9yczonKTtcbiAgICAgIHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yLCBpKSA9PiB7XG4gICAgICAgIHJlcG9ydFBhcnRzLnB1c2goYCAgJHtpICsgMX0uIFske2Vycm9yLmZpZWxkfV0gJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnRQYXJ0cy5wdXNoKCdcXG5cXG5XYXJuaW5nczonKTtcbiAgICAgIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MuZm9yRWFjaCgod2FybmluZywgaSkgPT4ge1xuICAgICAgICByZXBvcnRQYXJ0cy5wdXNoKGAgICR7aSArIDF9LiBbJHt3YXJuaW5nLmZpZWxkfV0gJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5zdWdnZXN0aW9ucyAmJiB2YWxpZGF0aW9uUmVzdWx0LnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlcG9ydFBhcnRzLnB1c2goJ1xcblxcblN1Z2dlc3Rpb25zOicpO1xuICAgICAgdmFsaWRhdGlvblJlc3VsdC5zdWdnZXN0aW9ucy5mb3JFYWNoKChzdWdnZXN0aW9uLCBpKSA9PiB7XG4gICAgICAgIHJlcG9ydFBhcnRzLnB1c2goYCAgJHtpICsgMX0uICR7c3VnZ2VzdGlvbn1gKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHRlZFJlcG9ydCA9IHJlcG9ydFBhcnRzLmpvaW4oJ1xcbicpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKCdbUGVyc29uYU1hbmFnZXJdIFZhbGlkYXRpb24gcmVwb3J0IHByZXZpZXcnLCB7XG4gICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICB2YWxpZDogdmFsaWRhdGlvblJlc3VsdC52YWxpZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHZhbGlkYXRpb25SZXN1bHQudmFsaWQsXG4gICAgICBtZXNzYWdlOiBmb3JtYXR0ZWRSZXBvcnQsXG4gICAgICByZXBvcnQ6IHZhbGlkYXRpb25SZXN1bHRcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgdXNlciBpZGVudGl0eVxuICAgKiBTRUNVUklUWTogUGhhc2UgNC42IC0gQWRkZWQgdXNlcm5hbWUgYW5kIGVtYWlsIHZhbGlkYXRpb25cbiAgICovXG4gIHNldFVzZXJJZGVudGl0eSh1c2VybmFtZTogc3RyaW5nIHwgbnVsbCwgZW1haWw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodXNlcm5hbWUpIHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjMgLSBBcHBseSBVbmljb2RlIG5vcm1hbGl6YXRpb24gRklSU1RcbiAgICAgIGNvbnN0IHVzZXJuYW1lVW5pY29kZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVzZXJuYW1lKTtcbiAgICAgIGlmICghdXNlcm5hbWVVbmljb2RlLmlzVmFsaWQgJiYgdXNlcm5hbWVVbmljb2RlLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVXNlcm5hbWUgY29udGFpbnMgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnM6ICR7dXNlcm5hbWVVbmljb2RlLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC42IC0gVmFsaWRhdGUgdXNlcm5hbWUgZm9ybWF0IEFGVEVSIG5vcm1hbGl6YXRpb24gKGFscGhhbnVtZXJpYywgaHlwaGVucywgdW5kZXJzY29yZXMpXG4gICAgICBjb25zdCB1c2VybmFtZVJlZ2V4ID0gL15bYS16QS1aMC05XFwtX117Myw1MH0kLztcbiAgICAgIGlmICghdXNlcm5hbWVSZWdleC50ZXN0KHVzZXJuYW1lVW5pY29kZS5ub3JtYWxpemVkQ29udGVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIHVzZXJuYW1lIGZvcm1hdC4gTXVzdCBiZSAzLTUwIGNoYXJhY3RlcnMsIGFscGhhbnVtZXJpYyB3aXRoIGh5cGhlbnMvdW5kZXJzY29yZXMgb25seSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgdXNlcm5hbWVcbiAgICAgIGNvbnN0IHZhbGlkVXNlcm5hbWUgPSBzYW5pdGl6ZUlucHV0KHVzZXJuYW1lVW5pY29kZS5ub3JtYWxpemVkQ29udGVudCwgNTApO1xuXG4gICAgICBpZiAoZW1haWwpIHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuMyAtIEFwcGx5IFVuaWNvZGUgbm9ybWFsaXphdGlvbiBGSVJTVFxuICAgICAgICBjb25zdCBlbWFpbFVuaWNvZGUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShlbWFpbCk7XG4gICAgICAgIGlmICghZW1haWxVbmljb2RlLmlzVmFsaWQgJiYgZW1haWxVbmljb2RlLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbWFpbCBjb250YWlucyBkYW5nZXJvdXMgVW5pY29kZSBwYXR0ZXJuczogJHtlbWFpbFVuaWNvZGUuZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC42IC0gVmFsaWRhdGUgZW1haWwgZm9ybWF0IEFGVEVSIG5vcm1hbGl6YXRpb25cbiAgICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xuICAgICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChlbWFpbFVuaWNvZGUubm9ybWFsaXplZENvbnRlbnQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2FuaXRpemUgZW1haWxcbiAgICAgICAgY29uc3QgdmFsaWRFbWFpbCA9IHNhbml0aXplSW5wdXQoZW1haWxVbmljb2RlLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUwgPSB2YWxpZEVtYWlsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuY3VycmVudFVzZXI7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdmFsaWRVc2VybmFtZTtcbiAgICAgIHByb2Nlc3MuZW52LkRPTExIT1VTRV9VU0VSID0gdmFsaWRVc2VybmFtZTtcbiAgICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlLnNldEN1cnJlbnRVc2VyKHZhbGlkVXNlcm5hbWUpOyAgLy8gU3luYyB3aXRoIE1ldGFkYXRhU2VydmljZVxuXG4gICAgICBsb2dnZXIuaW5mbygnVXNlciBpZGVudGl0eSBzZXQnLCB7IHVzZXJuYW1lOiB2YWxpZFVzZXJuYW1lIH0pO1xuICAgICAgdGhpcy5ub3RpZnlQZXJzb25hQ2hhbmdlKCd1c2VyLWNoYW5nZWQnLCBwcmV2aW91cywgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5jdXJyZW50VXNlcjtcbiAgICAgIHRoaXMuY3VycmVudFVzZXIgPSBudWxsO1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkRPTExIT1VTRV9VU0VSO1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTDtcbiAgICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlLnNldEN1cnJlbnRVc2VyKG51bGwpOyAgLy8gU3luYyB3aXRoIE1ldGFkYXRhU2VydmljZVxuXG4gICAgICBsb2dnZXIuaW5mbygnVXNlciBpZGVudGl0eSBjbGVhcmVkJyk7XG4gICAgICB0aGlzLm5vdGlmeVBlcnNvbmFDaGFuZ2UoJ3VzZXItY2hhbmdlZCcsIHByZXZpb3VzLCB0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIGlkZW50aXR5XG4gICAqL1xuICBnZXRVc2VySWRlbnRpdHkoKTogeyB1c2VybmFtZTogc3RyaW5nIHwgbnVsbDsgZW1haWw6IHN0cmluZyB8IG51bGwgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJuYW1lOiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCBudWxsLFxuICAgICAgZW1haWw6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTCB8fCBudWxsXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIHVzZXIgaWRlbnRpdHlcbiAgICovXG4gIGNsZWFyVXNlcklkZW50aXR5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0VXNlcklkZW50aXR5KG51bGwpO1xuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAqL1xuICB1cGRhdGVJbmRpY2F0b3JDb25maWcoY29uZmlnOiBJbmRpY2F0b3JDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmluZGljYXRvckNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAqL1xuICBnZXRJbmRpY2F0b3JDb25maWcoKTogSW5kaWNhdG9yQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5pbmRpY2F0b3JDb25maWc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gZ2V0IGN1cnJlbnQgdXNlciBmb3IgYXR0cmlidXRpb25cbiAgICogUkVGQUNUT1JFRDogTm93IGRlbGVnYXRlcyB0byBNZXRhZGF0YVNlcnZpY2UgZm9yIGNvbnNpc3RlbnQgdXNlciBhdHRyaWJ1dGlvblxuICAgKi9cbiAgcHVibGljIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICAvLyBPbmx5IHN5bmMgaWYgUGVyc29uYU1hbmFnZXIgaGFzIGFuIGV4cGxpY2l0bHktc2V0IHVzZXI7XG4gICAgLy8gb3RoZXJ3aXNlIGxldCBNZXRhZGF0YVNlcnZpY2UgcmVzb2x2ZSB2aWEgaXRzIG93biBmYWxsYmFjayBjaGFpbi5cbiAgICBpZiAodGhpcy5jdXJyZW50VXNlcikge1xuICAgICAgdGhpcy5tZXRhZGF0YVNlcnZpY2Uuc2V0Q3VycmVudFVzZXIodGhpcy5jdXJyZW50VXNlcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xuICB9XG4gIFxuXG4gIC8qKlxuICAgKiBSZXNldCBpbnRlcm5hbCBzdGF0ZTsgYWxpZ25zIFBlcnNvbmFNYW5hZ2VyIHdpdGggREkgbGlmZWN5Y2xlIGhvb2tzLlxuICAgKiBDUklUSUNBTDogTXVzdCBjYWxsIHN1cGVyLmRpc3Bvc2UoKSB0byBjbGVhbiB1cCBmaWxlIHdhdGNoZXJzIGFuZCBwcmV2ZW50IG9wZW4gaGFuZGxlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAvLyBJc3N1ZSAjMjgxOiBDbGVhciB0aGUgYWN0aXZlIHBlcnNvbmFzIHNldFxuICAgIHRoaXMuYWN0aXZlUGVyc29uYXMuY2xlYXIoKTtcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gbnVsbDtcblxuICAgIC8vIENSSVRJQ0FMOiBDbGVhbiB1cCBiYXNlIGNsYXNzIHJlc291cmNlcyAoZmlsZSB3YXRjaGVycywgY2FjaGVzKVxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhY3RpdmUgc2V0IGNsZWFudXAgaXMgbmVlZGVkIGFuZCBwZXJmb3JtIGNsZWFudXAgaWYgbmVjZXNzYXJ5XG4gICAqIElzc3VlICM4MzogQWN0aXZlIGVsZW1lbnQgbGltaXQgZW5mb3JjZW1lbnQgZm9yIHBlcnNvbmFzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1heCwgY2xlYW51cFRocmVzaG9sZCB9ID0gZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnKCdwZXJzb25hcycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZSA8IGNsZWFudXBUaHJlc2hvbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSBtYXgg4oCUIHdhcm4gYmVmb3JlIGNsZWFudXBcbiAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hcy5zaXplID49IG1heCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBBY3RpdmUgcGVyc29uYXMgbGltaXQgcmVhY2hlZCAoJHttYXh9KS4gYCArXG4gICAgICAgIGBDb25zaWRlciBkZWFjdGl2YXRpbmcgdW51c2VkIHBlcnNvbmFzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfUEVSU09OQVMgdG8gYSBoaWdoZXIgdmFsdWUuYFxuICAgICAgKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQnLFxuICAgICAgICBkZXRhaWxzOiBgQWN0aXZlIHBlcnNvbmFzIGxpbWl0IHJlYWNoZWQ6ICR7dGhpcy5hY3RpdmVQZXJzb25hcy5zaXplfS8ke21heH1gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB0aGlzLmNsZWFudXBTdGFsZUFjdGl2ZVBlcnNvbmFzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBwZXJzb25hcyBzZXRcbiAgICogSXNzdWUgIzgzOiBWYWxpZGF0ZXMgdGhhdCBhbGwgYWN0aXZlIHBlcnNvbmFzIHN0aWxsIGV4aXN0IGFuZCByZW1vdmVzIG9ycGhhbmVkIHJlZmVyZW5jZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2xlYW51cFN0YWxlQWN0aXZlUGVyc29uYXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZTtcbiAgICAgIGNvbnN0IHN0YWxlRmlsZW5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZUZpbGVuYW1lIG9mIHRoaXMuYWN0aXZlUGVyc29uYXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbmRQZXJzb25hKGFjdGl2ZUZpbGVuYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlUGVyc29uYXMuZGVsZXRlKGFjdGl2ZUZpbGVuYW1lKTtcbiAgICAgICAgICBzdGFsZUZpbGVuYW1lcy5wdXNoKGFjdGl2ZUZpbGVuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVQZXJzb25hcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBwZXJzb25hIHJlZmVyZW5jZShzKS4gYCArXG4gICAgICAgICAgYEFjdGl2ZSBwZXJzb25hczogJHtlbmRTaXplfS8ke2dldE1heEFjdGl2ZUxpbWl0KCdwZXJzb25hcycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZVBlcnNvbmFzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBwZXJzb25hIHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlRmlsZW5hbWVzOiBzdGFsZUZpbGVuYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgcGVyc29uYXM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZVBlcnNvbmFzJyxcbiAgICAgICAgZGV0YWlsczogYENsZWFudXAgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVBlcnNvbmFDaGFuZ2UoXG4gICAgdHlwZTogUGVyc29uYVN0YXRlQ2hhbmdlVHlwZSxcbiAgICBwcmV2aW91c1ZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ub3RpZmllcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubm90aWZpZXIubm90aWZ5UGVyc29uYUNoYW5nZSh7XG4gICAgICB0eXBlLFxuICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVQYXRoVmFsaWRhdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhdGhWYWxpZGF0b3JJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBQYXRoVmFsaWRhdG9yLmluaXRpYWxpemUodGhpcy5wZXJzb25hc0Rpcik7XG4gICAgICB0aGlzLnBhdGhWYWxpZGF0b3JJbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbUGVyc29uYU1hbmFnZXJdIEZhaWxlZCB0byBpbml0aWFsaXplIFBhdGhWYWxpZGF0b3InLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBkZWxldGUgdG8gaGFuZGxlIGF1dG8tZGVhY3RpdmF0aW9uIGJlZm9yZSBkZWxldGlvbi5cbiAgICogRklYOiBJc3N1ZSAjMjgxIC0gVW5pZmllZCBkZWxldGUgcGF0dGVybiBmb3Igc3RhbmRhcmQgZWxlbWVudC1jcnVkIGZsb3dcbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gVGhlIGZpbGVuYW1lIG9mIHRoZSBwZXJzb25hIHRvIGRlbGV0ZVxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBJc3N1ZSAjMjgxOiBBdXRvLWRlYWN0aXZhdGUgYmVmb3JlIGRlbGV0aW9uXG4gICAgLy8gVGhpcyBhbGxvd3MgZGVsZXRpbmcgYWN0aXZlIHBlcnNvbmFzIHdpdGhvdXQgcmVxdWlyaW5nIGV4cGxpY2l0IGRlYWN0aXZhdGlvblxuICAgIGNvbnN0IHdhc0FjdGl2ZSA9IHRoaXMuYWN0aXZlUGVyc29uYXMuaGFzKGZpbGVQYXRoKTtcbiAgICBpZiAod2FzQWN0aXZlKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBlcnNvbmFzLmRlbGV0ZShmaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKGZpbGVQYXRoKTtcbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuXG4gICAgLy8gU0VDVVJJVFk6IExvZyBwZXJzb25hIGRlbGV0aW9uIGV2ZW50IChCYXNlRWxlbWVudE1hbmFnZXIgYWxzbyBsb2dzLCBidXQgd2l0aCBkaWZmZXJlbnQgZGV0YWlscylcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICBkZXRhaWxzOiBgUGVyc29uYSBkZWxldGVkOiAke2ZpbGVQYXRofWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBmaWxlbmFtZTogZmlsZVBhdGgsXG4gICAgICAgIHdhc0FjdGl2ZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBwZXJzb25hIGJ5IG5hbWUgb3IgaWRlbnRpZmllciAobGVnYWN5IEFQSSlcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGRlbGV0ZShmaWxlbmFtZSkgdmlhIHN0YW5kYXJkIGVsZW1lbnQtY3J1ZCBmbG93XG4gICAqL1xuICBhc3luYyBkZWxldGVQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICAvLyBJc3N1ZSAjODQzOiBVc2UgYXN5bmMgZmFsbGJhY2sgdG8gcmVjb3ZlciBmcm9tIGNhY2hlIGV2aWN0aW9uXG4gICAgY29uc3QgcGVyc29uYSA9IGF3YWl0IHRoaXMuZmluZFBlcnNvbmFBc3luYyhwZXJzb25hSWRlbnRpZmllcik7XG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogYFBlcnNvbmEgJyR7cGVyc29uYUlkZW50aWZpZXJ9JyBub3QgZm91bmRgIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHBlcnNvbmEuZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgbWVzc2FnZTogYFN1Y2Nlc3NmdWxseSBkZWxldGVkIHBlcnNvbmEgJyR7cGVyc29uYUlkZW50aWZpZXJ9J2AgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHBlcnNvbmE6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW1wb3J0UGVyc29uYShzb3VyY2U6IHN0cmluZywgb3ZlcndyaXRlID0gZmFsc2UpOiBQcm9taXNlPEltcG9ydFJlc3VsdD4ge1xuICAgIGlmICghdGhpcy5wZXJzb25hSW1wb3J0ZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBcIlBlcnNvbmEgaW1wb3J0IGlzIG5vdCBhdmFpbGFibGUuIFBlcnNvbmFJbXBvcnRlciBzZXJ2aWNlIG5vdCBjb25maWd1cmVkLlwiXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVQYXRoVmFsaWRhdG9yKCk7XG5cbiAgICBjb25zdCBwZXJzb25hc01hcCA9IGF3YWl0IHRoaXMuZ2V0QWxsUGVyc29uYXMoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFJbXBvcnRlci5pbXBvcnRQZXJzb25hKHNvdXJjZSwgcGVyc29uYXNNYXAsIG92ZXJ3cml0ZSk7XG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5wZXJzb25hKSB7XG4gICAgICAvLyBDb252ZXJ0IGxlZ2FjeSBQZXJzb25hTWV0YWRhdGEgdG8gUGVyc29uYUVsZW1lbnRNZXRhZGF0YVxuICAgICAgY29uc3QgZWxlbWVudE1ldGFkYXRhID0gdGhpcy50b1BlcnNvbmFFbGVtZW50TWV0YWRhdGEocmVzdWx0LnBlcnNvbmEubWV0YWRhdGEpO1xuXG4gICAgICAvLyBGaXggIzkwNjogRm9yIHYxIGZvcm1hdCBpbXBvcnRzIChubyBpbnN0cnVjdGlvbnMgaW4gZnJvbnRtYXR0ZXIpLCB0aGUgbWFya2Rvd25cbiAgICAgIC8vIGJvZHkgbXVzdCBzdGF5IGFzIHRoZSBkb2N1bWVudCBib2R5IGJlbG93ICctLS0nLCBub3QgYmUgc3R1ZmZlZCBpbnRvIHRoZSBZQU1MXG4gICAgICAvLyBpbnN0cnVjdGlvbnMgZmllbGQuIFNldHRpbmcgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBkZXNjcmlwdGlvbiB0cmlnZ2VycyB0aGUgdjIgcGF0aFxuICAgICAgLy8gaW4gY3JlYXRlRWxlbWVudCgpLCBrZWVwaW5nIGJvZHlUZXh0IGFzIGNvbnRlbnQgKGRvY3VtZW50IGJvZHkpLlxuICAgICAgaWYgKCFlbGVtZW50TWV0YWRhdGEuaW5zdHJ1Y3Rpb25zICYmIHJlc3VsdC5wZXJzb25hLmNvbnRlbnQpIHtcbiAgICAgICAgLy8gUHJlZmVyIGRlc2NyaXB0aW9uIChjb25jaXNlIGJlaGF2aW9yYWwgc3VtbWFyeSkgb3ZlciBuYW1lIChqdXN0IGEgbGFiZWwpLlxuICAgICAgICAvLyBuYW1lIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QgKHZhbGlkYXRlZCBieSBQZXJzb25hSW1wb3J0ZXIudmFsaWRhdGVBbmRFbnJpY2hNZXRhZGF0YSkuXG4gICAgICAgIGVsZW1lbnRNZXRhZGF0YS5pbnN0cnVjdGlvbnMgPSBlbGVtZW50TWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgZWxlbWVudE1ldGFkYXRhLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcnNvbmFUb1NhdmUgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE1ldGFkYXRhLCByZXN1bHQucGVyc29uYS5jb250ZW50KTtcbiAgICAgIHBlcnNvbmFUb1NhdmUuZmlsZW5hbWUgPSByZXN1bHQucGVyc29uYS5maWxlbmFtZSA/PyBwZXJzb25hVG9TYXZlLmZpbGVuYW1lO1xuICAgICAgcGVyc29uYVRvU2F2ZS51bmlxdWVfaWQgPSByZXN1bHQucGVyc29uYS51bmlxdWVfaWQ7XG4gICAgICBwZXJzb25hVG9TYXZlLmlkID0gcGVyc29uYVRvU2F2ZS51bmlxdWVfaWQ7XG5cbiAgICAgIGF3YWl0IHN1cGVyLnNhdmUocGVyc29uYVRvU2F2ZSwgcGVyc29uYVRvU2F2ZS5maWxlbmFtZSk7XG4gICAgICAvLyBOb3RlOiByZWxvYWQoKSBpbnRlbnRpb25hbGx5IE5PVCBjYWxsZWQgaGVyZSAoSXNzdWUgIzQ5MSkuXG4gICAgICAvLyBJbXBvcnQgb25seSBhZGRzIGZpbGVzIOKAlCBubyBhY3RpdmUgcGVyc29uYSBjbGVhbnVwIG5lZWRlZC5cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICBwZXJzb25hOiBwZXJzb25hVG9TYXZlLFxuICAgICAgICBmaWxlbmFtZTogcGVyc29uYVRvU2F2ZS5maWxlbmFtZVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIFR5cGUgQWRhcHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IFBlcnNvbmFNZXRhZGF0YSAobGVnYWN5KSB0byBQZXJzb25hRWxlbWVudE1ldGFkYXRhIChuZXcgc3RhbmRhcmQpXG4gICAqIEVuc3VyZXMgc3RyaWN0IHR5cGluZyBmb3IgYWdlX3JhdGluZyBhbmQgZ2VuZXJhdGlvbl9tZXRob2RcbiAgICogTk9URTogRmlsZW5hbWUgaXMgaW5mcmFzdHJ1Y3R1cmUgZGF0YSwgbm90IGJ1c2luZXNzIG1ldGFkYXRhIC0gaXQncyBleGNsdWRlZCBoZXJlXG4gICAqL1xuICBwcml2YXRlIHRvUGVyc29uYUVsZW1lbnRNZXRhZGF0YShtZXRhZGF0YTogUGVyc29uYU1ldGFkYXRhKTogUGVyc29uYUVsZW1lbnRNZXRhZGF0YSB7XG4gICAgY29uc3QgeyBmaWxlbmFtZSwgLi4ubWV0YWRhdGFXaXRob3V0RmlsZW5hbWUgfSA9IG1ldGFkYXRhOyAvLyBTdHJpcCBmaWxlbmFtZSBmcm9tIGxlZ2FjeSBkYXRhXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWV0YWRhdGFXaXRob3V0RmlsZW5hbWUsXG4gICAgICB0eXBlOiBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/PyAnVW50aXRsZWQgUGVyc29uYScsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJycsXG4gICAgICBhZ2VfcmF0aW5nOiAobWV0YWRhdGEuYWdlX3JhdGluZyBhcyAnYWxsJyB8ICcxMysnIHwgJzE4KycpID8/ICdhbGwnLFxuICAgICAgZ2VuZXJhdGlvbl9tZXRob2Q6IChtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCBhcyAnaHVtYW4nIHwgJ0NoYXRHUFQnIHwgJ0NsYXVkZScgfCAnaHlicmlkJykgPz8gJ2h1bWFuJ1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBtZXRhZGF0YSBpcyBQZXJzb25hRWxlbWVudE1ldGFkYXRhXG4gICAqL1xuICBwcml2YXRlIGlzUGVyc29uYUVsZW1lbnRNZXRhZGF0YShtZXRhZGF0YTogYW55KTogbWV0YWRhdGEgaXMgUGVyc29uYUVsZW1lbnRNZXRhZGF0YSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhICYmIHR5cGVvZiBtZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgbWV0YWRhdGEudHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQTtcbiAgfVxuXG4gIC8vIEJhc2VFbGVtZW50TWFuYWdlciBvdmVycmlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxQZXJzb25hRWxlbWVudE1ldGFkYXRhPiB7XG4gICAgY29uc3QgcGVyc29uYURhdGEgPSBkYXRhIGFzIFBlcnNvbmFNZXRhZGF0YTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMudG9QZXJzb25hRWxlbWVudE1ldGFkYXRhKHBlcnNvbmFEYXRhKTtcblxuICAgIGlmICghbWV0YWRhdGEudW5pcXVlX2lkKSB7XG4gICAgICBtZXRhZGF0YS51bmlxdWVfaWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLmF1dGhvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IFBlcnNvbmFFbGVtZW50TWV0YWRhdGEsIGJvZHlUZXh0OiBzdHJpbmcpOiBQZXJzb25hRWxlbWVudCB7XG4gICAgY29uc3QgdW5pcXVlSWQgPSBtZXRhZGF0YS51bmlxdWVfaWQgPz8gZ2VuZXJhdGVVbmlxdWVJZChtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS5hdXRob3IpO1xuICAgIC8vIEZpbGVuYW1lIGlzIGRlcml2ZWQgZnJvbSBuYW1lIC0gdXNlIGluaGVyaXRlZCBnZXRFbGVtZW50RmlsZW5hbWUoKSBmb3IgY29uc2lzdGVudCBub3JtYWxpemF0aW9uXG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShtZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIEZpeCAjOTEyOiBQcmVmZXIgZXhwbGljaXQgZm9ybWF0X3ZlcnNpb24gbWFya2VyLCBmYWxsIGJhY2sgdG8gaW5zdHJ1Y3Rpb25zLXByZXNlbmNlIGNoZWNrXG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIGxldCBpbnN0cnVjdGlvbnM6IHN0cmluZztcbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgIGlmIChtZXRhZGF0YUluc3RydWN0aW9ucykge1xuICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBtZXRhZGF0YSwgYm9keVRleHQgaXMgY29udGVudCAocmVmZXJlbmNlIG1hdGVyaWFsKVxuICAgICAgaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGFJbnN0cnVjdGlvbnM7XG4gICAgICBjb250ZW50ID0gYm9keVRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHYxIGZvcm1hdCBvciBkaXJlY3QgY3JlYXRpb246IGJvZHlUZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zXG4gICAgICBpbnN0cnVjdGlvbnMgPSBib2R5VGV4dDtcbiAgICAgIGNvbnRlbnQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBTdHJpcCBpbnN0cnVjdGlvbnMgZnJvbSBtZXRhZGF0YSB0byBwcmV2ZW50IGR1cGxpY2F0ZSBZQU1MIGtleXMgZHVyaW5nIHNlcmlhbGl6YXRpb25cbiAgICBjb25zdCB7IGluc3RydWN0aW9uczogX3N0cmlwSW5zdHIsIC4uLmNsZWFuTWV0YWRhdGEgfSA9IG1ldGFkYXRhIGFzIGFueTtcblxuICAgIC8vIENyZWF0ZSBQZXJzb25hRWxlbWVudCBpbnN0YW5jZSAtIG1ldGFkYXRhIGlzIGFscmVhZHkgUGVyc29uYUVsZW1lbnRNZXRhZGF0YSB3aXRoIGNvcnJlY3QgdHlwZXNcbiAgICBjb25zdCBwZXJzb25hRWxlbWVudCA9IG5ldyBQZXJzb25hRWxlbWVudChcbiAgICAgIHtcbiAgICAgICAgLi4uY2xlYW5NZXRhZGF0YSxcbiAgICAgICAgdW5pcXVlX2lkOiB1bmlxdWVJZFxuICAgICAgfSxcbiAgICAgIGluc3RydWN0aW9ucyxcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgdGhpcy5tZXRhZGF0YVNlcnZpY2UsXG4gICAgICBjb250ZW50XG4gICAgKTtcblxuICAgIC8vIFNldCB0aGUgSUQgdG8gbWF0Y2ggdW5pcXVlX2lkIGZvciBjb25zaXN0ZW5jeVxuICAgIHBlcnNvbmFFbGVtZW50LmlkID0gdW5pcXVlSWQ7XG5cbiAgICByZXR1cm4gcGVyc29uYUVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBQZXJzb25hRWxlbWVudCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gRml4ICM5MDk6IFVzZSBzcHJlYWQgY29weSB0byBhdm9pZCBtdXRhdGluZyBsaXZlIGVsZW1lbnQgbWV0YWRhdGEgaW4tcGxhY2VcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uZWxlbWVudC5tZXRhZGF0YSB9O1xuXG4gICAgLy8gSXNzdWUgIzc1NTogU2VyaWFsaXplIHR5cGUgYXMgc2luZ3VsYXIgYW5kIHBlcnNpc3QgdW5pcXVlX2lkXG4gICAgbWV0YWRhdGEudHlwZSA9IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5QRVJTT05BKTtcbiAgICBtZXRhZGF0YS5mb3JtYXRfdmVyc2lvbiA9ICd2Mic7ICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIG1ldGFkYXRhLnVuaXF1ZV9pZCA9IGVsZW1lbnQuaWQ7XG5cbiAgICAvLyB2Mi4wIGR1YWwtZmllbGQgZm9ybWF0OiBpbnN0cnVjdGlvbnMgaW4gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChlbGVtZW50Lmluc3RydWN0aW9ucykge1xuICAgICAgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5pbnN0cnVjdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYm9keTogY29udGVudCAocmVmZXJlbmNlIG1hdGVyaWFsKSBiZWxvdyAnLS0tJywgd2l0aCBuYW1lIGhlYWRpbmdcbiAgICBjb25zdCBuYW1lID0gZWxlbWVudC5tZXRhZGF0YS5uYW1lO1xuICAgIGNvbnN0IGJvZHlDb250ZW50ID0gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGVsZW1lbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJycpLnRyaW0oKTtcblxuICAgIGxldCBib2R5OiBzdHJpbmc7XG4gICAgaWYgKGJvZHlDb250ZW50LnRyaW0oKSkge1xuICAgICAgYm9keSA9IGAjICR7bmFtZX1cXG5cXG4ke2JvZHlDb250ZW50fWA7XG4gICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgYm9keSA9IGAjICR7bmFtZX1cXG5cXG4ke2Rlc2NyaXB0aW9ufWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHkgPSBgIyAke25hbWV9YDtcbiAgICB9XG5cbiAgICAvLyBGaXggIzkwOTogVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGluc3RlYWQgb2YgbWFudWFsIFlBTUwgY29uc3RydWN0aW9uLlxuICAgIC8vIEpTT04gc2NoZW1hIHByZXNlcnZlcyBib29sZWFucyBhbmQgbnVtYmVyczsgcmVtb3ZlLWJvdGggY2xlYW5zIG51bGwvdW5kZWZpbmVkLlxuICAgIGNvbnN0IHBlcnNvbmFDb250ZW50ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5jcmVhdGVGcm9udG1hdHRlcihtZXRhZGF0YSwgYm9keSwge1xuICAgICAgbWV0aG9kOiAnbWFudWFsJyxcbiAgICAgIHNjaGVtYTogJ2pzb24nLFxuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSxcbiAgICAgIGNsZWFuaW5nU3RyYXRlZ3k6ICdyZW1vdmUtYm90aCcsXG4gICAgICBzb3J0S2V5czogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdmFsaWRhdGVDb250ZW50U2l6ZShwZXJzb25hQ29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVMpO1xuXG4gICAgcmV0dXJuIHBlcnNvbmFDb250ZW50O1xuICB9XG5cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLm1kJztcbiAgfVxuXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxQZXJzb25hRWxlbWVudD4ge1xuICAgIGxldCBtZXRhZGF0YTogUGVyc29uYU1ldGFkYXRhO1xuICAgIGxldCBpbnN0cnVjdGlvbnM6IHN0cmluZztcbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xuXG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nIHx8IGZvcm1hdCA9PT0gJ3lhbWwnKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpIGFzIFBlcnNvbmE7XG4gICAgICBtZXRhZGF0YSA9IHBhcnNlZC5tZXRhZGF0YTtcbiAgICAgIGluc3RydWN0aW9ucyA9IHBhcnNlZC5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQgfHwgJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjUgLSBWYWxpZGF0ZSBZQU1MIGNvbnRlbnQgYmVmb3JlIHBhcnNpbmdcbiAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjcgLSBUaHJvdyBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGZvciB0ZXN0IGV4cGVjdGF0aW9uc1xuICAgICAgaWYgKGRhdGEuaW5jbHVkZXMoJy0tLScpKSB7XG4gICAgICAgIGNvbnN0IHlhbWxQYXJ0ID0gZGF0YS5zcGxpdCgnLS0tJylbMV07XG4gICAgICAgIGlmICh5YW1sUGFydCkge1xuICAgICAgICAgIGNvbnN0IHlhbWxWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KHlhbWxQYXJ0KTtcbiAgICAgICAgICBpZiAoIXlhbWxWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnUGVyc29uYU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgICAgICAgIGRldGFpbHM6ICdNYWxpY2lvdXMgWUFNTCBjb250ZW50IGRldGVjdGVkJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBtYXJrZG93bjogTWFsaWNpb3VzIFlBTUwgY29udGVudCBkZXRlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoZGF0YSk7XG5cbiAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBtZXRhZGF0YSBrZXlzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgdGhpcy52YWxpZGF0ZU1ldGFkYXRhS2V5cyhwYXJzZWQuZGF0YSk7XG5cbiAgICAgIG1ldGFkYXRhID0gcGFyc2VkLmRhdGEgYXMgUGVyc29uYU1ldGFkYXRhO1xuICAgICAgY29uc3QgYm9keVRleHQgPSBwYXJzZWQuY29udGVudDtcblxuICAgICAgLy8gRHVhbC1maWVsZCBsb2FkaW5nOiBkZXRlY3QgdjIgZm9ybWF0IChpbnN0cnVjdGlvbnMgaW4gWUFNTCBmcm9udG1hdHRlcilcbiAgICAgIGlmIChtZXRhZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgLy8gdjIgZm9ybWF0OiBpbnN0cnVjdGlvbnMgZnJvbSBZQU1MLCBib2R5IHRleHQgaXMgY29udGVudCAocmVmZXJlbmNlIG1hdGVyaWFsKVxuICAgICAgICBpbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgICAgIGNvbnRlbnQgPSBib2R5VGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHYxIGZvcm1hdDogYm9keSB0ZXh0IG1hcHMgdG8gaW5zdHJ1Y3Rpb25zIChpdCBJUyBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMpXG4gICAgICAgIGluc3RydWN0aW9ucyA9IGJvZHlUZXh0O1xuICAgICAgICBjb250ZW50ID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBsZWdhY3kgUGVyc29uYU1ldGFkYXRhIHRvIFBlcnNvbmFFbGVtZW50TWV0YWRhdGEgYmVmb3JlIGNyZWF0aW5nIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50TWV0YWRhdGEgPSB0aGlzLnRvUGVyc29uYUVsZW1lbnRNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChlbGVtZW50TWV0YWRhdGEsIGluc3RydWN0aW9ucyk7XG4gICAgZWxlbWVudC5jb250ZW50ID0gY29udGVudDtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIGFzeW5jIGV4cG9ydEVsZW1lbnQocGVyc29uYTogUGVyc29uYUVsZW1lbnQsIF9mb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBVc2UgYmFzZSBlbGVtZW50IHNlcmlhbGl6YXRpb24gZm9yIHNlY3VyZSBZQU1MIGdlbmVyYXRpb25cbiAgICAvLyBQYXNzIGluc3RydWN0aW9ucyAoYmVoYXZpb3JhbCBkaXJlY3RpdmVzKSBhcyB0aGUgcHJpbWFyeSB0ZXh0XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChwZXJzb25hLm1ldGFkYXRhLCBwZXJzb25hLmluc3RydWN0aW9ucyk7XG4gICAgZWxlbWVudC5jb250ZW50ID0gcGVyc29uYS5jb250ZW50OyAgLy8gUHJlc2VydmUgcmVmZXJlbmNlIG1hdGVyaWFsXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjYW5EZWxldGUoZWxlbWVudDogUGVyc29uYUVsZW1lbnQpOiBQcm9taXNlPHsgYWxsb3dlZDogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0+IHtcbiAgICBpZiAoaXNEZWZhdWx0UGVyc29uYShlbGVtZW50LmZpbGVuYW1lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICAgIHJlYXNvbjogJ0Nhbm5vdCBkZWxldGUgYSBkZWZhdWx0IHBlcnNvbmEuIEVkaXQgaXQgdG8gY3JlYXRlIGEgcGVyc29uYWwgY29weSBpbnN0ZWFkLidcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzI4MTogQ2hlY2sgaWYgcGVyc29uYSBpcyBpbiB0aGUgYWN0aXZlIHNldFxuICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmFzLmhhcyhlbGVtZW50LmZpbGVuYW1lKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICAgIHJlYXNvbjogJ0Nhbm5vdCBkZWxldGUgYW4gYWN0aXZlIHBlcnNvbmEuIERlYWN0aXZhdGUgaXQgZmlyc3QuJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBhbGxvd2VkOiB0cnVlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgYmVmb3JlU2F2ZShwZXJzb25hOiBQZXJzb25hRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVBhdGhWYWxpZGF0b3IoKTtcbiAgICB0aGlzLm5vcm1hbGl6ZVBlcnNvbmFGb3JTYXZlKHBlcnNvbmEpO1xuICAgIC8vIFBhdGggdmFsaWRhdGlvbiBoYW5kbGVkIGJ5IEJhc2VFbGVtZW50TWFuYWdlci5zYXZlKCkgYmVmb3JlIHRoaXMgaG9vayBpcyBjYWxsZWRcbiAgfVxufVxuIl19
|
|
1442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYU1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc29uYS9QZXJzb25hTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUFFLGNBQWMsRUFBMEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFtQixlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRixPQUFPLEVBQW9CLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFrQyxNQUFNLHdD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b25hIG1hbmFnZW1lbnQgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBQZXJzb25hLCBQZXJzb25hTWV0YWRhdGEgfSBmcm9tICcuLi90eXBlcy9wZXJzb25hLmpzJztcbmltcG9ydCB7IFBlcnNvbmFFbGVtZW50LCBQZXJzb25hRWxlbWVudE1ldGFkYXRhIH0gZnJvbSAnLi9QZXJzb25hRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpbGVuYW1lLCBzYW5pdGl6ZUlucHV0LCB2YWxpZGF0ZUNvbnRlbnRTaXplIH0gZnJvbSAnLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBhdGhWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVFcnJvckhhbmRsZXIgfSBmcm9tICcuLi9zZWN1cml0eS9lcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5kaWNhdG9yQ29uZmlnLCBmb3JtYXRJbmRpY2F0b3IgfSBmcm9tICcuLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyLCBFbGVtZW50VHlwZSB9IGZyb20gJy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IHRvU2luZ3VsYXJMYWJlbCB9IGZyb20gJy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBTdGF0ZUNoYW5nZU5vdGlmaWVyLCB0eXBlIFBlcnNvbmFTdGF0ZUNoYW5nZVR5cGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9TdGF0ZUNoYW5nZU5vdGlmaWVyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICcuLi91dGlscy9maWxlc3lzdGVtLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBpc0RlZmF1bHRQZXJzb25hIH0gZnJvbSAnLi4vY29uc3RhbnRzL2RlZmF1bHRQZXJzb25hcy5qcyc7XG5pbXBvcnQgeyBQZXJzb25hSW1wb3J0ZXIsIEltcG9ydFJlc3VsdCB9IGZyb20gJy4vZXhwb3J0LWltcG9ydC9QZXJzb25hSW1wb3J0ZXIuanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyLCB0eXBlIEJhc2VFbGVtZW50TWFuYWdlck9wdGlvbnMgfSBmcm9tICcuLi9lbGVtZW50cy9iYXNlL0Jhc2VFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWQUxJREFUSU9OX0NPTlNUQU5UUyB9IGZyb20gJy4uL2VsZW1lbnRzL2Jhc2UvRWxlbWVudFZhbGlkYXRpb24uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplVmVyc2lvbiB9IGZyb20gJy4uL2VsZW1lbnRzL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG4vKipcbiAqIFZhbGlkYXRlZCBhbmQgc2FuaXRpemVkIHBlcnNvbmEgaW5wdXQgZGF0YVxuICovXG5pbnRlcmZhY2UgVmFsaWRhdGVkUGVyc29uYUlucHV0cyB7XG4gIG5hbWU6IHN0cmluZztcbiAgc2FuaXRpemVkTmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZztcbiAgZmlsZW5hbWU6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHN0cmluZ1tdO1xuICB1bmlxdWVJZDogc3RyaW5nO1xuICBhdXRob3I6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBlcnNvbmFNYW5hZ2VyT3B0aW9ucyBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlck9wdGlvbnMge1xuICBwZXJzb25hSW1wb3J0ZXI/OiBQZXJzb25hSW1wb3J0ZXI7XG4gIG5vdGlmaWVyPzogU3RhdGVDaGFuZ2VOb3RpZmllcjtcbn1cblxuZXhwb3J0IGNsYXNzIFBlcnNvbmFNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPFBlcnNvbmFFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBUcmFjayBhY3RpdmUgcGVyc29uYXMgYnkgZmlsZW5hbWUgKHN0YWJsZSBpZGVudGlmaWVyKVxuICAgKiBJc3N1ZSAjMjgxOiBDaGFuZ2VkIGZyb20gc2luZ2xlIGFjdGl2ZSBwZXJzb25hIHRvIFNldCBmb3IgbXVsdGlwbGUgYWN0aXZlXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVBlcnNvbmFzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5kaWNhdG9yQ29uZmlnOiBJbmRpY2F0b3JDb25maWc7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXI7XG4gIHByaXZhdGUgcGVyc29uYUltcG9ydGVyPzogUGVyc29uYUltcG9ydGVyO1xuICBwcml2YXRlIG5vdGlmaWVyPzogU3RhdGVDaGFuZ2VOb3RpZmllcjtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJzb25hc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHBhdGhWYWxpZGF0b3JJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTogVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBpbmRpY2F0b3JDb25maWc6IEluZGljYXRvckNvbmZpZyxcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBwZXJzb25hSW1wb3J0ZXI/OiBQZXJzb25hSW1wb3J0ZXIsXG4gICAgbm90aWZpZXI/OiBTdGF0ZUNoYW5nZU5vdGlmaWVyLFxuICAgIGJhc2VPcHRpb25zOiBQZXJzb25hTWFuYWdlck9wdGlvbnMgPSB7fVxuICApIHtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5QRVJTT05BLCBwb3J0Zm9saW9NYW5hZ2VyLCBmaWxlTG9ja01hbmFnZXIsIGJhc2VPcHRpb25zLCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gcG9ydGZvbGlvTWFuYWdlcjtcbiAgICB0aGlzLmZpbGVMb2NrTWFuYWdlciA9IGZpbGVMb2NrTWFuYWdlcjtcblxuICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnID0gaW5kaWNhdG9yQ29uZmlnO1xuICAgIHRoaXMucGVyc29uYUltcG9ydGVyID0gYmFzZU9wdGlvbnMucGVyc29uYUltcG9ydGVyID8/IHBlcnNvbmFJbXBvcnRlcjtcbiAgICB0aGlzLm5vdGlmaWVyID0gYmFzZU9wdGlvbnMubm90aWZpZXIgPz8gbm90aWZpZXI7XG4gICAgdGhpcy5wZXJzb25hc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLm1ldGFkYXRhU2VydmljZSA9IG1ldGFkYXRhU2VydmljZTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gbmV3IFNlcmlhbGl6YXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy5pbml0aWFsaXplUGF0aFZhbGlkYXRvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRvIHJldHVybiBzaW5ndWxhciBmb3JtIGZvciBlbGVtZW50IHR5cGUgbGFiZWxpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdwZXJzb25hJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBsb2FkIGFsbCBwZXJzb25hc1xuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmluaXRpYWxpemVQYXRoVmFsaWRhdG9yKCk7XG4gICAgLy8gQmFzZSBjbGFzcyBoYW5kbGVzIGVsZW1lbnQgbG9hZGluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZCBwZXJzb25hcyB1c2luZyBCYXNlRWxlbWVudE1hbmFnZXIgY2FjaGVzXG4gICAqL1xuICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbml0aWFsaXplUGF0aFZhbGlkYXRvcigpO1xuXG4gICAgLy8gQ2xlYXIgQmFzZUVsZW1lbnRNYW5hZ2VyIGNhY2hlcyBhbmQgcmVsb2FkXG4gICAgdGhpcy5jbGVhckNhY2hlKCk7XG4gICAgY29uc3QgcGVyc29uYXMgPSBhd2FpdCBzdXBlci5saXN0KCk7XG5cbiAgICAvLyBDaGVjayBpZiBhY3RpdmUgcGVyc29uYXMgc3RpbGwgZXhpc3QgYWZ0ZXIgcmVsb2FkXG4gICAgLy8gSXNzdWUgIzI4MTogU3VwcG9ydCBtdWx0aXBsZSBhY3RpdmUgcGVyc29uYXNcbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUZpbGVuYW1lIG9mIFsuLi50aGlzLmFjdGl2ZVBlcnNvbmFzXSkge1xuICAgICAgY29uc3Qgc3RpbGxFeGlzdHMgPSBwZXJzb25hcy5zb21lKHAgPT4gdGhpcy5kZXJpdmVGaWxlbmFtZShwKSA9PT0gYWN0aXZlRmlsZW5hbWUpO1xuICAgICAgaWYgKCFzdGlsbEV4aXN0cykge1xuICAgICAgICB0aGlzLmFjdGl2ZVBlcnNvbmFzLmRlbGV0ZShhY3RpdmVGaWxlbmFtZSk7XG4gICAgICAgIHRoaXMubm90aWZ5UGVyc29uYUNoYW5nZSgncGVyc29uYS1kZWFjdGl2YXRlZCcsIGFjdGl2ZUZpbGVuYW1lLCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlcml2ZUZpbGVuYW1lKHBlcnNvbmE6IFBlcnNvbmFFbGVtZW50KTogc3RyaW5nIHtcbiAgICBpZiAocGVyc29uYS5maWxlbmFtZSkge1xuICAgICAgcmV0dXJuIHBlcnNvbmEuZmlsZW5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9XG4gICAgICBwZXJzb25hLm1ldGFkYXRhPy51bmlxdWVfaWQgfHxcbiAgICAgIHRoaXMubm9ybWFsaXplRmlsZW5hbWUocGVyc29uYS5tZXRhZGF0YT8ubmFtZSB8fCAncGVyc29uYScpO1xuXG4gICAgcmV0dXJuIGJhc2UuZW5kc1dpdGgoJy5tZCcpID8gYmFzZSA6IGAke2Jhc2V9Lm1kYDtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBjbG9uZVBlcnNvbmEoYmFzZVBlcnNvbmE6IFBlcnNvbmFFbGVtZW50LCBvcHRpb25zOiB7IHdyaXRhYmxlQ29weT86IGJvb2xlYW4gfSA9IHt9KTogUGVyc29uYUVsZW1lbnQge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQZXJzb25hTWV0YWRhdGEgPSB7XG4gICAgICAuLi5iYXNlUGVyc29uYS5tZXRhZGF0YSxcbiAgICAgIHRyaWdnZXJzOiBiYXNlUGVyc29uYS5tZXRhZGF0YS50cmlnZ2VycyA/IFsuLi5iYXNlUGVyc29uYS5tZXRhZGF0YS50cmlnZ2Vyc10gOiB1bmRlZmluZWQsXG4gICAgICBjb250ZW50X2ZsYWdzOiBiYXNlUGVyc29uYS5tZXRhZGF0YS5jb250ZW50X2ZsYWdzID8gWy4uLmJhc2VQZXJzb25hLm1ldGFkYXRhLmNvbnRlbnRfZmxhZ3NdIDogdW5kZWZpbmVkXG4gICAgfTtcblxuICAgIGxldCB1bmlxdWVJZCA9IGJhc2VQZXJzb25hLmlkO1xuICAgIGxldCBmaWxlbmFtZSA9IGJhc2VQZXJzb25hLmZpbGVuYW1lO1xuXG4gICAgaWYgKG9wdGlvbnMud3JpdGFibGVDb3B5KSB7XG4gICAgICBjb25zdCBhdXRob3IgPSB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICAgIHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZChtZXRhZGF0YS5uYW1lLCBhdXRob3IpO1xuICAgICAgZmlsZW5hbWUgPSBgJHt1bmlxdWVJZH0ubWRgO1xuXG4gICAgICBtZXRhZGF0YS51bmlxdWVfaWQgPSB1bmlxdWVJZDtcbiAgICAgIGlmIChhdXRob3IpIHtcbiAgICAgICAgbWV0YWRhdGEuYXV0aG9yID0gYXV0aG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBuZXcgUGVyc29uYUVsZW1lbnQgaW5zdGFuY2UgKHYyLjAgZHVhbC1maWVsZDogcGFzcyBib3RoIGluc3RydWN0aW9ucyBhbmQgY29udGVudClcbiAgICBjb25zdCBjbG9uZWQgPSBuZXcgUGVyc29uYUVsZW1lbnQoXG4gICAgICB7XG4gICAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgICB0eXBlOiBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgICB1bmlxdWVfaWQ6IHVuaXF1ZUlkXG4gICAgICB9IGFzIFBhcnRpYWw8UGVyc29uYUVsZW1lbnRNZXRhZGF0YT4sXG4gICAgICBiYXNlUGVyc29uYS5pbnN0cnVjdGlvbnMsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlLFxuICAgICAgYmFzZVBlcnNvbmEuY29udGVudFxuICAgICk7XG5cbiAgICAvLyBTZXQgdGhlIElEXG4gICAgY2xvbmVkLmlkID0gdW5pcXVlSWQ7XG5cbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVQZXJzb25hRm9yU2F2ZShwZXJzb25hOiBQZXJzb25hRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQZXJzb25hTWV0YWRhdGEgPSB7IC4uLihwZXJzb25hLm1ldGFkYXRhID8/IHt9KSB9O1xuXG4gICAgLy8gU2FuaXRpemUgbmFtZSBmaXJzdCAoYmVmb3JlIE1ldGFkYXRhU2VydmljZSlcbiAgICBjb25zdCBzYW5pdGl6ZWROYW1lID1cbiAgICAgIHNhbml0aXplSW5wdXQobWV0YWRhdGEubmFtZSB8fCBwZXJzb25hLmZpbGVuYW1lIHx8IGBwZXJzb25hLSR7RGF0ZS5ub3coKX1gLCAxMDApIHx8ICdQZXJzb25hJztcbiAgICBtZXRhZGF0YS5uYW1lID0gc2FuaXRpemVkTmFtZTtcblxuICAgIC8vIFVzZSBNZXRhZGF0YVNlcnZpY2UgZm9yIGNvbW1vbiBmaWVsZHMgKyBwZXJzb25hLXNwZWNpZmljIGRlZmF1bHRzXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubWV0YWRhdGFTZXJ2aWNlLm5vcm1hbGl6ZU1ldGFkYXRhPFBlcnNvbmFNZXRhZGF0YT4oXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIEVsZW1lbnRUeXBlLlBFUlNPTkEsXG4gICAgICB7XG4gICAgICAgIHR5cGVEZWZhdWx0czoge1xuICAgICAgICAgIGNhdGVnb3J5OiAnZ2VuZXJhbCcsXG4gICAgICAgICAgY29udGVudF9mbGFnczogWyd1c2VyLWNyZWF0ZWQnXSxcbiAgICAgICAgICBhZ2VfcmF0aW5nOiAnYWxsJyxcbiAgICAgICAgICBjcmVhdGVkX2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdICAvLyBQZXJzb25hIHVzZXMgZGF0ZS1vbmx5IGZvcm1hdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEhhbmRsZSB1bmlxdWVfaWQgKHBlcnNvbmEtc3BlY2lmaWMpXG4gICAgaWYgKCFub3JtYWxpemVkLnVuaXF1ZV9pZCkge1xuICAgICAgbm9ybWFsaXplZC51bmlxdWVfaWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKG5vcm1hbGl6ZWQubmFtZSwgbm9ybWFsaXplZC5hdXRob3IpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0cmlnZ2VycyAoZWxlbWVudC1zcGVjaWZpYyB2YWxpZGF0aW9uKVxuICAgIGlmIChub3JtYWxpemVkLnRyaWdnZXJzICYmIG5vcm1hbGl6ZWQudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG5vcm1hbGl6ZWQudHJpZ2dlcnMsXG4gICAgICAgIEVsZW1lbnRUeXBlLlBFUlNPTkEsXG4gICAgICAgIG5vcm1hbGl6ZWQubmFtZVxuICAgICAgKTtcbiAgICAgIC8vIENSSVRJQ0FMOiBQcmVzZXJ2ZSB1bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBubyB2YWxpZCB0cmlnZ2Vyc1xuICAgICAgbm9ybWFsaXplZC50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2Vycy5sZW5ndGggPiAwXG4gICAgICAgID8gdmFsaWRhdGlvblJlc3VsdC52YWxpZFRyaWdnZXJzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkLnRyaWdnZXJzID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGVyc29uYS5maWxlbmFtZSB8fCB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShub3JtYWxpemVkLm5hbWUpO1xuICAgIHBlcnNvbmEuZmlsZW5hbWUgPSB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lKTtcblxuICAgIHBlcnNvbmEubWV0YWRhdGEgPSBub3JtYWxpemVkIGFzIFBlcnNvbmFFbGVtZW50TWV0YWRhdGE7XG4gICAgcGVyc29uYS51bmlxdWVfaWQgPSBub3JtYWxpemVkLnVuaXF1ZV9pZDtcbiAgICBwZXJzb25hLmlkID0gbm9ybWFsaXplZC51bmlxdWVfaWQ7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGxvYWRlZCBwZXJzb25hcyBhcyBhIE1hcCAodXNlZCBieSBpbXBvcnQgb3BlcmF0aW9ucylcbiAgICovXG4gIGFzeW5jIGdldEFsbFBlcnNvbmFzKCk6IFByb21pc2U8TWFwPHN0cmluZywgUGVyc29uYT4+IHtcbiAgICBjb25zdCBwZXJzb25hcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBQZXJzb25hPigpO1xuICAgIGZvciAoY29uc3QgcGVyc29uYSBvZiBwZXJzb25hcykge1xuICAgICAgbWFwLnNldChwZXJzb25hLmZpbGVuYW1lLCBwZXJzb25hKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGVyc29uYXMgZnJvbSBjYWNoZSBhcyBhIE1hcCAoc3luY2hyb25vdXMsIGZvciBESSBjb25zdW1lcnMpXG4gICAqL1xuICBnZXRQZXJzb25hcygpOiBNYXA8c3RyaW5nLCBQZXJzb25hPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFBlcnNvbmE+KCk7XG4gICAgZm9yIChjb25zdCBwZXJzb25hIG9mIHRoaXMuZWxlbWVudHMudmFsdWVzKCkpIHtcbiAgICAgIG1hcC5zZXQocGVyc29uYS5maWxlbmFtZSwgcGVyc29uYSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgcGVyc29uYXMgYXMgYW4gYXJyYXlcbiAgICogRW5zdXJlcyBhbGwgcGVyc29uYXMgaGF2ZSBmaWxlbmFtZXMgc2V0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8UGVyc29uYUVsZW1lbnRbXT4ge1xuICAgIGNvbnN0IHBlcnNvbmFzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuICAgIC8vIEVuc3VyZSBmaWxlbmFtZXMgYXJlIHNldCB1c2luZyBkZXJpdmVGaWxlbmFtZSBsb2dpY1xuICAgIGZvciAoY29uc3QgcGVyc29uYSBvZiBwZXJzb25hcykge1xuICAgICAgaWYgKCFwZXJzb25hLmZpbGVuYW1lKSB7XG4gICAgICAgIHBlcnNvbmEuZmlsZW5hbWUgPSB0aGlzLmRlcml2ZUZpbGVuYW1lKHBlcnNvbmEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGVyc29uYXM7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHBlcnNvbmFzIGFuZCByZXR1cm4gTUNQLWZvcm1hdHRlZCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgcmVsb2FkUGVyc29uYXMoKSB7XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICBjb25zdCBwZXJzb25hcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHtwZXJzb25hcy5sZW5ndGh9IHBlcnNvbmFzYFxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBwZXJzb25hIGJ5IGlkZW50aWZpZXIgKGZpbGVuYW1lLCBuYW1lLCBvciB1bmlxdWVfaWQpXG4gICAqIFVzZXMgY2FjaGVkIGVsZW1lbnRzIGZyb20gQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciBzeW5jaHJvbm91cyBhY2Nlc3NcbiAgICogTXVsdGktc3RyYXRlZ3kgc2VhcmNoOiBmaWxlbmFtZSAod2l0aC93aXRob3V0IC5tZCksIG5hbWUgKGNhc2UtaW5zZW5zaXRpdmUpLCB1bmlxdWVfaWRcbiAgICovXG4gIC8qKiBDYWNoZSBtaXNzIG1ldHJpY3MgZm9yIG1vbml0b3JpbmcgcGVyc29uYSBsb29rdXAgaGVhbHRoIChJc3N1ZSAjODQzKSAqL1xuICBwcml2YXRlIGNhY2hlTWlzc01ldHJpY3MgPSB7XG4gICAgY2FjaGVIaXRzOiAwLFxuICAgIGNhY2hlTWlzc2VzOiAwLFxuICAgIGRpc2tSZWNvdmVyaWVzOiAwLFxuICAgIGRpc2tGYWlsdXJlczogMCxcbiAgICBub3RGb3VuZDogMCxcbiAgICBkZWR1cGxpY2F0ZWRMb29rdXBzOiAwLFxuICB9O1xuXG4gIC8qKiBHZXQgY2FjaGUgbWlzcyBtZXRyaWNzIGZvciBtb25pdG9yaW5nIGFuZCBkaWFnbm9zdGljcyAqL1xuICBnZXRDYWNoZU1pc3NNZXRyaWNzKCk6IFJlYWRvbmx5PHR5cGVvZiB0aGlzLmNhY2hlTWlzc01ldHJpY3M+IHtcbiAgICByZXR1cm4geyAuLi50aGlzLmNhY2hlTWlzc01ldHJpY3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHBlcnNvbmEgbWF0Y2hlcyBhbiBpZGVudGlmaWVyIGJ5IGZpbGVuYW1lLCBuYW1lLCBvciBJRC5cbiAgICogU2hhcmVkIG1hdGNoaW5nIGxvZ2ljIHVzZWQgYnkgYm90aCBmaW5kUGVyc29uYSgpIGFuZCBmaW5kUGVyc29uYUFzeW5jKCkuXG4gICAqL1xuICBwcml2YXRlIG1hdGNoZXNJZGVudGlmaWVyKHBlcnNvbmE6IFBlcnNvbmFFbGVtZW50LCBpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmltbWVkID0gaWRlbnRpZmllci50cmltKCk7XG4gICAgY29uc3QgbG93ZXIgPSB0cmltbWVkLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmlsZW5hbWVXaXRoRXh0ID0gdHJpbW1lZC5lbmRzV2l0aCgnLm1kJykgPyB0cmltbWVkIDogYCR7dHJpbW1lZH0ubWRgO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kZXJpdmVGaWxlbmFtZShwZXJzb25hKTtcblxuICAgIC8vIFN0cmF0ZWd5IDE6IEV4YWN0IGZpbGVuYW1lIG1hdGNoICh3aXRoIG9yIHdpdGhvdXQgLm1kKVxuICAgIGlmIChmaWxlbmFtZSA9PT0gdHJpbW1lZCB8fCBmaWxlbmFtZSA9PT0gZmlsZW5hbWVXaXRoRXh0KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTdHJhdGVneSAyOiBOYW1lIG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKVxuICAgIGlmIChwZXJzb25hLm1ldGFkYXRhLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBTdHJhdGVneSAzOiBVbmlxdWUgSUQgbWF0Y2hcbiAgICBpZiAocGVyc29uYS5pZCA9PT0gdHJpbW1lZCB8fCBwZXJzb25hLm1ldGFkYXRhLnVuaXF1ZV9pZCA9PT0gdHJpbW1lZCkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmaW5kUGVyc29uYShpZGVudGlmaWVyOiBzdHJpbmcpOiBQZXJzb25hRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLnZhbHVlcygpLmZpbmQocCA9PiB0aGlzLm1hdGNoZXNJZGVudGlmaWVyKHAsIGlkZW50aWZpZXIpKTtcbiAgfVxuXG4gIC8qKiBJbi1mbGlnaHQgZGlzayBsb29rdXBzIHRvIHByZXZlbnQgZHVwbGljYXRlIHJlYWRzIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyICovXG4gIHByaXZhdGUgcGVuZGluZ0xvb2t1cHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxQZXJzb25hRWxlbWVudCB8IHVuZGVmaW5lZD4+KCk7XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBwZXJzb25hIHdpdGggZGlzayBmYWxsYmFjayB3aGVuIGNhY2hlIG1pc3Nlcy5cbiAgICpcbiAgICogSXNzdWUgIzg0MzogZmluZFBlcnNvbmEoKSBpcyBzeW5jaHJvbm91cyBhbmQgY2FjaGUtb25seS4gQWZ0ZXIgTFJVIGV2aWN0aW9uXG4gICAqIG9yIGRpcmVjdCBmaWxlc3lzdGVtIGVkaXRzIGZvbGxvd2VkIGJ5IHNjYW4oKSwgcGVyc29uYXMgYmVjb21lIGludmlzaWJsZSBldmVuXG4gICAqIHRob3VnaCB0aGUgZmlsZSBleGlzdHMgb24gZGlzay4gVGhpcyBhc3luYyBtZXRob2QgdHJpZXMgdGhlIGZhc3QgY2FjaGUgcGF0aFxuICAgKiBmaXJzdCwgdGhlbiBmYWxscyBiYWNrIHRvIEJhc2VFbGVtZW50TWFuYWdlci5maW5kQnlOYW1lKCkgd2hpY2ggaGFzIHRoZSBmdWxsXG4gICAqIGNhY2hlIOKGkiBzdG9yYWdlIGluZGV4IOKGkiBkaXJlY3QgZmlsZSBsb2FkIOKGkiBsaXN0IHNjYW4gZmFsbGJhY2sgY2hhaW4uXG4gICAqXG4gICAqIEluY2x1ZGVzIHJlcXVlc3QgZGVkdXBsaWNhdGlvbjogY29uY3VycmVudCBsb29rdXBzIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyXG4gICAqIHNoYXJlIGEgc2luZ2xlIGRpc2sgcmVhZCB0byBhdm9pZCByZWR1bmRhbnQgSS9PIGluIGJyaWRnZS9zd2FybSBzY2VuYXJpb3MuXG4gICAqL1xuICBhc3luYyBmaW5kUGVyc29uYUFzeW5jKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8UGVyc29uYUVsZW1lbnQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBGYXN0IHBhdGg6IGNoZWNrIExSVSBjYWNoZSAoc3luY2hyb25vdXMsIE8oY2FjaGUgc2l6ZSkpXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5maW5kUGVyc29uYShpZGVudGlmaWVyKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICB0aGlzLmNhY2hlTWlzc01ldHJpY3MuY2FjaGVIaXRzKys7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIHRoaXMuY2FjaGVNaXNzTWV0cmljcy5jYWNoZU1pc3NlcysrO1xuXG4gICAgLy8gRGVkdXBsaWNhdGUgY29uY3VycmVudCBkaXNrIGxvb2t1cHMgZm9yIHRoZSBzYW1lIGlkZW50aWZpZXJcbiAgICBjb25zdCBsb29rdXBLZXkgPSBpZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdMb29rdXBzLmdldChsb29rdXBLZXkpO1xuICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICB0aGlzLmNhY2hlTWlzc01ldHJpY3MuZGVkdXBsaWNhdGVkTG9va3VwcysrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbUGVyc29uYU1hbmFnZXJdIGZpbmRQZXJzb25hQXN5bmM6IGRlZHVwbGljYXRpbmcgY29uY3VycmVudCBsb29rdXAgZm9yIFwiJHtpZGVudGlmaWVyfVwiYCk7XG4gICAgICByZXR1cm4gcGVuZGluZztcbiAgICB9XG5cbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLnBlcmZvcm1EaXNrTG9va3VwKGlkZW50aWZpZXIpO1xuICAgIHRoaXMucGVuZGluZ0xvb2t1cHMuc2V0KGxvb2t1cEtleSwgbG9va3VwKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbG9va3VwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBlbmRpbmdMb29rdXBzLmRlbGV0ZShsb29rdXBLZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgZGlzayBsb29rdXAgZm9yIGZpbmRQZXJzb25hQXN5bmMuXG4gICAqIFNlcGFyYXRlZCB0byBzdXBwb3J0IHJlcXVlc3QgZGVkdXBsaWNhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybURpc2tMb29rdXAoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxQZXJzb25hRWxlbWVudCB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmcm9tRGlzayA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcbiAgICAgIGlmIChmcm9tRGlzayAmJiB0aGlzLm1hdGNoZXNJZGVudGlmaWVyKGZyb21EaXNrLCBpZGVudGlmaWVyKSkge1xuICAgICAgICB0aGlzLmNhY2hlTWlzc01ldHJpY3MuZGlza1JlY292ZXJpZXMrKztcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtQZXJzb25hTWFuYWdlcl0gQ2FjaGUgbWlzcyByZWNvdmVyZWQgZnJvbSBkaXNrOiBcIiR7aWRlbnRpZmllcn1cIiAodG90YWwgcmVjb3ZlcmllczogJHt0aGlzLmNhY2hlTWlzc01ldHJpY3MuZGlza1JlY292ZXJpZXN9LCBtaXNzIHJhdGU6ICR7dGhpcy5jYWNoZU1pc3NNZXRyaWNzLmNhY2hlTWlzc2VzfS8ke3RoaXMuY2FjaGVNaXNzTWV0cmljcy5jYWNoZUhpdHMgKyB0aGlzLmNhY2hlTWlzc01ldHJpY3MuY2FjaGVNaXNzZXN9KWApO1xuICAgICAgICByZXR1cm4gZnJvbURpc2s7XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlTWlzc01ldHJpY3Mubm90Rm91bmQrKztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BlcnNvbmFNYW5hZ2VyXSBmaW5kUGVyc29uYUFzeW5jOiBcIiR7aWRlbnRpZmllcn1cIiBub3QgZm91bmQgaW4gY2FjaGUgb3Igb24gZGlza2ApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuY2FjaGVNaXNzTWV0cmljcy5kaXNrRmFpbHVyZXMrKztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BlcnNvbmFNYW5hZ2VyXSBmaW5kUGVyc29uYUFzeW5jOiBkaXNrIGxvb2t1cCBmYWlsZWQgZm9yIFwiJHtpZGVudGlmaWVyfVwiIChwYXJzZS92YWxpZGF0aW9uIGVycm9yKWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYSBwZXJzb25hXG4gICAqIElzc3VlICMyODE6IE5vdyBzdXBwb3J0cyBtdWx0aXBsZSBhY3RpdmUgcGVyc29uYXMgKGFkZHMgdG8gc2V0IGluc3RlYWQgb2YgcmVwbGFjaW5nKVxuICAgKiBJc3N1ZSAjODQzOiBOb3cgYXN5bmMg4oCUIHVzZXMgZmluZFBlcnNvbmFBc3luYygpIHRvIHJlY292ZXIgZnJvbSBjYWNoZSBldmljdGlvblxuICAgKi9cbiAgYXN5bmMgYWN0aXZhdGVQZXJzb25hKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IHBlcnNvbmE/OiBQZXJzb25hIH0+IHtcbiAgICBjb25zdCBwZXJzb25hID0gYXdhaXQgdGhpcy5maW5kUGVyc29uYUFzeW5jKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYFBlcnNvbmEgbm90IGZvdW5kOiBcIiR7aWRlbnRpZmllcn1cImBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzI4MTogQWRkIHRvIHNldCBpbnN0ZWFkIG9mIHJlcGxhY2luZ1xuICAgIGNvbnN0IHdhc0FscmVhZHlBY3RpdmUgPSB0aGlzLmFjdGl2ZVBlcnNvbmFzLmhhcyhwZXJzb25hLmZpbGVuYW1lKTtcbiAgICBpZiAod2FzQWxyZWFkeUFjdGl2ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYFBlcnNvbmEgJyR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfScgaXMgYWxyZWFkeSBhY3RpdmVgLFxuICAgICAgICBwZXJzb25hXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElzc3VlICM4MzogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmFzLmFkZChwZXJzb25hLmZpbGVuYW1lKTtcbiAgICB0aGlzLm5vdGlmeVBlcnNvbmFDaGFuZ2UoJ3BlcnNvbmEtYWN0aXZhdGVkJywgbnVsbCwgcGVyc29uYS5maWxlbmFtZSk7XG5cbiAgICAvLyBTRUNVUklUWTogUGhhc2UgNC40IC0gTG9nIHBlcnNvbmEgYWN0aXZhdGlvbiBldmVudFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnUGVyc29uYU1hbmFnZXIuYWN0aXZhdGVQZXJzb25hJyxcbiAgICAgIGRldGFpbHM6IGBQZXJzb25hIGFjdGl2YXRlZDogJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFjdGl2ZUNvdW50OiB0aGlzLmFjdGl2ZVBlcnNvbmFzLnNpemUsXG4gICAgICAgIGZpbGVuYW1lOiBwZXJzb25hLmZpbGVuYW1lXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFbWl0IGFjdGl2YXRpb24gZXZlbnQgZm9yIHN1YnNjcmliZXJzXG4gICAgdGhpcy5kaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDphY3RpdmF0ZScsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7XG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgZWxlbWVudDogcGVyc29uYSxcbiAgICAgICAgZmlsZVBhdGg6IHBlcnNvbmEuZmlsZW5hbWVcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYEFjdGl2YXRlZCBwZXJzb25hOiAke3BlcnNvbmEubWV0YWRhdGEubmFtZX1gLFxuICAgICAgcGVyc29uYVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIGEgc3BlY2lmaWMgcGVyc29uYSBieSBuYW1lXG4gICAqIElzc3VlICMyODE6IE5vdyByZXF1aXJlcyBhIG5hbWUgcGFyYW1ldGVyIHRvIGRlYWN0aXZhdGUgc3BlY2lmaWMgcGVyc29uYSBmcm9tIHRoZSBzZXRcbiAgICovXG4gIGRlYWN0aXZhdGVQZXJzb25hKGlkZW50aWZpZXI/OiBzdHJpbmcpOiB7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9IHtcbiAgICAvLyBJZiBubyBpZGVudGlmaWVyIHByb3ZpZGVkLCByZXR1cm4gZXJyb3IgKGJyZWFraW5nIGNoYW5nZSBmcm9tIHNpbmdsZS1hY3RpdmUpXG4gICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogXCJObyBwZXJzb25hIGlzIGN1cnJlbnRseSBhY3RpdmVcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IFwiUGVyc29uYSBuYW1lIGlzIHJlcXVpcmVkIGZvciBkZWFjdGl2YXRpb24uIFVzZSAnZGVhY3RpdmF0ZV9lbGVtZW50JyB3aXRoIGEgc3BlY2lmaWMgcGVyc29uYSBuYW1lLlwiXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLmZpbmRQZXJzb25hKGlkZW50aWZpZXIpO1xuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBQZXJzb25hIG5vdCBmb3VuZDogXCIke2lkZW50aWZpZXJ9XCJgXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElzc3VlICMyODE6IFJldHVybiBzdWNjZXNzPXRydWUgZm9yIGlkZW1wb3RlbnQgYmVoYXZpb3IgKHBlcnNvbmEgYWxyZWFkeSBpbmFjdGl2ZSlcbiAgICBpZiAoIXRoaXMuYWN0aXZlUGVyc29uYXMuaGFzKHBlcnNvbmEuZmlsZW5hbWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBgUGVyc29uYSAnJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9JyBpcyBhbHJlYWR5IGluYWN0aXZlYFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5hY3RpdmVQZXJzb25hcy5kZWxldGUocGVyc29uYS5maWxlbmFtZSk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbUGVyc29uYU1hbmFnZXIuZGVhY3RpdmF0ZVBlcnNvbmFdIGRlbGV0ZWQ6ICR7ZGVsZXRlZH0sIG5ldyBzaXplOiAke3RoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZX1gKTtcbiAgICB0aGlzLm5vdGlmeVBlcnNvbmFDaGFuZ2UoJ3BlcnNvbmEtZGVhY3RpdmF0ZWQnLCBwZXJzb25hLmZpbGVuYW1lLCBudWxsKTtcblxuICAgIC8vIEVtaXQgZGVhY3RpdmF0aW9uIGV2ZW50IGZvciBzdWJzY3JpYmVyc1xuICAgIHRoaXMuZGlzcGF0Y2hlci5lbWl0KFxuICAgICAgJ2VsZW1lbnQ6ZGVhY3RpdmF0ZScsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7XG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgZWxlbWVudDogcGVyc29uYSxcbiAgICAgICAgZmlsZVBhdGg6IHBlcnNvbmEuZmlsZW5hbWVcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYERlYWN0aXZhdGVkIHBlcnNvbmE6ICR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgYWN0aXZlIHBlcnNvbmEgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgKiBJc3N1ZSAjMjgxOiBXaXRoIG11bHRpcGxlIGFjdGl2ZSBwZXJzb25hcywgcmV0dXJucyB0aGUgZmlyc3Qgb25lXG4gICAqL1xuICBnZXRBY3RpdmVQZXJzb25hKCk6IFBlcnNvbmFFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZmlyc3RBY3RpdmUgPSB0aGlzLmFjdGl2ZVBlcnNvbmFzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICByZXR1cm4gZmlyc3RBY3RpdmUgPyB0aGlzLmZpbmRQZXJzb25hKGZpcnN0QWN0aXZlKSB8fCBudWxsIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFjdGl2ZSBwZXJzb25hc1xuICAgKiBJc3N1ZSAjMjgxOiBOZXcgbWV0aG9kIHRvIGdldCBhbGwgYWN0aXZlIHBlcnNvbmFzXG4gICAqL1xuICBnZXRBY3RpdmVQZXJzb25hcygpOiBQZXJzb25hRWxlbWVudFtdIHtcbiAgICBjb25zdCBwZXJzb25hczogUGVyc29uYUVsZW1lbnRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgdGhpcy5hY3RpdmVQZXJzb25hcykge1xuICAgICAgY29uc3QgcGVyc29uYSA9IHRoaXMuZmluZFBlcnNvbmEoZmlsZW5hbWUpO1xuICAgICAgaWYgKHBlcnNvbmEpIHtcbiAgICAgICAgcGVyc29uYXMucHVzaChwZXJzb25hKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcnNvbmFzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpZGVudGlmaWVyIGZvciB0aGUgZmlyc3QgYWN0aXZlIHBlcnNvbmEgKGZpbGVuYW1lKS5cbiAgICogSXNzdWUgIzI4MTogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHJldHVybnMgZmlyc3QgYWN0aXZlIHBlcnNvbmEgSURcbiAgICovXG4gIGdldEFjdGl2ZVBlcnNvbmFJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hcy5zaXplID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVQZXJzb25hcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFjdGl2ZSBwZXJzb25hIElEcyAoZmlsZW5hbWVzKVxuICAgKiBJc3N1ZSAjMjgxOiBOZXcgbWV0aG9kIHRvIGdldCBhbGwgYWN0aXZlIHBlcnNvbmEgSURzXG4gICAqL1xuICBnZXRBY3RpdmVQZXJzb25hSWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuYWN0aXZlUGVyc29uYXNdO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc3BlY2lmaWMgcGVyc29uYSBpcyBhY3RpdmVcbiAgICogSXNzdWUgIzI4MTogTmV3IG1ldGhvZCB0byBjaGVjayBpZiBhIHBlcnNvbmEgaXMgYWN0aXZlXG4gICAqL1xuICBpc1BlcnNvbmFBY3RpdmUoaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGVyc29uYSA9IHRoaXMuZmluZFBlcnNvbmEoaWRlbnRpZmllcik7XG4gICAgaWYgKCFwZXJzb25hKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlUGVyc29uYXMuaGFzKHBlcnNvbmEuZmlsZW5hbWUpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHBlcnNvbmEgaW5kaWNhdG9yIGZvciByZXNwb25zZXNcbiAgICogSXNzdWUgIzI4MTogTm93IHN1cHBvcnRzIG11bHRpcGxlIGFjdGl2ZSBwZXJzb25hcyAtIGNvbmNhdGVuYXRlcyBhbGwgaW5kaWNhdG9yc1xuICAgKi9cbiAgZ2V0UGVyc29uYUluZGljYXRvcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmFzLnNpemUgPT09IDApIHJldHVybiBcIlwiO1xuXG4gICAgY29uc3QgaW5kaWNhdG9yczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHRoaXMuYWN0aXZlUGVyc29uYXMpIHtcbiAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLmZpbmRQZXJzb25hKGZpbGVuYW1lKTtcbiAgICAgIGlmIChwZXJzb25hKSB7XG4gICAgICAgIGNvbnN0IGluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluZGljYXRvcikge1xuICAgICAgICAgIGluZGljYXRvcnMucHVzaChpbmRpY2F0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGljYXRvcnMuam9pbignJyk7XG4gIH1cbiAgXG5cblxuICAvKipcbiAgICogQnVpbGQgcGVyc29uYSBtZXRhZGF0YSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCBvcHRpb25hbCBvdmVycmlkZXNcbiAgICpcbiAgICogQHBhcmFtIHZhbGlkYXRlZElucHV0cyAtIFZhbGlkYXRlZCBpbnB1dCBkYXRhXG4gICAqIEBwYXJhbSBtZXRhZGF0YU92ZXJyaWRlcyAtIE9wdGlvbmFsIG1ldGFkYXRhIG92ZXJyaWRlcyBmcm9tIHVzZXJcbiAgICogQHJldHVybnMgQ29tcGxldGUgUGVyc29uYU1ldGFkYXRhIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFBlcnNvbmFNZXRhZGF0YShcbiAgICB2YWxpZGF0ZWRJbnB1dHM6IFZhbGlkYXRlZFBlcnNvbmFJbnB1dHMsXG4gICAgbWV0YWRhdGFPdmVycmlkZXM/OiBQYXJ0aWFsPFBlcnNvbmFNZXRhZGF0YT5cbiAgKTogUGVyc29uYUVsZW1lbnRNZXRhZGF0YSB7XG4gICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIG1ldGFkYXRhIGtleXMgQkVGT1JFIG9iamVjdCBjb25zdHJ1Y3Rpb24gdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgaWYgKG1ldGFkYXRhT3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTWV0YWRhdGFLZXlzKG1ldGFkYXRhT3ZlcnJpZGVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YTogUGVyc29uYU1ldGFkYXRhID0ge1xuICAgICAgLi4uKG1ldGFkYXRhT3ZlcnJpZGVzIHx8IHt9KSxcbiAgICAgIG5hbWU6IHZhbGlkYXRlZElucHV0cy5zYW5pdGl6ZWROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHZhbGlkYXRlZElucHV0cy5kZXNjcmlwdGlvbixcbiAgICAgIHVuaXF1ZV9pZDogdmFsaWRhdGVkSW5wdXRzLnVuaXF1ZUlkLFxuICAgICAgYXV0aG9yOiB2YWxpZGF0ZWRJbnB1dHMuYXV0aG9yLFxuICAgICAgdHJpZ2dlcnM6IHZhbGlkYXRlZElucHV0cy50cmlnZ2VycyB8fCBtZXRhZGF0YU92ZXJyaWRlcz8udHJpZ2dlcnMsXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YU92ZXJyaWRlcz8udmVyc2lvbiB8fCBcIjEuMC4wXCIsXG4gICAgICBhZ2VfcmF0aW5nOiBtZXRhZGF0YU92ZXJyaWRlcz8uYWdlX3JhdGluZyB8fCBcImFsbFwiLFxuICAgICAgY29udGVudF9mbGFnczogbWV0YWRhdGFPdmVycmlkZXM/LmNvbnRlbnRfZmxhZ3MgfHwgW1widXNlci1jcmVhdGVkXCJdLFxuICAgICAgYWlfZ2VuZXJhdGVkOiBtZXRhZGF0YU92ZXJyaWRlcz8uYWlfZ2VuZXJhdGVkID8/IHRydWUsXG4gICAgICBnZW5lcmF0aW9uX21ldGhvZDogbWV0YWRhdGFPdmVycmlkZXM/LmdlbmVyYXRpb25fbWV0aG9kIHx8IFwiQ2xhdWRlXCIsXG4gICAgICBwcmljZTogbWV0YWRhdGFPdmVycmlkZXM/LnByaWNlIHx8IFwiZnJlZVwiLFxuICAgICAgcmV2ZW51ZV9zcGxpdDogbWV0YWRhdGFPdmVycmlkZXM/LnJldmVudWVfc3BsaXQgfHwgXCI4MC8yMFwiLFxuICAgICAgbGljZW5zZTogbWV0YWRhdGFPdmVycmlkZXM/LmxpY2Vuc2UgfHwgXCJDQy1CWS1TQS00LjBcIixcbiAgICAgIGNyZWF0ZWRfZGF0ZTogbWV0YWRhdGFPdmVycmlkZXM/LmNyZWF0ZWRfZGF0ZSB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLFxuICAgICAgY2F0ZWdvcnk6IG1ldGFkYXRhT3ZlcnJpZGVzPy5jYXRlZ29yeSB8fCAnZ2VuZXJhbCdcbiAgICB9O1xuXG4gICAgaWYgKG1ldGFkYXRhT3ZlcnJpZGVzKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhT3ZlcnJpZGVzLmNhdGVnb3J5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSBWYWxpZGF0aW9uU2VydmljZSB0byB2YWxpZGF0ZSBCRUZPUkUgc2FuaXRpemF0aW9uXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5UmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUNhdGVnb3J5KG1ldGFkYXRhT3ZlcnJpZGVzLmNhdGVnb3J5KTtcbiAgICAgICAgaWYgKGNhdGVnb3J5UmVzdWx0LmlzVmFsaWQgJiYgY2F0ZWdvcnlSZXN1bHQuc2FuaXRpemVkVmFsdWUpIHtcbiAgICAgICAgICBtZXRhZGF0YS5jYXRlZ29yeSA9IGNhdGVnb3J5UmVzdWx0LnNhbml0aXplZFZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWV0YWRhdGFPdmVycmlkZXMudHJpZ2dlcnMpICYmIG1ldGFkYXRhT3ZlcnJpZGVzLnRyaWdnZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVXNlIFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB0byBhcHBseSBwcm9wZXIgdmFsaWRhdGlvblxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVUcmlnZ2VycyhcbiAgICAgICAgICBtZXRhZGF0YU92ZXJyaWRlcy50cmlnZ2VycyxcbiAgICAgICAgICBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgICAgIG1ldGFkYXRhLm5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQ1JJVElDQUw6IFByZXNlcnZlIHVuZGVmaW5lZCBiZWhhdmlvclxuICAgICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2Vycy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnNcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YU92ZXJyaWRlcy5hZ2VfcmF0aW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWRBZ2VSYXRpbmcgPSBzYW5pdGl6ZUlucHV0KG1ldGFkYXRhT3ZlcnJpZGVzLmFnZV9yYXRpbmcsIDEwKTtcbiAgICAgICAgaWYgKHNhbml0aXplZEFnZVJhdGluZykge1xuICAgICAgICAgIG1ldGFkYXRhLmFnZV9yYXRpbmcgPSBzYW5pdGl6ZWRBZ2VSYXRpbmcudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnZlcnQgbGVnYWN5IFBlcnNvbmFNZXRhZGF0YSB0byBQZXJzb25hRWxlbWVudE1ldGFkYXRhIGJlZm9yZSByZXR1cm5pbmdcbiAgICByZXR1cm4gdGhpcy50b1BlcnNvbmFFbGVtZW50TWV0YWRhdGEobWV0YWRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhbGwgcGVyc29uYSBjcmVhdGlvbiBpbnB1dHNcbiAgICogU0VDVVJJVFk6IFBoYXNlIDQuMyAtIEFkZGVkIFVuaWNvZGUgdmFsaWRhdGlvbiB0byBhbGwgdGV4dCBpbnB1dHNcbiAgICogU0VDVVJJVFk6IFBoYXNlIDQuMSAtIEJsb2NrIEFMTCBpbnZhbGlkIGNvbnRlbnQsIG5vdCBqdXN0IGNyaXRpY2FsXG4gICAqIFNFQ1VSSVRZOiBQaGFzZSA0LjcgLSBBY2NlcHQgbm9ybWFsaXplZCBjb250ZW50IGV2ZW4gaWYgVW5pY29kZSBpc3N1ZXMgd2VyZSBkZXRlY3RlZCBhbmQgZml4ZWRcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBSYXcgcGVyc29uYSBuYW1lXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIFJhdyBwZXJzb25hIGRlc2NyaXB0aW9uXG4gICAqIEBwYXJhbSBpbnN0cnVjdGlvbnMgLSBSYXcgcGVyc29uYSBpbnN0cnVjdGlvbnNcbiAgICogQHBhcmFtIHRyaWdnZXJzIC0gT3B0aW9uYWwgY29tbWEtc2VwYXJhdGVkIHRyaWdnZXIgd29yZHNcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIGFuZCBzYW5pdGl6ZWQgaW5wdXRzIHJlYWR5IGZvciBtZXRhZGF0YSBjb25zdHJ1Y3Rpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUGVyc29uYUlucHV0cyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBpbnN0cnVjdGlvbnM6IHN0cmluZyxcbiAgICB0cmlnZ2Vycz86IHN0cmluZ1xuICApOiBQcm9taXNlPFZhbGlkYXRlZFBlcnNvbmFJbnB1dHM+IHtcbiAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIW5hbWUgfHwgIWRlc2NyaXB0aW9uIHx8ICFpbnN0cnVjdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IG5hbWUsIGRlc2NyaXB0aW9uLCBpbnN0cnVjdGlvbnMnKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWTogUGhhc2UgNC4zIC0gQXBwbHkgVW5pY29kZSBub3JtYWxpemF0aW9uIEJFRk9SRSB2YWxpZGF0aW9uXG4gICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuNyAtIE9ubHkgcmVqZWN0IENSSVRJQ0FMIFVuaWNvZGUgaXNzdWVzOyBhY2NlcHQgbm9ybWFsaXplZCBjb250ZW50IGZvciBsb3dlciBzZXZlcml0aWVzXG4gICAgY29uc3QgbmFtZVVuaWNvZGUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuYW1lKTtcbiAgICBjb25zdCBkZXNjVW5pY29kZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRlc2NyaXB0aW9uKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNVbmljb2RlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoaW5zdHJ1Y3Rpb25zKTtcblxuICAgIC8vIFJlamVjdCBjb250ZW50IHdpdGggY3JpdGljYWwgVW5pY29kZSBpc3N1ZXMgT05MWVxuICAgIC8vIExvd2VyIHNldmVyaXR5IGlzc3VlcyAoY29uZnVzYWJsZSBjaGFycywgZXRjLikgYXJlIG5vcm1hbGl6ZWQgYW5kIGFjY2VwdGVkXG4gICAgaWYgKCFuYW1lVW5pY29kZS5pc1ZhbGlkICYmIG5hbWVVbmljb2RlLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWUgY29udGFpbnMgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnM6ICR7bmFtZVVuaWNvZGUuZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGlmICghZGVzY1VuaWNvZGUuaXNWYWxpZCAmJiBkZXNjVW5pY29kZS5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXNjcmlwdGlvbiBjb250YWlucyBkYW5nZXJvdXMgVW5pY29kZSBwYXR0ZXJuczogJHtkZXNjVW5pY29kZS5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgaWYgKCFpbnN0cnVjdGlvbnNVbmljb2RlLmlzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zVW5pY29kZS5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN0cnVjdGlvbnMgY29udGFpbiBkYW5nZXJvdXMgVW5pY29kZSBwYXR0ZXJuczogJHtpbnN0cnVjdGlvbnNVbmljb2RlLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjcgLSBDUklUSUNBTCBGSVg6IFZhbGlkYXRlIEJFRk9SRSBzYW5pdGl6YXRpb25cbiAgICAvLyBJZiB3ZSBzYW5pdGl6ZSBmaXJzdCwgbWFsaWNpb3VzIHBhdHRlcm5zIGdldCByZW1vdmVkIGJlZm9yZSBkZXRlY3Rpb24hXG4gICAgLy8gRGV0ZWN0aW9uIG9yZGVyOiBVbmljb2RlIG5vcm1hbGl6ZSDihpIgVGhyZWF0IGRldGVjdCDihpIgU2FuaXRpemUg4oaSIEFjY2VwdFxuICAgIGNvbnN0IG5hbWVWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKG5hbWVVbmljb2RlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBpZiAoIW5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTmFtZSBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6ICR7bmFtZVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShkZXNjVW5pY29kZS5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgaWYgKCFkZXNjVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERlc2NyaXB0aW9uIGNvbnRhaW5zIHByb2hpYml0ZWQgY29udGVudDogJHtkZXNjVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RydWN0aW9uc1ZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoaW5zdHJ1Y3Rpb25zVW5pY29kZS5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgaWYgKCFpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjQgLSBMb2cgdmFsaWRhdGlvbiBmYWlsdXJlc1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiBpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLnNldmVyaXR5Py50b1VwcGVyQ2FzZSgpIGFzICdMT1cnIHwgJ01FRElVTScgfCAnSElHSCcgfCAnQ1JJVElDQUwnIHx8ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci52YWxpZGF0ZVBlcnNvbmFJbnB1dHMnLFxuICAgICAgICBkZXRhaWxzOiBgQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZDogJHtpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBmaWVsZDogJ2luc3RydWN0aW9ucycsXG4gICAgICAgICAgc2V2ZXJpdHk6IGluc3RydWN0aW9uc1ZhbGlkYXRpb24uc2V2ZXJpdHlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RydWN0aW9ucyBjb250YWluIHNlY3VyaXR5IHRocmVhdHM6ICR7aW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIE5vdyBzYW5pdGl6ZSB0aGUgVkFMSURBVEVEIGNvbnRlbnQgKENvbnRlbnRWYWxpZGF0b3IgYWxyZWFkeSByZXR1cm5zIHNhbml0aXplZENvbnRlbnQpXG4gICAgLy8gU0VDVVJJVFk6IFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIGxvZ2ljYWwgT1IgKHx8KSB0byBwcm9wZXJseSBoYW5kbGUgZW1wdHkgc3RyaW5nc1xuICAgIC8vIEVtcHR5IHN0cmluZyAnJyBpcyBhIHZhbGlkIHNhbml0aXphdGlvbiByZXN1bHQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgbWluaW11bSBsZW5ndGhcbiAgICAvLyBTRUNVUklUWTogVHJpbSB3aGl0ZXNwYWNlIGZyb20gbmFtZSB0byBwcmV2ZW50IHdoaXRlc3BhY2Utb25seSBuYW1lcyBmcm9tIHBhc3NpbmcgdmFsaWRhdGlvblxuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSAobmFtZVZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCA/PyBuYW1lVW5pY29kZS5ub3JtYWxpemVkQ29udGVudCkudHJpbSgpO1xuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gZGVzY1ZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCA/PyBkZXNjVW5pY29kZS5ub3JtYWxpemVkQ29udGVudDtcbiAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgPz8gaW5zdHJ1Y3Rpb25zVW5pY29kZS5ub3JtYWxpemVkQ29udGVudDtcblxuICAgIGlmIChzYW5pdGl6ZWROYW1lLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGVyc29uYSBuYW1lIG11c3QgYmUgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIGxvbmcnKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHNhbml0aXplZEluc3RydWN0aW9ucywgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCk7XG4gICAgdmFsaWRhdGVDb250ZW50U2l6ZShzYW5pdGl6ZWREZXNjcmlwdGlvbiwgMjAwMCk7XG5cbiAgICBjb25zdCBhdXRob3IgPSB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICBjb25zdCB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQoc2FuaXRpemVkTmFtZSwgdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCkgfHwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHZhbGlkYXRlRmlsZW5hbWUodGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gUGF0aCB2YWxpZGF0aW9uIGhhbmRsZWQgYnkgQmFzZUVsZW1lbnRNYW5hZ2VyLnNhdmUoKVxuXG4gICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIEJFRk9SRSBzYW5pdGl6YXRpb24gdG8gcmVqZWN0IGludmFsaWQgY2hhcmFjdGVyc1xuICAgIC8vIFRoaXMgcHJldmVudHMgJ2JhZCF0cmlnZ2VyJyBmcm9tIGJlY29taW5nICdiYWR0cmlnZ2VyJyBhbmQgcGFzc2luZ1xuICAgIGNvbnN0IHRyaWdnZXJMaXN0ID0gdHJpZ2dlcnMgP1xuICAgICAgdHJpZ2dlcnMuc3BsaXQoJywnKVxuICAgICAgICAubWFwKHQgPT4gdC50cmltKCkpXG4gICAgICAgIC5maWx0ZXIodCA9PiB0ICYmIFZBTElEQVRJT05fQ09OU1RBTlRTLlRSSUdHRVJfVkFMSURBVElPTl9SRUdFWC50ZXN0KHQpKSAvLyBWYWxpZGF0ZSBmb3JtYXQgRklSU1RcbiAgICAgICAgLm1hcCh0ID0+IHNhbml0aXplSW5wdXQodCwgNTApKSAvLyBUaGVuIHNhbml0aXplIGZvciBsZW5ndGhcbiAgICAgICAgLmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCkgOlxuICAgICAgW107XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgIHNhbml0aXplZE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICBpbnN0cnVjdGlvbnM6IHNhbml0aXplZEluc3RydWN0aW9ucyxcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgdHJpZ2dlcnM6IHRyaWdnZXJMaXN0LFxuICAgICAgdW5pcXVlSWQsXG4gICAgICBhdXRob3JcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBtZXRhZGF0YSBrZXlzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGRhbmdlcm91cyBrZXlzIGFyZSBkZXRlY3RlZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU1ldGFkYXRhS2V5cyhtZXRhZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFtZXRhZGF0YSB8fCB0eXBlb2YgbWV0YWRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGFuZ2Vyb3VzS2V5cyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgIGNvbnN0IGZvdW5kRGFuZ2Vyb3VzS2V5cyA9IE9iamVjdC5rZXlzKG1ldGFkYXRhKS5maWx0ZXIoXG4gICAgICBrZXkgPT4gZGFuZ2Vyb3VzS2V5cy5pbmNsdWRlcyhrZXkpXG4gICAgKTtcblxuICAgIGlmIChmb3VuZERhbmdlcm91c0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdQcm90b3R5cGUgcG9sbHV0aW9uIGF0dGVtcHQgZGV0ZWN0ZWQnLCB7XG4gICAgICAgIGRhbmdlcm91c0tleXM6IGZvdW5kRGFuZ2Vyb3VzS2V5cyxcbiAgICAgICAgc291cmNlOiAnUGVyc29uYU1hbmFnZXIudmFsaWRhdGVNZXRhZGF0YUtleXMnXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFJlamVjdGVkIGRhbmdlcm91cyBtZXRhZGF0YSBrZXlzOiAke2ZvdW5kRGFuZ2Vyb3VzS2V5cy5qb2luKCcsICcpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmEgZm9sbG93aW5nIHRoZSB1bmlmaWVkIGVsZW1lbnQgbWFuYWdlciBwYXR0ZXJuLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBwcmltYXJ5IEFQSSBmb3IgcGVyc29uYSBjcmVhdGlvbiwgcmVwbGFjaW5nIHRoZSBkZXByZWNhdGVkXG4gICAqIGBjcmVhdGVQZXJzb25hKClgIGFuZCBgY3JlYXRlTmV3UGVyc29uYSgpYCBtZXRob2RzICh2MiBicmVha2luZyBjaGFuZ2UpLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFBlcnNvbmEgY3JlYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0gZGF0YS5uYW1lIC0gRGlzcGxheSBuYW1lIGZvciB0aGUgcGVyc29uYSAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSBkYXRhLmRlc2NyaXB0aW9uIC0gU2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBlcnNvbmEncyBwdXJwb3NlXG4gICAqIEBwYXJhbSBkYXRhLmluc3RydWN0aW9ucyAtIEJlaGF2aW9yYWwgaW5zdHJ1Y3Rpb25zIChhbGlhczogY29udGVudClcbiAgICogQHBhcmFtIGRhdGEuY2F0ZWdvcnkgLSBPcHRpb25hbCBjYXRlZ29yeSBmb3Igb3JnYW5pemF0aW9uXG4gICAqIEBwYXJhbSBkYXRhLnRyaWdnZXJzIC0gT3B0aW9uYWwga2V5d29yZHMgdGhhdCBhY3RpdmF0ZSB0aGlzIHBlcnNvbmFcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgUGVyc29uYUVsZW1lbnRcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHZhbGlkYXRpb24gZmFpbHMgb3IgcGVyc29uYSBhbHJlYWR5IGV4aXN0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBCYXNpYyBwZXJzb25hIGNyZWF0aW9uXG4gICAqIGNvbnN0IHBlcnNvbmEgPSBhd2FpdCBwZXJzb25hTWFuYWdlci5jcmVhdGUoe1xuICAgKiAgIG5hbWU6ICdDb2RlIFJldmlld2VyJyxcbiAgICogICBkZXNjcmlwdGlvbjogJ0V4cGVydCBhdCByZXZpZXdpbmcgY29kZSBmb3IgcXVhbGl0eScsXG4gICAqICAgaW5zdHJ1Y3Rpb25zOiAnWW91IGFyZSBhIG1ldGljdWxvdXMgY29kZSByZXZpZXdlci4uLidcbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFdpdGggY2F0ZWdvcnkgYW5kIHRyaWdnZXJzXG4gICAqIGNvbnN0IHBlcnNvbmEgPSBhd2FpdCBwZXJzb25hTWFuYWdlci5jcmVhdGUoe1xuICAgKiAgIG5hbWU6ICdUZWNobmljYWwgV3JpdGVyJyxcbiAgICogICBkZXNjcmlwdGlvbjogJ1NwZWNpYWxpemVzIGluIGNsZWFyIGRvY3VtZW50YXRpb24nLFxuICAgKiAgIGluc3RydWN0aW9uczogJ1lvdSB3cml0ZSBjbGVhciwgY29uY2lzZSBkb2N1bWVudGF0aW9uLi4uJyxcbiAgICogICBjYXRlZ29yeTogJ3Byb2Zlc3Npb25hbCcsXG4gICAqICAgdHJpZ2dlcnM6IFsnZG9jcycsICdkb2N1bWVudGF0aW9uJywgJ3JlYWRtZSddXG4gICAqIH0pO1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBNaW5pbWFsIGNyZWF0aW9uIChkZWZhdWx0cyBhcHBsaWVkKVxuICAgKiBjb25zdCBwZXJzb25hID0gYXdhaXQgcGVyc29uYU1hbmFnZXIuY3JlYXRlKHtcbiAgICogICBuYW1lOiAnUXVpY2sgSGVscGVyJ1xuICAgKiB9KTtcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIFJlcGxhY2VzIGNyZWF0ZVBlcnNvbmEoKSBhbmQgY3JlYXRlTmV3UGVyc29uYSgpXG4gICAqL1xuICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxQZXJzb25hRWxlbWVudE1ldGFkYXRhPiAmIHsgY29udGVudD86IHN0cmluZzsgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIH0pOiBQcm9taXNlPFBlcnNvbmFFbGVtZW50PiB7XG4gICAgdGhpcy5pbml0aWFsaXplUGF0aFZhbGlkYXRvcigpO1xuXG4gICAgLy8gRXh0cmFjdCBuYW1lIGFuZCBkZXNjcmlwdGlvbiB3aXRoIGRlZmF1bHRzXG4gICAgY29uc3QgbmFtZSA9IGRhdGEubmFtZSB8fCAnbmV3LXBlcnNvbmEnO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbiB8fCAnJztcbiAgICAvLyBEdWFsLWZpZWxkOiBpbnN0cnVjdGlvbnMgPSBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMsIGNvbnRlbnQgPSByZWZlcmVuY2UgbWF0ZXJpYWxcbiAgICAvLyBCb3RoIGFyZSBmaXJzdC1jbGFzcyBmaWVsZHMuIEluc3RydWN0aW9ucyBpcyB0aGUgcHJpbWFyeSBmaWVsZCBmb3IgcGVyc29uYXMuXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZGF0YS5pbnN0cnVjdGlvbnMgPz8gJyc7XG4gICAgY29uc3QgY29udGVudCA9IGRhdGEuY29udGVudCA/PyAnJztcblxuICAgIC8vIElmIG5laXRoZXIgcHJvdmlkZWQsIGVycm9yXG4gICAgaWYgKCghaW5zdHJ1Y3Rpb25zIHx8IGluc3RydWN0aW9ucy50cmltKCkubGVuZ3RoID09PSAwKSAmJiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQZXJzb25hIGluc3RydWN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gY3JlYXRlICcke25hbWV9Jy5gKTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IGNvbnRlbnQgcHJvdmlkZWQgKG5vIGluc3RydWN0aW9ucyksIHRyZWF0IGNvbnRlbnQgYXMgaW5zdHJ1Y3Rpb25zIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICBjb25zdCBlZmZlY3RpdmVJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnMudHJpbSgpID8gaW5zdHJ1Y3Rpb25zIDogY29udGVudDtcbiAgICBjb25zdCBlZmZlY3RpdmVDb250ZW50ID0gaW5zdHJ1Y3Rpb25zLnRyaW0oKSA/IGNvbnRlbnQgOiAnJztcblxuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGluaXRpYWwgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBjb250ZW50OiBlZmZlY3RpdmVJbnN0cnVjdGlvbnNcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYFBlcnNvbmEgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHRyaWdnZXJzIGZyb20gZGF0YVxuICAgIGxldCB0cmlnZ2Vyc1N0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLnRyaWdnZXJzKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgICB0cmlnZ2Vyc1N0cmluZyA9IGRhdGEudHJpZ2dlcnMuam9pbignLCAnKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEudHJpZ2dlcnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyaWdnZXJzU3RyaW5nID0gZGF0YS50cmlnZ2VycztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYWxsIGlucHV0cyAtIHRocm93cyBvbiB2YWxpZGF0aW9uIGZhaWx1cmVcbiAgICBjb25zdCB2YWxpZGF0ZWRJbnB1dHMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlUGVyc29uYUlucHV0cyhuYW1lLCBkZXNjcmlwdGlvbiwgZWZmZWN0aXZlSW5zdHJ1Y3Rpb25zLCB0cmlnZ2Vyc1N0cmluZyk7XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIC0gdGhyb3cgaW5zdGVhZCBvZiByZXR1cm5pbmcgcmVzdWx0IG9iamVjdFxuICAgIGF3YWl0IHN1cGVyLmxpc3QoKTtcbiAgICBjb25zdCBleGlzdGluZ1BlcnNvbmEgPSB0aGlzLmZpbmRQZXJzb25hKHZhbGlkYXRlZElucHV0cy5maWxlbmFtZSk7XG4gICAgaWYgKGV4aXN0aW5nUGVyc29uYSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHBlcnNvbmEgbmFtZWQgXCIke3ZhbGlkYXRlZElucHV0cy5zYW5pdGl6ZWROYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgb3ZlcnJpZGVzIGZyb20gcmVtYWluaW5nIGRhdGEgZmllbGRzXG4gICAgY29uc3QgeyBuYW1lOiBfbiwgZGVzY3JpcHRpb246IF9kLCBjb250ZW50OiBfYywgaW5zdHJ1Y3Rpb25zOiBfaSwgdHJpZ2dlcnM6IF90LCAuLi5tZXRhZGF0YU92ZXJyaWRlcyB9ID0gZGF0YTtcblxuICAgIC8vIEJ1aWxkIG1ldGFkYXRhIHdpdGggZGVmYXVsdHMgYW5kIG9wdGlvbmFsIG92ZXJyaWRlc1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5idWlsZFBlcnNvbmFNZXRhZGF0YSh2YWxpZGF0ZWRJbnB1dHMsIG1ldGFkYXRhT3ZlcnJpZGVzIGFzIFBhcnRpYWw8UGVyc29uYU1ldGFkYXRhPik7XG5cbiAgICAvLyBDcmVhdGUgcGVyc29uYSBlbGVtZW50IHdpdGggZHVhbCBmaWVsZHNcbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCB2YWxpZGF0ZWRJbnB1dHMuaW5zdHJ1Y3Rpb25zKTtcbiAgICBwZXJzb25hLmNvbnRlbnQgPSBlZmZlY3RpdmVDb250ZW50O1xuICAgIHBlcnNvbmEuZmlsZW5hbWUgPSB2YWxpZGF0ZWRJbnB1dHMuZmlsZW5hbWU7XG4gICAgcGVyc29uYS51bmlxdWVfaWQgPSBtZXRhZGF0YS51bmlxdWVfaWQgPz8gdmFsaWRhdGVkSW5wdXRzLnVuaXF1ZUlkO1xuICAgIHBlcnNvbmEuaWQgPSBwZXJzb25hLnVuaXF1ZV9pZDtcblxuICAgIGF3YWl0IHN1cGVyLnNhdmUocGVyc29uYSwgcGVyc29uYS5maWxlbmFtZSk7XG4gICAgLy8gTm90ZTogcmVsb2FkKCkgaW50ZW50aW9uYWxseSBOT1QgY2FsbGVkIGhlcmUgKElzc3VlICM0OTEpLlxuICAgIC8vIHNhdmUoKSBhbHJlYWR5IGNhY2hlcyB0aGUgZWxlbWVudCBjb3JyZWN0bHkuIHJlbG9hZCgpIHdvdWxkIGNsZWFyIHRoZVxuICAgIC8vIGNhY2hlIGFuZCByZWJ1aWxkIHdpdGggZGlmZmVyZW50IElEcywgbWFraW5nIHRoZSBwZXJzb25hIGludmlzaWJsZS5cbiAgICAvLyByZWxvYWQoKSBpcyBvbmx5IG5lZWRlZCBhZnRlciBlZGl0L2RlbGV0ZSB3aGVyZSBmaWxlcyBtYXkgYmUgcmVuYW1lZC9yZW1vdmVkLlxuXG4gICAgLy8gU0VDVVJJVFk6IExvZyBwZXJzb25hIGNyZWF0aW9uIGV2ZW50XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYFBlcnNvbmEgY3JlYXRlZDogJHttZXRhZGF0YS5uYW1lfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBmaWxlbmFtZTogcGVyc29uYS5maWxlbmFtZSxcbiAgICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIGNhdGVnb3J5OiBtZXRhZGF0YS5jYXRlZ29yeSxcbiAgICAgICAgdHJpZ2dlckNvdW50OiBtZXRhZGF0YS50cmlnZ2Vycz8ubGVuZ3RoIHx8IDBcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwZXJzb25hO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgYW4gZXhpc3RpbmcgcGVyc29uYVxuICAgKi9cbiAgYXN5bmMgZWRpdFBlcnNvbmEocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZywgZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmICghcGVyc29uYUlkZW50aWZpZXIgfHwgIWZpZWxkIHx8ICF2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcnMuIFVzYWdlOiBlZGl0UGVyc29uYSBcInBlcnNvbmFfbmFtZVwiIFwiZmllbGRcIiBcIm5ld192YWx1ZVwiJyk7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzg0MzogVXNlIGFzeW5jIGZhbGxiYWNrIHRvIHJlY292ZXIgZnJvbSBjYWNoZSBldmljdGlvblxuICAgIGNvbnN0IHBlcnNvbmEgPSBhd2FpdCB0aGlzLmZpbmRQZXJzb25hQXN5bmMocGVyc29uYUlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTRUNVUklUWTogU2FuaXRpemUgdXNlciBpbnB1dCBiZWZvcmUgaW5jbHVkaW5nIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICBjb25zdCBzYW5pdGl6ZWRJZCA9IHNhbml0aXplSW5wdXQocGVyc29uYUlkZW50aWZpZXIsIDEwMCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBlcnNvbmEgbm90IGZvdW5kOiBcIiR7c2FuaXRpemVkSWR9XCJgKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVQYXRoVmFsaWRhdG9yKCk7XG5cbiAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBlZGl0IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVFZGl0KHBlcnNvbmEsIHsgW2ZpZWxkXTogdmFsdWUgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBQZXJzb25hIGVkaXQgd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkQWxpYXNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjb250ZW50OiAnaW5zdHJ1Y3Rpb25zJ1xuICAgIH07XG4gICAgY29uc3Qgbm9ybWFsaXplZElucHV0RmllbGQgPSBmaWVsZC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZCA9IGZpZWxkQWxpYXNNYXBbbm9ybWFsaXplZElucHV0RmllbGRdID8/IG5vcm1hbGl6ZWRJbnB1dEZpZWxkO1xuXG4gICAgY29uc3QgdmFsaWRGaWVsZHMgPSBbJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnaW5zdHJ1Y3Rpb25zJywgJ3RyaWdnZXJzJywgJ3ZlcnNpb24nLCAnY2F0ZWdvcnknXTtcbiAgICBpZiAoIXZhbGlkRmllbGRzLmluY2x1ZGVzKG5vcm1hbGl6ZWRGaWVsZCkpIHtcbiAgICAgIGNvbnN0IGZpZWxkTGlzdCA9IFsuLi52YWxpZEZpZWxkcywgLi4uT2JqZWN0LmtleXMoZmllbGRBbGlhc01hcCldLmpvaW4oJywgJyk7XG4gICAgICAvLyBTRUNVUklUWTogU2FuaXRpemUgdXNlciBpbnB1dCBiZWZvcmUgaW5jbHVkaW5nIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICBjb25zdCBzYW5pdGl6ZWRGaWVsZCA9IHNhbml0aXplSW5wdXQoZmllbGQsIDUwKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmaWVsZDogXCIke3Nhbml0aXplZEZpZWxkfVwiIGlzIG5vdCBlZGl0YWJsZS4gVmFsaWQgZmllbGRzOiAke2ZpZWxkTGlzdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0RlZmF1bHQgPSBpc0RlZmF1bHRQZXJzb25hKHBlcnNvbmEuZmlsZW5hbWUpO1xuICAgIGxldCBlZGl0YWJsZVBlcnNvbmEgPSB0aGlzLmNsb25lUGVyc29uYShwZXJzb25hLCB7IHdyaXRhYmxlQ29weTogaXNEZWZhdWx0IH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjMgLSBBcHBseSBVbmljb2RlIHZhbGlkYXRpb24gdG8gZWRpdCB2YWx1ZXNcbiAgICAgIGNvbnN0IHVuaWNvZGVSZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh2YWx1ZSk7XG4gICAgICBpZiAoIXVuaWNvZGVSZXN1bHQuaXNWYWxpZCAmJiB1bmljb2RlUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWUgY29udGFpbnMgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnM6ICR7dW5pY29kZVJlc3VsdC5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWVWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHVuaWNvZGVSZXN1bHQubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuMSAtIEJsb2NrIEFMTCBpbnZhbGlkIGNvbnRlbnQsIG5vdCBqdXN0IGNyaXRpY2FsXG4gICAgICBpZiAoIXZhbHVlVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjQgLSBMb2cgdmFsaWRhdGlvbiBmYWlsdXJlc1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci5lZGl0UGVyc29uYScsXG4gICAgICAgICAgZGV0YWlsczogYEVkaXQgdmFsdWUgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsdWVWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgZmllbGQ6IG5vcm1hbGl6ZWRGaWVsZCxcbiAgICAgICAgICAgIHNldmVyaXR5OiB2YWx1ZVZhbGlkYXRpb24uc2V2ZXJpdHlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlY3VyaXR5IFZhbGlkYXRpb24gRmFpbGVkOiBUaGUgbmV3IHZhbHVlIGNvbnRhaW5zIHByb2hpYml0ZWQgY29udGVudDogJHt2YWx1ZVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHNhbml0aXplZFZhbHVlID0gdmFsdWVWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgdW5pY29kZVJlc3VsdC5ub3JtYWxpemVkQ29udGVudDtcbiAgICAgIFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ2luc3RydWN0aW9ucycpIHtcbiAgICAgICAgZWRpdGFibGVQZXJzb25hLmluc3RydWN0aW9ucyA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICd0cmlnZ2VycycpIHtcbiAgICAgICAgZWRpdGFibGVQZXJzb25hLm1ldGFkYXRhLnRyaWdnZXJzID0gc2FuaXRpemVkVmFsdWVcbiAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgIC5tYXAodCA9PiBzYW5pdGl6ZUlucHV0KHQudHJpbSgpLCA1MCkpXG4gICAgICAgICAgLmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCk7XG4gICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ25hbWUnKSB7XG4gICAgICAgIGVkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS5uYW1lID0gc2FuaXRpemVJbnB1dChzYW5pdGl6ZWRWYWx1ZSwgMTAwKTtcbiAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnY2F0ZWdvcnknKSB7XG4gICAgICAgIGVkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeSA9XG4gICAgICAgICAgc2FuaXRpemVJbnB1dChzYW5pdGl6ZWRWYWx1ZSwgNTApPy50b0xvd2VyQ2FzZSgpIHx8ICdnZW5lcmFsJztcbiAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEZpZWxkID09PSAnZGVzY3JpcHRpb24nKSB7XG4gICAgICAgIGVkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICd2ZXJzaW9uJykge1xuICAgICAgICBlZGl0YWJsZVBlcnNvbmEubWV0YWRhdGEudmVyc2lvbiA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgICBlZGl0YWJsZVBlcnNvbmEudmVyc2lvbiA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvLWluY3JlbWVudCB2ZXJzaW9uIGlmIG5vdCBleHBsaWNpdGx5IHNldHRpbmcgdmVyc2lvbiBmaWVsZFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCAhPT0gJ3ZlcnNpb24nKSB7XG4gICAgICAgIGlmIChlZGl0YWJsZVBlcnNvbmEudmVyc2lvbikge1xuICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0byAzLXBhcnQgZm9ybWF0IGZpcnN0IChoYW5kbGVzIGxlZ2FjeSBcIjEuMFwiIGZvcm1hdClcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVmVyc2lvbihTdHJpbmcoZWRpdGFibGVQZXJzb25hLnZlcnNpb24pKTtcbiAgICAgICAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBub3JtYWxpemVkLm1hdGNoKC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKC0uKik/JC8pO1xuXG4gICAgICAgICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgWywgbWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlUmVsZWFzZV0gPSB2ZXJzaW9uTWF0Y2g7XG5cbiAgICAgICAgICAgIGlmIChwcmVSZWxlYXNlKSB7XG4gICAgICAgICAgICAgIC8vIEluY3JlbWVudCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4gICAgICAgICAgICAgIGNvbnN0IHByZVJlbGVhc2VNYXRjaCA9IHByZVJlbGVhc2UubWF0Y2goL14tKFthLXpBLVpdKylcXC4/KFxcZCspPyQvKTtcbiAgICAgICAgICAgICAgaWYgKHByZVJlbGVhc2VNYXRjaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFssIHByZVJlbGVhc2VUeXBlLCBwcmVSZWxlYXNlTnVtXSA9IHByZVJlbGVhc2VNYXRjaDtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0TnVtID0gTnVtYmVyLnBhcnNlSW50KHByZVJlbGVhc2VOdW0gfHwgJzAnKSArIDE7XG4gICAgICAgICAgICAgICAgZWRpdGFibGVQZXJzb25hLnZlcnNpb24gPSBgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaH0tJHtwcmVSZWxlYXNlVHlwZX0uJHtuZXh0TnVtfWA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWRpdGFibGVQZXJzb25hLnZlcnNpb24gPSBgJHttYWpvcn0uJHttaW5vcn0uJHtOdW1iZXIucGFyc2VJbnQocGF0Y2gpICsgMX1gO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBTdGFuZGFyZCB2ZXJzaW9uLCBidW1wIHBhdGNoXG4gICAgICAgICAgICAgIGVkaXRhYmxlUGVyc29uYS52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7TnVtYmVyLnBhcnNlSW50KHBhdGNoKSArIDF9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWRpdGFibGVQZXJzb25hLnZlcnNpb24gPSAnMS4wLjEnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGl0YWJsZVBlcnNvbmEudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3luYyB0byBtZXRhZGF0YVxuICAgICAgICBlZGl0YWJsZVBlcnNvbmEubWV0YWRhdGEudmVyc2lvbiA9IGVkaXRhYmxlUGVyc29uYS52ZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBlZGl0YWJsZVBlcnNvbmEubWV0YWRhdGEudW5pcXVlX2lkID0gZWRpdGFibGVQZXJzb25hLnVuaXF1ZV9pZDtcblxuICAgICAgLy8gUGF0aCB2YWxpZGF0aW9uIGhhbmRsZWQgYnkgQmFzZUVsZW1lbnRNYW5hZ2VyLnNhdmUoKVxuICAgICAgYXdhaXQgc3VwZXIuc2F2ZShlZGl0YWJsZVBlcnNvbmEsIGVkaXRhYmxlUGVyc29uYS5maWxlbmFtZSk7XG4gICAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuXG4gICAgICBjb25zdCBmaWVsZERpc3BsYXkgPSBmaWVsZEFsaWFzTWFwW25vcm1hbGl6ZWRJbnB1dEZpZWxkXVxuICAgICAgICA/IGAke25vcm1hbGl6ZWRGaWVsZH0gKGFsaWFzOiAke2ZpZWxkfSlgXG4gICAgICAgIDogbm9ybWFsaXplZEZpZWxkO1xuXG4gICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC40IC0gTG9nIHBlcnNvbmEgZWRpdCBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci5lZGl0UGVyc29uYScsXG4gICAgICAgIGRldGFpbHM6IGBQZXJzb25hIGVkaXRlZDogJHtlZGl0YWJsZVBlcnNvbmEubWV0YWRhdGEubmFtZX0gKGZpZWxkOiAke25vcm1hbGl6ZWRGaWVsZH0pYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBmaWVsZDogbm9ybWFsaXplZEZpZWxkLFxuICAgICAgICAgIGlzRGVmYXVsdFBlcnNvbmFDb3B5OiBpc0RlZmF1bHQsXG4gICAgICAgICAgb2xkVmFsdWU6IHBlcnNvbmEuY29udGVudD8uc3Vic3RyaW5nKDAsIDUwKSxcbiAgICAgICAgICBuZXdWYWx1ZTogZWRpdGFibGVQZXJzb25hLmNvbnRlbnQ/LnN1YnN0cmluZygwLCA1MClcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGBQZXJzb25hIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5LiBGaWVsZCBVcGRhdGVkOiAke2ZpZWxkRGlzcGxheX1gLFxuICAgICAgICBpc0RlZmF1bHQsXG4gICAgICAgIG5ld05hbWU6IGVkaXRhYmxlUGVyc29uYS5tZXRhZGF0YS5uYW1lIHx8IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogZWRpdGFibGVQZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIG5ld0lkOiBpc0RlZmF1bHQgPyBlZGl0YWJsZVBlcnNvbmEudW5pcXVlX2lkIDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIFVwZGF0aW5nIFBlcnNvbmE6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgZXhpc3RpbmcgcGVyc29uYSBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIHBlcnNvbmEgKGZvciBQZXJzb25hSGFuZGxlciBjb21wYXRpYmlsaXR5KVxuICAgKi9cbiAgYXN5bmMgZWRpdEV4aXN0aW5nUGVyc29uYShwZXJzb25hOiBQZXJzb25hRWxlbWVudCwgZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8UGVyc29uYUVsZW1lbnQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRQZXJzb25hKHBlcnNvbmEuZmlsZW5hbWUsIGZpZWxkLCB2YWx1ZSk7XG4gICAgLy8gTm90ZTogZWRpdFBlcnNvbmEgYWxyZWFkeSBjYWxscyByZWxvYWQoKSwgbm8gbmVlZCB0byByZWxvYWQgYWdhaW5cblxuICAgIC8vIEZvciBjb3B5LW9uLXdyaXRlLCB3ZSBuZWVkIHRvIGZpbmQgYnkgdGhlIG5ldyBJRCBpZiBvbmUgd2FzIGNyZWF0ZWRcbiAgICBjb25zdCBpZGVudGlmaWVyVG9GaW5kID0gcmVzdWx0LmlzRGVmYXVsdCAmJiByZXN1bHQubmV3SWQgPyByZXN1bHQubmV3SWQgOiBwZXJzb25hLmZpbGVuYW1lO1xuXG4gICAgLy8gRmluZCB0aGUgdXBkYXRlZCBwZXJzb25hXG4gICAgY29uc3QgdXBkYXRlZFBlcnNvbmEgPSB0aGlzLmZpbmRQZXJzb25hKGlkZW50aWZpZXJUb0ZpbmQpO1xuICAgIGlmICghdXBkYXRlZFBlcnNvbmEpIHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBEb24ndCBpbmNsdWRlIHVuc2FuaXRpemVkIHVzZXIgaW5wdXQgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJldHJpZXZlIHVwZGF0ZWQgcGVyc29uYScpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkUGVyc29uYTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgcGVyc29uYSBhbmQgcmV0dXJuIGEgZm9ybWF0dGVkIHJlcG9ydFxuICAgKi9cbiAgdmFsaWRhdGVQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICBpZiAoIXBlcnNvbmFJZGVudGlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgUGVyc29uYSBJZGVudGlmaWVyLiBVc2FnZTogdmFsaWRhdGVfcGVyc29uYSBcInBlcnNvbmFfbmFtZVwiJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGVyc29uYSA9IHRoaXMuZmluZFBlcnNvbmEocGVyc29uYUlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTRUNVUklUWTogU2FuaXRpemUgdXNlciBpbnB1dCBiZWZvcmUgaW5jbHVkaW5nIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICBjb25zdCBzYW5pdGl6ZWRJZCA9IHNhbml0aXplSW5wdXQocGVyc29uYUlkZW50aWZpZXIsIDEwMCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBlcnNvbmEgbm90IGZvdW5kOiBcIiR7c2FuaXRpemVkSWR9XCJgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gcGVyc29uYS52YWxpZGF0ZSgpO1xuICAgIGNvbnN0IHN0YXR1c0xpbmUgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkID8gJ+KchSBTdGF0dXM6IFZhbGlkJyA6ICfinYwgU3RhdHVzOiBJbnZhbGlkJztcblxuICAgIC8vIEJ1aWxkIGZvcm1hdHRlZCByZXBvcnQgZnJvbSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgIGNvbnN0IHJlcG9ydFBhcnRzOiBzdHJpbmdbXSA9IFtzdGF0dXNMaW5lXTtcblxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9ycyAmJiB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnRQYXJ0cy5wdXNoKCdcXG5cXG5FcnJvcnM6Jyk7XG4gICAgICB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5mb3JFYWNoKChlcnJvciwgaSkgPT4ge1xuICAgICAgICByZXBvcnRQYXJ0cy5wdXNoKGAgICR7aSArIDF9LiBbJHtlcnJvci5maWVsZH1dICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcmVwb3J0UGFydHMucHVzaCgnXFxuXFxuV2FybmluZ3M6Jyk7XG4gICAgICB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmZvckVhY2goKHdhcm5pbmcsIGkpID0+IHtcbiAgICAgICAgcmVwb3J0UGFydHMucHVzaChgICAke2kgKyAxfS4gWyR7d2FybmluZy5maWVsZH1dICR7d2FybmluZy5tZXNzYWdlfWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuc3VnZ2VzdGlvbnMgJiYgdmFsaWRhdGlvblJlc3VsdC5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXBvcnRQYXJ0cy5wdXNoKCdcXG5cXG5TdWdnZXN0aW9uczonKTtcbiAgICAgIHZhbGlkYXRpb25SZXN1bHQuc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnZ2VzdGlvbiwgaSkgPT4ge1xuICAgICAgICByZXBvcnRQYXJ0cy5wdXNoKGAgICR7aSArIDF9LiAke3N1Z2dlc3Rpb259YCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXR0ZWRSZXBvcnQgPSByZXBvcnRQYXJ0cy5qb2luKCdcXG4nKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnW1BlcnNvbmFNYW5hZ2VyXSBWYWxpZGF0aW9uIHJlcG9ydCBwcmV2aWV3Jywge1xuICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgdmFsaWQ6IHZhbGlkYXRpb25SZXN1bHQudmFsaWRcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkLFxuICAgICAgbWVzc2FnZTogZm9ybWF0dGVkUmVwb3J0LFxuICAgICAgcmVwb3J0OiB2YWxpZGF0aW9uUmVzdWx0XG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNldCBjdXJyZW50IHVzZXIgaWRlbnRpdHlcbiAgICogU0VDVVJJVFk6IFBoYXNlIDQuNiAtIEFkZGVkIHVzZXJuYW1lIGFuZCBlbWFpbCB2YWxpZGF0aW9uXG4gICAqL1xuICBzZXRVc2VySWRlbnRpdHkodXNlcm5hbWU6IHN0cmluZyB8IG51bGwsIGVtYWlsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHVzZXJuYW1lKSB7XG4gICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC4zIC0gQXBwbHkgVW5pY29kZSBub3JtYWxpemF0aW9uIEZJUlNUXG4gICAgICBjb25zdCB1c2VybmFtZVVuaWNvZGUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh1c2VybmFtZSk7XG4gICAgICBpZiAoIXVzZXJuYW1lVW5pY29kZS5pc1ZhbGlkICYmIHVzZXJuYW1lVW5pY29kZS5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVzZXJuYW1lIGNvbnRhaW5zIGRhbmdlcm91cyBVbmljb2RlIHBhdHRlcm5zOiAke3VzZXJuYW1lVW5pY29kZS5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuNiAtIFZhbGlkYXRlIHVzZXJuYW1lIGZvcm1hdCBBRlRFUiBub3JtYWxpemF0aW9uIChhbHBoYW51bWVyaWMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzKVxuICAgICAgY29uc3QgdXNlcm5hbWVSZWdleCA9IC9eW2EtekEtWjAtOVxcLV9dezMsNTB9JC87XG4gICAgICBpZiAoIXVzZXJuYW1lUmVnZXgudGVzdCh1c2VybmFtZVVuaWNvZGUubm9ybWFsaXplZENvbnRlbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCB1c2VybmFtZSBmb3JtYXQuIE11c3QgYmUgMy01MCBjaGFyYWN0ZXJzLCBhbHBoYW51bWVyaWMgd2l0aCBoeXBoZW5zL3VuZGVyc2NvcmVzIG9ubHknXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbml0aXplIHVzZXJuYW1lXG4gICAgICBjb25zdCB2YWxpZFVzZXJuYW1lID0gc2FuaXRpemVJbnB1dCh1c2VybmFtZVVuaWNvZGUubm9ybWFsaXplZENvbnRlbnQsIDUwKTtcblxuICAgICAgaWYgKGVtYWlsKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBQaGFzZSA0LjMgLSBBcHBseSBVbmljb2RlIG5vcm1hbGl6YXRpb24gRklSU1RcbiAgICAgICAgY29uc3QgZW1haWxVbmljb2RlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZW1haWwpO1xuICAgICAgICBpZiAoIWVtYWlsVW5pY29kZS5pc1ZhbGlkICYmIGVtYWlsVW5pY29kZS5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW1haWwgY29udGFpbnMgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnM6ICR7ZW1haWxVbmljb2RlLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU0VDVVJJVFk6IFBoYXNlIDQuNiAtIFZhbGlkYXRlIGVtYWlsIGZvcm1hdCBBRlRFUiBub3JtYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcbiAgICAgICAgaWYgKCFlbWFpbFJlZ2V4LnRlc3QoZW1haWxVbmljb2RlLm5vcm1hbGl6ZWRDb250ZW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbWFpbCBmb3JtYXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNhbml0aXplIGVtYWlsXG4gICAgICAgIGNvbnN0IHZhbGlkRW1haWwgPSBzYW5pdGl6ZUlucHV0KGVtYWlsVW5pY29kZS5ub3JtYWxpemVkQ29udGVudCwgMTAwKTtcbiAgICAgICAgcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMID0gdmFsaWRFbWFpbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmN1cnJlbnRVc2VyO1xuICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHZhbGlkVXNlcm5hbWU7XG4gICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiA9IHZhbGlkVXNlcm5hbWU7XG4gICAgICB0aGlzLm1ldGFkYXRhU2VydmljZS5zZXRDdXJyZW50VXNlcih2YWxpZFVzZXJuYW1lKTsgIC8vIFN5bmMgd2l0aCBNZXRhZGF0YVNlcnZpY2VcblxuICAgICAgbG9nZ2VyLmluZm8oJ1VzZXIgaWRlbnRpdHkgc2V0JywgeyB1c2VybmFtZTogdmFsaWRVc2VybmFtZSB9KTtcbiAgICAgIHRoaXMubm90aWZ5UGVyc29uYUNoYW5nZSgndXNlci1jaGFuZ2VkJywgcHJldmlvdXMsIHRoaXMuY3VycmVudFVzZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuY3VycmVudFVzZXI7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyID0gbnVsbDtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUjtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUw7XG4gICAgICB0aGlzLm1ldGFkYXRhU2VydmljZS5zZXRDdXJyZW50VXNlcihudWxsKTsgIC8vIFN5bmMgd2l0aCBNZXRhZGF0YVNlcnZpY2VcblxuICAgICAgbG9nZ2VyLmluZm8oJ1VzZXIgaWRlbnRpdHkgY2xlYXJlZCcpO1xuICAgICAgdGhpcy5ub3RpZnlQZXJzb25hQ2hhbmdlKCd1c2VyLWNoYW5nZWQnLCBwcmV2aW91cywgdGhpcy5jdXJyZW50VXNlcik7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBpZGVudGl0eVxuICAgKi9cbiAgZ2V0VXNlcklkZW50aXR5KCk6IHsgdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7IGVtYWlsOiBzdHJpbmcgfCBudWxsIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VybmFtZTogcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1VTRVIgfHwgbnVsbCxcbiAgICAgIGVtYWlsOiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU1BSUwgfHwgbnVsbFxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciB1c2VyIGlkZW50aXR5XG4gICAqL1xuICBjbGVhclVzZXJJZGVudGl0eSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldFVzZXJJZGVudGl0eShudWxsKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFVwZGF0ZSBpbmRpY2F0b3IgY29uZmlndXJhdGlvblxuICAgKi9cbiAgdXBkYXRlSW5kaWNhdG9yQ29uZmlnKGNvbmZpZzogSW5kaWNhdG9yQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5pbmRpY2F0b3JDb25maWcgPSBjb25maWc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBpbmRpY2F0b3IgY29uZmlndXJhdGlvblxuICAgKi9cbiAgZ2V0SW5kaWNhdG9yQ29uZmlnKCk6IEluZGljYXRvckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yQ29uZmlnO1xuICB9XG4gIFxuICAvKipcbiAgICogSGVscGVyIHRvIGdldCBjdXJyZW50IHVzZXIgZm9yIGF0dHJpYnV0aW9uXG4gICAqIFJFRkFDVE9SRUQ6IE5vdyBkZWxlZ2F0ZXMgdG8gTWV0YWRhdGFTZXJ2aWNlIGZvciBjb25zaXN0ZW50IHVzZXIgYXR0cmlidXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk6IHN0cmluZyB7XG4gICAgLy8gT25seSBzeW5jIGlmIFBlcnNvbmFNYW5hZ2VyIGhhcyBhbiBleHBsaWNpdGx5LXNldCB1c2VyO1xuICAgIC8vIG90aGVyd2lzZSBsZXQgTWV0YWRhdGFTZXJ2aWNlIHJlc29sdmUgdmlhIGl0cyBvd24gZmFsbGJhY2sgY2hhaW4uXG4gICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlLnNldEN1cnJlbnRVc2VyKHRoaXMuY3VycmVudFVzZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcbiAgfVxuICBcblxuICAvKipcbiAgICogUmVzZXQgaW50ZXJuYWwgc3RhdGU7IGFsaWducyBQZXJzb25hTWFuYWdlciB3aXRoIERJIGxpZmVjeWNsZSBob29rcy5cbiAgICogQ1JJVElDQUw6IE11c3QgY2FsbCBzdXBlci5kaXNwb3NlKCkgdG8gY2xlYW4gdXAgZmlsZSB3YXRjaGVycyBhbmQgcHJldmVudCBvcGVuIGhhbmRsZXNcbiAgICovXG4gIG92ZXJyaWRlIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgLy8gSXNzdWUgIzI4MTogQ2xlYXIgdGhlIGFjdGl2ZSBwZXJzb25hcyBzZXRcbiAgICB0aGlzLmFjdGl2ZVBlcnNvbmFzLmNsZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50VXNlciA9IG51bGw7XG5cbiAgICAvLyBDUklUSUNBTDogQ2xlYW4gdXAgYmFzZSBjbGFzcyByZXNvdXJjZXMgKGZpbGUgd2F0Y2hlcnMsIGNhY2hlcylcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjODM6IEFjdGl2ZSBlbGVtZW50IGxpbWl0IGVuZm9yY2VtZW50IGZvciBwZXJzb25hc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBtYXgsIGNsZWFudXBUaHJlc2hvbGQgfSA9IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZygncGVyc29uYXMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmFzLnNpemUgPCBjbGVhbnVwVGhyZXNob2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgbWF4IOKAlCB3YXJuIGJlZm9yZSBjbGVhbnVwXG4gICAgaWYgKHRoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIHBlcnNvbmFzIGxpbWl0IHJlYWNoZWQgKCR7bWF4fSkuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgZGVhY3RpdmF0aW5nIHVudXNlZCBwZXJzb25hcyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX1BFUlNPTkFTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnUGVyc29uYU1hbmFnZXIuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0JyxcbiAgICAgICAgZGV0YWlsczogYEFjdGl2ZSBwZXJzb25hcyBsaW1pdCByZWFjaGVkOiAke3RoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZX0vJHttYXh9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgdGhyZXNob2xkIOKAlCBwcm9hY3RpdmVseSBjbGVhbiBzdGFsZSBlbnRyaWVzXG4gICAgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVQZXJzb25hcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgcGVyc29uYXMgc2V0XG4gICAqIElzc3VlICM4MzogVmFsaWRhdGVzIHRoYXQgYWxsIGFjdGl2ZSBwZXJzb25hcyBzdGlsbCBleGlzdCBhbmQgcmVtb3ZlcyBvcnBoYW5lZCByZWZlcmVuY2VzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNsZWFudXBTdGFsZUFjdGl2ZVBlcnNvbmFzKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFNpemUgPSB0aGlzLmFjdGl2ZVBlcnNvbmFzLnNpemU7XG4gICAgICBjb25zdCBzdGFsZUZpbGVuYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhY3RpdmVGaWxlbmFtZSBvZiB0aGlzLmFjdGl2ZVBlcnNvbmFzKSB7XG4gICAgICAgIGlmICghdGhpcy5maW5kUGVyc29uYShhY3RpdmVGaWxlbmFtZSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVBlcnNvbmFzLmRlbGV0ZShhY3RpdmVGaWxlbmFtZSk7XG4gICAgICAgICAgc3RhbGVGaWxlbmFtZXMucHVzaChhY3RpdmVGaWxlbmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlUGVyc29uYXMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBzdGFydFNpemUgLSBlbmRTaXplO1xuXG4gICAgICBpZiAocmVtb3ZlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENsZWFuZWQgdXAgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgcGVyc29uYSByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgcGVyc29uYXM6ICR7ZW5kU2l6ZX0vJHtnZXRNYXhBY3RpdmVMaW1pdCgncGVyc29uYXMnKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVQZXJzb25hcycsXG4gICAgICAgICAgZGV0YWlsczogYFJlbW92ZWQgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgcGVyc29uYSByZWZlcmVuY2VzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50OiByZW1vdmVkLFxuICAgICAgICAgICAgYWN0aXZlQ291bnQ6IGVuZFNpemUsXG4gICAgICAgICAgICBzdGFsZUZpbGVuYW1lczogc3RhbGVGaWxlbmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIHBlcnNvbmFzOicsIGVycm9yKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVQZXJzb25hcycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlQZXJzb25hQ2hhbmdlKFxuICAgIHR5cGU6IFBlcnNvbmFTdGF0ZUNoYW5nZVR5cGUsXG4gICAgcHJldmlvdXNWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubm90aWZpZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmaWVyLm5vdGlmeVBlcnNvbmFDaGFuZ2Uoe1xuICAgICAgdHlwZSxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICBuZXdWYWx1ZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplUGF0aFZhbGlkYXRvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXRoVmFsaWRhdG9ySW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgUGF0aFZhbGlkYXRvci5pbml0aWFsaXplKHRoaXMucGVyc29uYXNEaXIpO1xuICAgICAgdGhpcy5wYXRoVmFsaWRhdG9ySW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignW1BlcnNvbmFNYW5hZ2VyXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBQYXRoVmFsaWRhdG9yJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVsZXRlIHRvIGhhbmRsZSBhdXRvLWRlYWN0aXZhdGlvbiBiZWZvcmUgZGVsZXRpb24uXG4gICAqIEZJWDogSXNzdWUgIzI4MSAtIFVuaWZpZWQgZGVsZXRlIHBhdHRlcm4gZm9yIHN0YW5kYXJkIGVsZW1lbnQtY3J1ZCBmbG93XG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIFRoZSBmaWxlbmFtZSBvZiB0aGUgcGVyc29uYSB0byBkZWxldGVcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSXNzdWUgIzI4MTogQXV0by1kZWFjdGl2YXRlIGJlZm9yZSBkZWxldGlvblxuICAgIC8vIFRoaXMgYWxsb3dzIGRlbGV0aW5nIGFjdGl2ZSBwZXJzb25hcyB3aXRob3V0IHJlcXVpcmluZyBleHBsaWNpdCBkZWFjdGl2YXRpb25cbiAgICBjb25zdCB3YXNBY3RpdmUgPSB0aGlzLmFjdGl2ZVBlcnNvbmFzLmhhcyhmaWxlUGF0aCk7XG4gICAgaWYgKHdhc0FjdGl2ZSkge1xuICAgICAgdGhpcy5hY3RpdmVQZXJzb25hcy5kZWxldGUoZmlsZVBhdGgpO1xuICAgIH1cblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZShmaWxlUGF0aCk7XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcblxuICAgIC8vIFNFQ1VSSVRZOiBMb2cgcGVyc29uYSBkZWxldGlvbiBldmVudCAoQmFzZUVsZW1lbnRNYW5hZ2VyIGFsc28gbG9ncywgYnV0IHdpdGggZGlmZmVyZW50IGRldGFpbHMpXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdQZXJzb25hTWFuYWdlci5kZWxldGUnLFxuICAgICAgZGV0YWlsczogYFBlcnNvbmEgZGVsZXRlZDogJHtmaWxlUGF0aH1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgZmlsZW5hbWU6IGZpbGVQYXRoLFxuICAgICAgICB3YXNBY3RpdmVcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcGVyc29uYSBieSBuYW1lIG9yIGlkZW50aWZpZXIgKGxlZ2FjeSBBUEkpXG4gICAqIEBkZXByZWNhdGVkIFVzZSBkZWxldGUoZmlsZW5hbWUpIHZpYSBzdGFuZGFyZCBlbGVtZW50LWNydWQgZmxvd1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlUGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgLy8gSXNzdWUgIzg0MzogVXNlIGFzeW5jIGZhbGxiYWNrIHRvIHJlY292ZXIgZnJvbSBjYWNoZSBldmljdGlvblxuICAgIGNvbnN0IHBlcnNvbmEgPSBhd2FpdCB0aGlzLmZpbmRQZXJzb25hQXN5bmMocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6IGBQZXJzb25hICcke3BlcnNvbmFJZGVudGlmaWVyfScgbm90IGZvdW5kYCB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZShwZXJzb25hLmZpbGVuYW1lKTtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIG1lc3NhZ2U6IGBTdWNjZXNzZnVsbHkgZGVsZXRlZCBwZXJzb25hICcke3BlcnNvbmFJZGVudGlmaWVyfSdgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwZXJzb25hOiAke3Nhbml0aXplZC5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGltcG9ydFBlcnNvbmEoc291cmNlOiBzdHJpbmcsIG92ZXJ3cml0ZSA9IGZhbHNlKTogUHJvbWlzZTxJbXBvcnRSZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMucGVyc29uYUltcG9ydGVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogXCJQZXJzb25hIGltcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBQZXJzb25hSW1wb3J0ZXIgc2VydmljZSBub3QgY29uZmlndXJlZC5cIlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplUGF0aFZhbGlkYXRvcigpO1xuXG4gICAgY29uc3QgcGVyc29uYXNNYXAgPSBhd2FpdCB0aGlzLmdldEFsbFBlcnNvbmFzKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hSW1wb3J0ZXIuaW1wb3J0UGVyc29uYShzb3VyY2UsIHBlcnNvbmFzTWFwLCBvdmVyd3JpdGUpO1xuICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQucGVyc29uYSkge1xuICAgICAgLy8gQ29udmVydCBsZWdhY3kgUGVyc29uYU1ldGFkYXRhIHRvIFBlcnNvbmFFbGVtZW50TWV0YWRhdGFcbiAgICAgIGNvbnN0IGVsZW1lbnRNZXRhZGF0YSA9IHRoaXMudG9QZXJzb25hRWxlbWVudE1ldGFkYXRhKHJlc3VsdC5wZXJzb25hLm1ldGFkYXRhKTtcblxuICAgICAgLy8gRml4ICM5MDY6IEZvciB2MSBmb3JtYXQgaW1wb3J0cyAobm8gaW5zdHJ1Y3Rpb25zIGluIGZyb250bWF0dGVyKSwgdGhlIG1hcmtkb3duXG4gICAgICAvLyBib2R5IG11c3Qgc3RheSBhcyB0aGUgZG9jdW1lbnQgYm9keSBiZWxvdyAnLS0tJywgbm90IGJlIHN0dWZmZWQgaW50byB0aGUgWUFNTFxuICAgICAgLy8gaW5zdHJ1Y3Rpb25zIGZpZWxkLiBTZXR0aW5nIGluc3RydWN0aW9ucyB0byB0aGUgZGVzY3JpcHRpb24gdHJpZ2dlcnMgdGhlIHYyIHBhdGhcbiAgICAgIC8vIGluIGNyZWF0ZUVsZW1lbnQoKSwga2VlcGluZyBib2R5VGV4dCBhcyBjb250ZW50IChkb2N1bWVudCBib2R5KS5cbiAgICAgIGlmICghZWxlbWVudE1ldGFkYXRhLmluc3RydWN0aW9ucyAmJiByZXN1bHQucGVyc29uYS5jb250ZW50KSB7XG4gICAgICAgIC8vIFByZWZlciBkZXNjcmlwdGlvbiAoY29uY2lzZSBiZWhhdmlvcmFsIHN1bW1hcnkpIG92ZXIgbmFtZSAoanVzdCBhIGxhYmVsKS5cbiAgICAgICAgLy8gbmFtZSBpcyBndWFyYW50ZWVkIHRvIGV4aXN0ICh2YWxpZGF0ZWQgYnkgUGVyc29uYUltcG9ydGVyLnZhbGlkYXRlQW5kRW5yaWNoTWV0YWRhdGEpLlxuICAgICAgICBlbGVtZW50TWV0YWRhdGEuaW5zdHJ1Y3Rpb25zID0gZWxlbWVudE1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8IGVsZW1lbnRNZXRhZGF0YS5uYW1lO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwZXJzb25hVG9TYXZlID0gdGhpcy5jcmVhdGVFbGVtZW50KGVsZW1lbnRNZXRhZGF0YSwgcmVzdWx0LnBlcnNvbmEuY29udGVudCk7XG4gICAgICBwZXJzb25hVG9TYXZlLmZpbGVuYW1lID0gcmVzdWx0LnBlcnNvbmEuZmlsZW5hbWUgPz8gcGVyc29uYVRvU2F2ZS5maWxlbmFtZTtcbiAgICAgIHBlcnNvbmFUb1NhdmUudW5pcXVlX2lkID0gcmVzdWx0LnBlcnNvbmEudW5pcXVlX2lkO1xuICAgICAgcGVyc29uYVRvU2F2ZS5pZCA9IHBlcnNvbmFUb1NhdmUudW5pcXVlX2lkO1xuXG4gICAgICBhd2FpdCBzdXBlci5zYXZlKHBlcnNvbmFUb1NhdmUsIHBlcnNvbmFUb1NhdmUuZmlsZW5hbWUpO1xuICAgICAgLy8gTm90ZTogcmVsb2FkKCkgaW50ZW50aW9uYWxseSBOT1QgY2FsbGVkIGhlcmUgKElzc3VlICM0OTEpLlxuICAgICAgLy8gSW1wb3J0IG9ubHkgYWRkcyBmaWxlcyDigJQgbm8gYWN0aXZlIHBlcnNvbmEgY2xlYW51cCBuZWVkZWQuXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgcGVyc29uYTogcGVyc29uYVRvU2F2ZSxcbiAgICAgICAgZmlsZW5hbWU6IHBlcnNvbmFUb1NhdmUuZmlsZW5hbWVcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBUeXBlIEFkYXB0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQ29udmVydCBQZXJzb25hTWV0YWRhdGEgKGxlZ2FjeSkgdG8gUGVyc29uYUVsZW1lbnRNZXRhZGF0YSAobmV3IHN0YW5kYXJkKVxuICAgKiBFbnN1cmVzIHN0cmljdCB0eXBpbmcgZm9yIGFnZV9yYXRpbmcgYW5kIGdlbmVyYXRpb25fbWV0aG9kXG4gICAqIE5PVEU6IEZpbGVuYW1lIGlzIGluZnJhc3RydWN0dXJlIGRhdGEsIG5vdCBidXNpbmVzcyBtZXRhZGF0YSAtIGl0J3MgZXhjbHVkZWQgaGVyZVxuICAgKi9cbiAgcHJpdmF0ZSB0b1BlcnNvbmFFbGVtZW50TWV0YWRhdGEobWV0YWRhdGE6IFBlcnNvbmFNZXRhZGF0YSk6IFBlcnNvbmFFbGVtZW50TWV0YWRhdGEge1xuICAgIGNvbnN0IHsgZmlsZW5hbWUsIC4uLm1ldGFkYXRhV2l0aG91dEZpbGVuYW1lIH0gPSBtZXRhZGF0YTsgLy8gU3RyaXAgZmlsZW5hbWUgZnJvbSBsZWdhY3kgZGF0YVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1ldGFkYXRhV2l0aG91dEZpbGVuYW1lLFxuICAgICAgdHlwZTogRWxlbWVudFR5cGUuUEVSU09OQSxcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUgPz8gJ1VudGl0bGVkIFBlcnNvbmEnLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnLFxuICAgICAgYWdlX3JhdGluZzogKG1ldGFkYXRhLmFnZV9yYXRpbmcgYXMgJ2FsbCcgfCAnMTMrJyB8ICcxOCsnKSA/PyAnYWxsJyxcbiAgICAgIGdlbmVyYXRpb25fbWV0aG9kOiAobWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgYXMgJ2h1bWFuJyB8ICdDaGF0R1BUJyB8ICdDbGF1ZGUnIHwgJ2h5YnJpZCcpID8/ICdodW1hbidcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgbWV0YWRhdGEgaXMgUGVyc29uYUVsZW1lbnRNZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBpc1BlcnNvbmFFbGVtZW50TWV0YWRhdGEobWV0YWRhdGE6IGFueSk6IG1ldGFkYXRhIGlzIFBlcnNvbmFFbGVtZW50TWV0YWRhdGEge1xuICAgIHJldHVybiBtZXRhZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnICYmIG1ldGFkYXRhLnR5cGUgPT09IEVsZW1lbnRUeXBlLlBFUlNPTkE7XG4gIH1cblxuICAvLyBCYXNlRWxlbWVudE1hbmFnZXIgb3ZlcnJpZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8UGVyc29uYUVsZW1lbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IHBlcnNvbmFEYXRhID0gZGF0YSBhcyBQZXJzb25hTWV0YWRhdGE7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRvUGVyc29uYUVsZW1lbnRNZXRhZGF0YShwZXJzb25hRGF0YSk7XG5cbiAgICBpZiAoIW1ldGFkYXRhLnVuaXF1ZV9pZCkge1xuICAgICAgbWV0YWRhdGEudW5pcXVlX2lkID0gZ2VuZXJhdGVVbmlxdWVJZChtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS5hdXRob3IpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBQZXJzb25hRWxlbWVudE1ldGFkYXRhLCBib2R5VGV4dDogc3RyaW5nKTogUGVyc29uYUVsZW1lbnQge1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gbWV0YWRhdGEudW5pcXVlX2lkID8/IGdlbmVyYXRlVW5pcXVlSWQobWV0YWRhdGEubmFtZSwgbWV0YWRhdGEuYXV0aG9yKTtcbiAgICAvLyBGaWxlbmFtZSBpcyBkZXJpdmVkIGZyb20gbmFtZSAtIHVzZSBpbmhlcml0ZWQgZ2V0RWxlbWVudEZpbGVuYW1lKCkgZm9yIGNvbnNpc3RlbnQgbm9ybWFsaXphdGlvblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUobWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBGaXggIzkxMjogUHJlZmVyIGV4cGxpY2l0IGZvcm1hdF92ZXJzaW9uIG1hcmtlciwgZmFsbCBiYWNrIHRvIGluc3RydWN0aW9ucy1wcmVzZW5jZSBjaGVja1xuICAgIGRlbGV0ZSAobWV0YWRhdGEgYXMgYW55KS5mb3JtYXRfdmVyc2lvbjsgIC8vIFN0cmlwIG1hcmtlciBmcm9tIHJ1bnRpbWUgbWV0YWRhdGFcbiAgICBjb25zdCBtZXRhZGF0YUluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICBsZXQgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICBpZiAobWV0YWRhdGFJbnN0cnVjdGlvbnMpIHtcbiAgICAgIC8vIHYyIGZvcm1hdDogaW5zdHJ1Y3Rpb25zIGZyb20gbWV0YWRhdGEsIGJvZHlUZXh0IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgIGluc3RydWN0aW9ucyA9IG1ldGFkYXRhSW5zdHJ1Y3Rpb25zO1xuICAgICAgY29udGVudCA9IGJvZHlUZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB2MSBmb3JtYXQgb3IgZGlyZWN0IGNyZWF0aW9uOiBib2R5VGV4dCBtYXBzIHRvIGluc3RydWN0aW9uc1xuICAgICAgaW5zdHJ1Y3Rpb25zID0gYm9keVRleHQ7XG4gICAgICBjb250ZW50ID0gJyc7XG4gICAgfVxuXG4gICAgLy8gU3RyaXAgaW5zdHJ1Y3Rpb25zIGZyb20gbWV0YWRhdGEgdG8gcHJldmVudCBkdXBsaWNhdGUgWUFNTCBrZXlzIGR1cmluZyBzZXJpYWxpemF0aW9uXG4gICAgY29uc3QgeyBpbnN0cnVjdGlvbnM6IF9zdHJpcEluc3RyLCAuLi5jbGVhbk1ldGFkYXRhIH0gPSBtZXRhZGF0YSBhcyBhbnk7XG5cbiAgICAvLyBDcmVhdGUgUGVyc29uYUVsZW1lbnQgaW5zdGFuY2UgLSBtZXRhZGF0YSBpcyBhbHJlYWR5IFBlcnNvbmFFbGVtZW50TWV0YWRhdGEgd2l0aCBjb3JyZWN0IHR5cGVzXG4gICAgY29uc3QgcGVyc29uYUVsZW1lbnQgPSBuZXcgUGVyc29uYUVsZW1lbnQoXG4gICAgICB7XG4gICAgICAgIC4uLmNsZWFuTWV0YWRhdGEsXG4gICAgICAgIHVuaXF1ZV9pZDogdW5pcXVlSWRcbiAgICAgIH0sXG4gICAgICBpbnN0cnVjdGlvbnMsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlLFxuICAgICAgY29udGVudFxuICAgICk7XG5cbiAgICAvLyBTZXQgdGhlIElEIHRvIG1hdGNoIHVuaXF1ZV9pZCBmb3IgY29uc2lzdGVuY3lcbiAgICBwZXJzb25hRWxlbWVudC5pZCA9IHVuaXF1ZUlkO1xuXG4gICAgcmV0dXJuIHBlcnNvbmFFbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogUGVyc29uYUVsZW1lbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEZpeCAjOTA5OiBVc2Ugc3ByZWFkIGNvcHkgdG8gYXZvaWQgbXV0YXRpbmcgbGl2ZSBlbGVtZW50IG1ldGFkYXRhIGluLXBsYWNlXG4gICAgY29uc3QgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmVsZW1lbnQubWV0YWRhdGEgfTtcblxuICAgIC8vIElzc3VlICM3NTU6IFNlcmlhbGl6ZSB0eXBlIGFzIHNpbmd1bGFyIGFuZCBwZXJzaXN0IHVuaXF1ZV9pZFxuICAgIG1ldGFkYXRhLnR5cGUgPSB0b1Npbmd1bGFyTGFiZWwoRWxlbWVudFR5cGUuUEVSU09OQSk7XG4gICAgbWV0YWRhdGEuZm9ybWF0X3ZlcnNpb24gPSAndjInOyAgLy8gRml4ICM5MTI6IEV4cGxpY2l0IGZvcm1hdCBtYXJrZXJcbiAgICBtZXRhZGF0YS51bmlxdWVfaWQgPSBlbGVtZW50LmlkO1xuXG4gICAgLy8gdjIuMCBkdWFsLWZpZWxkIGZvcm1hdDogaW5zdHJ1Y3Rpb25zIGluIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICBpZiAoZWxlbWVudC5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFkYXRhLmluc3RydWN0aW9ucyA9IGVsZW1lbnQuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGJvZHk6IGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbCkgYmVsb3cgJy0tLScsIHdpdGggbmFtZSBoZWFkaW5nXG4gICAgY29uc3QgbmFtZSA9IGVsZW1lbnQubWV0YWRhdGEubmFtZTtcbiAgICBjb25zdCBib2R5Q29udGVudCA9IGVsZW1lbnQuY29udGVudCB8fCAnJztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnKS50cmltKCk7XG5cbiAgICBsZXQgYm9keTogc3RyaW5nO1xuICAgIGlmIChib2R5Q29udGVudC50cmltKCkpIHtcbiAgICAgIGJvZHkgPSBgIyAke25hbWV9XFxuXFxuJHtib2R5Q29udGVudH1gO1xuICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGJvZHkgPSBgIyAke25hbWV9XFxuXFxuJHtkZXNjcmlwdGlvbn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBib2R5ID0gYCMgJHtuYW1lfWA7XG4gICAgfVxuXG4gICAgLy8gRml4ICM5MDk6IFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBpbnN0ZWFkIG9mIG1hbnVhbCBZQU1MIGNvbnN0cnVjdGlvbi5cbiAgICAvLyBKU09OIHNjaGVtYSBwcmVzZXJ2ZXMgYm9vbGVhbnMgYW5kIG51bWJlcnM7IHJlbW92ZS1ib3RoIGNsZWFucyBudWxsL3VuZGVmaW5lZC5cbiAgICBjb25zdCBwZXJzb25hQ29udGVudCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuY3JlYXRlRnJvbnRtYXR0ZXIobWV0YWRhdGEsIGJvZHksIHtcbiAgICAgIG1ldGhvZDogJ21hbnVhbCcsXG4gICAgICBzY2hlbWE6ICdqc29uJyxcbiAgICAgIGNsZWFuTWV0YWRhdGE6IHRydWUsXG4gICAgICBjbGVhbmluZ1N0cmF0ZWd5OiAncmVtb3ZlLWJvdGgnLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcblxuICAgIHZhbGlkYXRlQ29udGVudFNpemUocGVyc29uYUNvbnRlbnQsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfUEVSU09OQV9TSVpFX0JZVEVTKTtcblxuICAgIHJldHVybiBwZXJzb25hQ29udGVudDtcbiAgfVxuXG4gIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy5tZCc7XG4gIH1cblxuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJyk6IFByb21pc2U8UGVyc29uYUVsZW1lbnQ+IHtcbiAgICBsZXQgbWV0YWRhdGE6IFBlcnNvbmFNZXRhZGF0YTtcbiAgICBsZXQgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcblxuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJyB8fCBmb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKSBhcyBQZXJzb25hO1xuICAgICAgbWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGE7XG4gICAgICBpbnN0cnVjdGlvbnMgPSBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnO1xuICAgICAgY29udGVudCA9IHBhcnNlZC5jb250ZW50IHx8ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC41IC0gVmFsaWRhdGUgWUFNTCBjb250ZW50IGJlZm9yZSBwYXJzaW5nXG4gICAgICAvLyBTRUNVUklUWTogUGhhc2UgNC43IC0gVGhyb3cgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgdGVzdCBleHBlY3RhdGlvbnNcbiAgICAgIGlmIChkYXRhLmluY2x1ZGVzKCctLS0nKSkge1xuICAgICAgICBjb25zdCB5YW1sUGFydCA9IGRhdGEuc3BsaXQoJy0tLScpWzFdO1xuICAgICAgICBpZiAoeWFtbFBhcnQpIHtcbiAgICAgICAgICBjb25zdCB5YW1sVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sUGFydCk7XG4gICAgICAgICAgaWYgKCF5YW1sVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ1BlcnNvbmFNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiAnTWFsaWNpb3VzIFlBTUwgY29udGVudCBkZXRlY3RlZCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgbWFya2Rvd246IE1hbGljaW91cyBZQU1MIGNvbnRlbnQgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGRhdGEpO1xuXG4gICAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgbWV0YWRhdGEga2V5cyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgIHRoaXMudmFsaWRhdGVNZXRhZGF0YUtleXMocGFyc2VkLmRhdGEpO1xuXG4gICAgICBtZXRhZGF0YSA9IHBhcnNlZC5kYXRhIGFzIFBlcnNvbmFNZXRhZGF0YTtcbiAgICAgIGNvbnN0IGJvZHlUZXh0ID0gcGFyc2VkLmNvbnRlbnQ7XG5cbiAgICAgIC8vIER1YWwtZmllbGQgbG9hZGluZzogZGV0ZWN0IHYyIGZvcm1hdCAoaW5zdHJ1Y3Rpb25zIGluIFlBTUwgZnJvbnRtYXR0ZXIpXG4gICAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIC8vIHYyIGZvcm1hdDogaW5zdHJ1Y3Rpb25zIGZyb20gWUFNTCwgYm9keSB0ZXh0IGlzIGNvbnRlbnQgKHJlZmVyZW5jZSBtYXRlcmlhbClcbiAgICAgICAgaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgICAgICBjb250ZW50ID0gYm9keVRleHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB2MSBmb3JtYXQ6IGJvZHkgdGV4dCBtYXBzIHRvIGluc3RydWN0aW9ucyAoaXQgSVMgYmVoYXZpb3JhbCBkaXJlY3RpdmVzKVxuICAgICAgICBpbnN0cnVjdGlvbnMgPSBib2R5VGV4dDtcbiAgICAgICAgY29udGVudCA9ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnZlcnQgbGVnYWN5IFBlcnNvbmFNZXRhZGF0YSB0byBQZXJzb25hRWxlbWVudE1ldGFkYXRhIGJlZm9yZSBjcmVhdGluZyBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudE1ldGFkYXRhID0gdGhpcy50b1BlcnNvbmFFbGVtZW50TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudE1ldGFkYXRhLCBpbnN0cnVjdGlvbnMpO1xuICAgIGVsZW1lbnQuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBhc3luYyBleHBvcnRFbGVtZW50KHBlcnNvbmE6IFBlcnNvbmFFbGVtZW50LCBfZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gVXNlIGJhc2UgZWxlbWVudCBzZXJpYWxpemF0aW9uIGZvciBzZWN1cmUgWUFNTCBnZW5lcmF0aW9uXG4gICAgLy8gUGFzcyBpbnN0cnVjdGlvbnMgKGJlaGF2aW9yYWwgZGlyZWN0aXZlcykgYXMgdGhlIHByaW1hcnkgdGV4dFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQocGVyc29uYS5tZXRhZGF0YSwgcGVyc29uYS5pbnN0cnVjdGlvbnMpO1xuICAgIGVsZW1lbnQuY29udGVudCA9IHBlcnNvbmEuY29udGVudDsgIC8vIFByZXNlcnZlIHJlZmVyZW5jZSBtYXRlcmlhbFxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY2FuRGVsZXRlKGVsZW1lbnQ6IFBlcnNvbmFFbGVtZW50KTogUHJvbWlzZTx7IGFsbG93ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9PiB7XG4gICAgaWYgKGlzRGVmYXVsdFBlcnNvbmEoZWxlbWVudC5maWxlbmFtZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICByZWFzb246ICdDYW5ub3QgZGVsZXRlIGEgZGVmYXVsdCBwZXJzb25hLiBFZGl0IGl0IHRvIGNyZWF0ZSBhIHBlcnNvbmFsIGNvcHkgaW5zdGVhZC4nXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElzc3VlICMyODE6IENoZWNrIGlmIHBlcnNvbmEgaXMgaW4gdGhlIGFjdGl2ZSBzZXRcbiAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hcy5oYXMoZWxlbWVudC5maWxlbmFtZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICByZWFzb246ICdDYW5ub3QgZGVsZXRlIGFuIGFjdGl2ZSBwZXJzb25hLiBEZWFjdGl2YXRlIGl0IGZpcnN0LidcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWxsb3dlZDogdHJ1ZSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGJlZm9yZVNhdmUocGVyc29uYTogUGVyc29uYUVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmluaXRpYWxpemVQYXRoVmFsaWRhdG9yKCk7XG4gICAgdGhpcy5ub3JtYWxpemVQZXJzb25hRm9yU2F2ZShwZXJzb25hKTtcbiAgICAvLyBQYXRoIHZhbGlkYXRpb24gaGFuZGxlZCBieSBCYXNlRWxlbWVudE1hbmFnZXIuc2F2ZSgpIGJlZm9yZSB0aGlzIGhvb2sgaXMgY2FsbGVkXG4gIH1cbn1cbiJdfQ==
|