@decaf-ts/for-fabric 0.1.25 → 0.1.26
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/dist/for-fabric.cjs +3 -3
- package/dist/for-fabric.js +3 -3
- package/lib/client/FabricClientAdapter.cjs +13 -1
- package/lib/client/FabricClientAdapter.d.ts +2 -2
- package/lib/client/services/FabricEnrollmentService.cjs +1 -2
- package/lib/contract/Address.cjs +73 -0
- package/lib/contract/Address.d.ts +13 -0
- package/lib/contract/AddressContract.cjs +34 -0
- package/lib/contract/AddressContract.d.ts +5 -0
- package/lib/contract/index.cjs +7 -2
- package/lib/esm/client/FabricClientAdapter.d.ts +2 -2
- package/lib/esm/client/FabricClientAdapter.js +13 -1
- package/lib/esm/client/services/FabricEnrollmentService.js +1 -2
- package/lib/esm/contract/Address.d.ts +13 -0
- package/lib/esm/contract/Address.js +70 -0
- package/lib/esm/contract/AddressContract.d.ts +5 -0
- package/lib/esm/contract/AddressContract.js +31 -0
- package/lib/esm/contract/index.js +7 -2
- package/lib/esm/shared/decorators.d.ts +1 -1
- package/lib/esm/shared/decorators.js +2 -2
- package/lib/esm/version.d.ts +1 -1
- package/lib/esm/version.js +1 -1
- package/lib/shared/decorators.cjs +3 -3
- package/lib/shared/decorators.d.ts +1 -1
- package/lib/version.cjs +1 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
package/dist/for-fabric.js
CHANGED
|
@@ -1356,7 +1356,7 @@ async function ownedByOnCreate(context, data, key, model) {
|
|
|
1356
1356
|
setOwnedByKeyValue(model, key, owner);
|
|
1357
1357
|
}
|
|
1358
1358
|
|
|
1359
|
-
function
|
|
1359
|
+
function ownedBy() {
|
|
1360
1360
|
const key = getFabricModelKey(FabricModelKeys.OWNEDBY);
|
|
1361
1361
|
function ownedBy() {
|
|
1362
1362
|
return function(obj, attribute) {
|
|
@@ -1821,11 +1821,11 @@ __decorate([ Transaction(false), __metadata("design:type", Function), __metadata
|
|
|
1821
1821
|
|
|
1822
1822
|
const contracts = [ FabricERC20Contract ];
|
|
1823
1823
|
|
|
1824
|
-
const VERSION = "0.1.
|
|
1824
|
+
const VERSION = "0.1.25";
|
|
1825
1825
|
|
|
1826
1826
|
const PACKAGE_NAME = "@decaf-ts/for-fabric";
|
|
1827
1827
|
|
|
1828
1828
|
Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
1829
1829
|
|
|
1830
1830
|
export { ContractLogger, FabricContractAdapter, FabricContractContext, FabricContractRepository, FabricContractRepositoryObservableHandler, FabricCrudContract, FabricStatement, PACKAGE_NAME, SerializedCrudContract, VERSION, contracts, createdByOnFabricCreateUpdate, pkFabricOnCreate };
|
|
1831
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdENvbnRleHQudHMiLCIuLi9zcmMvc2hhcmVkL2V2ZW50cy50cyIsIi4uL3NyYy9jb250cmFjdHMvRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIudHMiLCIuLi9zcmMvY29udHJhY3RzL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvRmFicmljQ29udHJhY3RTdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2hhcmVkL2NvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIudHMiLCIuLi9zcmMvY29udHJhY3RzL0ZhYnJpY0NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9jb250cmFjdHMvbG9nZ2luZy50cyIsIi4uL3NyYy9jb250cmFjdHMvQ29udHJhY3RBZGFwdGVyLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jb250cmFjdHMvY3J1ZC9jcnVkLWNvbnRyYWN0LnRzIiwiLi4vc3JjL2NvbnRyYWN0cy9jcnVkL3NlcmlhbGl6ZWQtY3J1ZC1jb250cmFjdC50cyIsIi4uL3NyYy9zaGFyZWQvZXJyb3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL2NvbnRyYWN0cy9lcmMyMC9tb2RlbHMudHMiLCIuLi9zcmMvc2hhcmVkL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdC50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvaW5kZXgudHMiLCIuLi9zcmMvdmVyc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENoYWluY29kZVN0dWIsIENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb250ZXh0IGNsYXNzIGZvciBGYWJyaWMgY2hhaW5jb2RlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byBGYWJyaWMtc3BlY2lmaWMgY29udGV4dCBlbGVtZW50cyBsaWtlIHN0dWIsIGlkZW50aXR5LCBhbmQgbG9nZ2VyIHRvIGJlIHVzZWQgYnkgcmVwb3NpdG9yaWVzIGFuZCBhZGFwdGVycyBkdXJpbmcgY29udHJhY3QgZXhlY3V0aW9uLlxuICogQHRlbXBsYXRlIEYgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGJhc2UgQ29udGV4dFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDb250cmFjdENvbnRleHRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3QgbWV0aG9kXG4gKiBjb25zdCBjb250ZXh0ID0gbmV3IEZhYnJpY0NvbnRyYWN0Q29udGV4dCgpO1xuICogLy8gT3B0aW9uYWxseSBzZXQgdmFsdWVzIHZpYSB0aGUgYmFzZSBDb250ZXh0IEFQSVxuICogY29udGV4dC5zZXQoJ3N0dWInLCBjdHguc3R1Yik7XG4gKiBjb250ZXh0LnNldCgnY2xpZW50SWRlbnRpdHknLCBjdHguY2xpZW50SWRlbnRpdHkpO1xuICogY29udGV4dC5zZXQoJ2xvZ2dlcicsIGNvbnRyYWN0TG9nZ2VyKTtcbiAqXG4gKiAvLyBBY2Nlc3MgY29udGV4dCBwcm9wZXJ0aWVzXG4gKiBjb25zdCB0aW1lc3RhbXAgPSBjb250ZXh0LnRpbWVzdGFtcDtcbiAqIGNvbnN0IGNyZWF0b3IgPSBjb250ZXh0LmlkZW50aXR5LmdldElEKCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBMZWRnZXJcbiAqICAgQ29udHJhY3QtPj5Db250ZXh0OiBuZXcgRmFicmljQ29udHJhY3RDb250ZXh0KClcbiAqICAgQ29udHJhY3QtPj5Db250ZXh0OiBzZXQoJ3N0dWInfCdjbGllbnRJZGVudGl0eSd8J2xvZ2dlcicsIC4uLilcbiAqICAgQ29udGV4dC0tPj5Db250cmFjdDogdGltZXN0YW1wLCBpZGVudGl0eSwgbG9nZ2VyXG4gKiAgIENvbnRyYWN0LT4+TGVkZ2VyOiBJbnRlcmFjdCB2aWEgc3R1YlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RDb250ZXh0IGV4dGVuZHMgQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNDb250cmFjdENvbnRleHQgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGNvbnRleHQgd2l0aCBGYWJyaWMtc3BlY2lmaWMgZmxhZ3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNoYWluY29kZSBzdHViXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIENoYWluY29kZVN0dWIgaW5zdGFuY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGxlZGdlclxuICAgKiBAcmV0dXJuIHtDaGFpbmNvZGVTdHVifSBUaGUgY2hhaW5jb2RlIHN0dWJcbiAgICovXG4gIGdldCBzdHViKCk6IENoYWluY29kZVN0dWIge1xuICAgIHJldHVybiB0aGlzLmdldChcInN0dWJcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcFxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgdGltZXN0YW1wIGdldHRlciB0byB1c2UgdGhlIHN0dWIncyB0aW1lc3RhbXBcbiAgICogQHJldHVybiB7RGF0ZX0gVGhlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IHRpbWVzdGFtcCgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdHViLmdldERhdGVUaW1lc3RhbXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY2xpZW50IGlkZW50aXR5XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIENsaWVudElkZW50aXR5IGluc3RhbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24gc3VibWl0dGVyXG4gICAqIEByZXR1cm4ge0NsaWVudElkZW50aXR5fSBUaGUgY2xpZW50IGlkZW50aXR5XG4gICAqL1xuICBnZXQgaWRlbnRpdHkoKTogQ2xpZW50SWRlbnRpdHkge1xuICAgIHJldHVybiB0aGlzLmdldChcImlkZW50aXR5XCIpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBmYWJyaWMgY3R4JHt0aGlzLnN0dWIgPyBcIiB3aXRoIHN0dWJcIiA6IFwid2l0aG91dCBzdHViXCJ9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQnVsa0NydWRPcGVyYXRpb25LZXlzLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIEZhYnJpYyBldmVudCBuYW1lIGZyb20gY29tcG9uZW50c1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBuYW1lIGJ5IGpvaW5pbmcgdGFibGUsIGV2ZW50LCBhbmQgb3B0aW9uYWwgb3duZXIgd2l0aCB1bmRlcnNjb3Jlc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL2NvbGxlY3Rpb24gbmFtZVxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nfSBldmVudCAtIFRoZSBldmVudCB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW293bmVyXSAtIE9wdGlvbmFsIG93bmVyIGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBldmVudCBuYW1lIGluIGZvcm1hdCBcInRhYmxlX2V2ZW50XCIgb3IgXCJ0YWJsZV9ldmVudF9vd25lclwiXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRmFicmljRXZlbnROYW1lKFxuICB0YWJsZTogc3RyaW5nLFxuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgb3duZXI/OiBzdHJpbmdcbikge1xuICBjb25zdCBwYXJhbXMgPSBbdGFibGUsIGV2ZW50XTtcbiAgaWYgKG93bmVyKSBwYXJhbXMucHVzaChvd25lcik7XG4gIHJldHVybiBwYXJhbXMuam9pbihcIl9cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIEZhYnJpYyBldmVudCBuYW1lIGludG8gaXRzIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IFNwbGl0cyBhbiBldmVudCBuYW1lIGJ5IHVuZGVyc2NvcmVzIGFuZCBleHRyYWN0cyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZXZlbnQgbmFtZSB0byBwYXJzZVxuICogQHJldHVybiB7e3RhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLCBvd25lcjogc3RyaW5nfX0gVGhlIHBhcnNlZCBjb21wb25lbnRzIGFzIGEgc3RydWN0dXJlZCBvYmplY3RcbiAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBldmVudCBuYW1lIGZvcm1hdCBpcyBpbnZhbGlkXG4gKiBAZnVuY3Rpb24gcGFyc2VFdmVudE5hbWVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFBhcnNlciBhcyBwYXJzZUV2ZW50TmFtZVxuICogICBDYWxsZXItPj5QYXJzZXI6IHBhcnNlRXZlbnROYW1lKG5hbWUpXG4gKiAgIFBhcnNlci0+PlBhcnNlcjogc3BsaXQgbmFtZSBieSBcIl9cIlxuICogICBhbHQgcGFydHMgbGVuZ3RoIGludmFsaWRcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gKiAgIGVsc2VcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB7IHRhYmxlLCBldmVudCwgb3duZXI/IH1cbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZShuYW1lOiBzdHJpbmcpOiB7XG4gIHRhYmxlPzogc3RyaW5nO1xuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZztcbiAgb3duZXI/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KFwiX1wiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMylcbiAgICByZXR1cm4geyB0YWJsZTogdW5kZWZpbmVkLCBldmVudDogbmFtZSwgb3duZXI6IHVuZGVmaW5lZCB9O1xuICByZXR1cm4ge1xuICAgIHRhYmxlOiBwYXJ0c1swXSxcbiAgICBldmVudDogcGFydHNbMV0sXG4gICAgb3duZXI6IHBhcnRzWzJdLFxuICB9IGFzIHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICAgIG93bmVyPzogc3RyaW5nO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQnVsa0NydWRPcGVyYXRpb25LZXlzLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRXZlbnRJZHMsXG4gIE9ic2VydmVySGFuZGxlcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvZXZlbnRzXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9ic2VydmVyIGhhbmRsZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gKiBAc3VtbWFyeSBFbWl0cyBldmVudHMgb24gdGhlIEZhYnJpYyBsZWRnZXIgd2hlbiByZXBvc2l0b3J5IG9wZXJhdGlvbnMgb2NjdXJcbiAqIEBjbGFzcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlPYnNlcnZhYmxlSGFuZGxlclxuICogQGV4dGVuZHMge09ic2VydmVySGFuZGxlcn1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RcbiAqIGltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIC8vIENyZWF0ZSBhIGhhbmRsZXIgd2l0aCBkZWZhdWx0IHN1cHBvcnRlZCBldmVudHNcbiAqIGNvbnN0IGhhbmRsZXIgPSBuZXcgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIoKTtcbiAqXG4gKiAvLyBFbWl0IGFuIGV2ZW50XG4gKiBhd2FpdCBoYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAqICAgbG9nZ2VyLFxuICogICAnYXNzZXRzJyxcbiAqICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gKiAgICdhc3NldDEnLFxuICogICBjb250ZXh0XG4gKiApO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgT2JzZXJ2YWJsZUhhbmRsZXJcbiAqICAgcGFydGljaXBhbnQgU3R1YlxuICogICBwYXJ0aWNpcGFudCBMZWRnZXJcbiAqXG4gKiAgIFJlcG9zaXRvcnktPj5PYnNlcnZhYmxlSGFuZGxlcjogdXBkYXRlT2JzZXJ2ZXJzKGxvZywgdGFibGUsIGV2ZW50LCBpZCwgY3R4KVxuICogICBPYnNlcnZhYmxlSGFuZGxlci0+Pk9ic2VydmFibGVIYW5kbGVyOiBDaGVjayBpZiBldmVudCBpcyBzdXBwb3J0ZWRcbiAqICAgT2JzZXJ2YWJsZUhhbmRsZXItPj5PYnNlcnZhYmxlSGFuZGxlcjogZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUodGFibGUsIGV2ZW50LCBvd25lcilcbiAqICAgT2JzZXJ2YWJsZUhhbmRsZXItPj5TdHViOiBzZXRFdmVudChldmVudE5hbWUsIHBheWxvYWQpXG4gKiAgIFN0dWItPj5MZWRnZXI6IFJlY29yZCBldmVudFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIgZXh0ZW5kcyBPYnNlcnZlckhhbmRsZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGhhbmRsZXIgd2l0aCBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGV2ZW50c1xuICAgKiBAcGFyYW0ge0FycmF5PE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc+fSBbc3VwcG9ydGVkRXZlbnRzXSAtIEV2ZW50cyB0aGF0IHdpbGwgdHJpZ2dlciBGYWJyaWMgZXZlbnRzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN1cHBvcnRlZEV2ZW50czogKFxuICAgICAgfCBPcGVyYXRpb25LZXlzXG4gICAgICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5c1xuICAgICAgfCBzdHJpbmdcbiAgICApW10gPSBbXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgXVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBieSBlbWl0dGluZyBGYWJyaWMgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGV2ZW50cyBvbiB0aGUgRmFicmljIGxlZGdlciBmb3Igc3VwcG9ydGVkIGV2ZW50IHR5cGVzXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBldmVudCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmFicmljQ29udHJhY3RDb250ZXh0fSBjdHggLSBUaGUgRmFicmljIGNvbnRyYWN0IGNvbnRleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvd25lcl0gLSBPcHRpb25hbCBvd25lciBpZGVudGlmaWVyIGZvciB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtvYmplY3QgfCBzdHJpbmcgfCB1bmRlZmluZWR9IFtvd25lcl0gLSBPcHRpb25hbCBwYXlsb2FkIGZvciB0aGUgZXZlbnRcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV2ZW50IGlzIGVtaXR0ZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55PixcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBBZGFwdGVyLmxvZ0N0eDxGYWJyaWNDb250cmFjdENvbnRleHQ+KFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzXG4gICAgKTtcbiAgICBjb25zdCB7IHN0dWIgfSA9IGN0eDtcbiAgICBjb25zdCBbb3duZXIsIHBheWxvYWRdID0gYXJncztcbiAgICBjb25zdCB0YWJsZSA9IHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IGNsYXp6IDogY2xhenoubmFtZTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRFdmVudHMuaW5kZXhPZihldmVudCkgIT09IC0xKSB7XG4gICAgICBsb2cuZGVidWcoYEVtaXR0aW5nICR7ZXZlbnR9IGV2ZW50YCk7XG4gICAgICBjb25zdCBldmVudE5hbWUgPSBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSh0YWJsZSwgZXZlbnQsIG93bmVyKTtcbiAgICAgIHN0dWIuc2V0RXZlbnQoZXZlbnROYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGlkOiBpZCB9KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHViLnNldEV2ZW50KGV2ZW50LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSkpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgUmVwb3NpdG9yeSxcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBFdmVudElkcyxcbiAgQ29udGV4dHVhbEFyZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RDb250ZXh0IH0gZnJvbSBcIi4vQ29udHJhY3RDb250ZXh0XCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyIH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXJcIjtcbmltcG9ydCB7IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSBcIi4vQ29udHJhY3RBZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgbW9kZWxzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIG1vZGVscyB3aXRoaW4gRmFicmljIGNoYWluY29kZSBjb250cmFjdHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBNYW5nb1F1ZXJ5IC0gUXVlcnkgdHlwZSBmb3IgQ291Y2hEQi1saWtlIHF1ZXJpZXNcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNDb250cmFjdEFkYXB0ZXIgLSBBZGFwdGVyIHR5cGUgZm9yIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RDb250ZXh0IC0gQ29udGV4dCB0eXBlIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICpcbiAqIEBwYXJhbSB7RmFicmljQ29udHJhY3RBZGFwdGVyfSBbYWRhcHRlcl0gLSBUaGUgYWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc3RhdGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXk8T3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZz59IFt0cmFja2VkRXZlbnRzXSAtIEV2ZW50cyB0byB0cmFjayBmb3Igb2JzZXJ2ZXIgbm90aWZpY2F0aW9uc1xuICpcbiAqIEBjbGFzcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3QgY2xhc3NcbiAqIGltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSwgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIEB0YWJsZSgnYXNzZXRzJylcbiAqIGNsYXNzIEFzc2V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAaWQoKVxuICogICBpZDogc3RyaW5nO1xuICpcbiAqICAgQHByb3BlcnR5KClcbiAqICAgZGF0YTogc3RyaW5nO1xuICogfVxuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBwcml2YXRlIGFkYXB0ZXIgPSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG4gKiAgIHByaXZhdGUgcmVwb3NpdG9yeTogRmFicmljQ29udHJhY3RSZXBvc2l0b3J5PEFzc2V0PjtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKCdNeUNvbnRyYWN0Jyk7XG4gKiAgICAgdGhpcy5yZXBvc2l0b3J5ID0gbmV3IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxBc3NldD4odGhpcy5hZGFwdGVyLCBBc3NldCk7XG4gKiAgIH1cbiAqXG4gKiAgIEBUcmFuc2FjdGlvbigpXG4gKiAgIGFzeW5jIGNyZWF0ZUFzc2V0KGN0eDogQ29udGV4dCwgaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgICAgY29uc3QgYXNzZXQgPSBuZXcgQXNzZXQoKTtcbiAqICAgICBhc3NldC5pZCA9IGlkO1xuICogICAgIGFzc2V0LmRhdGEgPSBkYXRhO1xuICpcbiAqICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuY3JlYXRlKGFzc2V0LCB7IHN0dWI6IGN0eC5zdHViIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAqXG4gKiAgIENvbnRyYWN0LT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsLCBjdHgpXG4gKiAgIFJlcG9zaXRvcnktPj5BZGFwdGVyOiBwcmVwYXJlKG1vZGVsLCBwaylcbiAqICAgUmVwb3NpdG9yeS0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCByZWNvcmQsIHRyYW5zaWVudCwgY3R4KVxuICogICBBZGFwdGVyLT4+U3RhdGVEQjogcHV0U3RhdGUoaWQsIHNlcmlhbGl6ZWREYXRhKVxuICogICBTdGF0ZURCLS0+PkFkYXB0ZXI6IFN1Y2Nlc3NcbiAqICAgQWRhcHRlci0tPj5SZXBvc2l0b3J5OiByZWNvcmRcbiAqICAgUmVwb3NpdG9yeS0+PkFkYXB0ZXI6IHJldmVydChyZWNvcmQsIGNsYXNzLCBwaywgaWQsIHRyYW5zaWVudClcbiAqICAgQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNvbnRyYWN0OiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICBNLFxuICBGYWJyaWNDb250cmFjdEFkYXB0ZXJcbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyPzogRmFicmljQ29udHJhY3RBZGFwdGVyLFxuICAgIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sXG4gICAgcHJvdGVjdGVkIHRyYWNrZWRFdmVudHM/OiAoT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZylbXVxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG9ic2VydmVyIGhhbmRsZXIgZm9yIHRoaXMgcmVwb3NpdG9yeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIgaW5zdGFuY2VcbiAgICogQHJldHVybiB7T2JzZXJ2ZXJIYW5kbGVyfSBUaGUgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKi9cbiAgb3ZlcnJpZGUgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlPYnNlcnZhYmxlSGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBiYXNlZCBvbiB0cmFja2VkIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIGV2ZW50cyBiYXNlZCBvbiB0cmFja2VkRXZlbnRzIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIHBhcmVudCBtZXRob2RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL2NvbGxlY3Rpb24gbmFtZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgZXZlbnQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0Q29udGV4dH0gY3R4IC0gVGhlIEZhYnJpYyBjb250cmFjdCBjb250ZXh0XG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBvYnNlcnZlcnMgYXJlIHVwZGF0ZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnRyYWNrZWRFdmVudHMgfHwgdGhpcy50cmFja2VkRXZlbnRzLmluZGV4T2YoZXZlbnQpICE9PSAtMSlcbiAgICAgIHJldHVybiBhd2FpdCBzdXBlci51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQkFkYXB0ZXIsXG4gIENvdWNoREJHcm91cE9wZXJhdG9yLFxuICBDb3VjaERCS2V5cyxcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb1NlbGVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7IENvdWNoREJTdGF0ZW1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YXRlbWVudCB3cmFwcGVyIGZvciBleGVjdXRpbmcgTWFuZ28gcXVlcmllcyB3aXRoaW4gRmFicmljIGNvbnRyYWN0c1xuICogQHN1bW1hcnkgQnJpZGdlcyBDb3VjaERCLXN0eWxlIHF1ZXJpZXMgdG8gRmFicmljIHZpYSB0aGUgRmFicmljQ29udHJhY3RBZGFwdGVyLCBoYW5kbGluZyBpZGVudGl0eSBhbmQgcHJpbWFyeSBrZXkgcHJvamVjdGlvbiB3aGVuIG5lZWRlZC5cbiAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSB0aGlzIHN0YXRlbWVudCBvcGVyYXRlcyBvblxuICogQHRlbXBsYXRlIFIgLSBSZXN1bHQgdHlwZSByZXR1cm5lZCBieSB0aGUgc3RhdGVtZW50XG4gKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0QWRhcHRlcn0gYWRhcHRlciAtIFRoZSBGYWJyaWMgY29udHJhY3QgYWRhcHRlciB1c2VkIGZvciByYXcgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0Q29udGV4dH0gY3R4IC0gVGhlIEZhYnJpYyBjb250cmFjdCBjb250ZXh0IGNhcnJ5aW5nIHN0dWIgYW5kIGlkZW50aXR5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY1N0YXRlbWVudFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHN0bXQgPSBuZXcgRmFicmljU3RhdGVtZW50PE15TW9kZWwsIE15TW9kZWxbXT4oYWRhcHRlciwgY3R4KTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0bXQucmF3PE15TW9kZWxbXT4oeyBzZWxlY3RvcjogeyB0eXBlOiAnTXlNb2RlbCcgfSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IExlZGdlclxuICogICBBcHAtPj5TdGF0ZW1lbnQ6IHJhdyh7IHNlbGVjdG9yIH0pXG4gKiAgIFN0YXRlbWVudC0+PkFkYXB0ZXI6IGFkYXB0ZXIucmF3KG1hbmdvLCB0cnVlLCBjdHgpXG4gKiAgIEFkYXB0ZXItPj5MZWRnZXI6IEV2YWx1YXRlIHF1ZXJ5XG4gKiAgIEFkYXB0ZXItLT4+U3RhdGVtZW50OiByb3dzXG4gKiAgIFN0YXRlbWVudC0tPj5BcHA6IG1vZGVsc1xuICovXG5leHBvcnQgY2xhc3MgRmFicmljU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBDb3VjaERCU3RhdGVtZW50PFxuICBNLFxuICBDb3VjaERCQWRhcHRlcjxhbnksIHZvaWQsIEZhYnJpY0NvbnRyYWN0Q29udGV4dD4sXG4gIFJcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBDb3VjaERCQWRhcHRlcjxhbnksIHZvaWQsIEZhYnJpY0NvbnRyYWN0Q29udGV4dD4pIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuXG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHJhd0lucHV0LCB0cnVlLCBjdHgpO1xuXG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIHBrQXR0ciwgdHlwZSwgY3R4KSkgYXMgUjtcbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgb3ZlcnJpZGUgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBjb25zdCBbc2VsZWN0b3IsIHZhbHVlXSA9IHRoaXMub3JkZXJCeVNlbGVjdG9yIGFzIFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBPcmRlckRpcmVjdGlvbixcbiAgICAgIF07XG4gICAgICBjb25zdCByZWM6IGFueSA9IHt9O1xuICAgICAgcmVjW3NlbGVjdG9yXSA9IHZhbHVlO1xuICAgICAgKHF1ZXJ5LnNvcnQgYXMgYW55W10pLnB1c2gocmVjIGFzIGFueSk7XG4gICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBLZXlzIHVzZWQgdG8gbWFyayBGYWJyaWMtc3BlY2lmaWMgbW9kZWwgbWV0YWRhdGFcbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIHNwZWNpYWwga2V5cyB1c2VkIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIHRvIHBlcnNpc3QgRmFicmljLXJlbGF0ZWQgZmxhZ3Mgb24gbW9kZWxzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBlbnVtIEZhYnJpY01vZGVsS2V5cyB7XG4gIC8qKiBQcml2YXRlIGRhdGEgbWFya2VyIHVzZWQgdG8gdGFnIHByb3BlcnRpZXMgb3IgbW9kZWxzIGZvciBGYWJyaWMgcHJpdmF0ZSBjb2xsZWN0aW9ucyAqL1xuICBQUklWQVRFID0gXCJwcml2YXRlXCIsXG4gIFNIQVJFRCA9IFwic2hhcmVkXCIsXG4gIC8qKiBOYW1lc3BhY2UgcHJlZml4IHVzZWQgZm9yIEZhYnJpYy1zcGVjaWZpYyBtZXRhZGF0YSBrZXlzICovXG4gIEZBQlJJQyA9IFwiZmFicmljLlwiLFxuICBPV05FREJZID0gXCJvd25lZC1ieVwiLFxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIGZvciBGYWJyaWMgY3JlZGVudGlhbHNcbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGlkZW50aXR5IGZvcm1hdHMgcmVjb2duaXplZCBieSB0aGlzIGxpYnJhcnlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlUeXBlIHtcbiAgLyoqIFN0YW5kYXJkIFguNTA5IGlkZW50aXR5IGZvcm1hdCB1c2VkIGJ5IEh5cGVybGVkZ2VyIEZhYnJpYyAqL1xuICBYNTA5ID0gXCJYLjUwOVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdHJpbmcgaWRlbnRpZmllciBmb3IgdGhlIEZhYnJpYyBhZGFwdGVyIGZsYXZvdXJcbiAqIEBzdW1tYXJ5IFVzZWQgdG8gdGFnIGFkYXB0ZXJzL3JlcG9zaXRvcmllcyB0aGF0IG9wZXJhdGUgYWdhaW5zdCBIeXBlcmxlZGdlciBGYWJyaWNcbiAqIEBjb25zdCBGYWJyaWNGbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBjb25zdCBGYWJyaWNGbGF2b3VyID0gXCJobGYtZmFicmljXCI7XG4iLCJpbXBvcnQgeyBKU09OU2VyaWFsaXplciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcsIHRhYmxlTmFtZT86IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICAvLyBjb25zdCBjbGFzc05hbWUgPSB0YWJsZU5hbWU7XG4gICAgLy8gaWYgKCFjbGFzc05hbWUpXG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcblxuICAgIC8vIC8vIHRoaXMgd2lsbCByZXR1cm4gdW5kZWZpbmVkIHZhbHVlc1xuICAgIC8vIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcblxuICAgIC8vIC8vIFBvcHVsYXRlIE1vZGVsXG4gICAgLy8gY29uc3QgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbiA9IE9iamVjdC5rZXlzKG1vZGVsKS5yZWR1Y2UoXG4gICAgLy8gICAoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgIC8vICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9XG4gICAgLy8gICAgICAgZGVzZXJpYWxpemF0aW9uW1JlcG9zaXRvcnkuY29sdW1uKGFjY3VtLCBrZXkpXTtcbiAgICAvLyAgICAgcmV0dXJuIGFjY3VtO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIG1vZGVsXG4gICAgLy8gKTtcblxuICAgIC8vIGNvbnN0IHJlc3VsdCA9IE1vZGVsLmJ1aWxkKFxuICAgIC8vICAgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbixcbiAgICAvLyAgIGNsYXNzTmFtZVxuICAgIC8vICkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gZGVzZXJpYWxpemF0aW9uO1xuICB9XG5cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc29ydEtleXNSZWN1cnNpdmUgPSByZXF1aXJlKFwic29ydC1rZXlzLXJlY3Vyc2l2ZVwiKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzUmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBjYWNoZU1vZGVsRm9yUG9wdWxhdGUsXG4gIENhc2NhZGUsXG4gIGNyZWF0ZU9yVXBkYXRlLFxuICBnZXRQb3B1bGF0ZUtleSxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29udGV4dE9mUmVwb3NpdG9yeSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgYW4gZXhpc3RpbmcgbW9kZWwgb3IgY3JlYXRpbmcgYSBuZXcgb25lXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9PbmVPbkNyZWF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZSBleGlzdHNcbiAqXG4gKiAgIGFsdCBwcm9wZXJ0eVZhbHVlIGlzIG5vdCBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb09uZU9uQ3JlYXRlOiBpbm5lclJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+aW5uZXJSZXBvOiByZWFkKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlYWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IHNldCBtb2RlbFtrZXldID0gcHJvcGVydHlWYWx1ZVxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pk1vZGVsOiBnZXQoZGF0YS5jbGFzcylcbiAqICAgICBNb2RlbC0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjb25zdHJ1Y3RvclxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgICBSZXBvc2l0b3J5LS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwbzogY3JlYXRlKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgcmVwby0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjcmVhdGVkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBjcmVhdGVkXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9PbmVPbkNyZWF0ZTogcGtcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IGNyZWF0ZWRbcGtdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPbkNyZWF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgaW5uZXJSZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICAgICk7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IGlubmVyUmVwby5yZWFkKHByb3BlcnR5VmFsdWUsIGNvbnRleHQpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkKTtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkYXRhLmNsYXNzID1cbiAgICB0eXBlb2YgZGF0YS5jbGFzcyA9PT0gXCJzdHJpbmdcIiA/IGRhdGEuY2xhc3MgOiAoZGF0YS5jbGFzcyBhcyBhbnkpKCkubmFtZTtcblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChkYXRhLmNsYXNzIGFzIHVua25vd24gYXMgc3RyaW5nKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgQ291bGQgbm90IGZpbmQgbW9kZWwgJHtkYXRhLmNsYXNzfWApO1xuICBjb25zdCByZXBvOiBSZXBvPGFueT4gPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUocHJvcGVydHlWYWx1ZSwgY29udGV4dCk7XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY3JlYXRlZCk7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZCk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjcmVhdGVkW3BrXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB1cGRhdGVzXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIHVwZGF0aW5nIGEgbW9kZWwsIGVpdGhlciBieSByZWZlcmVuY2luZyBhbiBleGlzdGluZyBtb2RlbCBvciB1cGRhdGluZyB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25VcGRhdGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY3JlYXRlT3JVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgZmluZFByaW1hcnlLZXlcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uVXBkYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25VcGRhdGU6IGlubmVyUmVwb1xuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5pbm5lclJlcG86IHJlYWQocHJvcGVydHlWYWx1ZSlcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPblVwZGF0ZTogcmVhZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogc2V0IG1vZGVsW2tleV0gPSBwcm9wZXJ0eVZhbHVlXG4gKiAgIGVsc2UgcHJvcGVydHlWYWx1ZSBpcyBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y3JlYXRlT3JVcGRhdGU6IG1vZGVsW2tleV0sIGNvbnRleHRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0tPj5vbmVUb09uZU9uVXBkYXRlOiB1cGRhdGVkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmZpbmRQcmltYXJ5S2V5OiB1cGRhdGVkXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9PbmVPblVwZGF0ZTogcGtcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCB1cGRhdGVkW3BrXSwgdXBkYXRlZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBzZXQgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBpbm5lclJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICAgKTtcbiAgICBjb25zdCByZWFkID0gYXdhaXQgaW5uZXJSZXBvLnJlYWQocHJvcGVydHlWYWx1ZSwgY29udGV4dCk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWQpO1xuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZWQ6IGFueSA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKFxuICAgIG1vZGVsW2tleV0gYXMgTSxcbiAgICBjb250ZXh0LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKHVwZGF0ZWQpO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgdXBkYXRlZFtwa10gYXMgc3RyaW5nLFxuICAgIHVwZGF0ZWRcbiAgKTtcbiAgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGRlbGV0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIHRoZSByZWxhdGVkIG1vZGVsIGlmIGNhc2NhZGUgaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5vbmVUb09uZU9uRGVsZXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uRGVsZXRlLT4+b25lVG9PbmVPbkRlbGV0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25EZWxldGU6IGlubmVyUmVwb1xuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGEgTW9kZWwgaW5zdGFuY2VcbiAqICAgICBvbmVUb09uZU9uRGVsZXRlLT4+aW5uZXJSZXBvOiBkZWxldGUobW9kZWxba2V5XSwgY29udGV4dClcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkRlbGV0ZTogZGVsZXRlZFxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYSBNb2RlbCBpbnN0YW5jZVxuICogICAgIG9uZVRvT25lT25EZWxldGUtPj5pbm5lclJlcG86IGRlbGV0ZShtb2RlbFtrZXldW2lubmVyUmVwby5wa10sIGNvbnRleHQpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25EZWxldGU6IGRlbGV0ZWRcbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBkZWxldGVkW2lubmVyUmVwby5wa10sIGRlbGV0ZWRcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgaW5uZXJSZXBvOiBSZXBvPE0+ID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBsZXQgZGVsZXRlZDogTTtcbiAgaWYgKCEocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSlcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShtb2RlbFtrZXldIGFzIHN0cmluZywgY29udGV4dCk7XG4gIGVsc2VcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShcbiAgICAgIChtb2RlbFtrZXldIGFzIE0pW01vZGVsLnBrKGlubmVyUmVwby5jbGFzcykgYXMga2V5b2YgTV0gYXMgc3RyaW5nLFxuICAgICAgY29udGV4dFxuICAgICk7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICBkZWxldGVkW01vZGVsLnBrKGlubmVyUmVwby5jbGFzcyldIGFzIHN0cmluZyxcbiAgICBkZWxldGVkXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgbW9kZWxzIG9yIGNyZWF0aW5nIG5ldyBvbmVzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9NYW55T25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZXMgZXhpc3RzIGFuZCBoYXMgbGVuZ3RoXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIGFsbCBlbGVtZW50cyBoYXZlIHNhbWUgdHlwZVxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgYWx0IGFycmF5VHlwZSBpcyBub3QgXCJvYmplY3RcIlxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVwb1xuICogICAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG86IHJlYWQoaWQpXG4gKiAgICAgICByZXBvLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIHJlYWRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdXG4gKiAgIGVsc2UgYXJyYXlUeXBlIGlzIFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBwcm9wZXJ0eVZhbHVlc1swXVxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBwa05hbWVcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgcmVzdWx0IHNldFxuICogICAgIGxvb3AgZm9yIGVhY2ggbSBpbiBwcm9wZXJ0eVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jcmVhdGVPclVwZGF0ZTogbSwgY29udGV4dFxuICogICAgICAgY3JlYXRlT3JVcGRhdGUtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlY29yZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFkZCByZWNvcmRbcGtOYW1lXSB0byByZXN1bHRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi5yZXN1bHRdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5PE0+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcyB8fCAhcHJvcGVydHlWYWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1swXTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFsuLi5wcm9wZXJ0eVZhbHVlc10pO1xuICBpZiAoYXJyYXlUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXksIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoaWQsIGNvbnRleHQpO1xuICAgICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkKTtcbiAgICB9XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBrTmFtZSA9IE1vZGVsLnBrKHByb3BlcnR5VmFsdWVzWzBdKTtcblxuICBjb25zdCByZXN1bHQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBwcm9wZXJ0eVZhbHVlcykge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKG0sIGNvbnRleHQsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmQpO1xuICAgIHJlc3VsdC5hZGQocmVjb3JkW3BrTmFtZV0pO1xuICB9XG5cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi5yZXN1bHRdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBkZWxldGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gZGVsZXRpbmcgYSBtb2RlbCwgZGVsZXRpbmcgYWxsIHJlbGF0ZWQgbW9kZWxzIGlmIGNhc2NhZGUgZGVsZXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25EZWxldGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIGNhc2NhZGUuZGVsZXRlIGlzIENBU0NBREVcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgdmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqXG4gKiAgIGFsdCBpc0luc3RhbnRpYXRlZCAoYXJyYXlUeXBlIGlzIFwib2JqZWN0XCIpXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbCh2YWx1ZXNbMF0pXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb01hbnlPbkRlbGV0ZTogcmVwb1xuICogICBlbHNlIG5vdCBpbnN0YW50aWF0ZWRcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBpZCBpbiB1bmlxdWVWYWx1ZXNcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG86IGRlbGV0ZShpZCwgY29udGV4dClcbiAqICAgICByZXBvLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkYXRhLmNhc2NhZGUuZGVsZXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgdmFsdWVzID0gbW9kZWxba2V5XSBhcyBhbnk7XG4gIGlmICghdmFsdWVzIHx8ICF2YWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiB2YWx1ZXNbMF07XG4gIGNvbnN0IGFyZUFsbFNhbWVUeXBlID0gdmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpO1xuICBpZiAoIWFyZUFsbFNhbWVUeXBlKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IGlzSW5zdGFudGlhdGVkID0gYXJyYXlUeXBlID09PSBcIm9iamVjdFwiO1xuICBjb25zdCByZXBvID0gaXNJbnN0YW50aWF0ZWRcbiAgICA/IFJlcG9zaXRvcnkuZm9yTW9kZWwodmFsdWVzWzBdLCB0aGlzLmFkYXB0ZXIuYWxpYXMpXG4gICAgOiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuXG4gIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoW1xuICAgIC4uLihpc0luc3RhbnRpYXRlZFxuICAgICAgPyB2YWx1ZXMubWFwKFxuICAgICAgICAgICh2OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2W01vZGVsLnBrKHRoaXMuY2xhc3MpIGFzIHN0cmluZ11cbiAgICAgICAgKVxuICAgICAgOiB2YWx1ZXMpLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IGlkIG9mIHVuaXF1ZVZhbHVlcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCwgY29udGV4dCk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkKTtcbiAgfVxuICAobW9kZWwgYXMgYW55KVtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvcHVsYXRlcyBhIG1vZGVsJ3MgcmVsYXRpb25zaGlwXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGF0dGFjaGVzIHJlbGF0ZWQgbW9kZWxzIHRvIGEgbW9kZWwncyByZWxhdGlvbnNoaXAgcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gcG9wdWxhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcG9wdWxhdGVcbiAqICAgcGFydGljaXBhbnQgZmV0Y2hQb3B1bGF0ZVZhbHVlc1xuICogICBwYXJ0aWNpcGFudCBnZXRQb3B1bGF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKlxuICogICBDYWxsZXItPj5wb3B1bGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBjaGVjayBpZiBkYXRhLnBvcHVsYXRlIGlzIHRydWVcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogZ2V0IG5lc3RlZCB2YWx1ZSBhbmQgY2hlY2sgaWYgaXQgZXhpc3RzXG4gKlxuICogICBwb3B1bGF0ZS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF1cbiAqXG4gKiAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBpbml0aWFsaXplIHZhcmlhYmxlc1xuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBwcm9LZXlWYWx1ZSBpbiBwcm9wS2V5VmFsdWVzXG4gKiAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmdldFBvcHVsYXRlS2V5OiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWVcbiAqICAgICBnZXRQb3B1bGF0ZUtleS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBjYWNoZUtleVxuICpcbiAqICAgICBhbHQgdHJ5IHRvIGdldCBmcm9tIGNhY2hlXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Q29udGV4dDogZ2V0KGNhY2hlS2V5KVxuICogICAgICAgQ29udGV4dC0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiB2YWxcbiAqICAgICBlbHNlIGNhdGNoIGVycm9yXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBwcm9wTmFtZVxuICogICAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogcmVwb1xuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PnJlcG86IHJlYWQocHJvS2V5VmFsdWUpXG4gKiAgICAgICByZXBvLS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVuZFxuICpcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogYWRkIHZhbCB0byByZXN1bHRzXG4gKiAgIGVuZFxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0tPj5wb3B1bGF0ZTogcmVzdWx0c1xuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBzZXQgbW9kZWxba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdXG4gKiAgIHBvcHVsYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZlJlcG9zaXRvcnk8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEucG9wdWxhdGUpIHJldHVybjtcbiAgY29uc3QgbmVzdGVkOiBhbnkgPSBtb2RlbFtrZXldO1xuICBjb25zdCBpc0FyciA9IEFycmF5LmlzQXJyYXkobmVzdGVkKTtcbiAgaWYgKHR5cGVvZiBuZXN0ZWQgPT09IFwidW5kZWZpbmVkXCIgfHwgKGlzQXJyICYmIG5lc3RlZC5sZW5ndGggPT09IDApKSByZXR1cm47XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjOiBDb250ZXh0T2ZSZXBvc2l0b3J5PFI+LFxuICAgIG1vZGVsOiBNLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgcHJvcEtleVZhbHVlczogYW55W10sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGV0IHZhbDogYW55O1xuICAgIGNvbnN0IHJlc3VsdHM6IE1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvS2V5VmFsdWUgb2YgcHJvcEtleVZhbHVlcykge1xuICAgICAgY2FjaGVLZXkgPSBnZXRQb3B1bGF0ZUtleShtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsID0gYXdhaXQgYy5nZXQoY2FjaGVLZXkgYXMgYW55KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBwcm9wTmFtZSBhcyBrZXlvZiBNLFxuICAgICAgICAgIGFsaWFzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVwbykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCByZXBvXCIpO1xuICAgICAgICB2YWwgPSBhd2FpdCByZXBvLnJlYWQocHJvS2V5VmFsdWUsIGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXkgYXMgc3RyaW5nLFxuICAgIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF0sXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBpc0FyciA/IHJlcyA6IHJlc1swXTtcbn1cbiIsImltcG9ydCB7XG4gIExvZ2dlckZhY3RvcnksXG4gIExvZ2dpbmcsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE1pbmlMb2dnZXIsXG4gIE51bWVyaWNMb2dMZXZlbHMsXG4gIFN0cmluZ0xpa2UsXG59IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQ29udGV4dCBhcyBDdHggfSBmcm9tIFwiZmFicmljLWNvbnRyYWN0LWFwaVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RzXG4gKiBAc3VtbWFyeSBBZGFwdHMgdGhlIHN0YW5kYXJkIGxvZ2dpbmcgaW50ZXJmYWNlIHRvIHdvcmsgd2l0aCBGYWJyaWMncyBjaGFpbmNvZGUgY29udGV4dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0IC0gVGhlIGxvZ2dpbmcgY29udGV4dCBuYW1lXG4gKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz4gfCB1bmRlZmluZWR9IGNvbmYgLSBPcHRpb25hbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gKlxuICogQGNsYXNzIENvbnRyYWN0TG9nZ2VyXG4gKiBAZXh0ZW5kcyB7TWluaUxvZ2dlcn1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RcbiAqIGltcG9ydCB7IENvbnRyYWN0TG9nZ2VyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBAVHJhbnNhY3Rpb24oKVxuICogICBhc3luYyBteUZ1bmN0aW9uKGN0eDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICogICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBDb250cmFjdExvZ2dlcignTXlDb250cmFjdCcsIHsgbGV2ZWw6ICdpbmZvJyB9LCBjdHgpO1xuICpcbiAqICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyB0cmFuc2FjdGlvbicpO1xuICogICAgIGxvZ2dlci5kZWJ1ZygnVHJhbnNhY3Rpb24gZGV0YWlsczonLCB7IC4uLiB9KTtcbiAqXG4gKiAgICAgLy8gRG8gc29tZXRoaW5nXG4gKlxuICogICAgIGxvZ2dlci5pbmZvKCdUcmFuc2FjdGlvbiBjb21wbGV0ZScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyYWN0TG9nZ2VyIGV4dGVuZHMgTWluaUxvZ2dlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHVuZGVybHlpbmcgRmFicmljIGxvZ2dlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGxvZ2dlciE6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb250ZXh0OiBzdHJpbmcsXG4gICAgY29uZjogUGFydGlhbDxMb2dnaW5nQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgICBjdHg/OiBDdHhcbiAgKSB7XG4gICAgc3VwZXIoY29udGV4dCwgY29uZik7XG5cbiAgICBpZiAoIWN0eCkge1xuICAgICAgdGhpcy5sb2dnZXIgPSBuZXcgTWluaUxvZ2dlcihjb250ZXh0LCBjb25mKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIgPSBjdHgubG9nZ2luZy5nZXRMb2dnZXIoY29udGV4dCkgYXMgdW5rbm93biBhcyBMb2dnZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSBsb2cgbWV0aG9kIHRvIHVzZSB0aGUgRmFicmljIGNvbnRleHQncyBsb2dnZXJcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZSB8IEVycm9yfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBsb2dcbiAgICogQHBhcmFtIHtFcnJvcn0gW3N0YWNrXSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlIGZvciBlcnJvcnNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1zZzogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogRXJyb3JcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1t0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsXSA8XG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW2xldmVsXVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIGxldCBtZXRob2Q7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5pbmZvOlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5pbmZvO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgICAgbWV0aG9kID0gdGhpcy5sb2dnZXIudmVyYm9zZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmRlYnVnOlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5kZWJ1ZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmVycm9yOlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLnNpbGx5OlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5zaWxseTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgIH1cbiAgICBtZXRob2QuY2FsbCh0aGlzLmxvZ2dlciwgdGhpcy5jcmVhdGVMb2cobGV2ZWwsIG1zZywgc3RhY2spKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBDb250cmFjdExvZ2dlciBpbnN0YW5jZXNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgQ29udHJhY3RMb2dnZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCwgY29uZmlnLCBhbmQgRmFicmljIGNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3QgLSBUaGUgbG9nZ2luZyBjb250ZXh0IG5hbWVcbiAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPiB8IHVuZGVmaW5lZH0gY29uZmlnIC0gT3B0aW9uYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICogQHJldHVybiB7Q29udHJhY3RMb2dnZXJ9IEEgbmV3IENvbnRyYWN0TG9nZ2VyIGluc3RhbmNlXG4gKiBAZnVuY3Rpb24gZmFjdG9yeVxuICogQG1lbWJlck9mIG1vZHVsZTpmYWJyaWMuY29udHJhY3RzXG4gKi9cbmNvbnN0IGZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSAoXG4gIG9iamVjdD86IHN0cmluZyxcbiAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgY3R4PzogQ3R4XG4pID0+IHtcbiAgcmV0dXJuIG5ldyBDb250cmFjdExvZ2dlcihcbiAgICBvYmplY3QgfHwgQ29udHJhY3RMb2dnZXIubmFtZSxcbiAgICBjb25maWcgfHwge30sXG4gICAgY3R4IGFzIEN0eFxuICApO1xufTtcblxuLy8gU2V0IHRoZSBmYWN0b3J5IGFzIHRoZSBkZWZhdWx0IGxvZ2dlciBmYWN0b3J5XG5Mb2dnaW5nLnNldEZhY3RvcnkoZmFjdG9yeSk7XG4iLCJpbXBvcnQgeyBDb3VjaERCQWRhcHRlciwgQ291Y2hEQktleXMsIE1hbmdvUXVlcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBsaXN0LCBNb2RlbCwgcmVxdWlyZWQsIHR5cGUgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuL0NvbnRyYWN0Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgYWZ0ZXJBbnksXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBEQktleXMsXG4gIEdyb3VwU29ydCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25VcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWFkb25seSxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQgYXMgQ3R4LFxuICBPYmplY3QgYXMgRmFicmljT2JqZWN0LFxuICBQcm9wZXJ0eSBhcyBGYWJyaWNQcm9wZXJ0eSxcbn0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgU2VxdWVuY2UsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgQWRhcHRlcixcbiAgQ2FzY2FkZU1ldGFkYXRhLFxuICBKb2luQ29sdW1uT3B0aW9ucyxcbiAgb25lVG9NYW55T25VcGRhdGUsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIHJlbGF0aW9uLFxuICBQcmVwYXJlZE1vZGVsLFxuICBSZXBvc2l0b3J5LFxuICBRdWVyeUVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgQ29udGV4dHVhbGl6ZWRBcmdzLFxuICBMb2dnZXJPZixcbiAgQ29udGV4dCxcbiAgUmF3UmVzdWx0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dHVhbEFyZ3MsIE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVTdHViLFxuICBDbGllbnRJZGVudGl0eSxcbiAgSXRlcmF0b3JzLFxuICBTdGF0ZVF1ZXJ5UmVzcG9uc2UsXG59IGZyb20gXCJmYWJyaWMtc2hpbS1hcGlcIjtcbmltcG9ydCB7IEZhYnJpY1N0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplclwiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb09uZU9uQ3JlYXRlLFxuICBvbmVUb09uZU9uRGVsZXRlLFxuICBvbmVUb09uZU9uVXBkYXRlLFxuICBwb3B1bGF0ZSBhcyBwb3AsXG59IGZyb20gXCIuL0ZhYnJpY0NvbnN0cnVjdGlvblwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvbnRyYWN0TG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIG9yIHVwZGF0ZXIgZmllbGQgaW4gYSBtb2RlbCBiYXNlZCBvbiB0aGUgdXNlciBpbiB0aGUgY29udGV4dFxuICogQHN1bW1hcnkgQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBpbiBkZWNvcmF0b3JzIHRvIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBjcmVhdGVkX2J5IG9yIHVwZGF0ZWRfYnkgZmllbGRzXG4gKiB3aXRoIHRoZSB1c2VybmFtZSBmcm9tIHRoZSBjb250ZXh0IHdoZW4gYSBkb2N1bWVudCBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgTmFub1JlcG9zaXRvcnk8TT5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0Q29udGV4dH0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIHVzZXIgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbiBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IHdpdGggdGhlIHVzZXJuYW1lXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZmFicmljLmNvbnRyYWN0c1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBGIGFzIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBGLT4+QzogZ2V0KFwidXNlclwiKVxuICogICBDLS0+PkY6IHVzZXIgb2JqZWN0XG4gKiAgIEYtPj5NOiBzZXQga2V5IHRvIHVzZXIubmFtZVxuICogICBOb3RlIG92ZXIgRjogSWYgbm8gdXNlciBpbiBjb250ZXh0XG4gKiAgIEYtLT4+RjogdGhyb3cgVW5zdXBwb3J0ZWRFcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgQ2xpZW50SWRlbnRpdHk7XG4gICAgbW9kZWxba2V5XSA9IHVzZXIuZ2V0SUQoKSBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBhdXRvLWFzc2lnbm1lbnQgY2FsbGJhY2sgZm9yIEZhYnJpYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgYXNzaWducyBhIHByaW1hcnkga2V5IHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbW9kZWwgcHJvcGVydHkgdXNpbmcgYSBGYWJyaWMtYmFja2VkIHNlcXVlbmNlIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWQuIElmIHRoZSBzZXF1ZW5jZSBuYW1lIGlzIG5vdCBwcm92aWRlZCBpbiBvcHRpb25zLCBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIG1vZGVsIHZpYSBzZXF1ZW5jZU5hbWVGb3JNb2RlbC4gVGhlIGFzc2lnbmVkIGtleSBpcyBkZWZpbmVkIGFzIG5vbi13cml0YWJsZSBhbmQgZW51bWVyYWJsZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWwgZm9yIHRoZSB0YXJnZXQgaW5zdGFuY2VcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IGZvciByZXBvc2l0b3J5IGNvbnRleHRcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgU2VxdWVuY2VPcHRpb25zIHRvIGNvbmZpZ3VyZSBzZXF1ZW5jZSBiZWhhdmlvclxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBGYWJyaWNDb250cmFjdEZsYWdzIGZvciBjb250ZXh0dWFsIGZsYWdzXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZSBpbnZva2luZyB0aGUgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RmFicmljQ29udHJhY3RDb250ZXh0fSBjb250ZXh0IC0gRmFicmljIGNvbnRyYWN0IGNvbnRleHQgY29udGFpbmluZyBpbnZvY2F0aW9uIG1ldGFkYXRhXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBTZXF1ZW5jZSBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIG9yIGxvY2F0ZSB0aGUgc2VxdWVuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZSB0byBhc3NpZ24gb24gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHJlY2VpdmUgdGhlIGdlbmVyYXRlZCBwcmltYXJ5IGtleVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiB0aGUga2V5IGlzIGFzc2lnbmVkIG9yIHdoZW4gbm8gYWN0aW9uIGlzIHJlcXVpcmVkXG4gKiBAZnVuY3Rpb24gcGtGYWJyaWNPbkNyZWF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNvbnRyYWN0c1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb250ZXh0PEY+XG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgRmFicmljQ29udHJhY3REQlNlcXVlbmNlXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgUi0+PlI6IGRlcml2ZSBzZXF1ZW5jZSBuYW1lIGlmIG1pc3NpbmdcbiAqICAgUi0+PlM6IGFkYXB0ZXIuU2VxdWVuY2Uob3B0aW9ucylcbiAqICAgUy0tPj5SOiBzZXF1ZW5jZSBpbnN0YW5jZVxuICogICBSLT4+UzogbmV4dChjb250ZXh0KVxuICogICBTLS0+PlI6IG5leHQgdmFsdWVcbiAqICAgUi0+Pk06IGRlZmluZSBub24td3JpdGFibGUgcHJpbWFyeSBrZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBrRmFicmljT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgZGF0YTogU2VxdWVuY2VPcHRpb25zLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnR5cGUgfHwgbW9kZWxba2V5XSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldFByaW1hcnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG4gIGlmICghZGF0YS5uYW1lKSBkYXRhLm5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG4gIGxldCBzZXF1ZW5jZTogU2VxdWVuY2U7XG4gIHRyeSB7XG4gICAgc2VxdWVuY2UgPSAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKGRhdGEpKSBhcyBTZXF1ZW5jZTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIFNlcXVlbmNlICR7ZGF0YS5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpO1xuICBzZXRQcmltYXJ5S2V5VmFsdWUobW9kZWwsIGtleSBhcyBzdHJpbmcsIG5leHQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIHN0YXRlIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgQ291Y2hEQi1saWtlIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlIGZyb20gd2l0aGluIGEgY2hhaW5jb2RlIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUgdm9pZCAtIE5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGZvciBjb250cmFjdCBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RDb250ZXh0IC0gQ29udGV4dCB0eXBlIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICogQGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGEgRmFicmljIGNoYWluY29kZSBjb250cmFjdCBjbGFzc1xuICogaW1wb3J0IHsgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBwcml2YXRlIGFkYXB0ZXIgPSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG4gKlxuICogICBAVHJhbnNhY3Rpb24oKVxuICogICBhc3luYyBjcmVhdGVBc3NldChjdHg6IENvbnRleHQsIGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICogICAgIGNvbnN0IG1vZGVsID0geyBpZCwgZGF0YSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gKiAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSgnYXNzZXRzJywgaWQsIG1vZGVsLCB7fSwgeyBzdHViOiBjdHguc3R1YiB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTdHViXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAqXG4gKiAgIENvbnRyYWN0LT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgY3R4KVxuICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IFNlcmlhbGl6ZSBtb2RlbCB0byBKU09OXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IHB1dFN0YXRlKGlkLCBzZXJpYWxpemVkRGF0YSlcbiAqICAgU3R1Yi0+PlN0YXRlREI6IFdyaXRlIGRhdGFcbiAqICAgU3RhdGVEQi0tPj5TdHViOiBTdWNjZXNzXG4gKiAgIFN0dWItLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBTdWNjZXNzXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0tPj5Db250cmFjdDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBhbnksXG4gIHZvaWQsXG4gIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRDbGllbnQoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJDbGllbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBGYWJyaWMgY29udHJhY3RzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGJpbmFyeSBkYXRhIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IHNlcmlhbGl6ZXIgPSBuZXcgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIoKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRleHQgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgQ29udGV4dCBjb25zdHJ1Y3RvciB3aXRoIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlYWRvbmx5IENvbnRleHQ6IENvbnN0cnVjdG9yPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4gPVxuICAgIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgTWFuZ29RdWVyeSwgRmFicmljQ29udHJhY3RBZGFwdGVyLCBGYWJyaWNDb250cmFjdEZsYWdzLCBGYWJyaWNDb250cmFjdENvbnRleHQ+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gICAgICBhbnksXG4gICAgICBBZGFwdGVyPGFueSwgdm9pZCwgTWFuZ29RdWVyeSwgQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgICA+LFxuICA+KCk6IENvbnN0cnVjdG9yPFI+IHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGFuIGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3ZvaWR9IHNjb3BlIC0gTm90IHVzZWQgaW4gdGhpcyBhZGFwdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogdm9pZCwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgRmFicmljRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZm9yKGNvbmZpZzogUGFydGlhbDxhbnk+LCAuLi5hcmdzOiBhbnkpOiB0eXBlb2YgdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLmZvcihjb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcmVjb3JkIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIChub3QgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgc3R1YiB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGUpO1xuICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIGNyZWF0ZSB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBhZGRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlIHdpdGggcGsgJHtpZH1gKTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLnB1dFN0YXRlKGNvbXBvc2VkS2V5LCBtb2RlbCwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGRlc2VyaWFsaXplcyBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgc3R1YiB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBsb2cuaW5mbyhgaW4gQURBUFRFUiByZWFkIHdpdGggYXJncyAke2FyZ3N9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxldCBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29tcG9zZWRLZXkgPSBzdHViLmNyZWF0ZUNvbXBvc2l0ZUtleSh0YWJsZU5hbWUsIFtTdHJpbmcoaWQpXSk7XG4gICAgICBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbCBhbmQgdXBkYXRlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBzdHViIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlIHdpdGggcGsgJHtpZH1gKTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLnB1dFN0YXRlKGNvbXBvc2VkS2V5LCBtb2RlbCwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlY29yZCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncywgc3R1YiB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbGV0IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb21wb3NlZEtleSA9IHN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGNsYXp6LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgICBsb2cudmVyYm9zZShgZGVsZXRpbmcgZW50cnkgd2l0aCBwayAke2lkfSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZVN0YXRlKGlkOiBzdHJpbmcsIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgY29uc3QgeyBzdHViIH0gPSB0aGlzLmxvZ0N0eChbY3R4XSwgdGhpcy5kZWxldGVTdGF0ZSk7XG4gICAgYXdhaXQgc3R1Yi5kZWxldGVTdGF0ZShpZCk7XG4gIH1cblxuICBmb3JQcml2YXRlKGNvbGxlY3Rpb246IHN0cmluZyk6IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB7XG4gICAgY29uc3QgdG9PdmVycmlkZSA9IFtcbiAgICAgIHRoaXMucHV0U3RhdGUsXG4gICAgICB0aGlzLnJlYWRTdGF0ZSxcbiAgICAgIHRoaXMuZGVsZXRlU3RhdGUsXG4gICAgICB0aGlzLnF1ZXJ5UmVzdWx0LFxuICAgICAgdGhpcy5xdWVyeVJlc3VsdFBhZ2luYXRlZCxcbiAgICBdLm1hcCgoZm4pID0+IGZuLm5hbWUpO1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKCF0b092ZXJyaWRlLmluY2x1ZGVzKHByb3AgYXMgc3RyaW5nKSlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoKHRhcmdldCBhcyBhbnkpW3Byb3BdLCB7XG4gICAgICAgICAgYXN5bmMgYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3NMaXN0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICAgICAgY2FzZSBcInB1dFN0YXRlXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3R1YiwgaWQsIG1vZGVsXSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0dWIucHV0UHJpdmF0ZURhdGEoY29sbGVjdGlvbiwgaWQudG9TdHJpbmcoKSwgbW9kZWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlU3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdHViLCBpZF0gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHN0dWIgYXMgQ2hhaW5jb2RlU3R1YikuZGVsZXRlUHJpdmF0ZURhdGEoXG4gICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJyZWFkU3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdHViLCBpZF0gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R1Yi5nZXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcInF1ZXJ5UmVzdWx0XCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3R1YiwgcmF3SW5wdXRdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0dWIuZ2V0UHJpdmF0ZURhdGFRdWVyeVJlc3VsdChjb2xsZWN0aW9uLCByYXdJbnB1dCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcInF1ZXJ5UmVzdWx0UGFnaW5hdGVkXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3R1YiwgcmF3SW5wdXQsIGxpbWl0LCBza2lwXSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gYXdhaXQgKFxuICAgICAgICAgICAgICAgICAgc3R1YiBhcyBDaGFpbmNvZGVTdHViXG4gICAgICAgICAgICAgICAgKS5nZXRQcml2YXRlRGF0YVF1ZXJ5UmVzdWx0KGNvbGxlY3Rpb24sIHJhd0lucHV0KTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHJlYWNoZWRCb29rbWFyayA9IHNraXAgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSAmJiByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRLZXkgPSByZXMudmFsdWUua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRWYWx1ZSA9IChyZXMudmFsdWUudmFsdWUgYXMgYW55KS50b1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICBcInV0ZjhcIlxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBza2lwLCBza2lwIHVudGlsIHdlIHJlYWNoIGl0XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVhY2hlZEJvb2ttYXJrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZEtleSA9PT0gc2tpcD8udG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlZEJvb2ttYXJrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIEtleTogcmVjb3JkS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIFJlY29yZDogSlNPTi5wYXJzZShyZWNvcmRWYWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsYXN0S2V5ID0gcmVjb3JkS2V5O1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSBsaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzIGFzIHVua25vd24gYXMgSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoZWRSZWNvcmRzQ291bnQ6IHJlc3VsdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFyazogbGFzdEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVzLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgYXMgdW5rbm93biBhcyBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaGVkUmVjb3Jkc0NvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgVW5zdXBwb3J0ZWQgbWV0aG9kIG92ZXJyaWRlICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwdXRTdGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICkge1xuICAgIGxldCBkYXRhOiBCdWZmZXI7XG5cbiAgICBjb25zdCB7IHN0dWIsIGxvZyB9ID0gdGhpcy5sb2dDdHgoW2N0eF0sIHRoaXMucHV0U3RhdGUpO1xuICAgIHRyeSB7XG4gICAgICBkYXRhID0gQnVmZmVyLmZyb20oXG4gICAgICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCBhcyBNb2RlbClcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgcmVjb3JkIHdpdGggaWQgJHtpZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjdHguZ2V0KFwic2VncmVnYXRlZFwiKTtcbiAgICBpZiAoY29sbGVjdGlvbikgYXdhaXQgc3R1Yi5wdXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpLCBkYXRhKTtcbiAgICBlbHNlIGF3YWl0IHN0dWIucHV0U3RhdGUoaWQudG9TdHJpbmcoKSwgZGF0YSk7XG5cbiAgICBsb2cuc2lsbHkoXG4gICAgICBgc3RhdGUgc3RvcmVkJHtjb2xsZWN0aW9uID8gYCBpbiAke2NvbGxlY3Rpb259IGNvbGxlY3Rpb25gIDogXCJcIn0gdW5kZXIgaWQgJHtpZH1gXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZFN0YXRlKGlkOiBzdHJpbmcsIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuXG4gICAgY29uc3QgeyBzdHViLCBsb2cgfSA9IHRoaXMubG9nQ3R4KFtjdHhdLCB0aGlzLnJlYWRTdGF0ZSk7XG4gICAgbGV0IHJlczogc3RyaW5nO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjdHguZ2V0KFwic2VncmVnYXRlZFwiKTtcbiAgICBpZiAoY29sbGVjdGlvbilcbiAgICAgIHJlcyA9IChhd2FpdCBzdHViLmdldFByaXZhdGVEYXRhKGNvbGxlY3Rpb24sIGlkLnRvU3RyaW5nKCkpKS50b1N0cmluZygpO1xuICAgIGVsc2UgcmVzID0gKGF3YWl0IHN0dWIuZ2V0U3RhdGUoaWQudG9TdHJpbmcoKSkpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoIXJlcylcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0ke2NvbGxlY3Rpb24gPyBgIGluICR7Y29sbGVjdGlvbn0gY29sbGVjdGlvbmAgOiBcIlwifSBub3QgZm91bmRgXG4gICAgICApO1xuICAgIGxvZy5zaWxseShcbiAgICAgIGBzdGF0ZSByZXRyaWV2ZWQgZnJvbSR7Y29sbGVjdGlvbiA/IGAgJHtjb2xsZWN0aW9ufSBjb2xsZWN0aW9uYCA6IFwiXCJ9IHVuZGVyIGlkICR7aWR9YFxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlcy50b1N0cmluZygpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcmVjb3JkOiAke2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBxdWVyeVJlc3VsdChcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViLFxuICAgIHJhd0lucHV0OiBhbnksXG5cbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkU3RhdGUpO1xuICAgIGxldCByZXM6IEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IGN0eC5nZXQoXCJzZWdyZWdhdGVkXCIpO1xuICAgIGlmIChjb2xsZWN0aW9uKVxuICAgICAgcmVzID0gYXdhaXQgc3R1Yi5nZXRQcml2YXRlRGF0YVF1ZXJ5UmVzdWx0KFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShyYXdJbnB1dClcbiAgICAgICk7XG4gICAgZWxzZSByZXMgPSBhd2FpdCBzdHViLmdldFF1ZXJ5UmVzdWx0KEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHF1ZXJ5UmVzdWx0UGFnaW5hdGVkKFxuICAgIHN0dWI6IENoYWluY29kZVN0dWIsXG4gICAgcmF3SW5wdXQ6IGFueSxcbiAgICBsaW1pdDogbnVtYmVyID0gMjUwLFxuICAgIHNraXA/OiBudW1iZXIsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdGF0ZVF1ZXJ5UmVzcG9uc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkU3RhdGUpO1xuICAgIGxldCByZXM6IFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPjtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gY3R4LmdldChcInNlZ3JlZ2F0ZWRcIik7XG4gICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJhd0lucHV0LnNlbGVjdG9yID0ge1xuICAgICAgICAuLi5yYXdJbnB1dC5zZWxlY3RvcixcbiAgICAgICAgX2lkOiBza2lwID8geyAkZ3Q6IHNraXAudG9TdHJpbmcoKSB9IDogeyAkZ3RlOiBcIlwiIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgaXQgPSBhd2FpdCBzdHViLmdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQoXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgICAgKTtcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgaXRlcmF0b3I6IGl0LFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIGZldGNoZWRSZWNvcmRzQ291bnQ6IGxpbWl0LFxuICAgICAgICAgIGJvb2ttYXJrOiBcIlwiLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGVsc2VcbiAgICAgIHJlcyA9IGF3YWl0IHN0dWIuZ2V0UXVlcnlSZXN1bHRXaXRoUGFnaW5hdGlvbihcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgc2tpcD8udG9TdHJpbmcoKVxuICAgICAgKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWVyZ2VNb2RlbHMocmVzdWx0czogUmVjb3JkPHN0cmluZywgYW55PltdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgZXh0cmFjdCA9IChtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PikgPT5cbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVsKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiKSBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICBsZXQgZmluYWxNb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHJlc3VsdHMucG9wKCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgIGZpbmFsTW9kZWwgPSBPYmplY3QuYXNzaWduKHt9LCBleHRyYWN0KGZpbmFsTW9kZWwpLCBleHRyYWN0KHJlcykpO1xuICAgIH1cblxuICAgIHJldHVybiBmaW5hbE1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGJpbmFyeSBkYXRhIHRvIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmcgdXNpbmcgVVRGLTggZW5jb2RpbmdcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBidWZmZXIgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVjb2RlKGJ1ZmZlcjogVWludDhBcnJheSkge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIudGV4dERlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3BlcmF0aW9uIGZsYWdzIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICAgKiBAc3VtbWFyeSBNZXJnZXMgZGVmYXVsdCBmbGFncyB3aXRoIEZhYnJpYy1zcGVjaWZpYyBjb250ZXh0IGluZm9ybWF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8RmFicmljQ29udHJhY3RGbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBtZXJnZSB3aXRoIGRlZmF1bHRzXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEByZXR1cm4ge0ZhYnJpY0NvbnRyYWN0RmxhZ3N9IFRoZSBtZXJnZWQgZmxhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ29udHJhY3RGbGFncz4sXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGYWJyaWNDb250cmFjdEZsYWdzPiB7XG4gICAgY29uc3QgYmFzZUZsYWdzID0ge1xuICAgICAgc3R1YjogY3R4LnN0dWIsXG4gICAgICBzZWdyZWdhdGVkOiBmYWxzZSxcbiAgICB9O1xuICAgIGlmIChjdHggaW5zdGFuY2VvZiBGYWJyaWNDb250cmFjdENvbnRleHQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCB7XG4gICAgICAgIGxvZ2dlcjogY3R4LmxvZ2dlcixcbiAgICAgICAgaWRlbnRpdHk6IGN0eC5pZGVudGl0eSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY3R4LnN0dWIuZ2V0VHhJRCgpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCB7XG4gICAgICAgIGlkZW50aXR5OiBjdHguY2xpZW50SWRlbnRpdHksXG4gICAgICAgIGxvZ2dlcjogbmV3IENvbnRyYWN0TG9nZ2VyKHRoaXMgYXMgYW55LCB1bmRlZmluZWQsIGN0eCksXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGN0eC5zdHViLmdldFR4SUQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZsYWdzID0gKGF3YWl0IHN1cGVyLmZsYWdzKFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgbW9kZWwsXG4gICAgICBiYXNlRmxhZ3MgYXMgYW55LFxuICAgICAgLi4uYXJnc1xuICAgICkpIGFzIEZhYnJpY0NvbnRyYWN0RmxhZ3M7XG5cbiAgICByZXR1cm4gZmxhZ3MgYXMgRmFicmljQ29udHJhY3RGbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmRleCBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEZhYnJpYyBjb250cmFjdHMgYW5kIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaW5kZXg8TT4obW9kZWxzOiBDb25zdHJ1Y3RvcjxNPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHJlc3VsdHMgZnJvbSBhIHN0YXRlIHF1ZXJ5IGl0ZXJhdG9yXG4gICAqIEBzdW1tYXJ5IEl0ZXJhdGVzIHRocm91Z2ggcXVlcnkgcmVzdWx0cyBhbmQgY29udmVydHMgdGhlbSB0byBhIHN0cnVjdHVyZWQgZm9ybWF0XG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcGFyYW0ge0l0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3J9IGl0ZXJhdG9yIC0gVGhlIHN0YXRlIHF1ZXJ5IGl0ZXJhdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSGlzdG9yeT1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgaXMgYSBoaXN0b3J5IHF1ZXJ5XG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiBwcm9jZXNzZWQgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSZXN1bHRJdGVyYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IEl0ZXJhdG9yXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmVzdWx0SXRlcmF0b3I6IHJlc3VsdEl0ZXJhdG9yKGxvZywgaXRlcmF0b3IsIGlzSGlzdG9yeSlcbiAgICogICBsb29wIFVudGlsIGRvbmVcbiAgICogICAgIFJlc3VsdEl0ZXJhdG9yLT4+SXRlcmF0b3I6IG5leHQoKVxuICAgKiAgICAgSXRlcmF0b3ItLT4+UmVzdWx0SXRlcmF0b3I6IHsgdmFsdWUsIGRvbmUgfVxuICAgKiAgICAgYWx0IEhhcyB2YWx1ZVxuICAgKiAgICAgICBSZXN1bHRJdGVyYXRvci0+PlJlc3VsdEl0ZXJhdG9yOiBQcm9jZXNzIHZhbHVlIGJhc2VkIG9uIGlzSGlzdG9yeVxuICAgKiAgICAgICBSZXN1bHRJdGVyYXRvci0+PlJlc3VsdEl0ZXJhdG9yOiBBZGQgdG8gcmVzdWx0cyBhcnJheVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgUmVzdWx0SXRlcmF0b3ItPj5JdGVyYXRvcjogY2xvc2UoKVxuICAgKiAgIFJlc3VsdEl0ZXJhdG9yLS0+PkNhbGxlcjogYWxsUmVzdWx0c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3VsdEl0ZXJhdG9yKFxuICAgIGxvZzogTG9nZ2VyLFxuICAgIGl0ZXJhdG9yOiBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yLFxuICAgIGlzSGlzdG9yeSA9IGZhbHNlXG4gICkge1xuICAgIGNvbnN0IGFsbFJlc3VsdHMgPSBbXTtcbiAgICBsZXQgcmVzOiB7IHZhbHVlOiBhbnk7IGRvbmU6IGJvb2xlYW4gfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICB3aGlsZSAoIXJlcy5kb25lKSB7XG4gICAgICBpZiAocmVzLnZhbHVlICYmIHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgIGxldCBqc29uUmVzOiBhbnkgPSB7fTtcbiAgICAgICAgbG9nLmRlYnVnKHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICBpZiAoaXNIaXN0b3J5IC8qICYmIGlzSGlzdG9yeSA9PT0gdHJ1ZSovKSB7XG4gICAgICAgICAganNvblJlcy5UeElkID0gcmVzLnZhbHVlLnR4SWQ7XG4gICAgICAgICAganNvblJlcy5UaW1lc3RhbXAgPSByZXMudmFsdWUudGltZXN0YW1wO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uUmVzLlZhbHVlID0gSlNPTi5wYXJzZShyZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICBqc29uUmVzLlZhbHVlID0gcmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25SZXMgPSBKU09OLnBhcnNlKHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGpzb25SZXMgPSByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhbGxSZXN1bHRzLnB1c2goanNvblJlcyk7XG4gICAgICB9XG4gICAgICByZXMgPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgQ2xvc2luZyBpdGVyYXRvciBhZnRlciAke2FsbFJlc3VsdHMubGVuZ3RofSByZXN1bHRzYCk7XG4gICAgaXRlcmF0b3IuY2xvc2UoKTsgLy8gcHVycG9zZWx5IG5vdCBhd2FpdC4gbGV0IGl0ZXJhdG9yIGNsb3NlIG9uIGl0cyBvd25cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSByaWNoIHF1ZXJ5IHVzaW5nIENvdWNoREIgc3ludGF4IGFnYWluc3QgdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBkb2NzT25seSAtIFdoZXRoZXIgdG8gcmV0dXJuIG9ubHkgZG9jdW1lbnRzIChub3QgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNDb250cmFjdEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdHViXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVEQlxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogcmF3KHJhd0lucHV0LCBkb2NzT25seSwgY3R4KVxuICAgKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogRXh0cmFjdCBsaW1pdCBhbmQgc2tpcFxuICAgKiAgIGFsdCBXaXRoIHBhZ2luYXRpb25cbiAgICogICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IGdldFF1ZXJ5UmVzdWx0V2l0aFBhZ2luYXRpb24ocXVlcnksIGxpbWl0LCBza2lwKVxuICAgKiAgIGVsc2UgV2l0aG91dCBwYWdpbmF0aW9uXG4gICAqICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5TdHViOiBnZXRRdWVyeVJlc3VsdChxdWVyeSlcbiAgICogICBlbmRcbiAgICogICBTdHViLT4+U3RhdGVEQjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIFN0YXRlREItLT4+U3R1YjogSXRlcmF0b3JcbiAgICogICBTdHViLS0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogSXRlcmF0b3JcbiAgICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IHJlc3VsdEl0ZXJhdG9yKGxvZywgaXRlcmF0b3IpXG4gICAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLS0+PkNhbGxlcjogcmVzdWx0c1xuICAgKi9cbiAgYXN5bmMgcmF3PFIsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJhd1Jlc3VsdDxSLCBEPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBzdHViIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG5cbiAgICBjb25zdCB7IHNraXAsIGxpbWl0IH0gPSByYXdJbnB1dDtcbiAgICBsZXQgaXRlcmF0b3I6IEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I7XG4gICAgaWYgKGxpbWl0IHx8IHNraXApIHtcbiAgICAgIGRlbGV0ZSByYXdJbnB1dFtcImxpbWl0XCJdO1xuICAgICAgZGVsZXRlIHJhd0lucHV0W1wic2tpcFwiXTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFJldHJpZXZpbmcgcGFnaW5hdGVkIGl0ZXJhdG9yOiBsaW1pdDogJHtsaW1pdH0vIHNraXA6ICR7c2tpcH1gXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2U6IFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPiA9XG4gICAgICAgIChhd2FpdCB0aGlzLnF1ZXJ5UmVzdWx0UGFnaW5hdGVkKFxuICAgICAgICAgIHN0dWIsXG4gICAgICAgICAgcmF3SW5wdXQsXG4gICAgICAgICAgbGltaXQgfHwgMjUwLFxuICAgICAgICAgIChza2lwIGFzIGFueSk/LnRvU3RyaW5nKClcbiAgICAgICAgKSkgYXMgU3RhdGVRdWVyeVJlc3BvbnNlPEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I+O1xuICAgICAgaXRlcmF0b3IgPSByZXNwb25zZS5pdGVyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFwiUmV0cmlldmluZyBpdGVyYXRvclwiKTtcbiAgICAgIGl0ZXJhdG9yID0gKGF3YWl0IHRoaXMucXVlcnlSZXN1bHQoXG4gICAgICAgIHN0dWIsXG4gICAgICAgIHJhd0lucHV0XG4gICAgICApKSBhcyBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yO1xuICAgIH1cbiAgICBsb2cuZGVidWcoXCJJdGVyYXRvciBhY3F1aXJlZFwiKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSAoYXdhaXQgdGhpcy5yZXN1bHRJdGVyYXRvcihsb2csIGl0ZXJhdG9yKSkgYXMgUjtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcmV0dXJuaW5nICR7QXJyYXkuaXNBcnJheShyZXN1bHRzKSA/IHJlc3VsdHMubGVuZ3RoIDogMX0gcmVzdWx0c2BcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IEZhYnJpY1N0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY1N0YXRlbWVudCh0aGlzIGFzIGFueSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTGFiZWwgPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVMYWJlbH0gdGFibGVgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLmNyZWF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uY3R4QXJncykpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVMYWJlbCA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIGxvZy5kZWJ1ZyhgVXBkYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZUxhYmVsfSB0YWJsZWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5jdHhBcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtcbiAgICogQHBhcmFtIGFyZ3NcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByZXBhcmVkTW9kZWwge1xuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuXG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhzcGxpdC5tb2RlbCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gYWNjdW07XG4gICAgICAgIGNvbnN0IG1hcHBlZFByb3AgPSBNb2RlbC5jb2x1bW5OYW1lKG1vZGVsLCBrZXkgYXMgYW55KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gICAgbG9nLnNpbGx5KFxuICAgICAgYFByZXBhcmluZyByZWNvcmQgZm9yICR7dGFibGVOYW1lfSB0YWJsZSB3aXRoIHBrICR7KG1vZGVsIGFzIGFueSlbcGtdfWBcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IChtb2RlbCBhcyBhbnkpW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH1gKTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhtKS5yZWR1Y2UoKGFjY3VtOiBNLCBrZXkpID0+IHtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAgICAgb2JqW01vZGVsLmNvbHVtbk5hbWUoYWNjdW0sIGtleSBhcyBhbnkpXTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBtKTtcblxuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gcmVzdWx0ICYmIChyZXN1bHQgYXMgYW55KVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIHJlc3VsdFtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG5cbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc10gYXMgW1xuICAgICAgQ29uc3RydWN0b3I8TT4sXG4gICAgICBQcmltYXJ5S2V5VHlwZSxcbiAgICAgIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICAuLi5hbnlbXSxcbiAgICAgIEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuXG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdIGFzIFtcbiAgICAgIENvbnN0cnVjdG9yPE0+LFxuICAgICAgUHJpbWFyeUtleVR5cGUsXG4gICAgICBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgLi4uYW55W10sXG4gICAgICBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBbLi4uYW55LCBGYWJyaWNDb250cmFjdENvbnRleHRdXG4gICk6IChzdHJpbmcgfCBzdHJpbmdbXSB8IG51bWJlcltdIHwgUmVjb3JkPHN0cmluZywgYW55PltdKVtdIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0ID0gYXJncy5wb3AoKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkcywgcmVjb3JkcywgY3R4IGFzIGFueV07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogWy4uLmFueSwgRmFicmljQ29udHJhY3RDb250ZXh0XVxuICApIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0ID0gYXJncy5wb3AoKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkcywgcmVjb3JkcywgY3R4IGFzIGFueV07XG4gIH1cblxuICBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KFxuICAgIGVycjogRXJyb3IgfCBzdHJpbmcsXG4gICAgcmVhc29uPzogc3RyaW5nXG4gICk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIucGFyc2VFcnJvcihyZWFzb24gfHwgZXJyKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGxvZ0N0eDxBUkdTIGV4dGVuZHMgYW55W10+KFxuICAgIGFyZ3M6IEFSR1MsXG4gICAgbWV0aG9kOiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgc3RyaW5nXG4gICk6IENvbnRleHR1YWxpemVkQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+ICYge1xuICAgIHN0dWI6IENoYWluY29kZVN0dWI7XG4gICAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xuICB9IHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RBZGFwdGVyLmxvZ0N0eC5jYWxsKHRoaXMsIGFyZ3MsIG1ldGhvZCBhcyBhbnkpIGFzIGFueTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6IHN0cmluZ1xuICApOiBDb250ZXh0dWFsaXplZEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPiAmIHtcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViO1xuICAgIGlkZW50aXR5OiBDbGllbnRJZGVudGl0eTtcbiAgfTtcbiAgc3RhdGljIG92ZXJyaWRlIGxvZ0N0eDxBUkdTIGV4dGVuZHMgYW55W10+KFxuICAgIHRoaXM6IGFueSxcbiAgICBhcmdzOiBBUkdTLFxuICAgIG1ldGhvZDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgKTogQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgICBpZGVudGl0eTogQ2xpZW50SWRlbnRpdHk7XG4gIH07XG4gIHN0YXRpYyBvdmVycmlkZSBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBzdHJpbmdcbiAgKTogQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgICBpZGVudGl0eTogQ2xpZW50SWRlbnRpdHk7XG4gIH0ge1xuICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gY29udGV4dCBwcm92aWRlZFwiKTtcbiAgICBjb25zdCBjdHggPSBhcmdzLnBvcCgpIGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcblxuICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBjb250ZXh0IHByb3ZpZGVkXCIpO1xuICAgIGlmIChhcmdzLmZpbHRlcigoYSkgPT4gYSBpbnN0YW5jZW9mIENvbnRleHQpLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJoZXJlXCIpO1xuICAgIGNvbnN0IGxvZyA9IChcbiAgICAgIHRoaXNcbiAgICAgICAgPyBjdHgubG9nZ2VyLmZvcih0aGlzKS5mb3IobWV0aG9kKVxuICAgICAgICA6IGN0eC5sb2dnZXIuY2xlYXIoKS5mb3IodGhpcykuZm9yKG1ldGhvZClcbiAgICApIGFzIExvZ2dlck9mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD47XG4gICAgcmV0dXJuIHtcbiAgICAgIGN0eDogY3R4LFxuICAgICAgbG9nOiBtZXRob2QgPyAobG9nLmZvcihtZXRob2QpIGFzIExvZ2dlck9mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4pIDogbG9nLFxuICAgICAgc3R1YjogY3R4LnN0dWIsXG4gICAgICBpZGVudGl0eTogY3R4LmlkZW50aXR5LFxuICAgICAgY3R4QXJnczogWy4uLmFyZ3MsIGN0eF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IgfCBzdHJpbmcpOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcbiAgICBjb25zdCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1ldGhvZCBmb3IgZGVjb3JhdGlvbiBvdmVycmlkZXNcbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzL2V4dGVuZHMgZGVjYWYgZGVjb3JhdGlvbiB3aXRoIEZhYnJpYy1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5XG4gICAqIEBzdGF0aWNcbiAgICogQG92ZXJyaWRlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgZGVjb3JhdGlvbigpOiB2b2lkIHtcbiAgICBzdXBlci5kZWNvcmF0aW9uKCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZLCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZLCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihEQktleXMuSUQpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBwa0RlYyhcbiAgICAgICAgICBvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMsXG4gICAgICAgICAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwa0RlYyhvYmo6IGFueSwgYXR0cjogYW55KSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgICAgIHByb3BNZXRhZGF0YShNZXRhZGF0YS5rZXkoREJLZXlzLklELCBhdHRyKSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgIG9uQ3JlYXRlKHBrRmFicmljT25DcmVhdGUgYXMgYW55LCBvcHRpb25zLCBncm91cHNvcnQpXG4gICAgICAgICAgICApKG9iaiwgYXR0cik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pXG4gICAgICAuZXh0ZW5kKEZhYnJpY1Byb3BlcnR5KCkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKVxuICAgICAgLmV4dGVuZChmdW5jdGlvbiB0YWJsZShvYmo6IGFueSkge1xuICAgICAgICAvLyBjb25zdCBjaGFpbjogYW55W10gPSBbXTtcblxuICAgICAgICAvLyBsZXQgY3VycmVudCA9IG9iajtcblxuICAgICAgICAvLyBkbyB7XG4gICAgICAgIC8vICAgY2hhaW4ucHVzaChjdXJyZW50KTtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhgRm91bmQgY2xhc3M6ICR7Y3VycmVudH1gKTtcbiAgICAgICAgLy8gfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuICAgICAgICAvLyBkbyB7XG4gICAgICAgIC8vICAgY3VycmVudCA9IGNoYWluLnBvcCgpO1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKGBBcHBseWluZyBAT2JqZWN0KCkgdG8gY2xhc3M6ICR7Y3VycmVudH1gKTtcbiAgICAgICAgLy8gICAvL1RPRE86IFRISVMgSVMgTk9UIFdPUktJTkcgQU5EIFRIUk9XUyBFUlJPUlxuICAgICAgICAvLyAgIC8vIEZhYnJpY09iamVjdCgpKGN1cnJlbnQpO1xuICAgICAgICAvLyB9IHdoaWxlIChjaGFpbi5sZW5ndGggPiAxKTtcblxuICAgICAgICByZXR1cm4gRmFicmljT2JqZWN0KCkob2JqKTtcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIGZ1bmN0aW9uIG9uZVRvT25lRGVjPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICAgICAgZms/OiBzdHJpbmdcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICBjbGFzczogY2xhenosXG4gICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgIH07XG4gICAgICBpZiAoam9pbkNvbHVtbk9wdHMpIG1ldGEuam9pblRhYmxlID0gam9pbkNvbHVtbk9wdHM7XG4gICAgICBpZiAoZmspIG1ldGEubmFtZSA9IGZrO1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHJlbGF0aW9uKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FLCBtZXRhKSxcbiAgICAgICAgdHlwZShbY2xhenosIFN0cmluZywgTnVtYmVyLCBCaWdJbnRdKSxcbiAgICAgICAgb25DcmVhdGUob25lVG9PbmVPbkNyZWF0ZSBhcyBhbnksIG1ldGEpLFxuICAgICAgICBvblVwZGF0ZShvbmVUb09uZU9uVXBkYXRlIGFzIGFueSwgbWV0YSksXG4gICAgICAgIG9uRGVsZXRlKG9uZVRvT25lT25EZWxldGUgYXMgYW55LCBtZXRhKSxcbiAgICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FLCBtZXRhKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FKVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogb25lVG9PbmVEZWMsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gb25lVG9NYW55RGVjPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgICBmaz86IHN0cmluZ1xuICAgICkge1xuICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICBjbGFzczogY2xhenosXG4gICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgIH07XG4gICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHJlbGF0aW9uKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSwgbWV0YWRhdGEpLFxuICAgICAgICBsaXN0KFtjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPiwgU3RyaW5nLCBOdW1iZXJdKSxcbiAgICAgICAgb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUgYXMgYW55LCBtZXRhZGF0YSksXG4gICAgICAgIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAgIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlIGFzIGFueSwgbWV0YWRhdGEpLFxuICAgICAgICBhZnRlckFueShwb3AsIG1ldGFkYXRhKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSwgbWV0YWRhdGEpXG4gICAgICApO1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IG9uZVRvTWFueURlYyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cblxuRmFicmljQ29udHJhY3RBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7IEpTT05TZXJpYWxpemVyLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5pc3RpYyBKU09OIHNlcmlhbGl6ZXIgZm9yIEZhYnJpYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IEVuc3VyZXMgc3RhYmxlLCBkZXRlcm1pbmlzdGljIEpTT04gb3V0cHV0IGJ5IHNvcnRpbmcgb2JqZWN0IGtleXMgcmVjdXJzaXZlbHkgYmVmb3JlIHN0cmluZ2lmaWNhdGlvbiwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBGYWJyaWMgZW5kb3JzZW1lbnQgYW5kIGhhc2hpbmcuIEV4dGVuZHMgSlNPTlNlcmlhbGl6ZXIgdG8gcGx1ZyBpbnRvIGV4aXN0aW5nIERlY2FmIG1vZGVsIHNlcmlhbGl6YXRpb24gZmxvdy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIERlY2FmIE1vZGVsIHN1YnR5cGUgc2VyaWFsaXplZCBieSB0aGlzIGluc3RhbmNlXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICogQGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2VyaWFsaXplciA9IG5ldyBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxNeU1vZGVsPigpO1xuICogY29uc3QganNvbiA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsKTtcbiAqIGNvbnN0IHJlYnVpbHQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcbiAqICAgQ2FsbGVyLT4+RFM6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogcHJlU2VyaWFsaXplKG1vZGVsKVxuICogICBEUy0+PkRTOiBzb3J0LWtleXMtcmVjdXJzaXZlXG4gKiAgIERTLT4+RFM6IGpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcbiAqICAgRFMtLT4+Q2FsbGVyOiBzdHJpbmdcbiAqICAgQ2FsbGVyLT4+RFM6IGRlc2VyaWFsaXplKHN0cmluZylcbiAqICAgRFMtLT4+Q2FsbGVyOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbj4gZXh0ZW5kcyBKU09OU2VyaWFsaXplcjxNPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlc2VyaWFsaXplIGEgSlNPTiBzdHJpbmcgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgYmFzZSBKU09OU2VyaWFsaXplciBpbXBsZW1lbnRhdGlvbiB0byByZWJ1aWxkIHRoZSBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIEpTT04gc3RyaW5nIHRvIGRlc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge019IFRoZSByZWNvbnN0cnVjdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZyk6IE0ge1xuICAgIHJldHVybiBzdXBlci5kZXNlcmlhbGl6ZShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJpYWxpemUgYSBtb2RlbCBpbnRvIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwgd2l0aCBwcmVTZXJpYWxpemUsIHNvcnRzIGtleXMgcmVjdXJzaXZlbHksIGFuZCBzdHJpbmdpZmllcyBkZXRlcm1pbmlzdGljYWxseSBmb3Igc3RhYmxlIG9yZGVyaW5nXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRGV0ZXJtaW5pc3RpYyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKFwianNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1wiKTtcbiAgICBjb25zdCBzb3J0S2V5c1JlY3Vyc2l2ZSA9IHJlcXVpcmUoXCJzb3J0LWtleXMtcmVjdXJzaXZlXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNSZWN1cnNpdmUodGhpcy5wcmVTZXJpYWxpemUobW9kZWwpKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB9IGZyb20gXCIuLi9Db250cmFjdEFkYXB0ZXJcIjtcbmltcG9ydCB7IENvbnRyYWN0LCBDb250ZXh0IGFzIEN0eCB9IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBNb2RlbCwgU2VyaWFsaXplciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgQ29udGV4dCxcbiAgQ29udGV4dHVhbGl6ZWRBcmdzLFxuICBMb2dnZXJPZixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0RldGVybWluaXN0aWNTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2hlY2thYmxlLCBoZWFsdGhjaGVjayB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW50ZXJmYWNlcy9DaGVja2FibGVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi4vQ29udHJhY3RDb250ZXh0XCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENoYWluY29kZVN0dWIsIENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNvbnRyYWN0IGNsYXNzIGZvciBDUlVEIG9wZXJhdGlvbnMgaW4gRmFicmljIGNoYWluY29kZVxuICogQHN1bW1hcnkgUHJvdmlkZXMgc3RhbmRhcmQgY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgbW9kZWxzIGluIEZhYnJpYyBjaGFpbmNvZGVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBjbGFzcyBGYWJyaWNDcnVkQ29udHJhY3RcbiAqIEBleHRlbmRzIHtDb250cmFjdH1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBEZWZpbmUgYSBtb2RlbFxuICogQHRhYmxlKCdhc3NldHMnKVxuICogY2xhc3MgQXNzZXQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBpZCgpXG4gKiAgIGlkOiBzdHJpbmc7XG4gKlxuICogICBAcHJvcGVydHkoKVxuICogICBkYXRhOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQ3JlYXRlIGEgY29udHJhY3QgdGhhdCBleHRlbmRzIEZhYnJpY0NydWRDb250cmFjdFxuICogZXhwb3J0IGNsYXNzIEFzc2V0Q29udHJhY3QgZXh0ZW5kcyBGYWJyaWNDcnVkQ29udHJhY3Q8QXNzZXQ+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoJ0Fzc2V0Q29udHJhY3QnLCBBc3NldCk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIEFkZCBjdXN0b20gbWV0aG9kcyBhcyBuZWVkZWRcbiAqICAgYXN5bmMgZ2V0QXNzZXRIaXN0b3J5KGN0eDogQ29udGV4dCwgaWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcbiAqICAgICAvLyBDdXN0b20gaW1wbGVtZW50YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RhdGVEQlxuICpcbiAqICAgQ2xpZW50LT4+Q29udHJhY3Q6IGNyZWF0ZShjdHgsIG1vZGVsKVxuICogICBDb250cmFjdC0+PlJlcG9zaXRvcnk6IHJlcG9zaXRvcnkoY3R4KVxuICogICBDb250cmFjdC0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbCwgY3R4KVxuICogICBSZXBvc2l0b3J5LT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIHJlY29yZCwgdHJhbnNpZW50LCBjdHgpXG4gKiAgIEFkYXB0ZXItPj5TdGF0ZURCOiBwdXRTdGF0ZShpZCwgc2VyaWFsaXplZERhdGEpXG4gKiAgIFN0YXRlREItLT4+QWRhcHRlcjogU3VjY2Vzc1xuICogICBBZGFwdGVyLS0+PlJlcG9zaXRvcnk6IHJlY29yZFxuICogICBSZXBvc2l0b3J5LS0+PkNvbnRyYWN0OiBtb2RlbFxuICogICBDb250cmFjdC0tPj5DbGllbnQ6IG1vZGVsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGYWJyaWNDcnVkQ29udHJhY3Q8TSBleHRlbmRzIE1vZGVsPlxuICBleHRlbmRzIENvbnRyYWN0XG4gIGltcGxlbWVudHMgQ2hlY2thYmxlXG57XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2hhcmVkIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIGFsbCBjb250cmFjdCBpbnN0YW5jZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWRhcHRlcjogRmFicmljQ29udHJhY3RBZGFwdGVyID0gbmV3IEZhYnJpY0NvbnRyYWN0QWRhcHRlcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByZXBvOiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8TT47XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBzZXJpYWxpemVyID0gbmV3IERldGVybWluaXN0aWNTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0NydWRDb250cmFjdCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNvbnRyYWN0IHdpdGggYSBuYW1lIGFuZCBtb2RlbCBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250cmFjdFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMucmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoY2xhenopO1xuICB9XG5cbiAgYXN5bmMgbGlzdEJ5KFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIGtleTogc3RyaW5nIHwga2V5b2YgTSxcbiAgICBvcmRlcjogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMubGlzdEJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmxpc3RCeShcbiAgICAgIGtleSBhcyBrZXlvZiBNLFxuICAgICAgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHBhZ2luYXRlQnkoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAga2V5OiBzdHJpbmcgfCBrZXlvZiBNLFxuICAgIG9yZGVyOiBzdHJpbmcsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMucGFnaW5hdGVCeSk7XG4gICAgcmV0dXJuIHRoaXMucmVwby5wYWdpbmF0ZUJ5KGtleSBhcyBrZXlvZiBNLCBvcmRlciBhcyBhbnksIHNpemUsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZUJ5KFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIGtleTogc3RyaW5nIHwga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMuZmluZE9uZUJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmZpbmRPbmVCeShrZXkgYXMga2V5b2YgTSwgdmFsdWUsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgc3RhdGVtZW50KFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMuc3RhdGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnN0YXRlbWVudChtZXRob2QsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2luZ2xlIG1vZGVsIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyBjcmVhdGUgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCBtb2RlbFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIG1vZGVsOiBzdHJpbmcgfCBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8c3RyaW5nIHwgTT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbLi4uYXJncywgY3R4XSwgdGhpcy5jcmVhdGUpO1xuICAgIGxvZy5pbmZvKGBDT05UUkFDVCBDUkVBVEUsICR7Y3R4QXJnc31gKTtcblxuICAgIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIG1vZGVsID0gdGhpcy5kZXNlcmlhbGl6ZTxNPihtb2RlbCkgYXMgTTtcblxuICAgIGxvZy5pbmZvKGBDcmVhdGluZyBtb2RlbDogJHtKU09OLnN0cmluZ2lmeShtb2RlbCl9YCk7XG5cbiAgICBjb25zdCB0cmFuc2llbnQgPSB0aGlzLmdldFRyYW5zaWVudERhdGEoY3R4KTtcblxuICAgIGxvZy5pbmZvKGBNZXJnaW5nIHRyYW5zaWVudCBkYXRhLi4uYCk7XG4gICAgbW9kZWwgPSBNb2RlbC5tZXJnZShtb2RlbCwgdHJhbnNpZW50LCB0aGlzLmNsYXp6KSBhcyBNO1xuXG4gICAgcmV0dXJuIHRoaXMucmVwby5jcmVhdGUobW9kZWwsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHNpbmdsZSBtb2RlbCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyByZWFkIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0ga2V5IC0gVGhlIGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCBtb2RlbFxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICBjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBrZXk6IFByaW1hcnlLZXlUeXBlIHwgc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TSB8IHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbLi4uYXJncywgY3R4XSwgdGhpcy5yZWFkKTtcblxuICAgIGxvZy5pbmZvKGByZWFkaW5nIGVudHJ5IHdpdGggcGsgJHtrZXl9IGApO1xuXG4gICAgcmV0dXJuIHRoaXMucmVwby5yZWFkKGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNpZW50RGF0YShjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCk6IGFueSB7XG4gICAgY29uc3QgdHJhbnNpZW50TWFwID0gY3R4LnN0dWIuZ2V0VHJhbnNpZW50KCk7XG4gICAgbGV0IHRyYW5zaWVudDogYW55ID0ge307XG5cbiAgICBpZiAodHJhbnNpZW50TWFwLmhhcygodGhpcy5yZXBvIGFzIGFueSkudGFibGVOYW1lKSkge1xuICAgICAgdHJhbnNpZW50ID0gSlNPTi5wYXJzZShcbiAgICAgICAgKHRyYW5zaWVudE1hcC5nZXQoKHRoaXMucmVwbyBhcyBhbnkpLnRhYmxlTmFtZSkgYXMgQnVmZmVyKT8udG9TdHJpbmcoXG4gICAgICAgICAgXCJ1dGY4XCJcbiAgICAgICAgKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSBtb2RlbCBpbiB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSByZXBvc2l0b3J5J3MgdXBkYXRlIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgbW9kZWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBtb2RlbDogc3RyaW5nIHwgTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHN0cmluZyB8IE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMudXBkYXRlKTtcblxuICAgIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIG1vZGVsID0gdGhpcy5kZXNlcmlhbGl6ZTxNPihtb2RlbCkgYXMgTTtcblxuICAgIGxvZy5pbmZvKGBVcGRhdGluZyBtb2RlbDogJHtKU09OLnN0cmluZ2lmeShtb2RlbCl9YCk7XG5cbiAgICBjb25zdCB0cmFuc2llbnQgPSB0aGlzLmdldFRyYW5zaWVudERhdGEoY3R4KTtcblxuICAgIGxvZy5pbmZvKGBNZXJnaW5nIHRyYW5zaWVudCBkYXRhLi4uYCk7XG4gICAgbW9kZWwgPSBNb2RlbC5tZXJnZShtb2RlbCwgdHJhbnNpZW50LCB0aGlzLmNsYXp6KSBhcyBNO1xuICAgIHJldHVybiB0aGlzLnJlcG8udXBkYXRlKG1vZGVsLCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSBtb2RlbCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyBkZWxldGUgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIG1vZGVsXG4gICAqL1xuICBhc3luYyBkZWxldGUoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAga2V5OiBQcmltYXJ5S2V5VHlwZSB8IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0gfCBzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMuZGVsZXRlKTtcbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgZW50cnkgd2l0aCBwayAke2tleX0gYCk7XG4gICAgcmV0dXJuIHRoaXMucmVwby5kZWxldGUoU3RyaW5nKGtleSksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyBkZWxldGVBbGwgbWV0aG9kXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0ga2V5cyAtIFRoZSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIG1vZGVsc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIGtleXM6IFByaW1hcnlLZXlUeXBlW10gfCBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10gfCBzdHJpbmc+IHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjdHhdLCB0aGlzLnJlYWRBbGwpO1xuICAgIGlmICh0eXBlb2Yga2V5cyA9PT0gXCJzdHJpbmdcIikga2V5cyA9IEpTT04ucGFyc2Uoa2V5cykgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIHRoaXMucmVwby5kZWxldGVBbGwoa2V5cywgLi4uY3R4QXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyByZWFkQWxsIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCBtb2RlbHNcbiAgICovXG4gIGFzeW5jIHJlYWRBbGwoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAga2V5czogUHJpbWFyeUtleVR5cGVbXSB8IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXSB8IHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMucmVhZEFsbCk7XG4gICAgaWYgKHR5cGVvZiBrZXlzID09PSBcInN0cmluZ1wiKSBrZXlzID0gSlNPTi5wYXJzZShrZXlzKSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnJlYWRBbGwoa2V5cywgLi4uY3R4QXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyB1cGRhdGVBbGwgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCBtb2RlbHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBtb2RlbHM6IHN0cmluZyB8IE1bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHN0cmluZyB8IE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbLi4uYXJncywgY3R4XSwgdGhpcy51cGRhdGVBbGwpO1xuICAgIGlmICh0eXBlb2YgbW9kZWxzID09PSBcInN0cmluZ1wiKVxuICAgICAgbW9kZWxzID0gKEpTT04ucGFyc2UobW9kZWxzKSBhcyBbXSlcbiAgICAgICAgLm1hcCgobSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShtKSlcbiAgICAgICAgLm1hcCgobSkgPT4gbmV3IHRoaXMuY2xhenoobSkpIGFzIGFueTtcblxuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke21vZGVscy5sZW5ndGh9IGVudHJpZXMgdG8gdGhlIHRhYmxlYCk7XG4gICAgcmV0dXJuIHRoaXMucmVwby51cGRhdGVBbGwobW9kZWxzIGFzIHVua25vd24gYXMgTVtdLCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBxdWVyeSB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9ucyBhbmQgb3B0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzaW1wbGlmaWVkIHdheSB0byBxdWVyeSB0aGUgZGF0YWJhc2Ugd2l0aCBjb21tb24gcXVlcnkgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gZmlsdGVyIHJlY29yZHMuXG4gICAqIEBwYXJhbSBvcmRlckJ5IC0gVGhlIGZpZWxkIHRvIG9yZGVyIHJlc3VsdHMgYnkuXG4gICAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtvcmRlcj1PcmRlckRpcmVjdGlvbi5BU0NdIC0gVGhlIHNvcnQgZGlyZWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbWl0XSAtIE9wdGlvbmFsIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NraXBdIC0gT3B0aW9uYWwgbnVtYmVyIG9mIHJlc3VsdHMgdG8gc2tpcC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgcXVlcnkgcmVzdWx0cyBhcyBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBhc3luYyBxdWVyeShcbiAgICBjb250ZXh0OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb248TT4gfCBzdHJpbmcsXG4gICAgb3JkZXJCeTogc3RyaW5nIHwga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gfCBzdHJpbmcgPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgc2tpcD86IG51bWJlcixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGNvbnRleHRdLCB0aGlzLnF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnF1ZXJ5KFxuICAgICAgY29uZGl0aW9uIGFzIENvbmRpdGlvbjxNPixcbiAgICAgIG9yZGVyQnkgYXMga2V5b2YgTSxcbiAgICAgIG9yZGVyIGFzIE9yZGVyRGlyZWN0aW9uLFxuICAgICAgbGltaXQsXG4gICAgICBza2lwLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIHJhdyBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHthbnl9IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBkb2NzT25seSAtIFdoZXRoZXIgdG8gcmV0dXJuIG9ubHkgZG9jdW1lbnRzXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRzXG4gICAqL1xuICBhc3luYyByYXcoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnkgfCBzdHJpbmcsXG4gICAgZG9jc09ubHk6IGJvb2xlYW4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnkgfCBzdHJpbmc+IHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjdHhdLCB0aGlzLnJhdyk7XG4gICAgaWYgKHR5cGVvZiByYXdJbnB1dCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJhd0lucHV0ID0gSlNPTi5wYXJzZShyYXdJbnB1dCkgYXMgTWFuZ29RdWVyeTtcbiAgICByZXR1cm4gRmFicmljQ3J1ZENvbnRyYWN0LmFkYXB0ZXIucmF3KHJhd0lucHV0LCBkb2NzT25seSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljQ3J1ZENvbnRyYWN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXNlcmlhbGl6ZTxNIGV4dGVuZHMgTW9kZWw+KHN0cjogc3RyaW5nKTogTSB7XG4gICAgcmV0dXJuIChcbiAgICAgIEZhYnJpY0NydWRDb250cmFjdC5zZXJpYWxpemVyIGFzIHVua25vd24gYXMgU2VyaWFsaXplcjxNPlxuICAgICkuZGVzZXJpYWxpemUoc3RyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBpbml0KGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjdHhdLCB0aGlzLmluaXQpO1xuICAgIGxvZy5pbmZvKGBSdW5uaW5nIGNvbnRyYWN0ICR7dGhpcy5nZXROYW1lKCl9IGluaXRpYWxpemF0aW9uLi4uYCk7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgbG9nLmluZm8oYENvbnRyYWN0IGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZC5gKTtcbiAgfVxuXG4gIGFzeW5jIGhlYWx0aGNoZWNrKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICk6IFByb21pc2U8c3RyaW5nIHwgaGVhbHRoY2hlY2s+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2N0eF0sIHRoaXMuaGVhbHRoY2hlY2spO1xuICAgIGxvZy5pbmZvKGBSdW5uaW5nIEhlYWx0aGNoZWNrOiAke3RoaXMuaW5pdGlhbGl6ZWR9Li4uYCk7XG4gICAgcmV0dXJuIHsgaGVhbHRoY2hlY2s6IHRoaXMuaW5pdGlhbGl6ZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIGNyZWF0ZUFsbCBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIG1vZGVsc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIG1vZGVsczogc3RyaW5nIHwgTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8c3RyaW5nIHwgTVtdPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjdHhdLCB0aGlzLmNyZWF0ZUFsbCk7XG5cbiAgICBpZiAodHlwZW9mIG1vZGVscyA9PT0gXCJzdHJpbmdcIilcbiAgICAgIG1vZGVscyA9IChKU09OLnBhcnNlKG1vZGVscykgYXMgW10pXG4gICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZGVzZXJpYWxpemUobSkpXG4gICAgICAgIC5tYXAoKG0pID0+IG5ldyB0aGlzLmNsYXp6KG0pKSBhcyBhbnk7XG5cbiAgICBsb2cuaW5mbyhgYWRkaW5nICR7bW9kZWxzLmxlbmd0aH0gZW50cmllcyB0byB0aGUgdGFibGVgKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmNyZWF0ZUFsbChtb2RlbHMgYXMgdW5rbm93biBhcyBNW10sIGN0eCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICBhcmdzOiBBUkdTLFxuICAgIG1ldGhvZDogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHN0cmluZ1xuICApOiBQcm9taXNlPFxuICAgIENvbnRleHR1YWxpemVkQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+ICYge1xuICAgICAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgICAgIGlkZW50aXR5OiBDbGllbnRJZGVudGl0eTtcbiAgICB9XG4gID4ge1xuICAgIHJldHVybiBGYWJyaWNDcnVkQ29udHJhY3QubG9nQ3R4LmJpbmQodGhpcykoYXJncywgbWV0aG9kIGFzIGFueSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGFzeW5jIGxvZ0N0eDxBUkdTIGV4dGVuZHMgYW55W10+KFxuICAgIHRoaXM6IGFueSxcbiAgICBhcmdzOiBBUkdTLFxuICAgIG1ldGhvZDogc3RyaW5nXG4gICk6IFByb21pc2U8XG4gICAgQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgICBzdHViOiBDaGFpbmNvZGVTdHViO1xuICAgICAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xuICAgIH1cbiAgPjtcbiAgcHJvdGVjdGVkIHN0YXRpYyBhc3luYyBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICk6IFByb21pc2U8XG4gICAgQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgICBzdHViOiBDaGFpbmNvZGVTdHViO1xuICAgICAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xuICAgIH1cbiAgPjtcbiAgcHJvdGVjdGVkIHN0YXRpYyBhc3luYyBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxcbiAgICBDb250ZXh0dWFsaXplZEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPiAmIHtcbiAgICAgIHN0dWI6IENoYWluY29kZVN0dWI7XG4gICAgICBpZGVudGl0eTogQ2xpZW50SWRlbnRpdHk7XG4gICAgfVxuICA+IHtcbiAgICBpZiAoYXJncy5sZW5ndGggPCAxKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIGNvbnRleHQgcHJvdmlkZWRcIik7XG4gICAgY29uc3QgY3R4ID0gYXJncy5wb3AoKSBhcyBGYWJyaWNDb250cmFjdENvbnRleHQgfCBDb250ZXh0O1xuICAgIGlmIChjdHggaW5zdGFuY2VvZiBGYWJyaWNDb250cmFjdENvbnRleHQpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdHgsXG4gICAgICAgIGxvZzogY3R4LmxvZ2dlci5jbGVhcigpLmZvcih0aGlzKS5mb3IobWV0aG9kKSxcbiAgICAgICAgY3R4QXJnczogWy4uLmFyZ3MsIGN0eF0sXG4gICAgICAgIHN0dWI6IGN0eC5zdHViLFxuICAgICAgICBpZGVudGl0eTogY3R4LmlkZW50aXR5LFxuICAgICAgfTtcblxuICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIEN0eCkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIHZhbGlkIGNvbnRleHQgcHJvdmlkZWRcIik7XG5cbiAgICBmdW5jdGlvbiBnZXRPcCgpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWV0aG9kO1xuICAgICAgc3dpdGNoIChtZXRob2QubmFtZSkge1xuICAgICAgICBjYXNlIE9wZXJhdGlvbktleXMuQ1JFQVRFOlxuICAgICAgICBjYXNlIE9wZXJhdGlvbktleXMuUkVBRDpcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLlVQREFURTpcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLkRFTEVURTpcbiAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEw6XG4gICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgcmV0dXJuIG1ldGhvZC5uYW1lO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBtZXRob2QubmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB7XG4gICAgICBjb3JyZWxhdGlvbklkOiBjdHguc3R1Yi5nZXRUeElEKCksXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgRmFicmljQ3J1ZENvbnRyYWN0LmFkYXB0ZXIuY29udGV4dChcbiAgICAgIGdldE9wKCksXG4gICAgICBvdmVycmlkZXMgYXMgYW55LFxuICAgICAgdGhpcy5jbGF6eixcbiAgICAgIGN0eFxuICAgICk7XG5cbiAgICBjb25zdCBsb2cgPSAoXG4gICAgICB0aGlzXG4gICAgICAgID8gY29udGV4dC5sb2dnZXIuZm9yKHRoaXMpLmZvcihtZXRob2QpXG4gICAgICAgIDogY29udGV4dC5sb2dnZXIuY2xlYXIoKS5mb3IodGhpcykuZm9yKG1ldGhvZClcbiAgICApIGFzIExvZ2dlck9mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD47XG4gICAgcmV0dXJuIHtcbiAgICAgIGN0eDogY29udGV4dCxcbiAgICAgIGxvZzogbG9nLFxuICAgICAgc3R1YjogY29udGV4dC5zdHViLFxuICAgICAgaWRlbnRpdHk6IGNvbnRleHQuaWRlbnRpdHksXG4gICAgICBjdHhBcmdzOiBbLi4uYXJncywgY29udGV4dF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmFicmljQ3J1ZENvbnRyYWN0IH0gZnJvbSBcIi4vY3J1ZC1jb250cmFjdFwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ29udGV4dCBhcyBDdHgsIFRyYW5zYWN0aW9uIH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ1JVRCBjb250cmFjdCB2YXJpYW50IHRoYXQgc2VyaWFsaXplcy9kZXNlcmlhbGl6ZXMgcGF5bG9hZHNcbiAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIHNhbWUgQ1JVRCBvcGVyYXRpb25zIGFzIEZhYnJpY0NydWRDb250cmFjdCBidXQgdGFrZXMgYW5kIHJldHVybnMgSlNPTiBzdHJpbmdzIHRvIGZhY2lsaXRhdGUgc2ltcGxlIGNsaWVudCBpbnRlcmFjdGlvbnMuXG4gKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIGNvbnRyYWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBjb250cmFjdCBuYW1lXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIHRvIGluc3RhbnRpYXRlIG1vZGVscyBmcm9tIEpTT05cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgU2VyaWFsaXplZENydWRDb250cmFjdFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNvbnRyYWN0ID0gbmV3IFNlcmlhbGl6ZWRDcnVkQ29udHJhY3Q8TXlNb2RlbD4oJ015TW9kZWxDb250cmFjdCcsIE15TW9kZWwpO1xuICogLy8gQ2xpZW50IHN1Ym1pdHMgSlNPTiBzdHJpbmcgcGF5bG9hZHMgYW5kIHJlY2VpdmVzIEpTT04gc3RyaW5nIHJlc3BvbnNlc1xuICovXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplZENydWRDb250cmFjdDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEZhYnJpY0NydWRDb250cmFjdDxNPiB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY2xheno6IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIobmFtZSwgY2xhenopO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKClcbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKGNvbnRleHQ6IEN0eCwgbW9kZWw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmluZm8oYENyZWF0aW5nIG1vZGVsOiAke21vZGVsfWApO1xuXG4gICAgY29uc3QgbSA9IHRoaXMuZGVzZXJpYWxpemU8TT4obW9kZWwpO1xuXG4gICAgbG9nLmluZm8oYE1vZGVsIGRlc2VyaWFsaXplZDogJHtKU09OLnN0cmluZ2lmeShtKX1gKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKGF3YWl0IHN1cGVyLmNyZWF0ZShjdHggYXMgYW55LCBtKSkgYXMgTSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQoY29udGV4dDogQ3R4LCBrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLnJlYWQpO1xuICAgIGxvZy5pbmZvKGBSZWFkaW5nIGlkOiAke2tleX1gKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKGF3YWl0IHN1cGVyLnJlYWQoY3R4IGFzIGFueSwga2V5KSkgYXMgTSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoY29udGV4dDogQ3R4LCBtb2RlbDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMudXBkYXRlKTtcbiAgICBsb2cuaW5mbyhgVXBkYXRpbmcgbW9kZWw6ICR7bW9kZWx9YCk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKChhd2FpdCBzdXBlci51cGRhdGUoY3R4IGFzIGFueSwgbW9kZWwpKSBhcyBNKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbigpXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShjb250ZXh0OiBDdHgsIGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuZGVsZXRlKTtcbiAgICBsb2cuaW5mbyhgRGVsZXRpbmcgaWQ6ICR7a2V5fWApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSgoYXdhaXQgc3VwZXIuZGVsZXRlKGN0eCBhcyBhbnksIGtleSkpIGFzIE0pO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKGNvbnRleHQ6IEN0eCwga2V5czogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJzZWRLZXlzOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoa2V5cyk7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmRlbGV0ZUFsbCk7XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtwYXJzZWRLZXlzLmxlbmd0aH0gZW50cmllcyBmcm9tIHRoZSB0YWJsZWApO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgKChhd2FpdCBzdXBlci5kZWxldGVBbGwoY3R4IGFzIGFueSwgcGFyc2VkS2V5cykpIGFzIE1bXSkubWFwKFxuICAgICAgICAobSkgPT4gdGhpcy5zZXJpYWxpemUobSkgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChjb250ZXh0OiBDdHgsIGtleXM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyc2VkS2V5czogc3RyaW5nW10gPSBKU09OLnBhcnNlKGtleXMpO1xuXG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy5pbmZvKGByZWFkaW5nICR7cGFyc2VkS2V5cy5sZW5ndGh9IGVudHJpZXMgZnJvbSB0aGUgdGFibGVgKTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIucmVhZEFsbChjdHggYXMgYW55LCBwYXJzZWRLZXlzKSkgYXMgTVtdKS5tYXAoKG0pID0+XG4gICAgICAgIHRoaXMuc2VyaWFsaXplKG0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbigpXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChjb250ZXh0OiBDdHgsIG1vZGVsczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMudXBkYXRlQWxsKTtcbiAgICBjb25zdCBsaXN0OiBzdHJpbmdbXSA9IEpTT04ucGFyc2UobW9kZWxzKTtcbiAgICBjb25zdCBtb2RlbExpc3Q6IE1bXSA9IGxpc3RcbiAgICAgIC5tYXAoKG0pID0+IHRoaXMuZGVzZXJpYWxpemUobSkpXG4gICAgICAubWFwKChtKSA9PiBuZXcgdGhpcy5jbGF6eihtKSk7XG5cbiAgICBsb2cuaW5mbyhgVXBkYXRpbmcgJHttb2RlbExpc3QubGVuZ3RofSBlbnRyaWVzIHRvIHRoZSB0YWJsZWApO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIudXBkYXRlQWxsKGN0eCBhcyBhbnksIG1vZGVsTGlzdCkpIGFzIE1bXSkubWFwKFxuICAgICAgICAobSkgPT4gdGhpcy5zZXJpYWxpemUobSkgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KGNvbnRleHQ6IEN0eCwgbWV0aG9kOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGNvbnRleHRdLCB0aGlzLnN0YXRlbWVudCk7XG4gICAgYXJncyA9IGFyZ3MubWFwKChhKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsb2cuaW5mbyhgY2FsbGluZyBwcmVwYXJlZCBzdGF0ZW1lbnQgJHttZXRob2R9YCk7XG4gICAgbG9nLmRlYnVnKGB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIHJldHVybiBzdXBlci5zdGF0ZW1lbnQoY3R4LCBtZXRob2QsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBsaXN0QnkoXG4gICAgY29udGV4dDogQ3R4LFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9yZGVyOiBzdHJpbmcsXG4gICAgLi4uYXJnczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjb250ZXh0XSwgdGhpcy5saXN0QnkpO1xuICAgIHJldHVybiBzdXBlci5saXN0QnkoY3R4LCBrZXkgYXMga2V5b2YgTSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb24pO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGNvbnRleHQ6IEN0eCxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcmRlcjogc3RyaW5nLFxuICAgIHNpemU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGNvbnRleHRdLCB0aGlzLnBhZ2luYXRlQnkpO1xuICAgIHJldHVybiBzdXBlci5wYWdpbmF0ZUJ5KGN0eCwga2V5LCBvcmRlciBhcyBhbnksIHNpemUpO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBmaW5kT25lQnkoXG4gICAgY29udGV4dDogQ3R4LFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgLi4uYXJnczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjb250ZXh0XSwgdGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICByZXR1cm4gc3VwZXIuZmluZE9uZUJ5KGN0eCwga2V5LCB2YWx1ZSwgLi4uYXJncyk7XG4gIH1cblxuICAvLyBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIG92ZXJyaWRlIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbnRleHQ6IEN0eCxcbiAgICBjb25kaXRpb246IHN0cmluZyxcbiAgICBvcmRlckJ5OiBzdHJpbmcsXG4gICAgb3JkZXI6IHN0cmluZyxcbiAgICBsaW1pdD86IG51bWJlcixcbiAgICBza2lwPzogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5xdWVyeSk7XG4gICAgbGV0IGNvbmQ6IENvbmRpdGlvbjxhbnk+O1xuICAgIHRyeSB7XG4gICAgICBjb25kID0gQ29uZGl0aW9uLmZyb20oSlNPTi5wYXJzZShjb25kaXRpb24pKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBJbnZhbGlkIGNvbmRpdGlvbjogJHtlfWApO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIucXVlcnkoY3R4LCBjb25kLCBvcmRlckJ5LCBvcmRlciBhcyBhbnksIGxpbWl0LCBza2lwLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8vIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgb3ZlcnJpZGUgYXN5bmMgcmF3KFxuICAgIGNvbnRleHQ6IEN0eCxcbiAgICByYXdJbnB1dDogc3RyaW5nLFxuICAgIGRvY3NPbmx5OiBib29sZWFuLFxuICAgIC4uLmFyZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5yYXcpO1xuICAgIGNvbnN0IHBhcnNlZElucHV0OiBNYW5nb1F1ZXJ5ID0gSlNPTi5wYXJzZShyYXdJbnB1dCk7XG4gICAgcmV0dXJuIHN1cGVyLnJhdyhjdHgsIHBhcnNlZElucHV0LCBkb2NzT25seSwgLi4uYXJncyk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyBpbml0KGN0eDogQ3R4KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdChjdHgpO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBoZWFsdGhjaGVjayhjb250ZXh0OiBDdHgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy51cGRhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhgUnVubmluZyBIZWFsdGhjaGVjazogJHt0aGlzLmluaXRpYWxpemVkfS4uLmApO1xuICAgIC8vVE9ETzogVFJJTSBOT1QgV09SS0lORyBDSEVDSyBMQVRFUlxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhd2FpdCBzdXBlci5oZWFsdGhjaGVjayhjdHggYXMgYW55KSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoY29udGV4dDogQ3R4LCBtb2RlbHM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShtb2RlbHMpO1xuICAgIGNvbnN0IG1vZGVsTGlzdDogTVtdID0gbGlzdFxuICAgICAgLm1hcCgobSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShtKSlcbiAgICAgIC5tYXAoKG0pID0+IG5ldyB0aGlzLmNsYXp6KG0pKTtcblxuICAgIGxvZy5pbmZvKGBBZGRpbmcgJHttb2RlbExpc3QubGVuZ3RofSBlbnRyaWVzIHRvIHRoZSB0YWJsZWApO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIuY3JlYXRlQWxsKGNvbnRleHQsIG1vZGVsTGlzdCkpIGFzIE1bXSkubWFwKFxuICAgICAgICAobSkgPT4gdGhpcy5zZXJpYWxpemUobSkgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbi8vIGltcG9ydCB7IE1JU1NJTkdfUFJJVkFURV9EQVRBX0VSUk9SX01FU1NBR0UgfSBmcm9tIFwiLi4vY29udHJhY3RzL3ByaXZhdGUtZGF0YVwiO1xuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIG92ZXJmbG93IGVycm9yIGluIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbiBTbWFydCBDb250cmFjdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIE92ZXJmbG93RXJyb3JcbiAqIEBleHRlbmRzIEludGVybmFsRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBPdmVyZmxvd0Vycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE92ZXJmbG93RXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBiYWxhbmNlIHRvIHBlcmZvcm0gYSB0cmFuc2FjdGlvbiBpbiBTbWFydCBDb250cmFjdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIEJhbGFuY2VFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEJhbGFuY2VFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBCYWxhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBiYWxhbmNlIHRvIHBlcmZvcm0gYSB0cmFuc2FjdGlvbiBpbiBTbWFydCBDb250cmFjdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIEJhbGFuY2VFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEFsbG93YW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEFsbG93YW5jZUVycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgcmVnaXN0cmF0aW5nIG5ldyBlbnRpdGllc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgUmVnaXN0cmF0aW9uRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnQgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25FcnJvciBleHRlbmRzIEF1dGhvcml6YXRpb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFJlZ2lzdHJhdGlvbkVycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgYWRhcHRlci5iZWdpblRyYW5zYWN0aW9uKCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE1pc3NpbmdDb250ZXh0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgTWlzc2luZ0NvbnRleHRFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IgPSBcIk1JU1NJTkdfUFJJVkFURV9EQVRBX0VSUk9SX01FU1NBR0VcIikge1xuICAgIHN1cGVyKFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzLm5hbWUsIG1zZywgNDAzKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXJyb3IgdGhhdCBvY2N1cnMgd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAY2xhc3MgTm90SW5pdGlhbGl6ZWRFcnJvclxuICogQGV4dGVuZHMgQmFzZUVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgRXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwLlxuICpcbiAqIEB0aHJvd3Mge05vdEluaXRpYWxpemVkRXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIHdoZW4gYSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBzdGVwIGlzIG5vdCBwZXJmb3JtZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uXG4gKiBpZiAoIWlzSW5pdGlhbGl6ZWQpIHtcbiAqICAgdGhyb3cgbmV3IE5vdEluaXRpYWxpemVkRXJyb3IoJ0FwcGxpY2F0aW9uIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICogfVxuICpcbiAqIC8vIENhdGNoaW5nIGFuIE5vdEluaXRpYWxpemVkRXJyb3JcbiAqIHRyeSB7XG4gKiAgIC8vIFBlcmZvcm0gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEluaXRpYWxpemVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdJbml0aWFsaXphdGlvbiBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKE5vdEluaXRpYWxpemVkRXJyb3IubmFtZSwgbXNnLCA0MDkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nUEtDU1MxMUxpYiBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nUEtDU1MxMUxpYi5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRvcnNlbWVudEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgRW5kb3JzZW1lbnRFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFwiU3RyaW5nXCIgfSlcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiB1bmlxdWUgbmFtZVxuICAgKiBAc3VtbWFyeSBTZXJ2ZXMgYXMgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgRVJDMjAgdG9rZW4gZGVmaW5pdGlvbjsgdHlwaWNhbGx5IGEgaHVtYW4tcmVhZGFibGUgaWRlbnRpZmllclxuICAgKi9cbiAgbmFtZSE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPd25pbmcgaWRlbnRpdHkgb2YgdGhlIHRva2VuXG4gICAqIEBzdW1tYXJ5IFguNTA5IHN1YmplY3Qgb3IgTVNQIGlkZW50aXR5IHN0cmluZyB0aGF0IGRlbm90ZXMgd2hvIG93bnMvY29udHJvbHMgdGhlIHRva2VuIGRlZmluaXRpb25cbiAgICovXG4gIG93bmVyITogc3RyaW5nO1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiBzeW1ib2xcbiAgICogQHN1bW1hcnkgU2hvcnQgdGlja2VyLWxpa2Ugc3ltYm9sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0b2tlbiAoZS5nLiwgTVRLKVxuICAgKi9cbiAgc3ltYm9sITogc3RyaW5nO1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNpbWFsIHByZWNpc2lvbiBmb3IgdG9rZW4gYW1vdW50c1xuICAgKiBAc3VtbWFyeSBOdW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHNlcGFyYXRvciB1c2VkIHdoZW4gZm9ybWF0dGluZyB0b2tlbiBiYWxhbmNlc1xuICAgKi9cbiAgZGVjaW1hbHMhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobT86IE1vZGVsQXJnPEVSQzIwV2FsbGV0Pikge1xuICAgIHN1cGVyKG0pO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVSQzIwIHdhbGxldCBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGhvbGRlciBhY2NvdW50IGZvciBhbiBFUkMyMCB0b2tlbiB3aXRoaW4gdGhlIEZhYnJpYyBuZXR3b3JrLCB0cmFja2luZyBiYWxhbmNlIGFuZCB0b2tlbiBhc3NvY2lhdGlvbi5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8RVJDMjBXYWxsZXQ+fSBbbV0gLSBPcHRpb25hbCBwYXJ0aWFsIGRhdGEgb3IgYW5vdGhlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIHRoZSBtb2RlbFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBFUkMyMFdhbGxldFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHdhbGxldCA9IG5ldyBFUkMyMFdhbGxldCh7IGlkOiBcImFjY3QxXCIsIHRva2VuOiBcIk15VG9rZW5cIiwgYmFsYW5jZTogMTAwMCB9KTtcbiAqIC8vIFVwZGF0ZSBiYWxhbmNlIHZpYSByZXBvc2l0b3J5OiBhd2FpdCByZXBvLnVwZGF0ZSh3YWxsZXQsIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgQXBwLT4+UmVwbzogcmVhZChcImFjY3QxXCIsIGN0eClcbiAqICAgUmVwby0tPj5BcHA6IEVSQzIwV2FsbGV0XG4gKi9cbkB0YWJsZShcImVyYzIwX3dhbGxldHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBXYWxsZXQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICBAcGsoeyB0eXBlOiBcIlN0cmluZ1wiIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2FsbGV0IHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IGZvciB0aGUgd2FsbGV0OyBjb21tb25seSByZWZlcmVuY2VzIGFuIGFjY291bnQgb3IgaWRlbnRpdHlcbiAgICovXG4gIGlkITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFzc29jaWF0ZWQgdG9rZW4gbmFtZVxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBFUkMyMFRva2VuIHRoaXMgd2FsbGV0IGhvbGRzOyBtYWludGFpbmVkIGFzIGEgcmVsYXRpb25zaGlwIGZvciBjYXNjYWRpbmcgdXBkYXRlcy9kZWxldGVzXG4gICAqL1xuICB0b2tlbiE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiBiYWxhbmNlIGZvciB0aGlzIHdhbGxldFxuICAgKiBAc3VtbWFyeSBDdXJyZW50IGFtb3VudCBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBoZWxkIGJ5IHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlITogbnVtYmVyO1xuXG4gIEBjb2x1bW4oKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhcHRpdmUgZmxhZyBvciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IE9wdGlvbmFsIGZpZWxkIHVzZWQgYnkgc29tZSBmbG93cyB0byBtYXJrIG5vbi10cmFuc2ZlcmFibGUgZnVuZHMgb3IgbWFuYWdlZCBjdXN0b2R5XG4gICAqL1xuICBjYXB0aXZlITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxFUkMyMFdhbGxldD4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCBhbGxvd2FuY2UgbW9kZWxcbiAqIEBzdW1tYXJ5IENhcHR1cmVzIGFuIGFwcHJvdmFsIHJlbGF0aW9uc2hpcCB3aGVyZSBhbiBvd25lciBhbGxvd3MgYSBzcGVuZGVyIHRvIHRyYW5zZmVyIHVwIHRvIGEgY2VydGFpbiB2YWx1ZSBmcm9tIHRoZSBvd25lcidzIHdhbGxldC5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8QWxsb3dhbmNlPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQWxsb3dhbmNlXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWxsb3dhbmNlID0gbmV3IEFsbG93YW5jZSh7IG93bmVyOiBcImFjY3QxXCIsIHNwZW5kZXI6IFwiYWNjdDJcIiwgdmFsdWU6IDUwIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgQXBwLT4+QXBwOiBuZXcgQWxsb3dhbmNlKHsgb3duZXIsIHNwZW5kZXIsIHZhbHVlIH0pXG4gKi9cbkB0YWJsZShcImVyYzIwX2FsbG93YW5jZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogXCJTdHJpbmdcIiB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25EZWxldGUsXG4gIG9uUmVhZCxcbiAgb25VcGRhdGUsXG4gIHJlYWRvbmx5LFxuICB0cmFuc2llbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IEZhYnJpY0VSQzIwQ29udHJhY3QgfSBmcm9tIFwiLi4vY29udHJhY3RzL2VyYzIwL2VyYzIwY29udHJhY3RcIjtcbmltcG9ydCB7XG4gIGFwcGx5LFxuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbWV0YWRhdGEsXG4gIE1ldGFkYXRhLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIERlY29yYXRvciBmb3IgbWFya2luZyBtZXRob2RzIHRoYXQgcmVxdWlyZSBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqIENoZWNrcyB0aGUgb3duZXIgb2YgdGhlIHRva2VuIGJlZm9yZSBhbGxvd2luZyB0aGUgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBUb2tlbkNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBAT3duZXIoKVxuICogICBhc3luYyBNaW50KGN0eDogQ29udGV4dCwgYW1vdW50OiBudW1iZXIpIHtcbiAqICAgICAvLyBNaW50IHRva2VuIGxvZ2ljXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGNoZWNrcyBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE93bmVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBGYWJyaWNFUkMyMENvbnRyYWN0LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApIHtcbiAgICAgIGNvbnN0IGN0eDogSExDb250ZXh0ID0gYXJnc1swXTtcbiAgICAgIGNvbnN0IGFjb3VudElkID0gY3R4LmNsaWVudElkZW50aXR5LmdldElEKCk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0ICh0aGlzIGFzIEZhYnJpY0VSQzIwQ29udHJhY3QpW1xuICAgICAgICBcInRva2VuUmVwb3NpdG9yeVwiXG4gICAgICBdLnNlbGVjdCgpO1xuXG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBzZWxlY3QuZXhlY3V0ZShjdHgpO1xuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFwiTm8gdG9rZW5zIGF2YWlhbGJsZVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUbyBtYW55IHRva2VuIGF2YWlsYWJsZSA6ICR7dG9rZW5zLmxlbmd0aH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vuc1swXS5vd25lciAhPSBhY291bnRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICAgIGBVc2VyIG5vdCBhdXRob3JpemVkIHRvIHJ1biAke3Byb3BlcnR5S2V5fSBvbiB0aGUgdG9rZW5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvd25lZEJ5T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PGFueT4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgY29uc3Qgb3duZXIgPSBjcmVhdG9yLm1zcGlkO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPd25lZEJ5KCkge1xuICBjb25zdCBrZXkgPSBnZXRGYWJyaWNNb2RlbEtleShGYWJyaWNNb2RlbEtleXMuT1dORURCWSk7XG5cbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGdldEZhYnJpY01vZGVsS2V5KEZhYnJpY01vZGVsS2V5cy5PV05FREJZKSwgYXR0cmlidXRlKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFicmljTW9kZWxLZXkoa2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDICsga2V5KTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pID0+IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKSA9PiB7XG4gIHJldHVybiBgX18ke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGtleXMubGVuZ3RoICE9PSBkYXRhLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsKTtcblxuICBjb25zdCByZWJ1aWx0ID0ga2V5cy5yZWR1Y2UoXG4gICAgKGFjYzogUmVjb3JkPGtleW9mIE0sIGFueT4sIGssIGkpID0+IHtcbiAgICAgIGNvbnN0IGMgPVxuICAgICAgICB0eXBlb2YgZGF0YVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gZGF0YVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICAgIDogZGF0YVtpXS5jb2xsZWN0aW9ucyhtb2RlbCk7XG4gICAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICAgICk7XG4gICAgICBhY2Nba10gPSBtb2RlbFtrXTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PlxuICApO1xuXG4gIGNvbnN0IHRvQ3JlYXRlID0gbmV3IHRoaXMuY2xhc3MocmVidWlsdCk7XG5cbiAgLy8gY29uc3Qgc2VncmVnYXRlZCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG5cbiAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMub3ZlcnJpZGUoeyBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uIH0gYXMgYW55KS5jcmVhdGUoXG4gICAgdG9DcmVhdGUsXG4gICAgY29udGV4dFxuICApO1xuICBPYmplY3QuYXNzaWduKG1vZGVsLCBjcmVhdGVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGtleXMubGVuZ3RoICE9PSBkYXRhLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsKTtcblxuICBjb25zdCByZWJ1aWx0ID0ga2V5cy5yZWR1Y2UoXG4gICAgKGFjYzogUmVjb3JkPGtleW9mIE0sIGFueT4sIGssIGkpID0+IHtcbiAgICAgIGNvbnN0IGMgPVxuICAgICAgICB0eXBlb2YgZGF0YVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gZGF0YVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICAgIDogZGF0YVtpXS5jb2xsZWN0aW9ucyhtb2RlbCk7XG4gICAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICAgICk7XG4gICAgICBhY2Nba10gPSBtb2RlbFtrXTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PlxuICApO1xuXG4gIGNvbnN0IHRvQ3JlYXRlID0gbmV3IHRoaXMuY2xhc3MocmVidWlsdCk7XG5cbiAgLy8gY29uc3Qgc2VncmVnYXRlZCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG5cbiAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMub3ZlcnJpZGUoeyBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uIH0gYXMgYW55KS5jcmVhdGUoXG4gICAgdG9DcmVhdGUsXG4gICAgY29udGV4dFxuICApO1xuICBPYmplY3QuYXNzaWduKG1vZGVsLCBjcmVhdGVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0ZsYWdzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE1bXSxcbiAgbW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIFYgZXh0ZW5kcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFZbXSxcbiAga2V5OiBrZXlvZiBNW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbmZ1bmN0aW9uIHNlZ3JlZ2F0ZWQoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgdHlwZTogRmFicmljTW9kZWxLZXlzLlBSSVZBVEUgfCBGYWJyaWNNb2RlbEtleXMuU0hBUkVEXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgaWYgKCFwcm9wZXJ0eUtleSkge1xuICAgICAgICBjb25zdCBwcm9wcyA9IE1ldGFkYXRhLnByb3BlcnRpZXModGFyZ2V0IGFzIENvbnN0cnVjdG9yKSB8fCBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIHR5cGUpKHRhcmdldCwgcHJvcCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IE1ldGFkYXRhLmtleSh0eXBlLCBwcm9wZXJ0eUtleSk7XG4gICAgICBjb25zdCBjb25zdHI6IENvbnN0cnVjdG9yID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yO1xuXG4gICAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5KSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gbmV3IFNldChtZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIG1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5LCBtZXRhKTtcbiAgICB9XG4gICAgY29uc3QgZGVjczogYW55W10gPSBbXTtcbiAgICBpZiAoIXByb3BlcnR5S2V5KSB7XG4gICAgICAvLyBkZWNvcmF0ZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gICAgICBNZXRhZGF0YS5wcm9wZXJ0aWVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik/LmZvckVhY2goKHApID0+XG4gICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkodGFyZ2V0LCBwKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXRhZGF0YSh0eXBlLCB0cnVlKSh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNzLnB1c2goXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICBvbkNyZWF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlLFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDpcbiAgICAgICAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICA6IGNvbGxlY3Rpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uUmVhZChcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uUmVhZCBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOlxuICAgICAgICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIDogY29sbGVjdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25VcGRhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblVwZGF0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOlxuICAgICAgICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIDogY29sbGVjdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EZWxldGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkRlbGV0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOlxuICAgICAgICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIDogY29sbGVjdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY3MpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIC8vIHJldHVybiBhcHBseSgpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlciA9IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb25cbikge1xuICBmdW5jdGlvbiBwcml2YXRlRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHByaXZhdGVEYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHNoYXJlZERhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbi8vXG4vLyBleHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoY29sbGVjdGlvbj86IHN0cmluZykge1xuLy8gICBpZiAoIWNvbGxlY3Rpb24pIHtcbi8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb2xsZWN0aW9uIG5hbWUgaXMgcmVxdWlyZWRcIik7XG4vLyAgIH1cbi8vXG4vLyAgIGNvbnN0IGtleTogc3RyaW5nID0gRmFicmljTW9kZWxLZXlzLlBSSVZBVEU7XG4vL1xuLy8gICByZXR1cm4gZnVuY3Rpb24gcHJpdmF0ZURhdGE8TSBleHRlbmRzIE1vZGVsPihcbi8vICAgICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuLy8gICAgIGF0dHJpYnV0ZT86IGFueVxuLy8gICApIHtcbi8vICAgICBjb25zdCBjb25zdHIgPVxuLy8gICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcikgOiBtb2RlbDtcbi8vXG4vLyAgICAgY29uc3QgbWV0YURhdGE6IGFueSA9IE1ldGFkYXRhLmdldChjb25zdHIpO1xuLy8gICAgIGNvbnN0IG1vZGVsZGF0YSA9IG1ldGFEYXRhPy5wcml2YXRlPy5jb2xsZWN0aW9ucyB8fCBbXTtcbi8vXG4vLyAgICAgcHJvcE1ldGFkYXRhKGtleSwge1xuLy8gICAgICAgLi4uKCFhdHRyaWJ1dGUgJiYge1xuLy8gICAgICAgICBjb2xsZWN0aW9uczogbW9kZWxkYXRhXG4vLyAgICAgICAgICAgPyBbLi4ubmV3IFNldChbLi4ubW9kZWxkYXRhLCBjb2xsZWN0aW9uXSldXG4vLyAgICAgICAgICAgOiBbY29sbGVjdGlvbl0sXG4vLyAgICAgICB9KSxcbi8vICAgICAgIGlzUHJpdmF0ZTogIWF0dHJpYnV0ZSxcbi8vICAgICB9KShhdHRyaWJ1dGUgPyBjb25zdHIgOiBtb2RlbCk7XG4vL1xuLy8gICAgIGlmIChhdHRyaWJ1dGUpIHtcbi8vICAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPVxuLy8gICAgICAgICAobWV0YURhdGE/LnByaXZhdGU/LlthdHRyaWJ1dGVdIGFzIGFueSk/LmNvbGxlY3Rpb25zIHx8IFtdO1xuLy8gICAgICAgcHJvcE1ldGFkYXRhKE1ldGFkYXRhLmtleShrZXksIGF0dHJpYnV0ZSksIHtcbi8vICAgICAgICAgY29sbGVjdGlvbnM6IGF0dHJpYnV0ZURhdGFcbi8vICAgICAgICAgICA/IFsuLi5uZXcgU2V0KFsuLi5hdHRyaWJ1dGVEYXRhLCBjb2xsZWN0aW9uXSldXG4vLyAgICAgICAgICAgOiBbY29sbGVjdGlvbl0sXG4vLyAgICAgICB9KShtb2RlbCwgYXR0cmlidXRlKTtcbi8vICAgICAgIHRyYW5zaWVudCgpKG1vZGVsLCBhdHRyaWJ1dGUpO1xuLy8gICAgIH1cbi8vICAgfTtcbi8vIH1cbiIsIi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIGV2ZW50cyBlbWl0dGVkIGJ5IGFuIEVSQzIwIGNvbnRyYWN0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGVudW0gaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZXZlbnRzIHRoYXQgY2FuIGJlIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKiBUaGUgZXZlbnRzIGFyZSBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIEVJUC0yMCBzdGFuZGFyZC5cbiAqL1xuZXhwb3J0IGVudW0gRVJDMjBFdmVudHMge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgYHRyYW5zZmVyYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRyYW5zZmVycmVkLlxuICAgKi9cbiAgVFJBTlNGRVIgPSBcIlRyYW5zZmVyXCIsXG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhbiBgYXBwcm92ZWAgZnVuY3Rpb24gaXMgY2FsbGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhcHByb3ZlZCBzcGVuZGVyLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIHRva2VucyBhcHByb3ZlZCBmb3IgdGhlIHNwZW5kZXIuXG4gICAqL1xuICBBUFBST1ZBTCA9IFwiQXBwcm92YWxcIixcbn1cbiIsImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgQ29uZGl0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBUcmFuc2FjdGlvbiB9IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBhZGQsIHN1YiB9IGZyb20gXCIuLi8uLi9zaGFyZWQvbWF0aFwiO1xuaW1wb3J0IHtcbiAgQWxsb3dhbmNlRXJyb3IsXG4gIEJhbGFuY2VFcnJvcixcbiAgTm90SW5pdGlhbGl6ZWRFcnJvcixcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB9IGZyb20gXCIuLi9Db250cmFjdEFkYXB0ZXJcIjtcbmltcG9ydCB7IEFsbG93YW5jZSwgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IE93bmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NydWRDb250cmFjdCB9IGZyb20gXCIuLi9jcnVkL2NydWQtY29udHJhY3RcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyXCI7XG5pbXBvcnQgeyBFUkMyMEV2ZW50cyB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJjMjAvZXJjMjAtY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVSQzIwIHRva2VuIGNvbnRyYWN0IGJhc2UgZm9yIEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQHN1bW1hcnkgSW1wbGVtZW50cyBFUkMyMC1saWtlIHRva2VuIGxvZ2ljIHVzaW5nIHJlcG9zaXRvcmllcyBhbmQgYWRhcHRlcnMsIHByb3ZpZGluZyBzdGFuZGFyZCB0b2tlbiBvcGVyYXRpb25zIHN1Y2ggYXMgYmFsYW5jZSBxdWVyaWVzLCB0cmFuc2ZlcnMsIGFwcHJvdmFscywgbWludGluZyBhbmQgYnVybmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGNvbnRyYWN0IG5hbWUgdXNlZCB0byBzY29wZSB0b2tlbiBpZGVudGl0eVxuICogQG5vdGUgaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC0yMFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNFUkMyMENvbnRyYWN0XG4gKiBAZXhhbXBsZVxuICogY2xhc3MgTXlUb2tlbkNvbnRyYWN0IGV4dGVuZHMgRmFicmljRVJDMjBDb250cmFjdCB7XG4gKiAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcignTXlUb2tlbicpOyB9XG4gKiB9XG4gKiAvLyBUaGUgY29udHJhY3QgZXhwb3NlcyBtZXRob2RzIGxpa2UgVHJhbnNmZXIsIEFwcHJvdmUsIE1pbnQsIEJ1cm4sIGV0Yy5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IFdhbGxldFJlcG9cbiAqICAgcGFydGljaXBhbnQgVG9rZW5SZXBvXG4gKiAgIHBhcnRpY2lwYW50IExlZGdlclxuICogICBDbGllbnQtPj5Db250cmFjdDogVHJhbnNmZXIoY3R4LCB0bywgdmFsdWUpXG4gKiAgIENvbnRyYWN0LT4+V2FsbGV0UmVwbzogcmVhZChmcm9tKVxuICogICBDb250cmFjdC0+PldhbGxldFJlcG86IHJlYWQodG8pXG4gKiAgIENvbnRyYWN0LT4+TGVkZ2VyOiBwdXRTdGF0ZSh1cGRhdGVkIGJhbGFuY2VzKVxuICogICBDb250cmFjdC0tPj5DbGllbnQ6IHN1Y2Nlc3NcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZhYnJpY0VSQzIwQ29udHJhY3QgZXh0ZW5kcyBGYWJyaWNDcnVkQ29udHJhY3Q8RVJDMjBXYWxsZXQ+IHtcbiAgcHJpdmF0ZSB3YWxsZXRSZXBvc2l0b3J5OiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8RVJDMjBXYWxsZXQ+O1xuXG4gIHByaXZhdGUgdG9rZW5SZXBvc2l0b3J5OiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8RVJDMjBUb2tlbj47XG5cbiAgcHJpdmF0ZSBhbGxvd2FuY2VSZXBvc2l0b3J5OiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8QWxsb3dhbmNlPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSwgRVJDMjBXYWxsZXQpO1xuXG4gICAgRmFicmljRVJDMjBDb250cmFjdC5hZGFwdGVyID1cbiAgICAgIEZhYnJpY0VSQzIwQ29udHJhY3QuYWRhcHRlciB8fCBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG5cbiAgICB0aGlzLndhbGxldFJlcG9zaXRvcnkgPSBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkuZm9yTW9kZWwoXG4gICAgICBFUkMyMFdhbGxldCxcbiAgICAgIEZhYnJpY0VSQzIwQ29udHJhY3QuYWRhcHRlci5hbGlhc1xuICAgICk7XG5cbiAgICB0aGlzLnRva2VuUmVwb3NpdG9yeSA9IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeS5mb3JNb2RlbChcbiAgICAgIEVSQzIwVG9rZW4sXG4gICAgICBGYWJyaWNFUkMyMENvbnRyYWN0LmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuXG4gICAgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5ID0gRmFicmljQ29udHJhY3RSZXBvc2l0b3J5LmZvck1vZGVsKFxuICAgICAgQWxsb3dhbmNlLFxuICAgICAgRmFicmljRVJDMjBDb250cmFjdC5hZGFwdGVyLmFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgVG9rZW5OYW1lKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuVG9rZW5OYW1lKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBhbHJlYWR5IHNldCBmaXJzdCB0byBleGVjdXRlIHRoZSBmdW5jdGlvblxuICAgIGF3YWl0IHRoaXMuQ2hlY2tJbml0aWFsaXplZChjdHggYXMgYW55KTtcblxuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpO1xuICAgIGNvbnN0IHRva2VuID0gKGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCkpWzBdO1xuXG4gICAgcmV0dXJuIHRva2VuLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzeW1ib2wgb2YgdGhlIHRva2VuLiBFLmcuIOKAnEhJWOKAnS5cbiAgICpcbiAgICogQHBhcmFtIHtDb250ZXh0fSBjb250ZXh0IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFJldHVybnMgdGhlIHN5bWJvbCBvZiB0aGUgdG9rZW5cbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgU3ltYm9sKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuVG9rZW5OYW1lKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBhbHJlYWR5IHNldCBmaXJzdCB0byBleGVjdXRlIHRoZSBmdW5jdGlvblxuICAgIGF3YWl0IHRoaXMuQ2hlY2tJbml0aWFsaXplZChjdHggYXMgYW55KTtcblxuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpO1xuICAgIGNvbnN0IHRva2VuID0gKGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCkpWzBdO1xuXG4gICAgcmV0dXJuIHRva2VuLnN5bWJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWNpbWFscyB0aGUgdG9rZW4gdXNlc1xuICAgKiBlLmcuIDgsIG1lYW5zIHRvIGRpdmlkZSB0aGUgdG9rZW4gYW1vdW50IGJ5IDEwMDAwMDAwMCB0byBnZXQgaXRzIHVzZXIgcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY29udGV4dCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHNcbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgRGVjaW1hbHMoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5Ub2tlbk5hbWUpO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy50b2tlblJlcG9zaXRvcnkuc2VsZWN0KCk7XG4gICAgY29uc3QgdG9rZW4gPSAoYXdhaXQgc2VsZWN0LmV4ZWN1dGUoY3R4KSlbMF07XG5cbiAgICByZXR1cm4gdG9rZW4uZGVjaW1hbHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b3RhbCB0b2tlbiBzdXBwbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY29udGV4dCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSB0b3RhbCB0b2tlbiBzdXBwbHlcbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgVG90YWxTdXBwbHkoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5Ub2tlbk5hbWUpO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy53YWxsZXRSZXBvc2l0b3J5LnNlbGVjdCgpO1xuICAgIGNvbnN0IHdhbGxldHMgPSBhd2FpdCBzZWxlY3QuZXhlY3V0ZShjdHgpO1xuXG4gICAgaWYgKHdhbGxldHMubGVuZ3RoID09IDApIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUaGUgdG9rZW4gJHt0aGlzLmdldE5hbWUoKX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG5cbiAgICBsZXQgdG90YWwgPSAwO1xuXG4gICAgd2FsbGV0cy5mb3JFYWNoKCh3YWxsZXQpID0+IHtcbiAgICAgIHRvdGFsICs9IHdhbGxldC5iYWxhbmNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhbGFuY2VPZiByZXR1cm5zIHRoZSBiYWxhbmNlIG9mIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGN0eCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3duZXIgVGhlIG93bmVyIGZyb20gd2hpY2ggdGhlIGJhbGFuY2Ugd2lsbCBiZSByZXRyaWV2ZWRcbiAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyB0aGUgYWNjb3VudCBiYWxhbmNlXG4gICAqL1xuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIGFzeW5jIEJhbGFuY2VPZihjb250ZXh0OiBDb250ZXh0LCBvd25lcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLlRva2VuTmFtZSk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkucmVhZChvd25lciwgY3R4KTtcblxuICAgIHJldHVybiB3YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBUcmFuc2ZlciB0cmFuc2ZlcnMgdG9rZW5zIGZyb20gY2xpZW50IGFjY291bnQgdG8gcmVjaXBpZW50IGFjY291bnQuXG4gICAqIEBkZXNjcmlwdGlvbiByZWNpcGllbnQgYWNjb3VudCBtdXN0IGJlIGEgdmFsaWQgY2xpZW50SUQgYXMgcmV0dXJuZWQgYnkgdGhlIENsaWVudEFjY291bnRJRCgpIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSByZWNpcGllbnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBhbW91bnQgb2YgdG9rZW4gdG8gYmUgdHJhbnNmZXJyZWRcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybiB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICovXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIFRyYW5zZmVyKFxuICAgIGNvbnRleHQ6IENvbnRleHQsXG4gICAgdG86IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5UcmFuc2Zlcik7XG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3QgZnJvbSA9IGN0eC5pZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgY29uc3QgdHJhbnNmZXJSZXNwID0gYXdhaXQgdGhpcy5fdHJhbnNmZXIoZnJvbSwgdG8sIHZhbHVlLCBjdHgpO1xuICAgIGlmICghdHJhbnNmZXJSZXNwKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkZhaWxlZCB0byB0cmFuc2ZlclwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlciBgdmFsdWVgIGFtb3VudCBvZiB0b2tlbnMgZnJvbSBgZnJvbWAgdG8gYHRvYC5cbiAgICpcbiAgICogQHBhcmFtIHtDb250ZXh0fSBjb250ZXh0IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmcm9tIFRoZSBzZW5kZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSByZWNpcGllbnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBhbW91bnQgb2YgdG9rZW4gdG8gYmUgdHJhbnNmZXJyZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybiB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICovXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIFRyYW5zZmVyRnJvbShcbiAgICBjb250ZXh0OiBDb250ZXh0LFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIHZhbHVlOiBudW1iZXJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICAvLyBSZXRyaWV2ZSB0aGUgYWxsb3dhbmNlIG9mIHRoZSBzcGVuZGVyXG5cbiAgICBjb25zdCBzcGVuZGVyID0gY3R4LmlkZW50aXR5LmdldElEKCk7XG5cbiAgICBjb25zdCBhbGxvd2FuY2UgPSBhd2FpdCB0aGlzLl9nZXRBbGxvd2FuY2UoZnJvbSwgc3BlbmRlciwgY3R4KTtcbiAgICBpZiAoIWFsbG93YW5jZSB8fCBhbGxvd2FuY2UudmFsdWUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWxsb3dhbmNlRXJyb3IoXG4gICAgICAgIGBzcGVuZGVyICR7c3BlbmRlcn0gaGFzIG5vIGFsbG93YW5jZSBmcm9tICR7ZnJvbX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRBbGxvd2FuY2UgPSBhbGxvd2FuY2UudmFsdWU7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhbnNmZXJyZWQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBhbGxvd2FuY2VcbiAgICBpZiAoY3VycmVudEFsbG93YW5jZSA8IHZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgQmFsYW5jZUVycm9yKFxuICAgICAgICBcIlRoZSBzcGVuZGVyIGRvZXMgbm90IGhhdmUgZW5vdWdoIGFsbG93YW5jZSB0byBzcGVuZC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEZWNyZWFzZSB0aGUgYWxsb3dhbmNlXG4gICAgY29uc3QgdXBkYXRlZEFsbG93YW5jZSA9IHN1YihjdXJyZW50QWxsb3dhbmNlLCB2YWx1ZSk7XG4gICAgY29uc3QgbmV3QWxsb3dhbmNlID0gT2JqZWN0LmFzc2lnbih7fSwgYWxsb3dhbmNlLCB7XG4gICAgICB2YWx1ZTogdXBkYXRlZEFsbG93YW5jZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuYWxsb3dhbmNlUmVwb3NpdG9yeS51cGRhdGUobmV3QWxsb3dhbmNlLCBjdHgpO1xuXG4gICAgLy9SZWFsaXplIHRoZSB0cmFuc2ZlclxuICAgIGNvbnN0IHRyYW5zZmVyUmVzcCA9IGF3YWl0IHRoaXMuX3RyYW5zZmVyKGZyb20sIHRvLCB2YWx1ZSwgY3R4KTtcbiAgICBpZiAoIXRyYW5zZmVyUmVzcCkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gdHJhbnNmZXJcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBfdHJhbnNmZXIoXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICApIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyO1xuXG4gICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICBcImNhbm5vdCB0cmFuc2ZlciB0byBhbmQgZnJvbSBzYW1lIGNsaWVudCBhY2NvdW50XCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgLy8gdHJhbnNmZXIgb2YgMCBpcyBhbGxvd2VkIGluIEVSQzIwLCBzbyBqdXN0IHZhbGlkYXRlIGFnYWluc3QgbmVnYXRpdmUgYW1vdW50c1xuICAgICAgdGhyb3cgbmV3IEJhbGFuY2VFcnJvcihcInRyYW5zZmVyIGFtb3VudCBjYW5ub3QgYmUgbmVnYXRpdmVcIik7XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgc2VuZGVyXG5cbiAgICBjb25zdCBmcm9tV2FsbGV0ID0gYXdhaXQgdGhpcy53YWxsZXRSZXBvc2l0b3J5LnJlYWQoZnJvbSwgY3R4KTtcblxuICAgIGNvbnN0IGZyb21CYWxhbmNlID0gZnJvbVdhbGxldC5iYWxhbmNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNlbmRlciBoYXMgZW5vdWdoIHRva2VucyB0byBzcGVuZC5cbiAgICBpZiAoZnJvbUJhbGFuY2UgPCB2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEJhbGFuY2VFcnJvcihgY2xpZW50IGFjY291bnQgJHtmcm9tfSBoYXMgaW5zdWZmaWNpZW50IGZ1bmRzLmApO1xuICAgIH1cblxuICAgIC8vIFJldHJpZXZlIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHJlY2VwaWVudFxuXG4gICAgbGV0IHRvV2FsbGV0OiBFUkMyMFdhbGxldDtcbiAgICBsZXQgbmV3VG9XYWxsZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdG9XYWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkucmVhZCh0bywgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEJhc2VFcnJvcikge1xuICAgICAgICBpZiAoZS5jb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgd2FsbGV0IGZvciB0aGUgbWludGVyXG4gICAgICAgICAgdG9XYWxsZXQgPSBuZXcgRVJDMjBXYWxsZXQoe1xuICAgICAgICAgICAgaWQ6IHRvLFxuICAgICAgICAgICAgYmFsYW5jZTogMCxcbiAgICAgICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLlRva2VuTmFtZShjdHggYXMgYW55KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBuZXdUb1dhbGxldCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRvQmFsYW5jZSA9IHRvV2FsbGV0LmJhbGFuY2U7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJhbGFuY2VcbiAgICBjb25zdCBmcm9tVXBkYXRlZEJhbGFuY2UgPSBzdWIoZnJvbUJhbGFuY2UsIHZhbHVlKTtcbiAgICBjb25zdCB0b1VwZGF0ZWRCYWxhbmNlID0gYWRkKHRvQmFsYW5jZSwgdmFsdWUpO1xuXG4gICAgY29uc3QgdXBkYXRlZEZyb21XYWxsZXQgPSBPYmplY3QuYXNzaWduKHt9LCBmcm9tV2FsbGV0LCB7XG4gICAgICBiYWxhbmNlOiBmcm9tVXBkYXRlZEJhbGFuY2UsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkudXBkYXRlKHVwZGF0ZWRGcm9tV2FsbGV0LCBjdHgpO1xuXG4gICAgY29uc3QgdXBkYXRlZFRvV2FsbGV0ID0gT2JqZWN0LmFzc2lnbih7fSwgdG9XYWxsZXQsIHtcbiAgICAgIGJhbGFuY2U6IHRvVXBkYXRlZEJhbGFuY2UsXG4gICAgfSk7XG5cbiAgICBpZiAobmV3VG9XYWxsZXQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5jcmVhdGUodXBkYXRlZFRvV2FsbGV0LCBjdHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkudXBkYXRlKHVwZGF0ZWRUb1dhbGxldCwgY3R4KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHRoZSBUcmFuc2ZlciBldmVudFxuICAgIGNvbnN0IHRyYW5zZmVyRXZlbnQgPSB7IGZyb20sIHRvLCB2YWx1ZTogdmFsdWUgfTtcblxuICAgIHRoaXMucmVwb1xuICAgICAgLnJlZnJlc2goXG4gICAgICAgIEVSQzIwVG9rZW4gYXMgYW55LFxuICAgICAgICBFUkMyMEV2ZW50cy5UUkFOU0ZFUixcbiAgICAgICAgXCJcIixcbiAgICAgICAgdHJhbnNmZXJFdmVudCxcbiAgICAgICAgY3R4IGFzIHVua25vd24gYXMgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICAgICApXG4gICAgICAuY2F0Y2goKGUpID0+IGxvZy5lcnJvcihgRmFpbGVkIHRvIG5vdGlmeSB0cmFuc2ZlcjogJHtlfWApKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgc3BlbmRlcmAgdG8gc3BlbmQgYHZhbHVlYCBhbW91bnQgb2YgdG9rZW5zIGZyb20gdGhlIG93bmVyLiBOZXcgQXBwcm92ZSBjYWxscyBvdmVycmlkZSB0aGUgcHJldmlvdXMgYWxsb3dhbmNlLlxuICAgKiBAbm90ZSBodHRwczovL2VpcHMuZXRoZXJldW0ub3JnL0VJUFMvZWlwLTIwXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY3R4IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzcGVuZGVyIFRoZSBzcGVuZGVyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBhcHByb3ZlZCBmb3IgdHJhbnNmZXJcbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybiB3aGV0aGVyIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICovXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIEFwcHJvdmUoXG4gICAgY29udGV4dDogQ29udGV4dCxcbiAgICBzcGVuZGVyOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCwgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkFwcHJvdmUpO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3Qgb3duZXIgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgIGxldCBhbGxvd2FuY2UgPSBhd2FpdCB0aGlzLl9nZXRBbGxvd2FuY2Uob3duZXIsIHNwZW5kZXIsIGN0eCk7XG5cbiAgICBjb25zdCBvd25lcldhbGxldCA9IGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5yZWFkKG93bmVyLCAuLi5jdHhBcmdzKTtcblxuICAgIGlmIChvd25lcldhbGxldC5iYWxhbmNlIDwgdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlRXJyb3IoYGNsaWVudCBhY2NvdW50ICR7b3duZXJ9IGhhcyBpbnN1ZmZpY2llbnQgZnVuZHMuYCk7XG4gICAgfVxuXG4gICAgaWYgKGFsbG93YW5jZSkge1xuICAgICAgLy8gT3ZlcndyaXRlIHRoZSBhbGxvd2FuY2VcbiAgICAgIGFsbG93YW5jZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5LnVwZGF0ZShhbGxvd2FuY2UsIC4uLmN0eEFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGxvd2FuY2UgPSBuZXcgQWxsb3dhbmNlKHtcbiAgICAgICAgb3duZXI6IG93bmVyLFxuICAgICAgICBzcGVuZGVyOiBzcGVuZGVyLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5LmNyZWF0ZShhbGxvd2FuY2UsIC4uLmN0eEFyZ3MpO1xuICAgIH1cblxuICAgIC8vIEVtaXQgdGhlIEFwcHJvdmFsIGV2ZW50XG4gICAgY29uc3QgYXBwcm92YWxFdmVudCA9IHsgb3duZXIsIHNwZW5kZXIsIHZhbHVlOiB2YWx1ZSB9O1xuICAgIHRoaXMucmVwby5yZWZyZXNoKFxuICAgICAgRVJDMjBUb2tlbiBhcyBhbnksXG4gICAgICBFUkMyMEV2ZW50cy5BUFBST1ZBTCxcbiAgICAgIFwiXCIsXG4gICAgICBhcHByb3ZhbEV2ZW50LFxuICAgICAgY3R4IGFzIHVua25vd24gYXMgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICAgKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiB0b2tlbnMgd2hpY2ggYCBgIGlzIGFsbG93ZWQgdG8gd2l0aGRyYXcgZnJvbSBgb3duZXJgLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGN0eCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3duZXIgVGhlIG93bmVyIG9mIHRva2Vuc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gc3BlbmRlciBUaGUgc3BlbmRlciB3aG8gYXJlIGFibGUgdG8gdHJhbnNmZXIgdGhlIHRva2Vuc1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm4gdGhlIGFtb3VudCBvZiByZW1haW5pbmcgdG9rZW5zIGFsbG93ZWQgdG8gc3BlbnRcbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgQWxsb3dhbmNlKFxuICAgIGNvbnRleHQ6IENvbnRleHQsXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICBzcGVuZGVyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkFsbG93YW5jZSk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICBjb25zdCBhbGxvd2FuY2UgPSBhd2FpdCB0aGlzLl9nZXRBbGxvd2FuY2Uob3duZXIsIHNwZW5kZXIsIGN0eCk7XG5cbiAgICBpZiAoIWFsbG93YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEFsbG93YW5jZUVycm9yKFxuICAgICAgICBgc3BlbmRlciAke3NwZW5kZXJ9IGhhcyBubyBhbGxvd2FuY2UgZnJvbSAke293bmVyfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhbGxvd2FuY2UudmFsdWU7XG4gIH1cblxuICBhc3luYyBfZ2V0QWxsb3dhbmNlKFxuICAgIG93bmVyOiBzdHJpbmcsXG4gICAgc3BlbmRlcjogc3RyaW5nLFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICk6IFByb21pc2U8QWxsb3dhbmNlPiB7XG4gICAgY29uc3QgYWxsb3dhbmNlQ29uZGl0aW9uID0gQ29uZGl0aW9uLmFuZChcbiAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8QWxsb3dhbmNlPihcIm93bmVyXCIpLmVxKG93bmVyKSxcbiAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8QWxsb3dhbmNlPihcInNwZW5kZXJcIikuZXEoc3BlbmRlcilcbiAgICApO1xuXG4gICAgY29uc3QgYWxsb3dhbmNlID0gYXdhaXQgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZShhbGxvd2FuY2VDb25kaXRpb24pXG4gICAgICAuZXhlY3V0ZShjdHgpO1xuICAgIHJldHVybiBhbGxvd2FuY2U/LlswXTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PSBFeHRlbmRlZCBGdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU2V0IG9wdGlvbmFsIGluZm9tYXRpb24gZm9yIGEgdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY3R4IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0b2tlblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3ltYm9sIFRoZSBzeW1ib2wgb2YgdGhlIHRva2VuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkZWNpbWFscyBUaGUgZGVjaW1hbHMgb2YgdGhlIHRva2VuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0b3RhbFN1cHBseSBUaGUgdG90YWxTdXBwbHkgb2YgdGhlIHRva2VuXG4gICAqL1xuICBAVHJhbnNhY3Rpb24oKVxuICBhc3luYyBJbml0aWFsaXplKGNvbnRleHQ6IENvbnRleHQsIHRva2VuOiBFUkMyMFRva2VuKSB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5Jbml0aWFsaXplKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBub3QgYWxyZWFkeSBzZXQsIGNsaWVudCBpcyBub3QgYXV0aG9yaXplZCB0byBjaGFuZ2UgdGhlbSBvbmNlIGludGl0aWFsaXplZFxuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpLmV4ZWN1dGUoY3R4KTtcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIFwiY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQsIGNsaWVudCBpcyBub3QgYXV0aG9yaXplZCB0byBjaGFuZ2UgdGhlbVwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRva2VuLm93bmVyID0gY3R4LmlkZW50aXR5LmdldElEKCk7XG5cbiAgICBhd2FpdCB0aGlzLnRva2VuUmVwb3NpdG9yeS5jcmVhdGUodG9rZW4sIGN0eCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrcyB0aGF0IGNvbnRyYWN0IG9wdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBhc3luYyBDaGVja0luaXRpYWxpemVkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpLmV4ZWN1dGUoY3R4KTtcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcihcbiAgICAgICAgXCJjb250cmFjdCBvcHRpb25zIG5lZWQgdG8gYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGFueSBmdW5jdGlvbiwgY2FsbCBJbml0aWFsaXplKCkgdG8gaW5pdGlhbGl6ZSBjb250cmFjdFwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGNyZWF0ZXMgbmV3IHRva2VucyBhbmQgYWRkcyB0aGVtIHRvIG1pbnRlcidzIGFjY291bnQgYmFsYW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgYmFsYW5jZVxuICAgKi9cbiAgQE93bmVyKClcbiAgQFRyYW5zYWN0aW9uKClcbiAgYXN5bmMgTWludChjb250ZXh0OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuTWludCk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICAvLyBHZXQgSUQgb2Ygc3VibWl0dGluZyBjbGllbnQgaWRlbnRpdHlcbiAgICBjb25zdCBtaW50ZXIgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgIGlmIChhbW91bnQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIm1pbnQgYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpO1xuICAgIH1cblxuICAgIGxldCBtaW50ZXJXYWxsZXQ6IEVSQzIwV2FsbGV0O1xuICAgIHRyeSB7XG4gICAgICBtaW50ZXJXYWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkucmVhZChtaW50ZXIsIGN0eCk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gbWludGVyV2FsbGV0LmJhbGFuY2U7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRCYWxhbmNlID0gYWRkKGN1cnJlbnRCYWxhbmNlLCBhbW91bnQpO1xuXG4gICAgICBjb25zdCB1cGRhdGVkbWludGVyID0gT2JqZWN0LmFzc2lnbih7fSwgbWludGVyV2FsbGV0LCB7XG4gICAgICAgIGJhbGFuY2U6IHVwZGF0ZWRCYWxhbmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS51cGRhdGUodXBkYXRlZG1pbnRlciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEJhc2VFcnJvcikge1xuICAgICAgICBpZiAoZS5jb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgd2FsbGV0IGZvciB0aGUgbWludGVyXG4gICAgICAgICAgY29uc3QgbmV3V2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHtcbiAgICAgICAgICAgIGlkOiBtaW50ZXIsXG4gICAgICAgICAgICBiYWxhbmNlOiBhbW91bnQsXG4gICAgICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5Ub2tlbk5hbWUoY29udGV4dCksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy53YWxsZXRSZXBvc2l0b3J5LmNyZWF0ZShuZXdXYWxsZXQsIGN0eCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtaXQgdGhlIFRyYW5zZmVyIGV2ZW50XG4gICAgY29uc3QgdHJhbnNmZXJFdmVudCA9IHsgZnJvbTogXCIweDBcIiwgdG86IG1pbnRlciwgdmFsdWU6IGFtb3VudCB9O1xuICAgIGNvbnN0IGV2ZW50SGFuZGxlciA9XG4gICAgICB0aGlzLnJlcG8uT2JzZXJ2ZXJIYW5kbGVyKCkgYXMgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXI7XG4gICAgZXZlbnRIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIEVSQzIwVG9rZW4sXG4gICAgICBFUkMyMEV2ZW50cy5UUkFOU0ZFUixcbiAgICAgIFwiXCIsXG4gICAgICB0cmFuc2ZlckV2ZW50LFxuICAgICAgY3R4IGFzIHVua25vd24gYXMgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJuIHJlZGVlbSB0b2tlbnMgZnJvbSBtaW50ZXIncyBhY2NvdW50IGJhbGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtDb250ZXh0fSBjb250ZXh0IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnQgYW1vdW50IG9mIHRva2VucyB0byBiZSBidXJuZWRcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGJhbGFuY2VcbiAgICovXG4gIEBPd25lcigpXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIEJ1cm4oY29udGV4dDogQ29udGV4dCwgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuQnVybik7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICBjb25zdCBtaW50ZXIgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgIGNvbnN0IG1pbnRlcldhbGxldCA9IGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5yZWFkKG1pbnRlciwgY3R4KTtcblxuICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gbWludGVyV2FsbGV0LmJhbGFuY2U7XG5cbiAgICBpZiAoY3VycmVudEJhbGFuY2UgPCBhbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlRXJyb3IoYE1pbnRlciBoYXMgaW5zdWZmaWNpZW50IGZ1bmRzLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRCYWxhbmNlID0gc3ViKGN1cnJlbnRCYWxhbmNlLCBhbW91bnQpO1xuXG4gICAgY29uc3QgdXBkYXRlZG1pbnRlciA9IE9iamVjdC5hc3NpZ24oe30sIG1pbnRlcldhbGxldCwge1xuICAgICAgYmFsYW5jZTogdXBkYXRlZEJhbGFuY2UsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkudXBkYXRlKHVwZGF0ZWRtaW50ZXIsIGN0eCk7XG5cbiAgICBsb2cuaW5mbyhgJHthbW91bnR9IHRva2VucyB3ZXJlIGJ1cm5lZGApO1xuXG4gICAgLy8gRW1pdCB0aGUgVHJhbnNmZXIgZXZlbnRcbiAgICBjb25zdCB0cmFuc2ZlckV2ZW50ID0geyBmcm9tOiBtaW50ZXIsIHRvOiBcIjB4MFwiLCB2YWx1ZTogYW1vdW50IH07XG4gICAgY29uc3QgZXZlbnRIYW5kbGVyID1cbiAgICAgIHRoaXMucmVwby5PYnNlcnZlckhhbmRsZXIoKSBhcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlPYnNlcnZhYmxlSGFuZGxlcjtcbiAgICBldmVudEhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgRVJDMjBUb2tlbixcbiAgICAgIEVSQzIwRXZlbnRzLlRSQU5TRkVSLFxuICAgICAgXCJcIixcbiAgICAgIHRyYW5zZmVyRXZlbnQsXG4gICAgICBjdHggYXMgdW5rbm93biBhcyBGYWJyaWNDb250cmFjdENvbnRleHRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1cm5Gcm9tIHJlZGVlbSB0b2tlbnMgZnJvbSBhY2NvdW50IGFsbG93ZW5jZSBhbmQgYmFsYW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFjY291bnQgYWNjb3VudCBmcm9tIHdoZXJlIHRva2VucyB3aWxsIGJlIGJ1cm5lZFxuICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBiYWxhbmNlXG4gICAqL1xuICBAT3duZXIoKVxuICBAVHJhbnNhY3Rpb24oKVxuICBhc3luYyBCdXJuRnJvbShcbiAgICBjb250ZXh0OiBDb250ZXh0LFxuICAgIGFjY291bnQ6IHN0cmluZyxcbiAgICBhbW91bnQ6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuQnVybkZyb20pO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3QgYWNjb3VudFdhbGxldCA9IGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5yZWFkKGFjY291bnQsIGN0eCk7XG5cbiAgICBjb25zdCBjdXJyZW50QmFsYW5jZSA9IGFjY291bnRXYWxsZXQuYmFsYW5jZTtcblxuICAgIGlmIChjdXJyZW50QmFsYW5jZSA8IGFtb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEJhbGFuY2VFcnJvcihgJHthY2NvdW50fSBoYXMgaW5zdWZmaWNpZW50IGZ1bmRzLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRCYWxhbmNlID0gc3ViKGN1cnJlbnRCYWxhbmNlLCBhbW91bnQpO1xuXG4gICAgY29uc3QgdXBkYXRlZGFjY291bnQgPSBPYmplY3QuYXNzaWduKHt9LCBhY2NvdW50V2FsbGV0LCB7XG4gICAgICBiYWxhbmNlOiB1cGRhdGVkQmFsYW5jZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS51cGRhdGUodXBkYXRlZGFjY291bnQsIGN0eCk7XG5cbiAgICBsb2cuaW5mbyhgJHthbW91bnR9IHRva2VucyB3ZXJlIGJ1cm5lZCBmcm9tICR7YWNjb3VudH1gKTtcblxuICAgIC8vIEVtaXQgdGhlIFRyYW5zZmVyIGV2ZW50XG4gICAgY29uc3QgdHJhbnNmZXJFdmVudCA9IHsgZnJvbTogYWNjb3VudCwgdG86IFwiMHgwXCIsIHZhbHVlOiBhbW91bnQgfTtcbiAgICBjb25zdCBldmVudEhhbmRsZXIgPVxuICAgICAgdGhpcy5yZXBvLk9ic2VydmVySGFuZGxlcigpIGFzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyO1xuICAgIGV2ZW50SGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICBFUkMyMFRva2VuLFxuICAgICAgRVJDMjBFdmVudHMuVFJBTlNGRVIsXG4gICAgICBcIlwiLFxuICAgICAgdHJhbnNmZXJFdmVudCxcbiAgICAgIGN0eCBhcyB1bmtub3duIGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xpZW50QWNjb3VudEJhbGFuY2UgcmV0dXJucyB0aGUgYmFsYW5jZSBvZiB0aGUgcmVxdWVzdGluZyBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyB0aGUgYWNjb3VudCBiYWxhbmNlXG4gICAqL1xuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIGFzeW5jIENsaWVudEFjY291bnRCYWxhbmNlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuVG9rZW5OYW1lKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBhbHJlYWR5IHNldCBmaXJzdCB0byBleGVjdXRlIHRoZSBmdW5jdGlvblxuICAgIGF3YWl0IHRoaXMuQ2hlY2tJbml0aWFsaXplZChjdHggYXMgYW55KTtcblxuICAgIC8vIEdldCBJRCBvZiBzdWJtaXR0aW5nIGNsaWVudCBpZGVudGl0eVxuICAgIGNvbnN0IGNsaWVudEFjY291bnRJRCA9IGN0eC5pZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgY29uc3QgY2xpZW50V2FsbGV0ID0gYXdhaXQgdGhpcy53YWxsZXRSZXBvc2l0b3J5LnJlYWQoY2xpZW50QWNjb3VudElELCBjdHgpO1xuXG4gICAgaWYgKCFjbGllbnRXYWxsZXQpIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlRXJyb3IoYFRoZSBhY2NvdW50ICR7Y2xpZW50QWNjb3VudElEfSBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIHJldHVybiBjbGllbnRXYWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8vIENsaWVudEFjY291bnRJRCByZXR1cm5zIHRoZSBpZCBvZiB0aGUgcmVxdWVzdGluZyBjbGllbnQncyBhY2NvdW50LlxuICAvLyBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgY2xpZW50IGFjY291bnQgSUQgaXMgdGhlIGNsaWVudElkIGl0c2VsZi5cbiAgLy8gVXNlcnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGVpciBvd24gYWNjb3VudCBpZCwgd2hpY2ggdGhleSBjYW4gdGhlbiBnaXZlIHRvIG90aGVycyBhcyB0aGUgcGF5bWVudCBhZGRyZXNzXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgQ2xpZW50QWNjb3VudElEKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkNsaWVudEFjY291bnRJRCk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICAvLyBHZXQgSUQgb2Ygc3VibWl0dGluZyBjbGllbnQgaWRlbnRpdHlcbiAgICBjb25zdCBjbGllbnRBY2NvdW50SUQgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcbiAgICByZXR1cm4gY2xpZW50QWNjb3VudElEO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGYWJyaWNFUkMyMENvbnRyYWN0IH0gZnJvbSBcIi4vZXJjMjBjb250cmFjdFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vRmFicmljQ29udHJhY3RTdGF0ZW1lbnRcIjtcblxuZXhwb3J0IGNvbnN0IGNvbnRyYWN0czogYW55W10gPSBbRmFicmljRVJDMjBDb250cmFjdF07XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbIkZhYnJpY0NvbnRyYWN0Q29udGV4dCIsIkNvbnRleHQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwic3R1YiIsInRoaXMiLCJnZXQiLCJ0aW1lc3RhbXAiLCJnZXREYXRlVGltZXN0YW1wIiwiaWRlbnRpdHkiLCJ0b1N0cmluZyIsImdlbmVyYXRlRmFicmljRXZlbnROYW1lIiwidGFibGUiLCJldmVudCIsIm93bmVyIiwicGFyYW1zIiwicHVzaCIsImpvaW4iLCJwYXJzZUV2ZW50TmFtZSIsIm5hbWUiLCJwYXJ0cyIsInNwbGl0IiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIiLCJPYnNlcnZlckhhbmRsZXIiLCJzdXBwb3J0ZWRFdmVudHMiLCJPcGVyYXRpb25LZXlzIiwiQ1JFQVRFIiwiVVBEQVRFIiwiREVMRVRFIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwidXBkYXRlT2JzZXJ2ZXJzIiwiY2xhenoiLCJpZCIsImFyZ3MiLCJsb2ciLCJjdHgiLCJBZGFwdGVyIiwibG9nQ3R4IiwicGF5bG9hZCIsImluZGV4T2YiLCJkZWJ1ZyIsImV2ZW50TmFtZSIsInNldEV2ZW50IiwiQnVmZmVyIiwiZnJvbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiYWRhcHRlciIsInRyYWNrZWRFdmVudHMiLCJGYWJyaWNTdGF0ZW1lbnQiLCJDb3VjaERCU3RhdGVtZW50IiwicmF3IiwicmF3SW5wdXQiLCJyZXN1bHRzIiwicGtBdHRyIiwiTW9kZWwiLCJwayIsImZyb21TZWxlY3RvciIsInR5cGUiLCJNZXRhZGF0YSIsImtleSIsIkRCS2V5cyIsIklEIiwic2VsZWN0U2VsZWN0b3IiLCJtYXAiLCJyIiwicHJvY2Vzc1JlY29yZCIsImJ1aWxkIiwic2VsZWN0b3JzIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsInRhYmxlTmFtZSIsInF1ZXJ5Iiwic2VsZWN0b3IiLCJmaWVsZHMiLCJ3aGVyZUNvbmRpdGlvbiIsImNvbmRpdGlvbiIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiYXR0cmlidXRlIiwiZXEiLCJzZWxlY3RvcktleXMiLCJPYmplY3QiLCJrZXlzIiwidmFsdWVzIiwiQ291Y2hEQkdyb3VwT3BlcmF0b3IiLCJBTkQiLCJyZWR1Y2UiLCJhY2N1bSIsInZhbCIsIkVycm9yIiwiayIsIk9SIiwicyIsImVudHJpZXMiLCJyZXN1bHQiLCJmb3JFYWNoIiwiY29uc29sZSIsIndhcm4iLCJvcmRlckJ5U2VsZWN0b3IiLCJzb3J0IiwidmFsdWUiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwibGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJKU09OU2VyaWFsaXplciIsImRlc2VyaWFsaXplIiwic3RyIiwiZGVzZXJpYWxpemF0aW9uIiwicGFyc2UiLCJzZXJpYWxpemUiLCJtb2RlbCIsInJlcXVpcmUiLCJzb3J0S2V5c1JlY3Vyc2l2ZSIsInByZVNlcmlhbGl6ZSIsInRvU2VyaWFsaXplIiwiYXNzaWduIiwiYXN5bmMiLCJvbmVUb09uZU9uQ3JlYXRlIiwiY29udGV4dCIsImRhdGEiLCJwcm9wZXJ0eVZhbHVlIiwiaW5uZXJSZXBvIiwicmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEiLCJhbGlhcyIsInJlYWQiLCJjYWNoZU1vZGVsRm9yUG9wdWxhdGUiLCJjbGFzcyIsIkludGVybmFsRXJyb3IiLCJyZXBvIiwiZm9yTW9kZWwiLCJjcmVhdGVkIiwiY3JlYXRlIiwib25lVG9PbmVPblVwZGF0ZSIsImNhc2NhZGUiLCJ1cGRhdGUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsInVwZGF0ZWQiLCJjcmVhdGVPclVwZGF0ZSIsIm9uZVRvT25lT25EZWxldGUiLCJkZWxldGVkIiwiZGVsZXRlIiwib25lVG9NYW55T25DcmVhdGUiLCJwcm9wZXJ0eVZhbHVlcyIsImFycmF5VHlwZSIsImV2ZXJ5IiwiaXRlbSIsInVuaXF1ZVZhbHVlcyIsIlNldCIsInBrTmFtZSIsIm0iLCJyZWNvcmQiLCJhZGQiLCJvbmVUb01hbnlPbkRlbGV0ZSIsImFyZUFsbFNhbWVUeXBlIiwiaXNJbnN0YW50aWF0ZWQiLCJ2IiwicG9wdWxhdGUiLCJuZXN0ZWQiLCJpc0FyciIsIkFycmF5IiwiaXNBcnJheSIsImZldGNoUG9wdWxhdGVWYWx1ZXMiLCJjIiwicHJvcE5hbWUiLCJwcm9wS2V5VmFsdWVzIiwiY2FjaGVLZXkiLCJwcm9LZXlWYWx1ZSIsImdldFBvcHVsYXRlS2V5IiwiZSIsInJlcyIsIkNvbnRyYWN0TG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbmYiLCJsb2dnZXIiLCJsb2dnaW5nIiwiZ2V0TG9nZ2VyIiwibGV2ZWwiLCJtc2ciLCJzdGFjayIsIk51bWVyaWNMb2dMZXZlbHMiLCJjb25maWciLCJtZXRob2QiLCJMb2dMZXZlbCIsImluZm8iLCJ2ZXJib3NlIiwiZXJyb3IiLCJzaWxseSIsImNhbGwiLCJjcmVhdGVMb2ciLCJmYWN0b3J5Iiwib2JqZWN0IiwiTG9nZ2luZyIsInNldEZhY3RvcnkiLCJjcmVhdGVkQnlPbkZhYnJpY0NyZWF0ZVVwZGF0ZSIsInVzZXIiLCJnZXRJRCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwa0ZhYnJpY09uQ3JlYXRlIiwic2V0UHJpbWFyeUtleVZhbHVlIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsInNlcXVlbmNlTmFtZSIsInNlcXVlbmNlIiwiU2VxdWVuY2UiLCJuZXh0IiwiRmFicmljQ29udHJhY3RBZGFwdGVyIiwiQ291Y2hEQkFkYXB0ZXIiLCJnZXRDbGllbnQiLCJ0ZXh0RGVjb2RlciIsIlRleHREZWNvZGVyIiwic2VyaWFsaXplciIsInJlcG9zaXRvcnkiLCJzY29wZSIsImZvciIsImNvbXBvc2VkS2V5IiwiY3JlYXRlQ29tcG9zaXRlS2V5IiwiU3RyaW5nIiwicHV0U3RhdGUiLCJwYXJzZUVycm9yIiwicmVhZFN0YXRlIiwiY3R4QXJncyIsImRlbGV0ZVN0YXRlIiwiZm9yUHJpdmF0ZSIsImNvbGxlY3Rpb24iLCJ0b092ZXJyaWRlIiwicXVlcnlSZXN1bHQiLCJxdWVyeVJlc3VsdFBhZ2luYXRlZCIsImZuIiwiUHJveHkiLCJwcm9wIiwicmVjZWl2ZXIiLCJpbmNsdWRlcyIsIlJlZmxlY3QiLCJhcHBseSIsInRoaXNBcmciLCJhcmdzTGlzdCIsInB1dFByaXZhdGVEYXRhIiwiZGVsZXRlUHJpdmF0ZURhdGEiLCJnZXRQcml2YXRlRGF0YSIsImdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQiLCJpdGVyYXRvciIsImNvdW50IiwicmVhY2hlZEJvb2ttYXJrIiwibGFzdEtleSIsInJlY29yZEtleSIsInJlY29yZFZhbHVlIiwiS2V5IiwiUmVjb3JkIiwiY2xvc2UiLCJtZXRhZGF0YSIsImZldGNoZWRSZWNvcmRzQ291bnQiLCJib29rbWFyayIsImRvbmUiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJnZXRTdGF0ZSIsIk5vdEZvdW5kRXJyb3IiLCJnZXRRdWVyeVJlc3VsdCIsIl9pZCIsIiRndCIsIiRndGUiLCJpdCIsImdldFF1ZXJ5UmVzdWx0V2l0aFBhZ2luYXRpb24iLCJtZXJnZU1vZGVscyIsImV4dHJhY3QiLCJmaW5hbE1vZGVsIiwicG9wIiwiZGVjb2RlIiwiYnVmZmVyIiwiZmxhZ3MiLCJvcGVyYXRpb24iLCJiYXNlRmxhZ3MiLCJzZWdyZWdhdGVkIiwiY29ycmVsYXRpb25JZCIsImdldFR4SUQiLCJjbGllbnRJZGVudGl0eSIsImluZGV4IiwibW9kZWxzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXN1bHRJdGVyYXRvciIsImlzSGlzdG9yeSIsImFsbFJlc3VsdHMiLCJqc29uUmVzIiwiVHhJZCIsInR4SWQiLCJUaW1lc3RhbXAiLCJWYWx1ZSIsImVyciIsImRvY3NPbmx5IiwicmVzcG9uc2UiLCJTdGF0ZW1lbnQiLCJjcmVhdGVBbGwiLCJ0YWJsZUxhYmVsIiwiYWxsIiwiaSIsInVwZGF0ZUFsbCIsInByZXBhcmUiLCJzZWdyZWdhdGUiLCJtYXBwZWRQcm9wIiwiY29sdW1uTmFtZSIsImlzUmVzZXJ2ZWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJvYmoiLCJvYiIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZVByZWZpeCIsImNyZWF0ZUFsbFByZWZpeCIsImlkcyIsInJlY29yZHMiLCJ1cGRhdGVBbGxQcmVmaXgiLCJyZWFzb24iLCJmaWx0ZXIiLCJhIiwiY2xlYXIiLCJtZXNzYWdlIiwiQ29uZmxpY3RFcnJvciIsIkJhZFJlcXVlc3RFcnJvciIsIlF1ZXJ5RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZGVjb3JhdGlvbiIsIkRlY29yYXRpb24iLCJmbGF2b3VyZWRBcyIsIlBlcnNpc3RlbmNlS2V5cyIsIkNSRUFURURfQlkiLCJkZWZpbmUiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIlVQREFURURfQlkiLCJvbkNyZWF0ZVVwZGF0ZSIsImRlY29yYXRvciIsInBrRGVjIiwib3B0aW9ucyIsImdyb3Vwc29ydCIsImF0dHIiLCJyZXF1aXJlZCIsInJlYWRvbmx5IiwiQ09MVU1OIiwiZXh0ZW5kIiwiRmFicmljUHJvcGVydHkiLCJGYWJyaWNPYmplY3QiLCJvbmVUb09uZURlYyIsImpvaW5Db2x1bW5PcHRzIiwiZmsiLCJtZXRhIiwiam9pblRhYmxlIiwicmVsYXRpb24iLCJPTkVfVE9fT05FIiwiTnVtYmVyIiwiQmlnSW50Iiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsImFmdGVyQW55Iiwib25lVG9NYW55RGVjIiwiam9pblRhYmxlT3B0cyIsIk9ORV9UT19NQU5ZIiwibGlzdCIsIm9uZVRvTWFueU9uVXBkYXRlIiwic2V0Q3VycmVudCIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiRmFicmljQ3J1ZENvbnRyYWN0IiwiQ29udHJhY3QiLCJpbml0aWFsaXplZCIsImxpc3RCeSIsIm9yZGVyIiwicGFnaW5hdGVCeSIsInNpemUiLCJmaW5kT25lQnkiLCJzdGF0ZW1lbnQiLCJnZXRUcmFuc2llbnREYXRhIiwibWVyZ2UiLCJ0cmFuc2llbnRNYXAiLCJnZXRUcmFuc2llbnQiLCJoYXMiLCJkZWxldGVBbGwiLCJyZWFkQWxsIiwib3JkZXJCeSIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiaW5pdCIsImdldE5hbWUiLCJoZWFsdGhjaGVjayIsImJpbmQiLCJDdHgiLCJnZXRPcCIsIlJFQUQiLCJSRUFEX0FMTCIsIm92ZXJyaWRlcyIsIlNlcmlhbGl6ZWRDcnVkQ29udHJhY3QiLCJwYXJzZWRLZXlzIiwibW9kZWxMaXN0IiwiY29uZCIsInBhcnNlZElucHV0IiwiX19kZWNvcmF0ZSIsIlRyYW5zYWN0aW9uIiwicHJvdG90eXBlIiwiT3ZlcmZsb3dFcnJvciIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwiYiIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwiVmFsaWRhdGlvbkVycm9yIiwic3RyaW5nRm9ybWF0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJjb2x1bW4iLCJFUkMyMFdhbGxldCIsIkFsbG93YW5jZSIsIk93bmVyIiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwib3duZWRCeU9uQ3JlYXRlIiwiY3JlYXRvciIsImdldENyZWF0b3IiLCJtc3BpZCIsInNldE93bmVkQnlLZXlWYWx1ZSIsIk93bmVkQnkiLCJnZXRGYWJyaWNNb2RlbEtleSIsIk9XTkVEQlkiLCJvd25lZEJ5IiwiRkFCUklDIiwiSW1wbGljaXRQcml2YXRlQ29sbGVjdGlvbiIsInNlZ3JlZ2F0ZWREYXRhT25DcmVhdGUiLCJjb2xsZWN0aW9uUmVzb2x2ZXIiLCJjb2xsZWN0aW9ucyIsInJlYnVpbHQiLCJhY2MiLCJ0b0NyZWF0ZSIsIm92ZXJyaWRlIiwic2VncmVnYXRlZERhdGFPblJlYWQiLCJzZWdyZWdhdGVkRGF0YU9uVXBkYXRlIiwib2xkTW9kZWwiLCJzZWdyZWdhdGVkRGF0YU9uRGVsZXRlIiwiaW5uZXJTZWdyZWdhdGVkIiwic2VncmVnYXRlZERlYyIsInByb3BzIiwicHJvcGVydGllcyIsImNvbnN0ciIsInNldCIsImRlY3MiLCJwIiwicHJpb3JpdHkiLCJncm91cCIsIm9uUmVhZCIsInByaXZhdGVEYXRhIiwiUFJJVkFURSIsInNoYXJlZERhdGEiLCJTSEFSRUQiLCJFUkMyMEV2ZW50cyIsIkZhYnJpY0VSQzIwQ29udHJhY3QiLCJ3YWxsZXRSZXBvc2l0b3J5IiwidG9rZW5SZXBvc2l0b3J5IiwiYWxsb3dhbmNlUmVwb3NpdG9yeSIsIlRva2VuTmFtZSIsIkNoZWNrSW5pdGlhbGl6ZWQiLCJ0b2tlbiIsIlN5bWJvbCIsInN5bWJvbCIsIkRlY2ltYWxzIiwiZGVjaW1hbHMiLCJUb3RhbFN1cHBseSIsIndhbGxldHMiLCJ0b3RhbCIsIndhbGxldCIsImJhbGFuY2UiLCJCYWxhbmNlT2YiLCJUcmFuc2ZlciIsInRvIiwidHJhbnNmZXJSZXNwIiwiX3RyYW5zZmVyIiwiVHJhbnNmZXJGcm9tIiwiQnVybkZyb20iLCJzcGVuZGVyIiwiYWxsb3dhbmNlIiwiX2dldEFsbG93YW5jZSIsImN1cnJlbnRBbGxvd2FuY2UiLCJ1cGRhdGVkQWxsb3dhbmNlIiwibmV3QWxsb3dhbmNlIiwiZnJvbVdhbGxldCIsImZyb21CYWxhbmNlIiwidG9XYWxsZXQiLCJuZXdUb1dhbGxldCIsImNvZGUiLCJ0b0JhbGFuY2UiLCJmcm9tVXBkYXRlZEJhbGFuY2UiLCJ0b1VwZGF0ZWRCYWxhbmNlIiwidXBkYXRlZEZyb21XYWxsZXQiLCJ1cGRhdGVkVG9XYWxsZXQiLCJ0cmFuc2ZlckV2ZW50IiwicmVmcmVzaCIsIlRSQU5TRkVSIiwiY2F0Y2giLCJBcHByb3ZlIiwib3duZXJXYWxsZXQiLCJhcHByb3ZhbEV2ZW50IiwiQVBQUk9WQUwiLCJhbGxvd2FuY2VDb25kaXRpb24iLCJ3aGVyZSIsIkluaXRpYWxpemUiLCJNaW50IiwiYW1vdW50IiwibWludGVyIiwibWludGVyV2FsbGV0IiwiY3VycmVudEJhbGFuY2UiLCJ1cGRhdGVkQmFsYW5jZSIsInVwZGF0ZWRtaW50ZXIiLCJuZXdXYWxsZXQiLCJldmVudEhhbmRsZXIiLCJCdXJuIiwiYWNjb3VudCIsImFjY291bnRXYWxsZXQiLCJ1cGRhdGVkYWNjb3VudCIsIkNsaWVudEFjY291bnRCYWxhbmNlIiwiY2xpZW50QWNjb3VudElEIiwiY2xpZW50V2FsbGV0IiwiQ2xpZW50QWNjb3VudElEIiwiX19tZXRhZGF0YSIsImNvbnRyYWN0cyIsIlZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQ00sTUFBT0EsOEJBQThCQztJQUt6QyxXQUFBQztRQUNFQztBQUNEO0lBT0QsUUFBSUM7UUFDRixPQUFPQyxLQUFLQyxJQUFJO0FBQ2pCO0lBT0QsYUFBYUM7UUFDWCxPQUFPRixLQUFLRCxLQUFLSTtBQUNsQjtJQU9ELFlBQUlDO1FBQ0YsT0FBT0osS0FBS0MsSUFBSTtBQUNqQjtJQUVRLFFBQUFJO1FBQ1AsT0FBTyxhQUFhTCxLQUFLRCxPQUFPLGVBQWU7QUFDaEQ7OztTQzVEYU8sd0JBQ2RDLE9BQ0FDLE9BQ0FDO0lBRUEsTUFBTUMsU0FBUyxFQUFDSCxPQUFPQztJQUN2QixJQUFJQyxPQUFPQyxPQUFPQyxLQUFLRjtJQUN2QixPQUFPQyxPQUFPRSxLQUFLO0FBQ3JCOztBQXNCTSxT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
|
|
1831
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWZhYnJpYy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRyYWN0cy9Db250cmFjdENvbnRleHQudHMiLCIuLi9zcmMvc2hhcmVkL2V2ZW50cy50cyIsIi4uL3NyYy9jb250cmFjdHMvRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIudHMiLCIuLi9zcmMvY29udHJhY3RzL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9jb250cmFjdHMvRmFicmljQ29udHJhY3RTdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2hhcmVkL2NvbnN0YW50cy50cyIsIi4uL3NyYy9zaGFyZWQvU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIudHMiLCIuLi9zcmMvY29udHJhY3RzL0ZhYnJpY0NvbnN0cnVjdGlvbi50cyIsIi4uL3NyYy9jb250cmFjdHMvbG9nZ2luZy50cyIsIi4uL3NyYy9jb250cmFjdHMvQ29udHJhY3RBZGFwdGVyLnRzIiwiLi4vc3JjL3NoYXJlZC9EZXRlcm1pbmlzdGljU2VyaWFsaXplci50cyIsIi4uL3NyYy9jb250cmFjdHMvY3J1ZC9jcnVkLWNvbnRyYWN0LnRzIiwiLi4vc3JjL2NvbnRyYWN0cy9jcnVkL3NlcmlhbGl6ZWQtY3J1ZC1jb250cmFjdC50cyIsIi4uL3NyYy9zaGFyZWQvZXJyb3JzLnRzIiwiLi4vc3JjL3NoYXJlZC9tYXRoLnRzIiwiLi4vc3JjL2NvbnRyYWN0cy9lcmMyMC9tb2RlbHMudHMiLCIuLi9zcmMvc2hhcmVkL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvc2hhcmVkL2VyYzIwL2VyYzIwLWNvbnN0YW50cy50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvZXJjMjBjb250cmFjdC50cyIsIi4uL3NyYy9jb250cmFjdHMvZXJjMjAvaW5kZXgudHMiLCIuLi9zcmMvdmVyc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENoYWluY29kZVN0dWIsIENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb250ZXh0IGNsYXNzIGZvciBGYWJyaWMgY2hhaW5jb2RlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGFjY2VzcyB0byBGYWJyaWMtc3BlY2lmaWMgY29udGV4dCBlbGVtZW50cyBsaWtlIHN0dWIsIGlkZW50aXR5LCBhbmQgbG9nZ2VyIHRvIGJlIHVzZWQgYnkgcmVwb3NpdG9yaWVzIGFuZCBhZGFwdGVycyBkdXJpbmcgY29udHJhY3QgZXhlY3V0aW9uLlxuICogQHRlbXBsYXRlIEYgLSBGbGFncyBzcGVjaWZpYyB0byBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbmFsIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGJhc2UgQ29udGV4dFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNDb250cmFjdENvbnRleHRcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3QgbWV0aG9kXG4gKiBjb25zdCBjb250ZXh0ID0gbmV3IEZhYnJpY0NvbnRyYWN0Q29udGV4dCgpO1xuICogLy8gT3B0aW9uYWxseSBzZXQgdmFsdWVzIHZpYSB0aGUgYmFzZSBDb250ZXh0IEFQSVxuICogY29udGV4dC5zZXQoJ3N0dWInLCBjdHguc3R1Yik7XG4gKiBjb250ZXh0LnNldCgnY2xpZW50SWRlbnRpdHknLCBjdHguY2xpZW50SWRlbnRpdHkpO1xuICogY29udGV4dC5zZXQoJ2xvZ2dlcicsIGNvbnRyYWN0TG9nZ2VyKTtcbiAqXG4gKiAvLyBBY2Nlc3MgY29udGV4dCBwcm9wZXJ0aWVzXG4gKiBjb25zdCB0aW1lc3RhbXAgPSBjb250ZXh0LnRpbWVzdGFtcDtcbiAqIGNvbnN0IGNyZWF0b3IgPSBjb250ZXh0LmlkZW50aXR5LmdldElEKCk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgQ29udGV4dFxuICogICBwYXJ0aWNpcGFudCBMZWRnZXJcbiAqICAgQ29udHJhY3QtPj5Db250ZXh0OiBuZXcgRmFicmljQ29udHJhY3RDb250ZXh0KClcbiAqICAgQ29udHJhY3QtPj5Db250ZXh0OiBzZXQoJ3N0dWInfCdjbGllbnRJZGVudGl0eSd8J2xvZ2dlcicsIC4uLilcbiAqICAgQ29udGV4dC0tPj5Db250cmFjdDogdGltZXN0YW1wLCBpZGVudGl0eSwgbG9nZ2VyXG4gKiAgIENvbnRyYWN0LT4+TGVkZ2VyOiBJbnRlcmFjdCB2aWEgc3R1YlxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RDb250ZXh0IGV4dGVuZHMgQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBGYWJyaWNDb250cmFjdENvbnRleHQgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGNvbnRleHQgd2l0aCBGYWJyaWMtc3BlY2lmaWMgZmxhZ3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNoYWluY29kZSBzdHViXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIENoYWluY29kZVN0dWIgaW5zdGFuY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGxlZGdlclxuICAgKiBAcmV0dXJuIHtDaGFpbmNvZGVTdHVifSBUaGUgY2hhaW5jb2RlIHN0dWJcbiAgICovXG4gIGdldCBzdHViKCk6IENoYWluY29kZVN0dWIge1xuICAgIHJldHVybiB0aGlzLmdldChcInN0dWJcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcFxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgdGltZXN0YW1wIGdldHRlciB0byB1c2UgdGhlIHN0dWIncyB0aW1lc3RhbXBcbiAgICogQHJldHVybiB7RGF0ZX0gVGhlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IHRpbWVzdGFtcCgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdHViLmdldERhdGVUaW1lc3RhbXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY2xpZW50IGlkZW50aXR5XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIENsaWVudElkZW50aXR5IGluc3RhbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24gc3VibWl0dGVyXG4gICAqIEByZXR1cm4ge0NsaWVudElkZW50aXR5fSBUaGUgY2xpZW50IGlkZW50aXR5XG4gICAqL1xuICBnZXQgaWRlbnRpdHkoKTogQ2xpZW50SWRlbnRpdHkge1xuICAgIHJldHVybiB0aGlzLmdldChcImlkZW50aXR5XCIpO1xuICB9XG5cbiAgb3ZlcnJpZGUgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBmYWJyaWMgY3R4JHt0aGlzLnN0dWIgPyBcIiB3aXRoIHN0dWJcIiA6IFwid2l0aG91dCBzdHViXCJ9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQnVsa0NydWRPcGVyYXRpb25LZXlzLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIEZhYnJpYyBldmVudCBuYW1lIGZyb20gY29tcG9uZW50c1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBuYW1lIGJ5IGpvaW5pbmcgdGFibGUsIGV2ZW50LCBhbmQgb3B0aW9uYWwgb3duZXIgd2l0aCB1bmRlcnNjb3Jlc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL2NvbGxlY3Rpb24gbmFtZVxuICogQHBhcmFtIHtPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nfSBldmVudCAtIFRoZSBldmVudCB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ30gW293bmVyXSAtIE9wdGlvbmFsIG93bmVyIGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBldmVudCBuYW1lIGluIGZvcm1hdCBcInRhYmxlX2V2ZW50XCIgb3IgXCJ0YWJsZV9ldmVudF9vd25lclwiXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRmFicmljRXZlbnROYW1lKFxuICB0YWJsZTogc3RyaW5nLFxuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgb3duZXI/OiBzdHJpbmdcbikge1xuICBjb25zdCBwYXJhbXMgPSBbdGFibGUsIGV2ZW50XTtcbiAgaWYgKG93bmVyKSBwYXJhbXMucHVzaChvd25lcik7XG4gIHJldHVybiBwYXJhbXMuam9pbihcIl9cIik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIEZhYnJpYyBldmVudCBuYW1lIGludG8gaXRzIGNvbXBvbmVudHNcbiAqIEBzdW1tYXJ5IFNwbGl0cyBhbiBldmVudCBuYW1lIGJ5IHVuZGVyc2NvcmVzIGFuZCBleHRyYWN0cyB0YWJsZSwgZXZlbnQsIGFuZCBvcHRpb25hbCBvd25lclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZXZlbnQgbmFtZSB0byBwYXJzZVxuICogQHJldHVybiB7e3RhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLCBvd25lcjogc3RyaW5nfX0gVGhlIHBhcnNlZCBjb21wb25lbnRzIGFzIGEgc3RydWN0dXJlZCBvYmplY3RcbiAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBldmVudCBuYW1lIGZvcm1hdCBpcyBpbnZhbGlkXG4gKiBAZnVuY3Rpb24gcGFyc2VFdmVudE5hbWVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IFBhcnNlciBhcyBwYXJzZUV2ZW50TmFtZVxuICogICBDYWxsZXItPj5QYXJzZXI6IHBhcnNlRXZlbnROYW1lKG5hbWUpXG4gKiAgIFBhcnNlci0+PlBhcnNlcjogc3BsaXQgbmFtZSBieSBcIl9cIlxuICogICBhbHQgcGFydHMgbGVuZ3RoIGludmFsaWRcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gKiAgIGVsc2VcbiAqICAgICBQYXJzZXItLT4+Q2FsbGVyOiB7IHRhYmxlLCBldmVudCwgb3duZXI/IH1cbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50TmFtZShuYW1lOiBzdHJpbmcpOiB7XG4gIHRhYmxlPzogc3RyaW5nO1xuICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZztcbiAgb3duZXI/OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KFwiX1wiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMylcbiAgICByZXR1cm4geyB0YWJsZTogdW5kZWZpbmVkLCBldmVudDogbmFtZSwgb3duZXI6IHVuZGVmaW5lZCB9O1xuICByZXR1cm4ge1xuICAgIHRhYmxlOiBwYXJ0c1swXSxcbiAgICBldmVudDogcGFydHNbMV0sXG4gICAgb3duZXI6IHBhcnRzWzJdLFxuICB9IGFzIHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nO1xuICAgIG93bmVyPzogc3RyaW5nO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQnVsa0NydWRPcGVyYXRpb25LZXlzLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb250ZXh0dWFsQXJncyxcbiAgRXZlbnRJZHMsXG4gIE9ic2VydmVySGFuZGxlcixcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSB9IGZyb20gXCIuLi9zaGFyZWQvZXZlbnRzXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9ic2VydmVyIGhhbmRsZXIgZm9yIEZhYnJpYyBjaGFpbmNvZGUgZXZlbnRzXG4gKiBAc3VtbWFyeSBFbWl0cyBldmVudHMgb24gdGhlIEZhYnJpYyBsZWRnZXIgd2hlbiByZXBvc2l0b3J5IG9wZXJhdGlvbnMgb2NjdXJcbiAqIEBjbGFzcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlPYnNlcnZhYmxlSGFuZGxlclxuICogQGV4dGVuZHMge09ic2VydmVySGFuZGxlcn1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RcbiAqIGltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIC8vIENyZWF0ZSBhIGhhbmRsZXIgd2l0aCBkZWZhdWx0IHN1cHBvcnRlZCBldmVudHNcbiAqIGNvbnN0IGhhbmRsZXIgPSBuZXcgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIoKTtcbiAqXG4gKiAvLyBFbWl0IGFuIGV2ZW50XG4gKiBhd2FpdCBoYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAqICAgbG9nZ2VyLFxuICogICAnYXNzZXRzJyxcbiAqICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gKiAgICdhc3NldDEnLFxuICogICBjb250ZXh0XG4gKiApO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgT2JzZXJ2YWJsZUhhbmRsZXJcbiAqICAgcGFydGljaXBhbnQgU3R1YlxuICogICBwYXJ0aWNpcGFudCBMZWRnZXJcbiAqXG4gKiAgIFJlcG9zaXRvcnktPj5PYnNlcnZhYmxlSGFuZGxlcjogdXBkYXRlT2JzZXJ2ZXJzKGxvZywgdGFibGUsIGV2ZW50LCBpZCwgY3R4KVxuICogICBPYnNlcnZhYmxlSGFuZGxlci0+Pk9ic2VydmFibGVIYW5kbGVyOiBDaGVjayBpZiBldmVudCBpcyBzdXBwb3J0ZWRcbiAqICAgT2JzZXJ2YWJsZUhhbmRsZXItPj5PYnNlcnZhYmxlSGFuZGxlcjogZ2VuZXJhdGVGYWJyaWNFdmVudE5hbWUodGFibGUsIGV2ZW50LCBvd25lcilcbiAqICAgT2JzZXJ2YWJsZUhhbmRsZXItPj5TdHViOiBzZXRFdmVudChldmVudE5hbWUsIHBheWxvYWQpXG4gKiAgIFN0dWItPj5MZWRnZXI6IFJlY29yZCBldmVudFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIgZXh0ZW5kcyBPYnNlcnZlckhhbmRsZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgdGhlIGhhbmRsZXIgd2l0aCBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGV2ZW50c1xuICAgKiBAcGFyYW0ge0FycmF5PE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmc+fSBbc3VwcG9ydGVkRXZlbnRzXSAtIEV2ZW50cyB0aGF0IHdpbGwgdHJpZ2dlciBGYWJyaWMgZXZlbnRzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN1cHBvcnRlZEV2ZW50czogKFxuICAgICAgfCBPcGVyYXRpb25LZXlzXG4gICAgICB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5c1xuICAgICAgfCBzdHJpbmdcbiAgICApW10gPSBbXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTCxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsXG4gICAgXVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBieSBlbWl0dGluZyBGYWJyaWMgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGV2ZW50cyBvbiB0aGUgRmFicmljIGxlZGdlciBmb3Igc3VwcG9ydGVkIGV2ZW50IHR5cGVzXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvY29sbGVjdGlvbiBuYW1lXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBldmVudCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmFicmljQ29udHJhY3RDb250ZXh0fSBjdHggLSBUaGUgRmFicmljIGNvbnRyYWN0IGNvbnRleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvd25lcl0gLSBPcHRpb25hbCBvd25lciBpZGVudGlmaWVyIGZvciB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtvYmplY3QgfCBzdHJpbmcgfCB1bmRlZmluZWR9IFtvd25lcl0gLSBPcHRpb25hbCBwYXlsb2FkIGZvciB0aGUgZXZlbnRcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV2ZW50IGlzIGVtaXR0ZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55PixcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBBZGFwdGVyLmxvZ0N0eDxGYWJyaWNDb250cmFjdENvbnRleHQ+KFxuICAgICAgYXJncyxcbiAgICAgIHRoaXMudXBkYXRlT2JzZXJ2ZXJzXG4gICAgKTtcbiAgICBjb25zdCB7IHN0dWIgfSA9IGN0eDtcbiAgICBjb25zdCBbb3duZXIsIHBheWxvYWRdID0gYXJncztcbiAgICBjb25zdCB0YWJsZSA9IHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IGNsYXp6IDogY2xhenoubmFtZTtcbiAgICBpZiAodGhpcy5zdXBwb3J0ZWRFdmVudHMuaW5kZXhPZihldmVudCkgIT09IC0xKSB7XG4gICAgICBsb2cuZGVidWcoYEVtaXR0aW5nICR7ZXZlbnR9IGV2ZW50YCk7XG4gICAgICBjb25zdCBldmVudE5hbWUgPSBnZW5lcmF0ZUZhYnJpY0V2ZW50TmFtZSh0YWJsZSwgZXZlbnQsIG93bmVyKTtcbiAgICAgIHN0dWIuc2V0RXZlbnQoZXZlbnROYW1lLCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGlkOiBpZCB9KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHViLnNldEV2ZW50KGV2ZW50LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShwYXlsb2FkKSkpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgUmVwb3NpdG9yeSxcbiAgT2JzZXJ2ZXJIYW5kbGVyLFxuICBFdmVudElkcyxcbiAgQ29udGV4dHVhbEFyZ3MsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RDb250ZXh0IH0gZnJvbSBcIi4vQ29udHJhY3RDb250ZXh0XCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyIH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXJcIjtcbmltcG9ydCB7IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cywgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB0eXBlIHsgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSBcIi4vQ29udHJhY3RBZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgZm9yIEh5cGVybGVkZ2VyIEZhYnJpYyBjaGFpbmNvZGUgbW9kZWxzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIG1vZGVscyB3aXRoaW4gRmFicmljIGNoYWluY29kZSBjb250cmFjdHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBNYW5nb1F1ZXJ5IC0gUXVlcnkgdHlwZSBmb3IgQ291Y2hEQi1saWtlIHF1ZXJpZXNcbiAqIEB0ZW1wbGF0ZSBGYWJyaWNDb250cmFjdEFkYXB0ZXIgLSBBZGFwdGVyIHR5cGUgZm9yIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RDb250ZXh0IC0gQ29udGV4dCB0eXBlIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICpcbiAqIEBwYXJhbSB7RmFicmljQ29udHJhY3RBZGFwdGVyfSBbYWRhcHRlcl0gLSBUaGUgYWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc3RhdGUgZGF0YWJhc2VcbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IFtjbGF6el0gLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXk8T3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZz59IFt0cmFja2VkRXZlbnRzXSAtIEV2ZW50cyB0byB0cmFjayBmb3Igb2JzZXJ2ZXIgbm90aWZpY2F0aW9uc1xuICpcbiAqIEBjbGFzcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3QgY2xhc3NcbiAqIGltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeSwgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIEB0YWJsZSgnYXNzZXRzJylcbiAqIGNsYXNzIEFzc2V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAaWQoKVxuICogICBpZDogc3RyaW5nO1xuICpcbiAqICAgQHByb3BlcnR5KClcbiAqICAgZGF0YTogc3RyaW5nO1xuICogfVxuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBwcml2YXRlIGFkYXB0ZXIgPSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG4gKiAgIHByaXZhdGUgcmVwb3NpdG9yeTogRmFicmljQ29udHJhY3RSZXBvc2l0b3J5PEFzc2V0PjtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKCdNeUNvbnRyYWN0Jyk7XG4gKiAgICAgdGhpcy5yZXBvc2l0b3J5ID0gbmV3IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxBc3NldD4odGhpcy5hZGFwdGVyLCBBc3NldCk7XG4gKiAgIH1cbiAqXG4gKiAgIEBUcmFuc2FjdGlvbigpXG4gKiAgIGFzeW5jIGNyZWF0ZUFzc2V0KGN0eDogQ29udGV4dCwgaWQ6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgICAgY29uc3QgYXNzZXQgPSBuZXcgQXNzZXQoKTtcbiAqICAgICBhc3NldC5pZCA9IGlkO1xuICogICAgIGFzc2V0LmRhdGEgPSBkYXRhO1xuICpcbiAqICAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuY3JlYXRlKGFzc2V0LCB7IHN0dWI6IGN0eC5zdHViIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ29udHJhY3RcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAqXG4gKiAgIENvbnRyYWN0LT4+UmVwb3NpdG9yeTogY3JlYXRlKG1vZGVsLCBjdHgpXG4gKiAgIFJlcG9zaXRvcnktPj5BZGFwdGVyOiBwcmVwYXJlKG1vZGVsLCBwaylcbiAqICAgUmVwb3NpdG9yeS0+PkFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCByZWNvcmQsIHRyYW5zaWVudCwgY3R4KVxuICogICBBZGFwdGVyLT4+U3RhdGVEQjogcHV0U3RhdGUoaWQsIHNlcmlhbGl6ZWREYXRhKVxuICogICBTdGF0ZURCLS0+PkFkYXB0ZXI6IFN1Y2Nlc3NcbiAqICAgQWRhcHRlci0tPj5SZXBvc2l0b3J5OiByZWNvcmRcbiAqICAgUmVwb3NpdG9yeS0+PkFkYXB0ZXI6IHJldmVydChyZWNvcmQsIGNsYXNzLCBwaywgaWQsIHRyYW5zaWVudClcbiAqICAgQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNvbnRyYWN0OiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICBNLFxuICBGYWJyaWNDb250cmFjdEFkYXB0ZXJcbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyPzogRmFicmljQ29udHJhY3RBZGFwdGVyLFxuICAgIGNsYXp6PzogQ29uc3RydWN0b3I8TT4sXG4gICAgcHJvdGVjdGVkIHRyYWNrZWRFdmVudHM/OiAoT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZylbXVxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG9ic2VydmVyIGhhbmRsZXIgZm9yIHRoaXMgcmVwb3NpdG9yeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIgaW5zdGFuY2VcbiAgICogQHJldHVybiB7T2JzZXJ2ZXJIYW5kbGVyfSBUaGUgb2JzZXJ2ZXIgaGFuZGxlclxuICAgKi9cbiAgb3ZlcnJpZGUgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlPYnNlcnZhYmxlSGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG9ic2VydmVycyBiYXNlZCBvbiB0cmFja2VkIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIGV2ZW50cyBiYXNlZCBvbiB0cmFja2VkRXZlbnRzIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIHBhcmVudCBtZXRob2RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlIC0gVGhlIHRhYmxlL2NvbGxlY3Rpb24gbmFtZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgZXZlbnQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0Q29udGV4dH0gY3R4IC0gVGhlIEZhYnJpYyBjb250cmFjdCBjb250ZXh0XG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBvYnNlcnZlcnMgYXJlIHVwZGF0ZWRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZU9ic2VydmVycyhcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnRyYWNrZWRFdmVudHMgfHwgdGhpcy50cmFja2VkRXZlbnRzLmluZGV4T2YoZXZlbnQpICE9PSAtMSlcbiAgICAgIHJldHVybiBhd2FpdCBzdXBlci51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQ291Y2hEQkFkYXB0ZXIsXG4gIENvdWNoREJHcm91cE9wZXJhdG9yLFxuICBDb3VjaERCS2V5cyxcbiAgQ291Y2hEQk9wZXJhdG9yLFxuICBNYW5nb09wZXJhdG9yLFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb1NlbGVjdG9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7IENvdWNoREJTdGF0ZW1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YXRlbWVudCB3cmFwcGVyIGZvciBleGVjdXRpbmcgTWFuZ28gcXVlcmllcyB3aXRoaW4gRmFicmljIGNvbnRyYWN0c1xuICogQHN1bW1hcnkgQnJpZGdlcyBDb3VjaERCLXN0eWxlIHF1ZXJpZXMgdG8gRmFicmljIHZpYSB0aGUgRmFicmljQ29udHJhY3RBZGFwdGVyLCBoYW5kbGluZyBpZGVudGl0eSBhbmQgcHJpbWFyeSBrZXkgcHJvamVjdGlvbiB3aGVuIG5lZWRlZC5cbiAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSB0aGlzIHN0YXRlbWVudCBvcGVyYXRlcyBvblxuICogQHRlbXBsYXRlIFIgLSBSZXN1bHQgdHlwZSByZXR1cm5lZCBieSB0aGUgc3RhdGVtZW50XG4gKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0QWRhcHRlcn0gYWRhcHRlciAtIFRoZSBGYWJyaWMgY29udHJhY3QgYWRhcHRlciB1c2VkIGZvciByYXcgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0Q29udGV4dH0gY3R4IC0gVGhlIEZhYnJpYyBjb250cmFjdCBjb250ZXh0IGNhcnJ5aW5nIHN0dWIgYW5kIGlkZW50aXR5XG4gKiBAcmV0dXJuIHt2b2lkfVxuICogQGNsYXNzIEZhYnJpY1N0YXRlbWVudFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHN0bXQgPSBuZXcgRmFicmljU3RhdGVtZW50PE15TW9kZWwsIE15TW9kZWxbXT4oYWRhcHRlciwgY3R4KTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0bXQucmF3PE15TW9kZWxbXT4oeyBzZWxlY3RvcjogeyB0eXBlOiAnTXlNb2RlbCcgfSB9KTtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IExlZGdlclxuICogICBBcHAtPj5TdGF0ZW1lbnQ6IHJhdyh7IHNlbGVjdG9yIH0pXG4gKiAgIFN0YXRlbWVudC0+PkFkYXB0ZXI6IGFkYXB0ZXIucmF3KG1hbmdvLCB0cnVlLCBjdHgpXG4gKiAgIEFkYXB0ZXItPj5MZWRnZXI6IEV2YWx1YXRlIHF1ZXJ5XG4gKiAgIEFkYXB0ZXItLT4+U3RhdGVtZW50OiByb3dzXG4gKiAgIFN0YXRlbWVudC0tPj5BcHA6IG1vZGVsc1xuICovXG5leHBvcnQgY2xhc3MgRmFicmljU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBDb3VjaERCU3RhdGVtZW50PFxuICBNLFxuICBDb3VjaERCQWRhcHRlcjxhbnksIHZvaWQsIEZhYnJpY0NvbnRyYWN0Q29udGV4dD4sXG4gIFJcbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBDb3VjaERCQWRhcHRlcjxhbnksIHZvaWQsIEZhYnJpY0NvbnRyYWN0Q29udGV4dD4pIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogTWFuZ29RdWVyeSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yYXcpO1xuXG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHJhd0lucHV0LCB0cnVlLCBjdHgpO1xuXG4gICAgY29uc3QgcGtBdHRyID0gTW9kZWwucGsodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS5nZXQoXG4gICAgICB0aGlzLmZyb21TZWxlY3RvcixcbiAgICAgIE1ldGFkYXRhLmtleShEQktleXMuSUQsIHBrQXR0ciBhcyBzdHJpbmcpXG4gICAgKT8udHlwZTtcblxuICAgIGlmICghdGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4gdGhpcy5wcm9jZXNzUmVjb3JkKHIsIHBrQXR0ciwgdHlwZSwgY3R4KSkgYXMgUjtcbiAgICByZXR1cm4gcmVzdWx0cyBhcyBSO1xuICB9XG5cbiAgb3ZlcnJpZGUgYnVpbGQoKTogTWFuZ29RdWVyeSB7XG4gICAgY29uc3Qgc2VsZWN0b3JzOiBNYW5nb1NlbGVjdG9yID0ge307XG4gICAgc2VsZWN0b3JzW0NvdWNoREJLZXlzLlRBQkxFXSA9IHt9O1xuICAgIHNlbGVjdG9yc1tDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IHF1ZXJ5OiBNYW5nb1F1ZXJ5ID0geyBzZWxlY3Rvcjogc2VsZWN0b3JzIH07XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VsZWN0b3IpIHF1ZXJ5LmZpZWxkcyA9IHRoaXMuc2VsZWN0U2VsZWN0b3IgYXMgc3RyaW5nW107XG5cbiAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbikge1xuICAgICAgY29uc3QgY29uZGl0aW9uOiBNYW5nb1NlbGVjdG9yID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8TT4oQ291Y2hEQktleXMuVEFCTEUgYXMga2V5b2YgTSkuZXEoXG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvcltDb3VjaERCS2V5cy5UQUJMRV1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICkuc2VsZWN0b3I7XG4gICAgICBjb25zdCBzZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pIGFzIE1hbmdvT3BlcmF0b3JbXTtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0b3JLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBPYmplY3QudmFsdWVzKENvdWNoREJHcm91cE9wZXJhdG9yKS5pbmRleE9mKHNlbGVjdG9yS2V5c1swXSkgIT09IC0xXG4gICAgICApXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3JLZXlzWzBdKSB7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSA9IFtcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgICBjb25kaXRpb25bQ291Y2hEQkdyb3VwT3BlcmF0b3IuQU5EXSBhcyBNYW5nb1NlbGVjdG9yXG4gICAgICAgICAgICAgICkucmVkdWNlKChhY2N1bTogTWFuZ29TZWxlY3RvcltdLCB2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJUb28gbWFueSBrZXlzIGluIHF1ZXJ5IHNlbGVjdG9yLiBzaG91bGQgYmUgb25lXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IENvdWNoREJHcm91cE9wZXJhdG9yLkFORClcbiAgICAgICAgICAgICAgICAgIGFjY3VtLnB1c2goLi4uKHZhbFtrXSBhcyBhbnlbXSkpO1xuICAgICAgICAgICAgICAgIGVsc2UgYWNjdW0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgfSwgW10pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHF1ZXJ5LnNlbGVjdG9yID0gY29uZGl0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBDb3VjaERCR3JvdXBPcGVyYXRvci5PUjoge1xuICAgICAgICAgICAgY29uc3QgczogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgICAgICAgc1tDb3VjaERCR3JvdXBPcGVyYXRvci5BTkRdID0gW1xuICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHF1ZXJ5LnNlbGVjdG9yKS5tYXAoKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxhbnksIGFueT4gPSB7fTtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBxdWVyeS5zZWxlY3RvciA9IHM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBPYmplY3QuZW50cmllcyhjb25kaXRpb24pLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICBpZiAocXVlcnkuc2VsZWN0b3Jba2V5XSlcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYEEgJHtrZXl9IHF1ZXJ5IHBhcmFtIGlzIGFib3V0IHRvIGJlIG92ZXJyaWRkZW46ICR7cXVlcnkuc2VsZWN0b3Jba2V5XX0gYnkgJHt2YWx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBxdWVyeS5zZWxlY3RvcltrZXldID0gdmFsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcmRlckJ5U2VsZWN0b3IpIHtcbiAgICAgIHF1ZXJ5LnNvcnQgPSBxdWVyeS5zb3J0IHx8IFtdO1xuICAgICAgcXVlcnkuc2VsZWN0b3IgPSBxdWVyeS5zZWxlY3RvciB8fCAoe30gYXMgTWFuZ29TZWxlY3Rvcik7XG4gICAgICBjb25zdCBbc2VsZWN0b3IsIHZhbHVlXSA9IHRoaXMub3JkZXJCeVNlbGVjdG9yIGFzIFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBPcmRlckRpcmVjdGlvbixcbiAgICAgIF07XG4gICAgICBjb25zdCByZWM6IGFueSA9IHt9O1xuICAgICAgcmVjW3NlbGVjdG9yXSA9IHZhbHVlO1xuICAgICAgKHF1ZXJ5LnNvcnQgYXMgYW55W10pLnB1c2gocmVjIGFzIGFueSk7XG4gICAgICBpZiAoIXF1ZXJ5LnNlbGVjdG9yW3NlbGVjdG9yXSkge1xuICAgICAgICBxdWVyeS5zZWxlY3RvcltzZWxlY3Rvcl0gPSB7fSBhcyBNYW5nb1NlbGVjdG9yO1xuICAgICAgICAocXVlcnkuc2VsZWN0b3Jbc2VsZWN0b3JdIGFzIE1hbmdvU2VsZWN0b3IpW0NvdWNoREJPcGVyYXRvci5CSUdHRVJdID1cbiAgICAgICAgICBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHF1ZXJ5LmxpbWl0ID0gdGhpcy5saW1pdFNlbGVjdG9yO1xuXG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpIHF1ZXJ5LnNraXAgPSB0aGlzLm9mZnNldFNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBLZXlzIHVzZWQgdG8gbWFyayBGYWJyaWMtc3BlY2lmaWMgbW9kZWwgbWV0YWRhdGFcbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIHNwZWNpYWwga2V5cyB1c2VkIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIHRvIHBlcnNpc3QgRmFicmljLXJlbGF0ZWQgZmxhZ3Mgb24gbW9kZWxzXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBlbnVtIEZhYnJpY01vZGVsS2V5cyB7XG4gIC8qKiBQcml2YXRlIGRhdGEgbWFya2VyIHVzZWQgdG8gdGFnIHByb3BlcnRpZXMgb3IgbW9kZWxzIGZvciBGYWJyaWMgcHJpdmF0ZSBjb2xsZWN0aW9ucyAqL1xuICBQUklWQVRFID0gXCJwcml2YXRlXCIsXG4gIFNIQVJFRCA9IFwic2hhcmVkXCIsXG4gIC8qKiBOYW1lc3BhY2UgcHJlZml4IHVzZWQgZm9yIEZhYnJpYy1zcGVjaWZpYyBtZXRhZGF0YSBrZXlzICovXG4gIEZBQlJJQyA9IFwiZmFicmljLlwiLFxuICBPV05FREJZID0gXCJvd25lZC1ieVwiLFxufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3VwcG9ydGVkIGlkZW50aXR5IHR5cGVzIGZvciBGYWJyaWMgY3JlZGVudGlhbHNcbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGlkZW50aXR5IGZvcm1hdHMgcmVjb2duaXplZCBieSB0aGlzIGxpYnJhcnlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlUeXBlIHtcbiAgLyoqIFN0YW5kYXJkIFguNTA5IGlkZW50aXR5IGZvcm1hdCB1c2VkIGJ5IEh5cGVybGVkZ2VyIEZhYnJpYyAqL1xuICBYNTA5ID0gXCJYLjUwOVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdHJpbmcgaWRlbnRpZmllciBmb3IgdGhlIEZhYnJpYyBhZGFwdGVyIGZsYXZvdXJcbiAqIEBzdW1tYXJ5IFVzZWQgdG8gdGFnIGFkYXB0ZXJzL3JlcG9zaXRvcmllcyB0aGF0IG9wZXJhdGUgYWdhaW5zdCBIeXBlcmxlZGdlciBGYWJyaWNcbiAqIEBjb25zdCBGYWJyaWNGbGF2b3VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1mYWJyaWMuc2hhcmVkXG4gKi9cbmV4cG9ydCBjb25zdCBGYWJyaWNGbGF2b3VyID0gXCJobGYtZmFicmljXCI7XG4iLCJpbXBvcnQgeyBKU09OU2VyaWFsaXplciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEpTT05TZXJpYWxpemVyPE0+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgb3ZlcnJpZGUgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcsIHRhYmxlTmFtZT86IHN0cmluZyk6IE0ge1xuICAgIGNvbnN0IGRlc2VyaWFsaXphdGlvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICAvLyBjb25zdCBjbGFzc05hbWUgPSB0YWJsZU5hbWU7XG4gICAgLy8gaWYgKCFjbGFzc05hbWUpXG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBjbGFzcyByZWZlcmVuY2UgaW4gc2VyaWFsaXplZCBtb2RlbFwiKTtcblxuICAgIC8vIC8vIHRoaXMgd2lsbCByZXR1cm4gdW5kZWZpbmVkIHZhbHVlc1xuICAgIC8vIGNvbnN0IG1vZGVsOiBNID0gTW9kZWwuYnVpbGQoZGVzZXJpYWxpemF0aW9uLCBjbGFzc05hbWUpIGFzIHVua25vd24gYXMgTTtcblxuICAgIC8vIC8vIFBvcHVsYXRlIE1vZGVsXG4gICAgLy8gY29uc3QgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbiA9IE9iamVjdC5rZXlzKG1vZGVsKS5yZWR1Y2UoXG4gICAgLy8gICAoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgIC8vICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9XG4gICAgLy8gICAgICAgZGVzZXJpYWxpemF0aW9uW1JlcG9zaXRvcnkuY29sdW1uKGFjY3VtLCBrZXkpXTtcbiAgICAvLyAgICAgcmV0dXJuIGFjY3VtO1xuICAgIC8vICAgfSxcbiAgICAvLyAgIG1vZGVsXG4gICAgLy8gKTtcblxuICAgIC8vIGNvbnN0IHJlc3VsdCA9IE1vZGVsLmJ1aWxkKFxuICAgIC8vICAgcHJvY2Vzc2VkRGVzZWFsaXphdGlvbixcbiAgICAvLyAgIGNsYXNzTmFtZVxuICAgIC8vICkgYXMgdW5rbm93biBhcyBNO1xuXG4gICAgLy8gcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gZGVzZXJpYWxpemF0aW9uO1xuICB9XG5cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUoXCJqc29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljXCIpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3Qgc29ydEtleXNSZWN1cnNpdmUgPSByZXF1aXJlKFwic29ydC1rZXlzLXJlY3Vyc2l2ZVwiKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHNvcnRLZXlzUmVjdXJzaXZlKHRoaXMucHJlU2VyaWFsaXplKG1vZGVsKSkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcHJlU2VyaWFsaXplKG1vZGVsOiBNKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgcmV0dXJuIHRvU2VyaWFsaXplO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBjYWNoZU1vZGVsRm9yUG9wdWxhdGUsXG4gIENhc2NhZGUsXG4gIGNyZWF0ZU9yVXBkYXRlLFxuICBnZXRQb3B1bGF0ZUtleSxcbiAgUmVsYXRpb25zTWV0YWRhdGEsXG4gIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29udGV4dE9mUmVwb3NpdG9yeSwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi9Db250cmFjdENvbnRleHRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCBjcmVhdGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgYW4gZXhpc3RpbmcgbW9kZWwgb3IgY3JlYXRpbmcgYSBuZXcgb25lXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9PbmVPbkNyZWF0ZVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9PbmVPbkNyZWF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBvbmVUb09uZU9uQ3JlYXRlLT4+b25lVG9PbmVPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZSBleGlzdHNcbiAqXG4gKiAgIGFsdCBwcm9wZXJ0eVZhbHVlIGlzIG5vdCBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb09uZU9uQ3JlYXRlOiBpbm5lclJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+aW5uZXJSZXBvOiByZWFkKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlYWRcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pm9uZVRvT25lT25DcmVhdGU6IHNldCBtb2RlbFtrZXldID0gcHJvcGVydHlWYWx1ZVxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYW4gb2JqZWN0XG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+Pk1vZGVsOiBnZXQoZGF0YS5jbGFzcylcbiAqICAgICBNb2RlbC0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjb25zdHJ1Y3RvclxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbChjb25zdHJ1Y3RvcilcbiAqICAgICBSZXBvc2l0b3J5LS0+Pm9uZVRvT25lT25DcmVhdGU6IHJlcG9cbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+cmVwbzogY3JlYXRlKHByb3BlcnR5VmFsdWUpXG4gKiAgICAgcmVwby0tPj5vbmVUb09uZU9uQ3JlYXRlOiBjcmVhdGVkXG4gKiAgICAgb25lVG9PbmVPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBjcmVhdGVkXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9PbmVPbkNyZWF0ZTogcGtcbiAqICAgICBvbmVUb09uZU9uQ3JlYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZFxuICogICAgIG9uZVRvT25lT25DcmVhdGUtPj5vbmVUb09uZU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IGNyZWF0ZWRbcGtdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPbkNyZWF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgaW5uZXJSZXBvID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICAgICk7XG4gICAgY29uc3QgcmVhZCA9IGF3YWl0IGlubmVyUmVwby5yZWFkKHByb3BlcnR5VmFsdWUsIGNvbnRleHQpO1xuICAgIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBwcm9wZXJ0eVZhbHVlLCByZWFkKTtcbiAgICAobW9kZWwgYXMgYW55KVtrZXldID0gcHJvcGVydHlWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkYXRhLmNsYXNzID1cbiAgICB0eXBlb2YgZGF0YS5jbGFzcyA9PT0gXCJzdHJpbmdcIiA/IGRhdGEuY2xhc3MgOiAoZGF0YS5jbGFzcyBhcyBhbnkpKCkubmFtZTtcblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChkYXRhLmNsYXNzIGFzIHVua25vd24gYXMgc3RyaW5nKTtcbiAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgQ291bGQgbm90IGZpbmQgbW9kZWwgJHtkYXRhLmNsYXNzfWApO1xuICBjb25zdCByZXBvOiBSZXBvPGFueT4gPSBSZXBvc2l0b3J5LmZvck1vZGVsKGNvbnN0cnVjdG9yLCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUocHJvcGVydHlWYWx1ZSwgY29udGV4dCk7XG4gIGNvbnN0IHBrID0gTW9kZWwucGsoY3JlYXRlZCk7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShjb250ZXh0LCBtb2RlbCwga2V5LCBjcmVhdGVkW3BrXSwgY3JlYXRlZCk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBjcmVhdGVkW3BrXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB1cGRhdGVzXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIHVwZGF0aW5nIGEgbW9kZWwsIGVpdGhlciBieSByZWZlcmVuY2luZyBhbiBleGlzdGluZyBtb2RlbCBvciB1cGRhdGluZyB0aGUgcmVsYXRlZCBtb2RlbFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uVXBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25VcGRhdGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY3JlYXRlT3JVcGRhdGVcbiAqICAgcGFydGljaXBhbnQgZmluZFByaW1hcnlLZXlcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uVXBkYXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGFuIG9iamVjdFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5yZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YTogbW9kZWwsIGtleVxuICogICAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25VcGRhdGU6IGlubmVyUmVwb1xuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5pbm5lclJlcG86IHJlYWQocHJvcGVydHlWYWx1ZSlcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPblVwZGF0ZTogcmVhZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWRcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+b25lVG9PbmVPblVwZGF0ZTogc2V0IG1vZGVsW2tleV0gPSBwcm9wZXJ0eVZhbHVlXG4gKiAgIGVsc2UgcHJvcGVydHlWYWx1ZSBpcyBhbiBvYmplY3RcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y3JlYXRlT3JVcGRhdGU6IG1vZGVsW2tleV0sIGNvbnRleHRcbiAqICAgICBjcmVhdGVPclVwZGF0ZS0tPj5vbmVUb09uZU9uVXBkYXRlOiB1cGRhdGVkXG4gKiAgICAgb25lVG9PbmVPblVwZGF0ZS0+PmZpbmRQcmltYXJ5S2V5OiB1cGRhdGVkXG4gKiAgICAgZmluZFByaW1hcnlLZXktLT4+b25lVG9PbmVPblVwZGF0ZTogcGtcbiAqICAgICBvbmVUb09uZU9uVXBkYXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCB1cGRhdGVkW3BrXSwgdXBkYXRlZFxuICogICAgIG9uZVRvT25lT25VcGRhdGUtPj5vbmVUb09uZU9uVXBkYXRlOiBzZXQgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9PbmVPblVwZGF0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25VcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zdCBpbm5lclJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICAgKTtcbiAgICBjb25zdCByZWFkID0gYXdhaXQgaW5uZXJSZXBvLnJlYWQocHJvcGVydHlWYWx1ZSwgY29udGV4dCk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHByb3BlcnR5VmFsdWUsIHJlYWQpO1xuICAgIChtb2RlbCBhcyBhbnkpW2tleV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZWQ6IGFueSA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKFxuICAgIG1vZGVsW2tleV0gYXMgTSxcbiAgICBjb250ZXh0LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBjb25zdCBwayA9IE1vZGVsLnBrKHVwZGF0ZWQpO1xuICBhd2FpdCBjYWNoZU1vZGVsRm9yUG9wdWxhdGUoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXksXG4gICAgdXBkYXRlZFtwa10gYXMgc3RyaW5nLFxuICAgIHVwZGF0ZWRcbiAgKTtcbiAgbW9kZWxba2V5XSA9IHVwZGF0ZWRbcGtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGRlbGV0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tb25lIHJlbGF0aW9uc2hpcCB3aGVuIGRlbGV0aW5nIGEgbW9kZWwsIGRlbGV0aW5nIHRoZSByZWxhdGVkIG1vZGVsIGlmIGNhc2NhZGUgaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlcG9zaXRvcnkgdHlwZSBleHRlbmRpbmcgUmVwbzxNLCBGLCBDPlxuICogQHRlbXBsYXRlIFYgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhIHR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZSBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtSfSB0aGlzIC0gVGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Q29udGV4dDxGPn0gY29udGV4dCAtIFRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb25zIG1ldGFkYXRhXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSBvZiB0aGUgcmVsYXRpb25zaGlwXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqIEBmdW5jdGlvbiBvbmVUb09uZU9uRGVsZXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvT25lT25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGFcbiAqICAgcGFydGljaXBhbnQgY2FjaGVNb2RlbEZvclBvcHVsYXRlXG4gKlxuICogICBDYWxsZXItPj5vbmVUb09uZU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvT25lT25EZWxldGUtPj5vbmVUb09uZU9uRGVsZXRlOiBjaGVjayBpZiBwcm9wZXJ0eVZhbHVlIGV4aXN0c1xuICogICBvbmVUb09uZU9uRGVsZXRlLT4+b25lVG9PbmVPbkRlbGV0ZTogY2hlY2sgaWYgY2FzY2FkZS51cGRhdGUgaXMgQ0FTQ0FERVxuICpcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgIHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhLS0+Pm9uZVRvT25lT25EZWxldGU6IGlubmVyUmVwb1xuICpcbiAqICAgYWx0IHByb3BlcnR5VmFsdWUgaXMgbm90IGEgTW9kZWwgaW5zdGFuY2VcbiAqICAgICBvbmVUb09uZU9uRGVsZXRlLT4+aW5uZXJSZXBvOiBkZWxldGUobW9kZWxba2V5XSwgY29udGV4dClcbiAqICAgICBpbm5lclJlcG8tLT4+b25lVG9PbmVPbkRlbGV0ZTogZGVsZXRlZFxuICogICBlbHNlIHByb3BlcnR5VmFsdWUgaXMgYSBNb2RlbCBpbnN0YW5jZVxuICogICAgIG9uZVRvT25lT25EZWxldGUtPj5pbm5lclJlcG86IGRlbGV0ZShtb2RlbFtrZXldW2lubmVyUmVwby5wa10sIGNvbnRleHQpXG4gKiAgICAgaW5uZXJSZXBvLS0+Pm9uZVRvT25lT25EZWxldGU6IGRlbGV0ZWRcbiAqICAgZW5kXG4gKlxuICogICBvbmVUb09uZU9uRGVsZXRlLT4+Y2FjaGVNb2RlbEZvclBvcHVsYXRlOiBjb250ZXh0LCBtb2RlbCwga2V5LCBkZWxldGVkW2lubmVyUmVwby5wa10sIGRlbGV0ZWRcbiAqICAgb25lVG9PbmVPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvT25lT25EZWxldGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogRmFicmljQ29udHJhY3RDb250ZXh0LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZTogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlKSByZXR1cm47XG4gIGlmIChkYXRhLmNhc2NhZGUudXBkYXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgaW5uZXJSZXBvOiBSZXBvPE0+ID0gcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEoXG4gICAgbW9kZWwsXG4gICAga2V5LFxuICAgIHRoaXMuYWRhcHRlci5hbGlhc1xuICApO1xuICBsZXQgZGVsZXRlZDogTTtcbiAgaWYgKCEocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIE1vZGVsKSlcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShtb2RlbFtrZXldIGFzIHN0cmluZywgY29udGV4dCk7XG4gIGVsc2VcbiAgICBkZWxldGVkID0gYXdhaXQgaW5uZXJSZXBvLmRlbGV0ZShcbiAgICAgIChtb2RlbFtrZXldIGFzIE0pW01vZGVsLnBrKGlubmVyUmVwby5jbGFzcykgYXMga2V5b2YgTV0gYXMgc3RyaW5nLFxuICAgICAgY29udGV4dFxuICAgICk7XG4gIGF3YWl0IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZShcbiAgICBjb250ZXh0LFxuICAgIG1vZGVsLFxuICAgIGtleSxcbiAgICBkZWxldGVkW01vZGVsLnBrKGlubmVyUmVwby5jbGFzcyldIGFzIHN0cmluZyxcbiAgICBkZWxldGVkXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGNyZWF0aW9uXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXAgd2hlbiBjcmVhdGluZyBhIG1vZGVsLCBlaXRoZXIgYnkgcmVmZXJlbmNpbmcgZXhpc3RpbmcgbW9kZWxzIG9yIGNyZWF0aW5nIG5ldyBvbmVzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmVwb3NpdG9yeSB0eXBlIGV4dGVuZGluZyBSZXBvPE0sIEYsIEM+XG4gKiBAdGVtcGxhdGUgViAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGEgdHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIHJlcG9zaXRvcnkgZmxhZ3MgdHlwZVxuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PEY+fSBjb250ZXh0IC0gVGhlIGNvbnRleHQgZm9yIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbnMgbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IG9mIHRoZSByZWxhdGlvbnNoaXBcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIG9uZVRvTWFueU9uQ3JlYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmNvcmVcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IG9uZVRvTWFueU9uQ3JlYXRlXG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKiAgIHBhcnRpY2lwYW50IGNyZWF0ZU9yVXBkYXRlXG4gKiAgIHBhcnRpY2lwYW50IGZpbmRQcmltYXJ5S2V5XG4gKiAgIHBhcnRpY2lwYW50IGNhY2hlTW9kZWxGb3JQb3B1bGF0ZVxuICpcbiAqICAgQ2FsbGVyLT4+b25lVG9NYW55T25DcmVhdGU6IHRoaXMsIGNvbnRleHQsIGRhdGEsIGtleSwgbW9kZWxcbiAqICAgb25lVG9NYW55T25DcmVhdGUtPj5vbmVUb01hbnlPbkNyZWF0ZTogY2hlY2sgaWYgcHJvcGVydHlWYWx1ZXMgZXhpc3RzIGFuZCBoYXMgbGVuZ3RoXG4gKiAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGNoZWNrIGlmIGFsbCBlbGVtZW50cyBoYXZlIHNhbWUgdHlwZVxuICogICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgYWx0IGFycmF5VHlwZSBpcyBub3QgXCJvYmplY3RcIlxuICogICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBrZXlcbiAqICAgICByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YS0tPj5vbmVUb01hbnlPbkNyZWF0ZTogcmVwb1xuICogICAgIGxvb3AgZm9yIGVhY2ggaWQgaW4gdW5pcXVlVmFsdWVzXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PnJlcG86IHJlYWQoaWQpXG4gKiAgICAgICByZXBvLS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiByZWFkXG4gKiAgICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmNhY2hlTW9kZWxGb3JQb3B1bGF0ZTogY29udGV4dCwgbW9kZWwsIGtleSwgaWQsIHJlYWRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdXG4gKiAgIGVsc2UgYXJyYXlUeXBlIGlzIFwib2JqZWN0XCJcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+PmZpbmRQcmltYXJ5S2V5OiBwcm9wZXJ0eVZhbHVlc1swXVxuICogICAgIGZpbmRQcmltYXJ5S2V5LS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBwa05hbWVcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBjcmVhdGUgcmVzdWx0IHNldFxuICogICAgIGxvb3AgZm9yIGVhY2ggbSBpbiBwcm9wZXJ0eVZhbHVlc1xuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jcmVhdGVPclVwZGF0ZTogbSwgY29udGV4dFxuICogICAgICAgY3JlYXRlT3JVcGRhdGUtLT4+b25lVG9NYW55T25DcmVhdGU6IHJlY29yZFxuICogICAgICAgb25lVG9NYW55T25DcmVhdGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmRcbiAqICAgICAgIG9uZVRvTWFueU9uQ3JlYXRlLT4+b25lVG9NYW55T25DcmVhdGU6IGFkZCByZWNvcmRbcGtOYW1lXSB0byByZXN1bHRcbiAqICAgICBlbmRcbiAqICAgICBvbmVUb01hbnlPbkNyZWF0ZS0+Pm9uZVRvTWFueU9uQ3JlYXRlOiBzZXQgbW9kZWxba2V5XSA9IFsuLi5yZXN1bHRdXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25DcmVhdGUtLT4+Q2FsbGVyOiB2b2lkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvbmVUb01hbnlPbkNyZWF0ZTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBSIGV4dGVuZHMgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5PE0+LFxuICBWIGV4dGVuZHMgUmVsYXRpb25zTWV0YWRhdGEsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gbW9kZWxba2V5XTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcyB8fCAhcHJvcGVydHlWYWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlc1swXTtcbiAgaWYgKCFwcm9wZXJ0eVZhbHVlcy5ldmVyeSgoaXRlbTogYW55KSA9PiB0eXBlb2YgaXRlbSA9PT0gYXJyYXlUeXBlKSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBJbnZhbGlkIG9wZXJhdGlvbi4gQWxsIGVsZW1lbnRzIG9mIHByb3BlcnR5ICR7a2V5IGFzIHN0cmluZ30gbXVzdCBtYXRjaCB0aGUgc2FtZSB0eXBlLmBcbiAgICApO1xuICBjb25zdCB1bmlxdWVWYWx1ZXMgPSBuZXcgU2V0KFsuLi5wcm9wZXJ0eVZhbHVlc10pO1xuICBpZiAoYXJyYXlUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVwbyA9IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhKG1vZGVsLCBrZXksIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB1bmlxdWVWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoaWQsIGNvbnRleHQpO1xuICAgICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCByZWFkKTtcbiAgICB9XG4gICAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi51bmlxdWVWYWx1ZXNdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBrTmFtZSA9IE1vZGVsLnBrKHByb3BlcnR5VmFsdWVzWzBdKTtcblxuICBjb25zdCByZXN1bHQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBwcm9wZXJ0eVZhbHVlcykge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGNyZWF0ZU9yVXBkYXRlKG0sIGNvbnRleHQsIHRoaXMuYWRhcHRlci5hbGlhcyk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIHJlY29yZFtwa05hbWVdLCByZWNvcmQpO1xuICAgIHJlc3VsdC5hZGQocmVjb3JkW3BrTmFtZV0pO1xuICB9XG5cbiAgKG1vZGVsIGFzIGFueSlba2V5XSA9IFsuLi5yZXN1bHRdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBkZWxldGlvblxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIHdoZW4gZGVsZXRpbmcgYSBtb2RlbCwgZGVsZXRpbmcgYWxsIHJlbGF0ZWQgbW9kZWxzIGlmIGNhc2NhZGUgZGVsZXRlIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gb25lVG9NYW55T25EZWxldGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgb25lVG9NYW55T25EZWxldGVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YVxuICogICBwYXJ0aWNpcGFudCBjYWNoZU1vZGVsRm9yUG9wdWxhdGVcbiAqXG4gKiAgIENhbGxlci0+Pm9uZVRvTWFueU9uRGVsZXRlOiB0aGlzLCBjb250ZXh0LCBkYXRhLCBrZXksIG1vZGVsXG4gKiAgIG9uZVRvTWFueU9uRGVsZXRlLT4+b25lVG9NYW55T25EZWxldGU6IGNoZWNrIGlmIGNhc2NhZGUuZGVsZXRlIGlzIENBU0NBREVcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogY2hlY2sgaWYgdmFsdWVzIGV4aXN0cyBhbmQgaGFzIGxlbmd0aFxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjaGVjayBpZiBhbGwgZWxlbWVudHMgaGF2ZSBzYW1lIHR5cGVcbiAqXG4gKiAgIGFsdCBpc0luc3RhbnRpYXRlZCAoYXJyYXlUeXBlIGlzIFwib2JqZWN0XCIpXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5SZXBvc2l0b3J5OiBmb3JNb2RlbCh2YWx1ZXNbMF0pXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5vbmVUb01hbnlPbkRlbGV0ZTogcmVwb1xuICogICBlbHNlIG5vdCBpbnN0YW50aWF0ZWRcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhOiBtb2RlbCwga2V5XG4gKiAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+b25lVG9NYW55T25EZWxldGU6IHJlcG9cbiAqICAgZW5kXG4gKlxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBjcmVhdGUgdW5pcXVlVmFsdWVzIHNldFxuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBpZCBpbiB1bmlxdWVWYWx1ZXNcbiAqICAgICBvbmVUb01hbnlPbkRlbGV0ZS0+PnJlcG86IGRlbGV0ZShpZCwgY29udGV4dClcbiAqICAgICByZXBvLS0+Pm9uZVRvTWFueU9uRGVsZXRlOiBkZWxldGVkXG4gKiAgICAgb25lVG9NYW55T25EZWxldGUtPj5jYWNoZU1vZGVsRm9yUG9wdWxhdGU6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkXG4gKiAgIGVuZFxuICpcbiAqICAgb25lVG9NYW55T25EZWxldGUtPj5vbmVUb01hbnlPbkRlbGV0ZTogc2V0IG1vZGVsW2tleV0gPSBbLi4udW5pcXVlVmFsdWVzXVxuICogICBvbmVUb01hbnlPbkRlbGV0ZS0tPj5DYWxsZXI6IHZvaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9uZVRvTWFueU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkYXRhLmNhc2NhZGUuZGVsZXRlICE9PSBDYXNjYWRlLkNBU0NBREUpIHJldHVybjtcbiAgY29uc3QgdmFsdWVzID0gbW9kZWxba2V5XSBhcyBhbnk7XG4gIGlmICghdmFsdWVzIHx8ICF2YWx1ZXMubGVuZ3RoKSByZXR1cm47XG4gIGNvbnN0IGFycmF5VHlwZSA9IHR5cGVvZiB2YWx1ZXNbMF07XG4gIGNvbnN0IGFyZUFsbFNhbWVUeXBlID0gdmFsdWVzLmV2ZXJ5KChpdGVtOiBhbnkpID0+IHR5cGVvZiBpdGVtID09PSBhcnJheVR5cGUpO1xuICBpZiAoIWFyZUFsbFNhbWVUeXBlKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYEludmFsaWQgb3BlcmF0aW9uLiBBbGwgZWxlbWVudHMgb2YgcHJvcGVydHkgJHtrZXkgYXMgc3RyaW5nfSBtdXN0IG1hdGNoIHRoZSBzYW1lIHR5cGUuYFxuICAgICk7XG4gIGNvbnN0IGlzSW5zdGFudGlhdGVkID0gYXJyYXlUeXBlID09PSBcIm9iamVjdFwiO1xuICBjb25zdCByZXBvID0gaXNJbnN0YW50aWF0ZWRcbiAgICA/IFJlcG9zaXRvcnkuZm9yTW9kZWwodmFsdWVzWzBdLCB0aGlzLmFkYXB0ZXIuYWxpYXMpXG4gICAgOiByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShtb2RlbCwga2V5LCB0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuXG4gIGNvbnN0IHVuaXF1ZVZhbHVlcyA9IG5ldyBTZXQoW1xuICAgIC4uLihpc0luc3RhbnRpYXRlZFxuICAgICAgPyB2YWx1ZXMubWFwKFxuICAgICAgICAgICh2OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2W01vZGVsLnBrKHRoaXMuY2xhc3MpIGFzIHN0cmluZ11cbiAgICAgICAgKVxuICAgICAgOiB2YWx1ZXMpLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IGlkIG9mIHVuaXF1ZVZhbHVlcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCwgY29udGV4dCk7XG4gICAgYXdhaXQgY2FjaGVNb2RlbEZvclBvcHVsYXRlKGNvbnRleHQsIG1vZGVsLCBrZXksIGlkLCBkZWxldGVkKTtcbiAgfVxuICAobW9kZWwgYXMgYW55KVtrZXldID0gWy4uLnVuaXF1ZVZhbHVlc107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBvcHVsYXRlcyBhIG1vZGVsJ3MgcmVsYXRpb25zaGlwXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGF0dGFjaGVzIHJlbGF0ZWQgbW9kZWxzIHRvIGEgbW9kZWwncyByZWxhdGlvbnNoaXAgcHJvcGVydHlcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIFJlcG88TSwgRiwgQz5cbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YSB0eXBlIGV4dGVuZGluZyBSZWxhdGlvbnNNZXRhZGF0YVxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUgZXh0ZW5kaW5nIENvbnRleHQ8Rj5cbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnRleHQ8Rj59IGNvbnRleHQgLSBUaGUgY29udGV4dCBmb3IgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtWfSBkYXRhIC0gVGhlIHJlbGF0aW9ucyBtZXRhZGF0YVxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgb2YgdGhlIHJlbGF0aW9uc2hpcFxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gcG9wdWxhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcG9wdWxhdGVcbiAqICAgcGFydGljaXBhbnQgZmV0Y2hQb3B1bGF0ZVZhbHVlc1xuICogICBwYXJ0aWNpcGFudCBnZXRQb3B1bGF0ZUtleVxuICogICBwYXJ0aWNpcGFudCBDb250ZXh0XG4gKiAgIHBhcnRpY2lwYW50IHJlcG9zaXRvcnlGcm9tVHlwZU1ldGFkYXRhXG4gKlxuICogICBDYWxsZXItPj5wb3B1bGF0ZTogdGhpcywgY29udGV4dCwgZGF0YSwga2V5LCBtb2RlbFxuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBjaGVjayBpZiBkYXRhLnBvcHVsYXRlIGlzIHRydWVcbiAqICAgcG9wdWxhdGUtPj5wb3B1bGF0ZTogZ2V0IG5lc3RlZCB2YWx1ZSBhbmQgY2hlY2sgaWYgaXQgZXhpc3RzXG4gKlxuICogICBwb3B1bGF0ZS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IGNvbnRleHQsIG1vZGVsLCBrZXksIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF1cbiAqXG4gKiAgIGZldGNoUG9wdWxhdGVWYWx1ZXMtPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBpbml0aWFsaXplIHZhcmlhYmxlc1xuICpcbiAqICAgbG9vcCBmb3IgZWFjaCBwcm9LZXlWYWx1ZSBpbiBwcm9wS2V5VmFsdWVzXG4gKiAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PmdldFBvcHVsYXRlS2V5OiBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWVcbiAqICAgICBnZXRQb3B1bGF0ZUtleS0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiBjYWNoZUtleVxuICpcbiAqICAgICBhbHQgdHJ5IHRvIGdldCBmcm9tIGNhY2hlXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+Q29udGV4dDogZ2V0KGNhY2hlS2V5KVxuICogICAgICAgQ29udGV4dC0tPj5mZXRjaFBvcHVsYXRlVmFsdWVzOiB2YWxcbiAqICAgICBlbHNlIGNhdGNoIGVycm9yXG4gKiAgICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+cmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGE6IG1vZGVsLCBwcm9wTmFtZVxuICogICAgICAgcmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEtLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogcmVwb1xuICogICAgICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0+PnJlcG86IHJlYWQocHJvS2V5VmFsdWUpXG4gKiAgICAgICByZXBvLS0+PmZldGNoUG9wdWxhdGVWYWx1ZXM6IHZhbFxuICogICAgIGVuZFxuICpcbiAqICAgICBmZXRjaFBvcHVsYXRlVmFsdWVzLT4+ZmV0Y2hQb3B1bGF0ZVZhbHVlczogYWRkIHZhbCB0byByZXN1bHRzXG4gKiAgIGVuZFxuICpcbiAqICAgZmV0Y2hQb3B1bGF0ZVZhbHVlcy0tPj5wb3B1bGF0ZTogcmVzdWx0c1xuICogICBwb3B1bGF0ZS0+PnBvcHVsYXRlOiBzZXQgbW9kZWxba2V5XSA9IGlzQXJyID8gcmVzIDogcmVzWzBdXG4gKiAgIHBvcHVsYXRlLS0+PkNhbGxlcjogdm9pZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHRPZlJlcG9zaXRvcnk8Uj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWRhdGEucG9wdWxhdGUpIHJldHVybjtcbiAgY29uc3QgbmVzdGVkOiBhbnkgPSBtb2RlbFtrZXldO1xuICBjb25zdCBpc0FyciA9IEFycmF5LmlzQXJyYXkobmVzdGVkKTtcbiAgaWYgKHR5cGVvZiBuZXN0ZWQgPT09IFwidW5kZWZpbmVkXCIgfHwgKGlzQXJyICYmIG5lc3RlZC5sZW5ndGggPT09IDApKSByZXR1cm47XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQb3B1bGF0ZVZhbHVlcyhcbiAgICBjOiBDb250ZXh0T2ZSZXBvc2l0b3J5PFI+LFxuICAgIG1vZGVsOiBNLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgcHJvcEtleVZhbHVlczogYW55W10sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGNhY2hlS2V5OiBzdHJpbmc7XG4gICAgbGV0IHZhbDogYW55O1xuICAgIGNvbnN0IHJlc3VsdHM6IE1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvS2V5VmFsdWUgb2YgcHJvcEtleVZhbHVlcykge1xuICAgICAgY2FjaGVLZXkgPSBnZXRQb3B1bGF0ZUtleShtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lLCBwcm9wTmFtZSwgcHJvS2V5VmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsID0gYXdhaXQgYy5nZXQoY2FjaGVLZXkgYXMgYW55KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHJlcG8gPSByZXBvc2l0b3J5RnJvbVR5cGVNZXRhZGF0YShcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBwcm9wTmFtZSBhcyBrZXlvZiBNLFxuICAgICAgICAgIGFsaWFzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVwbykgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCByZXBvXCIpO1xuICAgICAgICB2YWwgPSBhd2FpdCByZXBvLnJlYWQocHJvS2V5VmFsdWUsIGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoUG9wdWxhdGVWYWx1ZXMoXG4gICAgY29udGV4dCxcbiAgICBtb2RlbCxcbiAgICBrZXkgYXMgc3RyaW5nLFxuICAgIGlzQXJyID8gbmVzdGVkIDogW25lc3RlZF0sXG4gICAgdGhpcy5hZGFwdGVyLmFsaWFzXG4gICk7XG4gIChtb2RlbCBhcyBhbnkpW2tleV0gPSBpc0FyciA/IHJlcyA6IHJlc1swXTtcbn1cbiIsImltcG9ydCB7XG4gIExvZ2dlckZhY3RvcnksXG4gIExvZ2dpbmcsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE1pbmlMb2dnZXIsXG4gIE51bWVyaWNMb2dMZXZlbHMsXG4gIFN0cmluZ0xpa2UsXG59IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQ29udGV4dCBhcyBDdHggfSBmcm9tIFwiZmFicmljLWNvbnRyYWN0LWFwaVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMb2dnZXIgaW1wbGVtZW50YXRpb24gZm9yIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RzXG4gKiBAc3VtbWFyeSBBZGFwdHMgdGhlIHN0YW5kYXJkIGxvZ2dpbmcgaW50ZXJmYWNlIHRvIHdvcmsgd2l0aCBGYWJyaWMncyBjaGFpbmNvZGUgY29udGV4dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0IC0gVGhlIGxvZ2dpbmcgY29udGV4dCBuYW1lXG4gKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz4gfCB1bmRlZmluZWR9IGNvbmYgLSBPcHRpb25hbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gKlxuICogQGNsYXNzIENvbnRyYWN0TG9nZ2VyXG4gKiBAZXh0ZW5kcyB7TWluaUxvZ2dlcn1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhIEZhYnJpYyBjaGFpbmNvZGUgY29udHJhY3RcbiAqIGltcG9ydCB7IENvbnRyYWN0TG9nZ2VyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBAVHJhbnNhY3Rpb24oKVxuICogICBhc3luYyBteUZ1bmN0aW9uKGN0eDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICogICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBDb250cmFjdExvZ2dlcignTXlDb250cmFjdCcsIHsgbGV2ZWw6ICdpbmZvJyB9LCBjdHgpO1xuICpcbiAqICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyB0cmFuc2FjdGlvbicpO1xuICogICAgIGxvZ2dlci5kZWJ1ZygnVHJhbnNhY3Rpb24gZGV0YWlsczonLCB7IC4uLiB9KTtcbiAqXG4gKiAgICAgLy8gRG8gc29tZXRoaW5nXG4gKlxuICogICAgIGxvZ2dlci5pbmZvKCdUcmFuc2FjdGlvbiBjb21wbGV0ZScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyYWN0TG9nZ2VyIGV4dGVuZHMgTWluaUxvZ2dlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHVuZGVybHlpbmcgRmFicmljIGxvZ2dlciBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGxvZ2dlciE6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb250ZXh0OiBzdHJpbmcsXG4gICAgY29uZjogUGFydGlhbDxMb2dnaW5nQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgICBjdHg/OiBDdHhcbiAgKSB7XG4gICAgc3VwZXIoY29udGV4dCwgY29uZik7XG5cbiAgICBpZiAoIWN0eCkge1xuICAgICAgdGhpcy5sb2dnZXIgPSBuZXcgTWluaUxvZ2dlcihjb250ZXh0LCBjb25mKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIgPSBjdHgubG9nZ2luZy5nZXRMb2dnZXIoY29udGV4dCkgYXMgdW5rbm93biBhcyBMb2dnZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgYmFzZSBsb2cgbWV0aG9kIHRvIHVzZSB0aGUgRmFicmljIGNvbnRleHQncyBsb2dnZXJcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZSB8IEVycm9yfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBsb2dcbiAgICogQHBhcmFtIHtFcnJvcn0gW3N0YWNrXSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlIGZvciBlcnJvcnNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1zZzogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogRXJyb3JcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1t0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsXSA8XG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW2xldmVsXVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIGxldCBtZXRob2Q7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5pbmZvOlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5pbmZvO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgICAgbWV0aG9kID0gdGhpcy5sb2dnZXIudmVyYm9zZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmRlYnVnOlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5kZWJ1ZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmVycm9yOlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLnNpbGx5OlxuICAgICAgICBtZXRob2QgPSB0aGlzLmxvZ2dlci5zaWxseTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgIH1cbiAgICBtZXRob2QuY2FsbCh0aGlzLmxvZ2dlciwgdGhpcy5jcmVhdGVMb2cobGV2ZWwsIG1zZywgc3RhY2spKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBDb250cmFjdExvZ2dlciBpbnN0YW5jZXNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgQ29udHJhY3RMb2dnZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCwgY29uZmlnLCBhbmQgRmFicmljIGNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3QgLSBUaGUgbG9nZ2luZyBjb250ZXh0IG5hbWVcbiAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPiB8IHVuZGVmaW5lZH0gY29uZmlnIC0gT3B0aW9uYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICogQHJldHVybiB7Q29udHJhY3RMb2dnZXJ9IEEgbmV3IENvbnRyYWN0TG9nZ2VyIGluc3RhbmNlXG4gKiBAZnVuY3Rpb24gZmFjdG9yeVxuICogQG1lbWJlck9mIG1vZHVsZTpmYWJyaWMuY29udHJhY3RzXG4gKi9cbmNvbnN0IGZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSAoXG4gIG9iamVjdD86IHN0cmluZyxcbiAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgY3R4PzogQ3R4XG4pID0+IHtcbiAgcmV0dXJuIG5ldyBDb250cmFjdExvZ2dlcihcbiAgICBvYmplY3QgfHwgQ29udHJhY3RMb2dnZXIubmFtZSxcbiAgICBjb25maWcgfHwge30sXG4gICAgY3R4IGFzIEN0eFxuICApO1xufTtcblxuLy8gU2V0IHRoZSBmYWN0b3J5IGFzIHRoZSBkZWZhdWx0IGxvZ2dlciBmYWN0b3J5XG5Mb2dnaW5nLnNldEZhY3RvcnkoZmFjdG9yeSk7XG4iLCJpbXBvcnQgeyBDb3VjaERCQWRhcHRlciwgQ291Y2hEQktleXMsIE1hbmdvUXVlcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgeyBsaXN0LCBNb2RlbCwgcmVxdWlyZWQsIHR5cGUgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuL0NvbnRyYWN0Q29udGV4dFwiO1xuaW1wb3J0IHtcbiAgYWZ0ZXJBbnksXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBEQktleXMsXG4gIEdyb3VwU29ydCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25VcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICByZWFkb25seSxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnRleHQgYXMgQ3R4LFxuICBPYmplY3QgYXMgRmFicmljT2JqZWN0LFxuICBQcm9wZXJ0eSBhcyBGYWJyaWNQcm9wZXJ0eSxcbn0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgU2VxdWVuY2UsXG4gIFNlcXVlbmNlT3B0aW9ucyxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgQWRhcHRlcixcbiAgQ2FzY2FkZU1ldGFkYXRhLFxuICBKb2luQ29sdW1uT3B0aW9ucyxcbiAgb25lVG9NYW55T25VcGRhdGUsXG4gIEpvaW5UYWJsZU9wdGlvbnMsXG4gIEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gIHJlbGF0aW9uLFxuICBQcmVwYXJlZE1vZGVsLFxuICBSZXBvc2l0b3J5LFxuICBRdWVyeUVycm9yLFxuICBQYWdpbmdFcnJvcixcbiAgTWlncmF0aW9uRXJyb3IsXG4gIE9ic2VydmVyRXJyb3IsXG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgQ29udGV4dHVhbGl6ZWRBcmdzLFxuICBMb2dnZXJPZixcbiAgQ29udGV4dCxcbiAgUmF3UmVzdWx0LFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dHVhbEFyZ3MsIE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQge1xuICBDaGFpbmNvZGVTdHViLFxuICBDbGllbnRJZGVudGl0eSxcbiAgSXRlcmF0b3JzLFxuICBTdGF0ZVF1ZXJ5UmVzcG9uc2UsXG59IGZyb20gXCJmYWJyaWMtc2hpbS1hcGlcIjtcbmltcG9ydCB7IEZhYnJpY1N0YXRlbWVudCB9IGZyb20gXCIuL0ZhYnJpY0NvbnRyYWN0U3RhdGVtZW50XCI7XG5pbXBvcnQgeyBGYWJyaWNGbGF2b3VyIH0gZnJvbSBcIi4uL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNpbXBsZURldGVybWluaXN0aWNTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3NoYXJlZC9TaW1wbGVEZXRlcm1pbmlzdGljU2VyaWFsaXplclwiO1xuaW1wb3J0IHtcbiAgb25lVG9NYW55T25DcmVhdGUsXG4gIG9uZVRvTWFueU9uRGVsZXRlLFxuICBvbmVUb09uZU9uQ3JlYXRlLFxuICBvbmVUb09uZU9uRGVsZXRlLFxuICBvbmVUb09uZU9uVXBkYXRlLFxuICBwb3B1bGF0ZSBhcyBwb3AsXG59IGZyb20gXCIuL0ZhYnJpY0NvbnN0cnVjdGlvblwiO1xuaW1wb3J0IHtcbiAgYXBwbHksXG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IENvbnRyYWN0TG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjcmVhdG9yIG9yIHVwZGF0ZXIgZmllbGQgaW4gYSBtb2RlbCBiYXNlZCBvbiB0aGUgdXNlciBpbiB0aGUgY29udGV4dFxuICogQHN1bW1hcnkgQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBpbiBkZWNvcmF0b3JzIHRvIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBjcmVhdGVkX2J5IG9yIHVwZGF0ZWRfYnkgZmllbGRzXG4gKiB3aXRoIHRoZSB1c2VybmFtZSBmcm9tIHRoZSBjb250ZXh0IHdoZW4gYSBkb2N1bWVudCBpcyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgTmFub1JlcG9zaXRvcnk8TT5cbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgUmVsYXRpb25zTWV0YWRhdGFcbiAqIEBwYXJhbSB7Un0gdGhpcyAtIFRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiBAcGFyYW0ge0ZhYnJpY0NvbnRyYWN0Q29udGV4dH0gY29udGV4dCAtIFRoZSBvcGVyYXRpb24gY29udGV4dCBjb250YWluaW5nIHVzZXIgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSB7Vn0gZGF0YSAtIFRoZSByZWxhdGlvbiBtZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gc2V0IHdpdGggdGhlIHVzZXJuYW1lXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIGJlaW5nIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gKiBAZnVuY3Rpb24gY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZmFicmljLmNvbnRyYWN0c1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBGIGFzIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBGLT4+QzogZ2V0KFwidXNlclwiKVxuICogICBDLS0+PkY6IHVzZXIgb2JqZWN0XG4gKiAgIEYtPj5NOiBzZXQga2V5IHRvIHVzZXIubmFtZVxuICogICBOb3RlIG92ZXIgRjogSWYgbm8gdXNlciBpbiBjb250ZXh0XG4gKiAgIEYtLT4+RjogdGhyb3cgVW5zdXBwb3J0ZWRFcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25GYWJyaWNDcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPixcbiAgZGF0YTogVixcbiAga2V5OiBrZXlvZiBNLFxuICBtb2RlbDogTVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXNlciA9IGNvbnRleHQuZ2V0KFwiaWRlbnRpdHlcIikgYXMgQ2xpZW50SWRlbnRpdHk7XG4gICAgbW9kZWxba2V5XSA9IHVzZXIuZ2V0SUQoKSBhcyBNW3R5cGVvZiBrZXldO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJObyBVc2VyIGZvdW5kIGluIGNvbnRleHQuIFBsZWFzZSBwcm92aWRlIGEgdXNlciBpbiB0aGUgY29udGV4dFwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBhdXRvLWFzc2lnbm1lbnQgY2FsbGJhY2sgZm9yIEZhYnJpYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgYXNzaWducyBhIHByaW1hcnkga2V5IHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbW9kZWwgcHJvcGVydHkgdXNpbmcgYSBGYWJyaWMtYmFja2VkIHNlcXVlbmNlIHdoZW4gdGhlIG1vZGVsIGlzIGNyZWF0ZWQuIElmIHRoZSBzZXF1ZW5jZSBuYW1lIGlzIG5vdCBwcm92aWRlZCBpbiBvcHRpb25zLCBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIG1vZGVsIHZpYSBzZXF1ZW5jZU5hbWVGb3JNb2RlbC4gVGhlIGFzc2lnbmVkIGtleSBpcyBkZWZpbmVkIGFzIG5vbi13cml0YWJsZSBhbmQgZW51bWVyYWJsZS5cbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWwgZm9yIHRoZSB0YXJnZXQgaW5zdGFuY2VcbiAqIEB0ZW1wbGF0ZSBSIC0gVHlwZSBleHRlbmRpbmcgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IGZvciByZXBvc2l0b3J5IGNvbnRleHRcbiAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBleHRlbmRpbmcgU2VxdWVuY2VPcHRpb25zIHRvIGNvbmZpZ3VyZSBzZXF1ZW5jZSBiZWhhdmlvclxuICogQHRlbXBsYXRlIEYgLSBUeXBlIGV4dGVuZGluZyBGYWJyaWNDb250cmFjdEZsYWdzIGZvciBjb250ZXh0dWFsIGZsYWdzXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZSBpbnZva2luZyB0aGUgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RmFicmljQ29udHJhY3RDb250ZXh0fSBjb250ZXh0IC0gRmFicmljIGNvbnRyYWN0IGNvbnRleHQgY29udGFpbmluZyBpbnZvY2F0aW9uIG1ldGFkYXRhXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBTZXF1ZW5jZSBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIG9yIGxvY2F0ZSB0aGUgc2VxdWVuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZSB0byBhc3NpZ24gb24gdGhlIG1vZGVsXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHJlY2VpdmUgdGhlIGdlbmVyYXRlZCBwcmltYXJ5IGtleVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgd2hlbiB0aGUga2V5IGlzIGFzc2lnbmVkIG9yIHdoZW4gbm8gYWN0aW9uIGlzIHJlcXVpcmVkXG4gKiBAZnVuY3Rpb24gcGtGYWJyaWNPbkNyZWF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLmNvbnRyYWN0c1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAqICAgcGFydGljaXBhbnQgQyBhcyBDb250ZXh0PEY+XG4gKiAgIHBhcnRpY2lwYW50IFMgYXMgRmFicmljQ29udHJhY3REQlNlcXVlbmNlXG4gKiAgIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAqICAgUi0+PlI6IGRlcml2ZSBzZXF1ZW5jZSBuYW1lIGlmIG1pc3NpbmdcbiAqICAgUi0+PlM6IGFkYXB0ZXIuU2VxdWVuY2Uob3B0aW9ucylcbiAqICAgUy0tPj5SOiBzZXF1ZW5jZSBpbnN0YW5jZVxuICogICBSLT4+UzogbmV4dChjb250ZXh0KVxuICogICBTLS0+PlI6IG5leHQgdmFsdWVcbiAqICAgUi0+Pk06IGRlZmluZSBub24td3JpdGFibGUgcHJpbWFyeSBrZXlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBrRmFicmljT25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeTxNPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgZGF0YTogU2VxdWVuY2VPcHRpb25zLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFkYXRhLnR5cGUgfHwgbW9kZWxba2V5XSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldFByaW1hcnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG4gIGlmICghZGF0YS5uYW1lKSBkYXRhLm5hbWUgPSBNb2RlbC5zZXF1ZW5jZU5hbWUobW9kZWwsIFwicGtcIik7XG4gIGxldCBzZXF1ZW5jZTogU2VxdWVuY2U7XG4gIHRyeSB7XG4gICAgc2VxdWVuY2UgPSAoYXdhaXQgdGhpcy5hZGFwdGVyLlNlcXVlbmNlKGRhdGEpKSBhcyBTZXF1ZW5jZTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIFNlcXVlbmNlICR7ZGF0YS5uYW1lfTogJHtlfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IGF3YWl0IHNlcXVlbmNlLm5leHQoY29udGV4dCBhcyBGYWJyaWNDb250cmFjdENvbnRleHQpO1xuICBzZXRQcmltYXJ5S2V5VmFsdWUobW9kZWwsIGtleSBhcyBzdHJpbmcsIG5leHQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBZGFwdGVyIGZvciBIeXBlcmxlZGdlciBGYWJyaWMgY2hhaW5jb2RlIHN0YXRlIGRhdGFiYXNlIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgQ291Y2hEQi1saWtlIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlIGZyb20gd2l0aGluIGEgY2hhaW5jb2RlIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUgdm9pZCAtIE5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGZvciBjb250cmFjdCBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RGbGFncyAtIEZsYWdzIHNwZWNpZmljIHRvIEZhYnJpYyBjb250cmFjdCBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgRmFicmljQ29udHJhY3RDb250ZXh0IC0gQ29udGV4dCB0eXBlIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICogQGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGEgRmFicmljIGNoYWluY29kZSBjb250cmFjdCBjbGFzc1xuICogaW1wb3J0IHsgRmFicmljQ29udHJhY3RBZGFwdGVyIH0gZnJvbSAnQGRlY2FmLXRzL2Zvci1mYWJyaWMnO1xuICpcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBwcml2YXRlIGFkYXB0ZXIgPSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG4gKlxuICogICBAVHJhbnNhY3Rpb24oKVxuICogICBhc3luYyBjcmVhdGVBc3NldChjdHg6IENvbnRleHQsIGlkOiBzdHJpbmcsIGRhdGE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICogICAgIGNvbnN0IG1vZGVsID0geyBpZCwgZGF0YSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH07XG4gKiAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSgnYXNzZXRzJywgaWQsIG1vZGVsLCB7fSwgeyBzdHViOiBjdHguc3R1YiB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IEZhYnJpY0NvbnRyYWN0QWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBTdHViXG4gKiAgIHBhcnRpY2lwYW50IFN0YXRlREJcbiAqXG4gKiAgIENvbnRyYWN0LT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwsIHRyYW5zaWVudCwgY3R4KVxuICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IFNlcmlhbGl6ZSBtb2RlbCB0byBKU09OXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IHB1dFN0YXRlKGlkLCBzZXJpYWxpemVkRGF0YSlcbiAqICAgU3R1Yi0+PlN0YXRlREI6IFdyaXRlIGRhdGFcbiAqICAgU3RhdGVEQi0tPj5TdHViOiBTdWNjZXNzXG4gKiAgIFN0dWItLT4+RmFicmljQ29udHJhY3RBZGFwdGVyOiBTdWNjZXNzXG4gKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0tPj5Db250cmFjdDogbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZhYnJpY0NvbnRyYWN0QWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBhbnksXG4gIHZvaWQsXG4gIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRDbGllbnQoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJDbGllbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBGYWJyaWMgY29udHJhY3RzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBkZWNvZGVyIGZvciBjb252ZXJ0aW5nIGJpbmFyeSBkYXRhIHRvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IHNlcmlhbGl6ZXIgPSBuZXcgU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIoKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRleHQgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBPdmVycmlkZXMgdGhlIGJhc2UgQ29udGV4dCBjb25zdHJ1Y3RvciB3aXRoIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlYWRvbmx5IENvbnRleHQ6IENvbnN0cnVjdG9yPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4gPVxuICAgIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgTWFuZ29RdWVyeSwgRmFicmljQ29udHJhY3RBZGFwdGVyLCBGYWJyaWNDb250cmFjdEZsYWdzLCBGYWJyaWNDb250cmFjdENvbnRleHQ+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gICAgICBhbnksXG4gICAgICBBZGFwdGVyPGFueSwgdm9pZCwgTWFuZ29RdWVyeSwgQ29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgICA+LFxuICA+KCk6IENvbnN0cnVjdG9yPFI+IHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8Uj47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGFuIGFkYXB0ZXIgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3ZvaWR9IHNjb3BlIC0gTm90IHVzZWQgaW4gdGhpcyBhZGFwdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyIGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogdm9pZCwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgRmFicmljRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZm9yKGNvbmZpZzogUGFydGlhbDxhbnk+LCAuLi5hcmdzOiBhbnkpOiB0eXBlb2YgdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLmZvcihjb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcmVjb3JkIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSByZWNvcmQgZGF0YVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHRyYW5zaWVudCAtIFRyYW5zaWVudCBkYXRhIChub3QgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgc3R1YiB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGUpO1xuICAgIGxvZy5pbmZvKGBpbiBBREFQVEVSIGNyZWF0ZSB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5pbmZvKGBhZGRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlIHdpdGggcGsgJHtpZH1gKTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLnB1dFN0YXRlKGNvbXBvc2VkS2V5LCBtb2RlbCwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW5kIGRlc2VyaWFsaXplcyBhIHJlY29yZCBmcm9tIHRoZSBGYWJyaWMgc3RhdGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSByZWNvcmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgc3R1YiB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkKTtcbiAgICBsb2cuaW5mbyhgaW4gQURBUFRFUiByZWFkIHdpdGggYXJncyAke2FyZ3N9YCk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIGxldCBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29tcG9zZWRLZXkgPSBzdHViLmNyZWF0ZUNvbXBvc2l0ZUtleSh0YWJsZU5hbWUsIFtTdHJpbmcoaWQpXSk7XG4gICAgICBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZFN0YXRlKGNvbXBvc2VkS2V5LCBjdHgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSByZWNvcmQgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbCBhbmQgdXBkYXRlcyBpdCBpbiB0aGUgRmFicmljIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcmVjb3JkIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIHJlY29yZCBkYXRhXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdHJhbnNpZW50IC0gVHJhbnNpZW50IGRhdGEgKG5vdCB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cywgaW5jbHVkaW5nIHRoZSBjaGFpbmNvZGUgc3R1YiBhbmQgbG9nZ2VyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0PEZhYnJpY0NvbnRyYWN0RmxhZ3M+PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCB7IGN0eCwgbG9nLCBzdHViIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKGNsYXp6KTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cudmVyYm9zZShgdXBkYXRpbmcgZW50cnkgdG8gJHt0YWJsZU5hbWV9IHRhYmxlIHdpdGggcGsgJHtpZH1gKTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gc3R1Yi5jcmVhdGVDb21wb3NpdGVLZXkodGFibGVOYW1lLCBbU3RyaW5nKGlkKV0pO1xuICAgICAgbW9kZWwgPSBhd2FpdCB0aGlzLnB1dFN0YXRlKGNvbXBvc2VkS2V5LCBtb2RlbCwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgcmVjb3JkIGZyb20gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIHJlY29yZCBhbmQgdGhlbiByZW1vdmVzIGl0IGZyb20gdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIHJlY29yZCBpZGVudGlmaWVyIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q29udGV4dDxGYWJyaWNDb250cmFjdEZsYWdzPj5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgeyBjdHgsIGxvZywgY3R4QXJncywgc3R1YiB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5kZWxldGUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbGV0IG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb21wb3NlZEtleSA9IHN0dWIuY3JlYXRlQ29tcG9zaXRlS2V5KHRhYmxlTmFtZSwgW1N0cmluZyhpZCldKTtcbiAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy5yZWFkKGNsYXp6LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgICBsb2cudmVyYm9zZShgZGVsZXRpbmcgZW50cnkgd2l0aCBwayAke2lkfSBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVTdGF0ZShjb21wb3NlZEtleSwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlbGV0ZVN0YXRlKGlkOiBzdHJpbmcsIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgY29uc3QgeyBzdHViIH0gPSB0aGlzLmxvZ0N0eChbY3R4XSwgdGhpcy5kZWxldGVTdGF0ZSk7XG4gICAgYXdhaXQgc3R1Yi5kZWxldGVTdGF0ZShpZCk7XG4gIH1cblxuICBmb3JQcml2YXRlKGNvbGxlY3Rpb246IHN0cmluZyk6IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB7XG4gICAgY29uc3QgdG9PdmVycmlkZSA9IFtcbiAgICAgIHRoaXMucHV0U3RhdGUsXG4gICAgICB0aGlzLnJlYWRTdGF0ZSxcbiAgICAgIHRoaXMuZGVsZXRlU3RhdGUsXG4gICAgICB0aGlzLnF1ZXJ5UmVzdWx0LFxuICAgICAgdGhpcy5xdWVyeVJlc3VsdFBhZ2luYXRlZCxcbiAgICBdLm1hcCgoZm4pID0+IGZuLm5hbWUpO1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKCF0b092ZXJyaWRlLmluY2x1ZGVzKHByb3AgYXMgc3RyaW5nKSlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoKHRhcmdldCBhcyBhbnkpW3Byb3BdLCB7XG4gICAgICAgICAgYXN5bmMgYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3NMaXN0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICAgICAgY2FzZSBcInB1dFN0YXRlXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3R1YiwgaWQsIG1vZGVsXSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0dWIucHV0UHJpdmF0ZURhdGEoY29sbGVjdGlvbiwgaWQudG9TdHJpbmcoKSwgbW9kZWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlU3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdHViLCBpZF0gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHN0dWIgYXMgQ2hhaW5jb2RlU3R1YikuZGVsZXRlUHJpdmF0ZURhdGEoXG4gICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJyZWFkU3RhdGVcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdHViLCBpZF0gPSBhcmdzTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R1Yi5nZXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcInF1ZXJ5UmVzdWx0XCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3R1YiwgcmF3SW5wdXRdID0gYXJnc0xpc3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0dWIuZ2V0UHJpdmF0ZURhdGFRdWVyeVJlc3VsdChjb2xsZWN0aW9uLCByYXdJbnB1dCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcInF1ZXJ5UmVzdWx0UGFnaW5hdGVkXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3R1YiwgcmF3SW5wdXQsIGxpbWl0LCBza2lwXSA9IGFyZ3NMaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gYXdhaXQgKFxuICAgICAgICAgICAgICAgICAgc3R1YiBhcyBDaGFpbmNvZGVTdHViXG4gICAgICAgICAgICAgICAgKS5nZXRQcml2YXRlRGF0YVF1ZXJ5UmVzdWx0KGNvbGxlY3Rpb24sIHJhd0lucHV0KTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHJlYWNoZWRCb29rbWFyayA9IHNraXAgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSAmJiByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRLZXkgPSByZXMudmFsdWUua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRWYWx1ZSA9IChyZXMudmFsdWUudmFsdWUgYXMgYW55KS50b1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICBcInV0ZjhcIlxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBza2lwLCBza2lwIHVudGlsIHdlIHJlYWNoIGl0XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVhY2hlZEJvb2ttYXJrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZEtleSA9PT0gc2tpcD8udG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlZEJvb2ttYXJrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIEtleTogcmVjb3JkS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIFJlY29yZDogSlNPTi5wYXJzZShyZWNvcmRWYWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsYXN0S2V5ID0gcmVjb3JkS2V5O1xuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSBsaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzIGFzIHVua25vd24gYXMgSXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoZWRSZWNvcmRzQ291bnQ6IHJlc3VsdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFyazogbGFzdEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVzLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgYXMgdW5rbm93biBhcyBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaGVkUmVjb3Jkc0NvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgVW5zdXBwb3J0ZWQgbWV0aG9kIG92ZXJyaWRlICR7U3RyaW5nKHByb3ApfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwdXRTdGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICkge1xuICAgIGxldCBkYXRhOiBCdWZmZXI7XG5cbiAgICBjb25zdCB7IHN0dWIsIGxvZyB9ID0gdGhpcy5sb2dDdHgoW2N0eF0sIHRoaXMucHV0U3RhdGUpO1xuICAgIHRyeSB7XG4gICAgICBkYXRhID0gQnVmZmVyLmZyb20oXG4gICAgICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLnNlcmlhbGl6ZShtb2RlbCBhcyBNb2RlbClcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IFNlcmlhbGl6YXRpb25FcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgcmVjb3JkIHdpdGggaWQgJHtpZH06ICR7ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjdHguZ2V0KFwic2VncmVnYXRlZFwiKTtcbiAgICBpZiAoY29sbGVjdGlvbikgYXdhaXQgc3R1Yi5wdXRQcml2YXRlRGF0YShjb2xsZWN0aW9uLCBpZC50b1N0cmluZygpLCBkYXRhKTtcbiAgICBlbHNlIGF3YWl0IHN0dWIucHV0U3RhdGUoaWQudG9TdHJpbmcoKSwgZGF0YSk7XG5cbiAgICBsb2cuc2lsbHkoXG4gICAgICBgc3RhdGUgc3RvcmVkJHtjb2xsZWN0aW9uID8gYCBpbiAke2NvbGxlY3Rpb259IGNvbGxlY3Rpb25gIDogXCJcIn0gdW5kZXIgaWQgJHtpZH1gXG4gICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZFN0YXRlKGlkOiBzdHJpbmcsIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0KSB7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuXG4gICAgY29uc3QgeyBzdHViLCBsb2cgfSA9IHRoaXMubG9nQ3R4KFtjdHhdLCB0aGlzLnJlYWRTdGF0ZSk7XG4gICAgbGV0IHJlczogc3RyaW5nO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjdHguZ2V0KFwic2VncmVnYXRlZFwiKTtcbiAgICBpZiAoY29sbGVjdGlvbilcbiAgICAgIHJlcyA9IChhd2FpdCBzdHViLmdldFByaXZhdGVEYXRhKGNvbGxlY3Rpb24sIGlkLnRvU3RyaW5nKCkpKS50b1N0cmluZygpO1xuICAgIGVsc2UgcmVzID0gKGF3YWl0IHN0dWIuZ2V0U3RhdGUoaWQudG9TdHJpbmcoKSkpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoIXJlcylcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0ke2NvbGxlY3Rpb24gPyBgIGluICR7Y29sbGVjdGlvbn0gY29sbGVjdGlvbmAgOiBcIlwifSBub3QgZm91bmRgXG4gICAgICApO1xuICAgIGxvZy5zaWxseShcbiAgICAgIGBzdGF0ZSByZXRyaWV2ZWQgZnJvbSR7Y29sbGVjdGlvbiA/IGAgJHtjb2xsZWN0aW9ufSBjb2xsZWN0aW9uYCA6IFwiXCJ9IHVuZGVyIGlkICR7aWR9YFxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IEZhYnJpY0NvbnRyYWN0QWRhcHRlci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlcy50b1N0cmluZygpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcmVjb3JkOiAke2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBxdWVyeVJlc3VsdChcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViLFxuICAgIHJhd0lucHV0OiBhbnksXG5cbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkU3RhdGUpO1xuICAgIGxldCByZXM6IEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IGN0eC5nZXQoXCJzZWdyZWdhdGVkXCIpO1xuICAgIGlmIChjb2xsZWN0aW9uKVxuICAgICAgcmVzID0gYXdhaXQgc3R1Yi5nZXRQcml2YXRlRGF0YVF1ZXJ5UmVzdWx0KFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShyYXdJbnB1dClcbiAgICAgICk7XG4gICAgZWxzZSByZXMgPSBhd2FpdCBzdHViLmdldFF1ZXJ5UmVzdWx0KEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KSk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHF1ZXJ5UmVzdWx0UGFnaW5hdGVkKFxuICAgIHN0dWI6IENoYWluY29kZVN0dWIsXG4gICAgcmF3SW5wdXQ6IGFueSxcbiAgICBsaW1pdDogbnVtYmVyID0gMjUwLFxuICAgIHNraXA/OiBudW1iZXIsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdGF0ZVF1ZXJ5UmVzcG9uc2U8SXRlcmF0b3JzLlN0YXRlUXVlcnlJdGVyYXRvcj4+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkU3RhdGUpO1xuICAgIGxldCByZXM6IFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPjtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gY3R4LmdldChcInNlZ3JlZ2F0ZWRcIik7XG4gICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJhd0lucHV0LnNlbGVjdG9yID0ge1xuICAgICAgICAuLi5yYXdJbnB1dC5zZWxlY3RvcixcbiAgICAgICAgX2lkOiBza2lwID8geyAkZ3Q6IHNraXAudG9TdHJpbmcoKSB9IDogeyAkZ3RlOiBcIlwiIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgaXQgPSBhd2FpdCBzdHViLmdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQoXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHJhd0lucHV0KVxuICAgICAgKTtcbiAgICAgIHJlcyA9IHtcbiAgICAgICAgaXRlcmF0b3I6IGl0LFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIGZldGNoZWRSZWNvcmRzQ291bnQ6IGxpbWl0LFxuICAgICAgICAgIGJvb2ttYXJrOiBcIlwiLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGVsc2VcbiAgICAgIHJlcyA9IGF3YWl0IHN0dWIuZ2V0UXVlcnlSZXN1bHRXaXRoUGFnaW5hdGlvbihcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocmF3SW5wdXQpLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgc2tpcD8udG9TdHJpbmcoKVxuICAgICAgKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWVyZ2VNb2RlbHMocmVzdWx0czogUmVjb3JkPHN0cmluZywgYW55PltdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgZXh0cmFjdCA9IChtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PikgPT5cbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVsKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiKSBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICBsZXQgZmluYWxNb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHJlc3VsdHMucG9wKCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgIGZpbmFsTW9kZWwgPSBPYmplY3QuYXNzaWduKHt9LCBleHRyYWN0KGZpbmFsTW9kZWwpLCBleHRyYWN0KHJlcykpO1xuICAgIH1cblxuICAgIHJldHVybiBmaW5hbE1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNvZGVzIGJpbmFyeSBkYXRhIHRvIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBzdHJpbmcgdXNpbmcgVVRGLTggZW5jb2RpbmdcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBidWZmZXIgLSBUaGUgYmluYXJ5IGRhdGEgdG8gZGVjb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVjb2RlKGJ1ZmZlcjogVWludDhBcnJheSkge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIudGV4dERlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgb3BlcmF0aW9uIGZsYWdzIGZvciBGYWJyaWMgY29udHJhY3Qgb3BlcmF0aW9uc1xuICAgKiBAc3VtbWFyeSBNZXJnZXMgZGVmYXVsdCBmbGFncyB3aXRoIEZhYnJpYy1zcGVjaWZpYyBjb250ZXh0IGluZm9ybWF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8RmFicmljQ29udHJhY3RGbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBtZXJnZSB3aXRoIGRlZmF1bHRzXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEByZXR1cm4ge0ZhYnJpY0NvbnRyYWN0RmxhZ3N9IFRoZSBtZXJnZWQgZmxhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8RmFicmljQ29udHJhY3RGbGFncz4sXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGYWJyaWNDb250cmFjdEZsYWdzPiB7XG4gICAgY29uc3QgYmFzZUZsYWdzID0ge1xuICAgICAgc3R1YjogY3R4LnN0dWIsXG4gICAgICBzZWdyZWdhdGVkOiBmYWxzZSxcbiAgICB9O1xuICAgIGlmIChjdHggaW5zdGFuY2VvZiBGYWJyaWNDb250cmFjdENvbnRleHQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCB7XG4gICAgICAgIGxvZ2dlcjogY3R4LmxvZ2dlcixcbiAgICAgICAgaWRlbnRpdHk6IGN0eC5pZGVudGl0eSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogY3R4LnN0dWIuZ2V0VHhJRCgpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFzZUZsYWdzLCB7XG4gICAgICAgIGlkZW50aXR5OiBjdHguY2xpZW50SWRlbnRpdHksXG4gICAgICAgIGxvZ2dlcjogbmV3IENvbnRyYWN0TG9nZ2VyKHRoaXMgYXMgYW55LCB1bmRlZmluZWQsIGN0eCksXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGN0eC5zdHViLmdldFR4SUQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZsYWdzID0gKGF3YWl0IHN1cGVyLmZsYWdzKFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgbW9kZWwsXG4gICAgICBiYXNlRmxhZ3MgYXMgYW55LFxuICAgICAgLi4uYXJnc1xuICAgICkpIGFzIEZhYnJpY0NvbnRyYWN0RmxhZ3M7XG5cbiAgICByZXR1cm4gZmxhZ3MgYXMgRmFicmljQ29udHJhY3RGbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbiBpbmRleCBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEZhYnJpYyBjb250cmFjdHMgYW5kIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaW5kZXg8TT4obW9kZWxzOiBDb25zdHJ1Y3RvcjxNPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHJlc3VsdHMgZnJvbSBhIHN0YXRlIHF1ZXJ5IGl0ZXJhdG9yXG4gICAqIEBzdW1tYXJ5IEl0ZXJhdGVzIHRocm91Z2ggcXVlcnkgcmVzdWx0cyBhbmQgY29udmVydHMgdGhlbSB0byBhIHN0cnVjdHVyZWQgZm9ybWF0XG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBsb2cgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIGRlYnVnZ2luZ1xuICAgKiBAcGFyYW0ge0l0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3J9IGl0ZXJhdG9yIC0gVGhlIHN0YXRlIHF1ZXJ5IGl0ZXJhdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSGlzdG9yeT1mYWxzZV0gLSBXaGV0aGVyIHRoaXMgaXMgYSBoaXN0b3J5IHF1ZXJ5XG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55W10+fSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiBwcm9jZXNzZWQgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSZXN1bHRJdGVyYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IEl0ZXJhdG9yXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmVzdWx0SXRlcmF0b3I6IHJlc3VsdEl0ZXJhdG9yKGxvZywgaXRlcmF0b3IsIGlzSGlzdG9yeSlcbiAgICogICBsb29wIFVudGlsIGRvbmVcbiAgICogICAgIFJlc3VsdEl0ZXJhdG9yLT4+SXRlcmF0b3I6IG5leHQoKVxuICAgKiAgICAgSXRlcmF0b3ItLT4+UmVzdWx0SXRlcmF0b3I6IHsgdmFsdWUsIGRvbmUgfVxuICAgKiAgICAgYWx0IEhhcyB2YWx1ZVxuICAgKiAgICAgICBSZXN1bHRJdGVyYXRvci0+PlJlc3VsdEl0ZXJhdG9yOiBQcm9jZXNzIHZhbHVlIGJhc2VkIG9uIGlzSGlzdG9yeVxuICAgKiAgICAgICBSZXN1bHRJdGVyYXRvci0+PlJlc3VsdEl0ZXJhdG9yOiBBZGQgdG8gcmVzdWx0cyBhcnJheVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgUmVzdWx0SXRlcmF0b3ItPj5JdGVyYXRvcjogY2xvc2UoKVxuICAgKiAgIFJlc3VsdEl0ZXJhdG9yLS0+PkNhbGxlcjogYWxsUmVzdWx0c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3VsdEl0ZXJhdG9yKFxuICAgIGxvZzogTG9nZ2VyLFxuICAgIGl0ZXJhdG9yOiBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yLFxuICAgIGlzSGlzdG9yeSA9IGZhbHNlXG4gICkge1xuICAgIGNvbnN0IGFsbFJlc3VsdHMgPSBbXTtcbiAgICBsZXQgcmVzOiB7IHZhbHVlOiBhbnk7IGRvbmU6IGJvb2xlYW4gfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICB3aGlsZSAoIXJlcy5kb25lKSB7XG4gICAgICBpZiAocmVzLnZhbHVlICYmIHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgIGxldCBqc29uUmVzOiBhbnkgPSB7fTtcbiAgICAgICAgbG9nLmRlYnVnKHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICBpZiAoaXNIaXN0b3J5IC8qICYmIGlzSGlzdG9yeSA9PT0gdHJ1ZSovKSB7XG4gICAgICAgICAganNvblJlcy5UeElkID0gcmVzLnZhbHVlLnR4SWQ7XG4gICAgICAgICAganNvblJlcy5UaW1lc3RhbXAgPSByZXMudmFsdWUudGltZXN0YW1wO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBqc29uUmVzLlZhbHVlID0gSlNPTi5wYXJzZShyZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKGVycik7XG4gICAgICAgICAgICBqc29uUmVzLlZhbHVlID0gcmVzLnZhbHVlLnZhbHVlLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25SZXMgPSBKU09OLnBhcnNlKHJlcy52YWx1ZS52YWx1ZS50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGpzb25SZXMgPSByZXMudmFsdWUudmFsdWUudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhbGxSZXN1bHRzLnB1c2goanNvblJlcyk7XG4gICAgICB9XG4gICAgICByZXMgPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgQ2xvc2luZyBpdGVyYXRvciBhZnRlciAke2FsbFJlc3VsdHMubGVuZ3RofSByZXN1bHRzYCk7XG4gICAgaXRlcmF0b3IuY2xvc2UoKTsgLy8gcHVycG9zZWx5IG5vdCBhd2FpdC4gbGV0IGl0ZXJhdG9yIGNsb3NlIG9uIGl0cyBvd25cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSByaWNoIHF1ZXJ5IHVzaW5nIENvdWNoREIgc3ludGF4IGFnYWluc3QgdGhlIEZhYnJpYyBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZVxuICAgKiBAcGFyYW0ge01hbmdvUXVlcnl9IHJhd0lucHV0IC0gVGhlIE1hbmdvIFF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBkb2NzT25seSAtIFdoZXRoZXIgdG8gcmV0dXJuIG9ubHkgZG9jdW1lbnRzIChub3QgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMsIGluY2x1ZGluZyB0aGUgY2hhaW5jb2RlIHN0dWIgYW5kIGxvZ2dlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcXVlcnkgcmVzdWx0c1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBGYWJyaWNDb250cmFjdEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdHViXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVEQlxuICAgKlxuICAgKiAgIENhbGxlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogcmF3KHJhd0lucHV0LCBkb2NzT25seSwgY3R4KVxuICAgKiAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogRXh0cmFjdCBsaW1pdCBhbmQgc2tpcFxuICAgKiAgIGFsdCBXaXRoIHBhZ2luYXRpb25cbiAgICogICAgIEZhYnJpY0NvbnRyYWN0QWRhcHRlci0+PlN0dWI6IGdldFF1ZXJ5UmVzdWx0V2l0aFBhZ2luYXRpb24ocXVlcnksIGxpbWl0LCBza2lwKVxuICAgKiAgIGVsc2UgV2l0aG91dCBwYWdpbmF0aW9uXG4gICAqICAgICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5TdHViOiBnZXRRdWVyeVJlc3VsdChxdWVyeSlcbiAgICogICBlbmRcbiAgICogICBTdHViLT4+U3RhdGVEQjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIFN0YXRlREItLT4+U3R1YjogSXRlcmF0b3JcbiAgICogICBTdHViLS0+PkZhYnJpY0NvbnRyYWN0QWRhcHRlcjogSXRlcmF0b3JcbiAgICogICBGYWJyaWNDb250cmFjdEFkYXB0ZXItPj5GYWJyaWNDb250cmFjdEFkYXB0ZXI6IHJlc3VsdEl0ZXJhdG9yKGxvZywgaXRlcmF0b3IpXG4gICAqICAgRmFicmljQ29udHJhY3RBZGFwdGVyLS0+PkNhbGxlcjogcmVzdWx0c1xuICAgKi9cbiAgYXN5bmMgcmF3PFIsIEQgZXh0ZW5kcyBib29sZWFuPihcbiAgICByYXdJbnB1dDogTWFuZ29RdWVyeSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZG9jc09ubHk6IEQgPSB0cnVlIGFzIEQsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJhd1Jlc3VsdDxSLCBEPj4ge1xuICAgIGNvbnN0IHsgbG9nLCBzdHViIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJhdyk7XG5cbiAgICBjb25zdCB7IHNraXAsIGxpbWl0IH0gPSByYXdJbnB1dDtcbiAgICBsZXQgaXRlcmF0b3I6IEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I7XG4gICAgaWYgKGxpbWl0IHx8IHNraXApIHtcbiAgICAgIGRlbGV0ZSByYXdJbnB1dFtcImxpbWl0XCJdO1xuICAgICAgZGVsZXRlIHJhd0lucHV0W1wic2tpcFwiXTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYFJldHJpZXZpbmcgcGFnaW5hdGVkIGl0ZXJhdG9yOiBsaW1pdDogJHtsaW1pdH0vIHNraXA6ICR7c2tpcH1gXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2U6IFN0YXRlUXVlcnlSZXNwb25zZTxJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yPiA9XG4gICAgICAgIChhd2FpdCB0aGlzLnF1ZXJ5UmVzdWx0UGFnaW5hdGVkKFxuICAgICAgICAgIHN0dWIsXG4gICAgICAgICAgcmF3SW5wdXQsXG4gICAgICAgICAgbGltaXQgfHwgMjUwLFxuICAgICAgICAgIChza2lwIGFzIGFueSk/LnRvU3RyaW5nKClcbiAgICAgICAgKSkgYXMgU3RhdGVRdWVyeVJlc3BvbnNlPEl0ZXJhdG9ycy5TdGF0ZVF1ZXJ5SXRlcmF0b3I+O1xuICAgICAgaXRlcmF0b3IgPSByZXNwb25zZS5pdGVyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFwiUmV0cmlldmluZyBpdGVyYXRvclwiKTtcbiAgICAgIGl0ZXJhdG9yID0gKGF3YWl0IHRoaXMucXVlcnlSZXN1bHQoXG4gICAgICAgIHN0dWIsXG4gICAgICAgIHJhd0lucHV0XG4gICAgICApKSBhcyBJdGVyYXRvcnMuU3RhdGVRdWVyeUl0ZXJhdG9yO1xuICAgIH1cbiAgICBsb2cuZGVidWcoXCJJdGVyYXRvciBhY3F1aXJlZFwiKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSAoYXdhaXQgdGhpcy5yZXN1bHRJdGVyYXRvcihsb2csIGl0ZXJhdG9yKSkgYXMgUjtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgcmV0dXJuaW5nICR7QXJyYXkuaXNBcnJheShyZXN1bHRzKSA/IHJlc3VsdHMubGVuZ3RoIDogMX0gcmVzdWx0c2BcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzIGFzIGFueTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IEZhYnJpY1N0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IEZhYnJpY1N0YXRlbWVudCh0aGlzIGFzIGFueSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGNvbnN0IHRhYmxlTGFiZWwgPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBsb2cuZGVidWcoYENyZWF0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVMYWJlbH0gdGFibGVgKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLmNyZWF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uY3R4QXJncykpXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKGlkLmxlbmd0aCAhPT0gbW9kZWwubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZUFsbCk7XG4gICAgY29uc3QgdGFibGVMYWJlbCA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIGxvZy5kZWJ1ZyhgVXBkYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZUxhYmVsfSB0YWJsZWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGlkLm1hcCgoaSwgY291bnQpID0+IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgaSwgbW9kZWxbY291bnRdLCAuLi5jdHhBcmdzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtcbiAgICogQHBhcmFtIGFyZ3NcbiAgICovXG4gIG92ZXJyaWRlIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IFByZXBhcmVkTW9kZWwge1xuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnByZXBhcmUpO1xuXG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSk7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpO1xuICAgIGNvbnN0IHNwbGl0ID0gTW9kZWwuc2VncmVnYXRlKG1vZGVsKTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhzcGxpdC5tb2RlbCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gYWNjdW07XG4gICAgICAgIGNvbnN0IG1hcHBlZFByb3AgPSBNb2RlbC5jb2x1bW5OYW1lKG1vZGVsLCBrZXkgYXMgYW55KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gICAgbG9nLnNpbGx5KFxuICAgICAgYFByZXBhcmluZyByZWNvcmQgZm9yICR7dGFibGVOYW1lfSB0YWJsZSB3aXRoIHBrICR7KG1vZGVsIGFzIGFueSlbcGtdfWBcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IChtb2RlbCBhcyBhbnkpW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQ+XG4gICk6IE0ge1xuICAgIGNvbnN0IHsgbG9nIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKGNsYXp6KTtcbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH1gKTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhtKS5yZWR1Y2UoKGFjY3VtOiBNLCBrZXkpID0+IHtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID1cbiAgICAgICAgb2JqW01vZGVsLmNvbHVtbk5hbWUoYWNjdW0sIGtleSBhcyBhbnkpXTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBtKTtcblxuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gcmVzdWx0ICYmIChyZXN1bHQgYXMgYW55KVtrZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIHJlc3VsdFtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKSB7XG4gICAgY29uc3QgeyBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZVByZWZpeCk7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IE1vZGVsLnRhYmxlTmFtZSh0YWJsZU5hbWUpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbCk7XG5cbiAgICByZXR1cm4gW3RhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uY3R4QXJnc10gYXMgW1xuICAgICAgQ29uc3RydWN0b3I8TT4sXG4gICAgICBQcmltYXJ5S2V5VHlwZSxcbiAgICAgIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICAuLi5hbnlbXSxcbiAgICAgIEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPEZhYnJpY0NvbnRyYWN0Q29udGV4dD5cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy51cGRhdGVQcmVmaXgpO1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIHJlY29yZFtDb3VjaERCS2V5cy5UQUJMRV0gPSBNb2RlbC50YWJsZU5hbWUodGFibGVOYW1lKTtcbiAgICBPYmplY3QuYXNzaWduKHJlY29yZCwgbW9kZWwpO1xuXG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkLCByZWNvcmQsIC4uLmN0eEFyZ3NdIGFzIFtcbiAgICAgIENvbnN0cnVjdG9yPE0+LFxuICAgICAgUHJpbWFyeUtleVR5cGUsXG4gICAgICBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgLi4uYW55W10sXG4gICAgICBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVBbGxQcmVmaXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkczogUHJpbWFyeUtleVR5cGVbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBbLi4uYW55LCBGYWJyaWNDb250cmFjdENvbnRleHRdXG4gICk6IChzdHJpbmcgfCBzdHJpbmdbXSB8IG51bWJlcltdIHwgUmVjb3JkPHN0cmluZywgYW55PltdKVtdIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0ID0gYXJncy5wb3AoKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkcywgcmVjb3JkcywgY3R4IGFzIGFueV07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlQWxsUHJlZml4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgdGFibGVOYW1lOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZHM6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogWy4uLmFueSwgRmFicmljQ29udHJhY3RDb250ZXh0XVxuICApIHtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gbW9kZWxzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcblxuICAgIGNvbnN0IGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0ID0gYXJncy5wb3AoKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSBpZHMubWFwKChpZCwgY291bnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgcmVjb3JkW0NvdWNoREJLZXlzLlRBQkxFXSA9IHRhYmxlTmFtZTtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVjb3JkLCBtb2RlbHNbY291bnRdKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt0YWJsZU5hbWUsIGlkcywgcmVjb3JkcywgY3R4IGFzIGFueV07XG4gIH1cblxuICBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KFxuICAgIGVycjogRXJyb3IgfCBzdHJpbmcsXG4gICAgcmVhc29uPzogc3RyaW5nXG4gICk6IEUge1xuICAgIHJldHVybiBGYWJyaWNDb250cmFjdEFkYXB0ZXIucGFyc2VFcnJvcihyZWFzb24gfHwgZXJyKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGxvZ0N0eDxBUkdTIGV4dGVuZHMgYW55W10+KFxuICAgIGFyZ3M6IEFSR1MsXG4gICAgbWV0aG9kOiAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgc3RyaW5nXG4gICk6IENvbnRleHR1YWxpemVkQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+ICYge1xuICAgIHN0dWI6IENoYWluY29kZVN0dWI7XG4gICAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xuICB9IHtcbiAgICByZXR1cm4gRmFicmljQ29udHJhY3RBZGFwdGVyLmxvZ0N0eC5jYWxsKHRoaXMsIGFyZ3MsIG1ldGhvZCBhcyBhbnkpIGFzIGFueTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6IHN0cmluZ1xuICApOiBDb250ZXh0dWFsaXplZEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPiAmIHtcbiAgICBzdHViOiBDaGFpbmNvZGVTdHViO1xuICAgIGlkZW50aXR5OiBDbGllbnRJZGVudGl0eTtcbiAgfTtcbiAgc3RhdGljIG92ZXJyaWRlIGxvZ0N0eDxBUkdTIGV4dGVuZHMgYW55W10+KFxuICAgIHRoaXM6IGFueSxcbiAgICBhcmdzOiBBUkdTLFxuICAgIG1ldGhvZDogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAgKTogQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgICBpZGVudGl0eTogQ2xpZW50SWRlbnRpdHk7XG4gIH07XG4gIHN0YXRpYyBvdmVycmlkZSBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBzdHJpbmdcbiAgKTogQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgICBpZGVudGl0eTogQ2xpZW50SWRlbnRpdHk7XG4gIH0ge1xuICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gY29udGV4dCBwcm92aWRlZFwiKTtcbiAgICBjb25zdCBjdHggPSBhcmdzLnBvcCgpIGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dDtcblxuICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIENvbnRleHQpKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBjb250ZXh0IHByb3ZpZGVkXCIpO1xuICAgIGlmIChhcmdzLmZpbHRlcigoYSkgPT4gYSBpbnN0YW5jZW9mIENvbnRleHQpLmxlbmd0aCA+IDEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJoZXJlXCIpO1xuICAgIGNvbnN0IGxvZyA9IChcbiAgICAgIHRoaXNcbiAgICAgICAgPyBjdHgubG9nZ2VyLmZvcih0aGlzKS5mb3IobWV0aG9kKVxuICAgICAgICA6IGN0eC5sb2dnZXIuY2xlYXIoKS5mb3IodGhpcykuZm9yKG1ldGhvZClcbiAgICApIGFzIExvZ2dlck9mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD47XG4gICAgcmV0dXJuIHtcbiAgICAgIGN0eDogY3R4LFxuICAgICAgbG9nOiBtZXRob2QgPyAobG9nLmZvcihtZXRob2QpIGFzIExvZ2dlck9mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD4pIDogbG9nLFxuICAgICAgc3R1YjogY3R4LnN0dWIsXG4gICAgICBpZGVudGl0eTogY3R4LmlkZW50aXR5LFxuICAgICAgY3R4QXJnczogWy4uLmFyZ3MsIGN0eF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBwYXJzZUVycm9yPEUgZXh0ZW5kcyBCYXNlRXJyb3I+KGVycjogRXJyb3IgfCBzdHJpbmcpOiBFIHtcbiAgICAvLyBpZiAoXG4gICAgLy8gICBNSVNTSU5HX1BSSVZBVEVfREFUQV9SRUdFWC50ZXN0KFxuICAgIC8vICAgICB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2VcbiAgICAvLyAgIClcbiAgICAvLyApXG4gICAgLy8gICByZXR1cm4gbmV3IFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzKGVycikgYXMgRTtcbiAgICBjb25zdCBtc2cgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhOb3RGb3VuZEVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoZXJyKSBhcyBFO1xuICAgIGlmIChtc2cuaW5jbHVkZXMoQ29uZmxpY3RFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKEJhZFJlcXVlc3RFcnJvci5uYW1lKSlcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKFF1ZXJ5RXJyb3IubmFtZSkpIHJldHVybiBuZXcgUXVlcnlFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhQYWdpbmdFcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBQYWdpbmdFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhVbnN1cHBvcnRlZEVycm9yLm5hbWUpKVxuICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZEVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE1pZ3JhdGlvbkVycm9yLm5hbWUpKSByZXR1cm4gbmV3IE1pZ3JhdGlvbkVycm9yKGVycikgYXMgRTtcbiAgICBpZiAobXNnLmluY2x1ZGVzKE9ic2VydmVyRXJyb3IubmFtZSkpIHJldHVybiBuZXcgT2JzZXJ2ZXJFcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhBdXRob3JpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhGb3JiaWRkZW5FcnJvci5uYW1lKSkgcmV0dXJuIG5ldyBGb3JiaWRkZW5FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhDb25uZWN0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgaWYgKG1zZy5pbmNsdWRlcyhTZXJpYWxpemF0aW9uRXJyb3IubmFtZSkpXG4gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6YXRpb25FcnJvcihlcnIpIGFzIEU7XG4gICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycikgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1ldGhvZCBmb3IgZGVjb3JhdGlvbiBvdmVycmlkZXNcbiAgICogQHN1bW1hcnkgT3ZlcnJpZGVzL2V4dGVuZHMgZGVjYWYgZGVjb3JhdGlvbiB3aXRoIEZhYnJpYy1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5XG4gICAqIEBzdGF0aWNcbiAgICogQG92ZXJyaWRlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGUgZGVjb3JhdGlvbigpOiB2b2lkIHtcbiAgICBzdXBlci5kZWNvcmF0aW9uKCk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZLCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uRmFicmljQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZLCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhGYWJyaWNGbGF2b3VyKVxuICAgICAgLmZvcihEQktleXMuSUQpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBwa0RlYyhcbiAgICAgICAgICBvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMsXG4gICAgICAgICAgZ3JvdXBzb3J0PzogR3JvdXBTb3J0XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwa0RlYyhvYmo6IGFueSwgYXR0cjogYW55KSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICAgIHJlcXVpcmVkKCksXG4gICAgICAgICAgICAgIHJlYWRvbmx5KCksXG4gICAgICAgICAgICAgIHByb3BNZXRhZGF0YShNZXRhZGF0YS5rZXkoREJLZXlzLklELCBhdHRyKSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgIG9uQ3JlYXRlKHBrRmFicmljT25DcmVhdGUgYXMgYW55LCBvcHRpb25zLCBncm91cHNvcnQpXG4gICAgICAgICAgICApKG9iaiwgYXR0cik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pXG4gICAgICAuZXh0ZW5kKEZhYnJpY1Byb3BlcnR5KCkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoRmFicmljRmxhdm91cilcbiAgICAgIC5mb3IoUGVyc2lzdGVuY2VLZXlzLlRBQkxFKVxuICAgICAgLmV4dGVuZChmdW5jdGlvbiB0YWJsZShvYmo6IGFueSkge1xuICAgICAgICAvLyBjb25zdCBjaGFpbjogYW55W10gPSBbXTtcblxuICAgICAgICAvLyBsZXQgY3VycmVudCA9IG9iajtcblxuICAgICAgICAvLyBkbyB7XG4gICAgICAgIC8vICAgY2hhaW4ucHVzaChjdXJyZW50KTtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhgRm91bmQgY2xhc3M6ICR7Y3VycmVudH1gKTtcbiAgICAgICAgLy8gfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuICAgICAgICAvLyBkbyB7XG4gICAgICAgIC8vICAgY3VycmVudCA9IGNoYWluLnBvcCgpO1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKGBBcHBseWluZyBAT2JqZWN0KCkgdG8gY2xhc3M6ICR7Y3VycmVudH1gKTtcbiAgICAgICAgLy8gICAvL1RPRE86IFRISVMgSVMgTk9UIFdPUktJTkcgQU5EIFRIUk9XUyBFUlJPUlxuICAgICAgICAvLyAgIC8vIEZhYnJpY09iamVjdCgpKGN1cnJlbnQpO1xuICAgICAgICAvLyB9IHdoaWxlIChjaGFpbi5sZW5ndGggPiAxKTtcblxuICAgICAgICByZXR1cm4gRmFicmljT2JqZWN0KCkob2JqKTtcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIGZ1bmN0aW9uIG9uZVRvT25lRGVjPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICBqb2luQ29sdW1uT3B0cz86IEpvaW5Db2x1bW5PcHRpb25zLFxuICAgICAgZms/OiBzdHJpbmdcbiAgICApIHtcbiAgICAgIGNvbnN0IG1ldGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICBjbGFzczogY2xhenosXG4gICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgIH07XG4gICAgICBpZiAoam9pbkNvbHVtbk9wdHMpIG1ldGEuam9pblRhYmxlID0gam9pbkNvbHVtbk9wdHM7XG4gICAgICBpZiAoZmspIG1ldGEubmFtZSA9IGZrO1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHJlbGF0aW9uKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FLCBtZXRhKSxcbiAgICAgICAgdHlwZShbY2xhenosIFN0cmluZywgTnVtYmVyLCBCaWdJbnRdKSxcbiAgICAgICAgb25DcmVhdGUob25lVG9PbmVPbkNyZWF0ZSBhcyBhbnksIG1ldGEpLFxuICAgICAgICBvblVwZGF0ZShvbmVUb09uZU9uVXBkYXRlIGFzIGFueSwgbWV0YSksXG4gICAgICAgIG9uRGVsZXRlKG9uZVRvT25lT25EZWxldGUgYXMgYW55LCBtZXRhKSxcbiAgICAgICAgYWZ0ZXJBbnkocG9wLCBtZXRhKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FLCBtZXRhKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKEZhYnJpY0ZsYXZvdXIpXG4gICAgICAuZm9yKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FKVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogb25lVG9PbmVEZWMsXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgZnVuY3Rpb24gb25lVG9NYW55RGVjPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8TT4pLFxuICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgcG9wdWxhdGU6IGJvb2xlYW4sXG4gICAgICBqb2luVGFibGVPcHRzPzogSm9pblRhYmxlT3B0aW9ucyB8IEpvaW5UYWJsZU11bHRpcGxlQ29sdW1uc09wdGlvbnMsXG4gICAgICBmaz86IHN0cmluZ1xuICAgICkge1xuICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICBjbGFzczogY2xhenosXG4gICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgIH07XG4gICAgICBpZiAoam9pblRhYmxlT3B0cykgbWV0YWRhdGEuam9pblRhYmxlID0gam9pblRhYmxlT3B0cztcbiAgICAgIGlmIChmaykgbWV0YWRhdGEubmFtZSA9IGZrO1xuICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICBwcm9wKCksXG4gICAgICAgIHJlbGF0aW9uKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSwgbWV0YWRhdGEpLFxuICAgICAgICBsaXN0KFtjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPiwgU3RyaW5nLCBOdW1iZXJdKSxcbiAgICAgICAgb25DcmVhdGUob25lVG9NYW55T25DcmVhdGUgYXMgYW55LCBtZXRhZGF0YSksXG4gICAgICAgIG9uVXBkYXRlKG9uZVRvTWFueU9uVXBkYXRlLCBtZXRhZGF0YSksXG4gICAgICAgIG9uRGVsZXRlKG9uZVRvTWFueU9uRGVsZXRlIGFzIGFueSwgbWV0YWRhdGEpLFxuICAgICAgICBhZnRlckFueShwb3AsIG1ldGFkYXRhKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSwgbWV0YWRhdGEpXG4gICAgICApO1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZm9yKFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IG9uZVRvTWFueURlYyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cblxuRmFicmljQ29udHJhY3RBZGFwdGVyLmRlY29yYXRpb24oKTtcbkFkYXB0ZXIuc2V0Q3VycmVudChGYWJyaWNGbGF2b3VyKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7IEpTT05TZXJpYWxpemVyLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5pc3RpYyBKU09OIHNlcmlhbGl6ZXIgZm9yIEZhYnJpYyBtb2RlbHNcbiAqIEBzdW1tYXJ5IEVuc3VyZXMgc3RhYmxlLCBkZXRlcm1pbmlzdGljIEpTT04gb3V0cHV0IGJ5IHNvcnRpbmcgb2JqZWN0IGtleXMgcmVjdXJzaXZlbHkgYmVmb3JlIHN0cmluZ2lmaWNhdGlvbiwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBGYWJyaWMgZW5kb3JzZW1lbnQgYW5kIGhhc2hpbmcuIEV4dGVuZHMgSlNPTlNlcmlhbGl6ZXIgdG8gcGx1ZyBpbnRvIGV4aXN0aW5nIERlY2FmIG1vZGVsIHNlcmlhbGl6YXRpb24gZmxvdy5cbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIERlY2FmIE1vZGVsIHN1YnR5cGUgc2VyaWFsaXplZCBieSB0aGlzIGluc3RhbmNlXG4gKiBAcGFyYW0ge3ZvaWR9IFtjb25zdHJ1Y3Rvcl0gTm8gcHVibGljIGNvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICogQGNsYXNzIERldGVybWluaXN0aWNTZXJpYWxpemVyXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc2VyaWFsaXplciA9IG5ldyBEZXRlcm1pbmlzdGljU2VyaWFsaXplcjxNeU1vZGVsPigpO1xuICogY29uc3QganNvbiA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsKTtcbiAqIGNvbnN0IHJlYnVpbHQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGpzb24pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgRFMgYXMgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXJcbiAqICAgQ2FsbGVyLT4+RFM6IHNlcmlhbGl6ZShtb2RlbClcbiAqICAgRFMtPj5EUzogcHJlU2VyaWFsaXplKG1vZGVsKVxuICogICBEUy0+PkRTOiBzb3J0LWtleXMtcmVjdXJzaXZlXG4gKiAgIERTLT4+RFM6IGpzb24tc3RyaW5naWZ5LWRldGVybWluaXN0aWNcbiAqICAgRFMtLT4+Q2FsbGVyOiBzdHJpbmdcbiAqICAgQ2FsbGVyLT4+RFM6IGRlc2VyaWFsaXplKHN0cmluZylcbiAqICAgRFMtLT4+Q2FsbGVyOiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbj4gZXh0ZW5kcyBKU09OU2VyaWFsaXplcjxNPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlc2VyaWFsaXplIGEgSlNPTiBzdHJpbmcgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgYmFzZSBKU09OU2VyaWFsaXplciBpbXBsZW1lbnRhdGlvbiB0byByZWJ1aWxkIHRoZSBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIEpTT04gc3RyaW5nIHRvIGRlc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge019IFRoZSByZWNvbnN0cnVjdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBvdmVycmlkZSBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZyk6IE0ge1xuICAgIHJldHVybiBzdXBlci5kZXNlcmlhbGl6ZShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXJpYWxpemUgYSBtb2RlbCBpbnRvIGEgZGV0ZXJtaW5pc3RpYyBKU09OIHN0cmluZ1xuICAgKiBAc3VtbWFyeSBQcmVwYXJlcyB0aGUgbW9kZWwgd2l0aCBwcmVTZXJpYWxpemUsIHNvcnRzIGtleXMgcmVjdXJzaXZlbHksIGFuZCBzdHJpbmdpZmllcyBkZXRlcm1pbmlzdGljYWxseSBmb3Igc3RhYmxlIG9yZGVyaW5nXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRGV0ZXJtaW5pc3RpYyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbFxuICAgKi9cbiAgb3ZlcnJpZGUgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKFwianNvbi1zdHJpbmdpZnktZGV0ZXJtaW5pc3RpY1wiKTtcbiAgICBjb25zdCBzb3J0S2V5c1JlY3Vyc2l2ZSA9IHJlcXVpcmUoXCJzb3J0LWtleXMtcmVjdXJzaXZlXCIpO1xuICAgIHJldHVybiBzdHJpbmdpZnkoc29ydEtleXNSZWN1cnNpdmUodGhpcy5wcmVTZXJpYWxpemUobW9kZWwpKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB9IGZyb20gXCIuLi9Db250cmFjdEFkYXB0ZXJcIjtcbmltcG9ydCB7IENvbnRyYWN0LCBDb250ZXh0IGFzIEN0eCB9IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBNb2RlbCwgU2VyaWFsaXplciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgQ29udGV4dCxcbiAgQ29udGV4dHVhbGl6ZWRBcmdzLFxuICBMb2dnZXJPZixcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL0RldGVybWluaXN0aWNTZXJpYWxpemVyXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ2hlY2thYmxlLCBoZWFsdGhjaGVjayB9IGZyb20gXCIuLi8uLi9zaGFyZWQvaW50ZXJmYWNlcy9DaGVja2FibGVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdENvbnRleHQgfSBmcm9tIFwiLi4vQ29udHJhY3RDb250ZXh0XCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENoYWluY29kZVN0dWIsIENsaWVudElkZW50aXR5IH0gZnJvbSBcImZhYnJpYy1zaGltLWFwaVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNvbnRyYWN0IGNsYXNzIGZvciBDUlVEIG9wZXJhdGlvbnMgaW4gRmFicmljIGNoYWluY29kZVxuICogQHN1bW1hcnkgUHJvdmlkZXMgc3RhbmRhcmQgY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgbW9kZWxzIGluIEZhYnJpYyBjaGFpbmNvZGVcbiAqIEB0ZW1wbGF0ZSBNIC0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAqIEBjbGFzcyBGYWJyaWNDcnVkQ29udHJhY3RcbiAqIEBleHRlbmRzIHtDb250cmFjdH1cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBEZWZpbmUgYSBtb2RlbFxuICogQHRhYmxlKCdhc3NldHMnKVxuICogY2xhc3MgQXNzZXQgZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBpZCgpXG4gKiAgIGlkOiBzdHJpbmc7XG4gKlxuICogICBAcHJvcGVydHkoKVxuICogICBkYXRhOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gQ3JlYXRlIGEgY29udHJhY3QgdGhhdCBleHRlbmRzIEZhYnJpY0NydWRDb250cmFjdFxuICogZXhwb3J0IGNsYXNzIEFzc2V0Q29udHJhY3QgZXh0ZW5kcyBGYWJyaWNDcnVkQ29udHJhY3Q8QXNzZXQ+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoJ0Fzc2V0Q29udHJhY3QnLCBBc3NldCk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIEFkZCBjdXN0b20gbWV0aG9kcyBhcyBuZWVkZWRcbiAqICAgYXN5bmMgZ2V0QXNzZXRIaXN0b3J5KGN0eDogQ29udGV4dCwgaWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcbiAqICAgICAvLyBDdXN0b20gaW1wbGVtZW50YXRpb25cbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBDb250cmFjdFxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RhdGVEQlxuICpcbiAqICAgQ2xpZW50LT4+Q29udHJhY3Q6IGNyZWF0ZShjdHgsIG1vZGVsKVxuICogICBDb250cmFjdC0+PlJlcG9zaXRvcnk6IHJlcG9zaXRvcnkoY3R4KVxuICogICBDb250cmFjdC0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbCwgY3R4KVxuICogICBSZXBvc2l0b3J5LT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIHJlY29yZCwgdHJhbnNpZW50LCBjdHgpXG4gKiAgIEFkYXB0ZXItPj5TdGF0ZURCOiBwdXRTdGF0ZShpZCwgc2VyaWFsaXplZERhdGEpXG4gKiAgIFN0YXRlREItLT4+QWRhcHRlcjogU3VjY2Vzc1xuICogICBBZGFwdGVyLS0+PlJlcG9zaXRvcnk6IHJlY29yZFxuICogICBSZXBvc2l0b3J5LS0+PkNvbnRyYWN0OiBtb2RlbFxuICogICBDb250cmFjdC0tPj5DbGllbnQ6IG1vZGVsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGYWJyaWNDcnVkQ29udHJhY3Q8TSBleHRlbmRzIE1vZGVsPlxuICBleHRlbmRzIENvbnRyYWN0XG4gIGltcGxlbWVudHMgQ2hlY2thYmxlXG57XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2hhcmVkIGFkYXB0ZXIgaW5zdGFuY2UgZm9yIGFsbCBjb250cmFjdCBpbnN0YW5jZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWRhcHRlcjogRmFicmljQ29udHJhY3RBZGFwdGVyID0gbmV3IEZhYnJpY0NvbnRyYWN0QWRhcHRlcigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSByZXBvOiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8TT47XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBzZXJpYWxpemVyID0gbmV3IERldGVybWluaXN0aWNTZXJpYWxpemVyKCk7XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IEZhYnJpY0NydWRDb250cmFjdCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIGNvbnRyYWN0IHdpdGggYSBuYW1lIGFuZCBtb2RlbCBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250cmFjdFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMucmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwoY2xhenopO1xuICB9XG5cbiAgYXN5bmMgbGlzdEJ5KFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIGtleTogc3RyaW5nIHwga2V5b2YgTSxcbiAgICBvcmRlcjogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMubGlzdEJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmxpc3RCeShcbiAgICAgIGtleSBhcyBrZXlvZiBNLFxuICAgICAgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAuLi5jdHhBcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHBhZ2luYXRlQnkoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAga2V5OiBzdHJpbmcgfCBrZXlvZiBNLFxuICAgIG9yZGVyOiBzdHJpbmcsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMucGFnaW5hdGVCeSk7XG4gICAgcmV0dXJuIHRoaXMucmVwby5wYWdpbmF0ZUJ5KGtleSBhcyBrZXlvZiBNLCBvcmRlciBhcyBhbnksIHNpemUsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZUJ5KFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIGtleTogc3RyaW5nIHwga2V5b2YgTSxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMuZmluZE9uZUJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmZpbmRPbmVCeShrZXkgYXMga2V5b2YgTSwgdmFsdWUsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgc3RhdGVtZW50KFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMuc3RhdGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnN0YXRlbWVudChtZXRob2QsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2luZ2xlIG1vZGVsIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyBjcmVhdGUgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCBtb2RlbFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIG1vZGVsOiBzdHJpbmcgfCBNLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8c3RyaW5nIHwgTT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbLi4uYXJncywgY3R4XSwgdGhpcy5jcmVhdGUpO1xuICAgIGxvZy5pbmZvKGBDT05UUkFDVCBDUkVBVEUsICR7Y3R4QXJnc31gKTtcblxuICAgIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIG1vZGVsID0gdGhpcy5kZXNlcmlhbGl6ZTxNPihtb2RlbCkgYXMgTTtcblxuICAgIGxvZy5pbmZvKGBDcmVhdGluZyBtb2RlbDogJHtKU09OLnN0cmluZ2lmeShtb2RlbCl9YCk7XG5cbiAgICBjb25zdCB0cmFuc2llbnQgPSB0aGlzLmdldFRyYW5zaWVudERhdGEoY3R4KTtcblxuICAgIGxvZy5pbmZvKGBNZXJnaW5nIHRyYW5zaWVudCBkYXRhLi4uYCk7XG4gICAgbW9kZWwgPSBNb2RlbC5tZXJnZShtb2RlbCwgdHJhbnNpZW50LCB0aGlzLmNsYXp6KSBhcyBNO1xuXG4gICAgcmV0dXJuIHRoaXMucmVwby5jcmVhdGUobW9kZWwsIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHNpbmdsZSBtb2RlbCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyByZWFkIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0ga2V5IC0gVGhlIGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCBtb2RlbFxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICBjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBrZXk6IFByaW1hcnlLZXlUeXBlIHwgc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TSB8IHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbLi4uYXJncywgY3R4XSwgdGhpcy5yZWFkKTtcblxuICAgIGxvZy5pbmZvKGByZWFkaW5nIGVudHJ5IHdpdGggcGsgJHtrZXl9IGApO1xuXG4gICAgcmV0dXJuIHRoaXMucmVwby5yZWFkKGtleSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNpZW50RGF0YShjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCk6IGFueSB7XG4gICAgY29uc3QgdHJhbnNpZW50TWFwID0gY3R4LnN0dWIuZ2V0VHJhbnNpZW50KCk7XG4gICAgbGV0IHRyYW5zaWVudDogYW55ID0ge307XG5cbiAgICBpZiAodHJhbnNpZW50TWFwLmhhcygodGhpcy5yZXBvIGFzIGFueSkudGFibGVOYW1lKSkge1xuICAgICAgdHJhbnNpZW50ID0gSlNPTi5wYXJzZShcbiAgICAgICAgKHRyYW5zaWVudE1hcC5nZXQoKHRoaXMucmVwbyBhcyBhbnkpLnRhYmxlTmFtZSkgYXMgQnVmZmVyKT8udG9TdHJpbmcoXG4gICAgICAgICAgXCJ1dGY4XCJcbiAgICAgICAgKSBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHNpbmdsZSBtb2RlbCBpbiB0aGUgc3RhdGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSByZXBvc2l0b3J5J3MgdXBkYXRlIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgbW9kZWxcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBtb2RlbDogc3RyaW5nIHwgTSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHN0cmluZyB8IE0+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMudXBkYXRlKTtcblxuICAgIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIG1vZGVsID0gdGhpcy5kZXNlcmlhbGl6ZTxNPihtb2RlbCkgYXMgTTtcblxuICAgIGxvZy5pbmZvKGBVcGRhdGluZyBtb2RlbDogJHtKU09OLnN0cmluZ2lmeShtb2RlbCl9YCk7XG5cbiAgICBjb25zdCB0cmFuc2llbnQgPSB0aGlzLmdldFRyYW5zaWVudERhdGEoY3R4KTtcblxuICAgIGxvZy5pbmZvKGBNZXJnaW5nIHRyYW5zaWVudCBkYXRhLi4uYCk7XG4gICAgbW9kZWwgPSBNb2RlbC5tZXJnZShtb2RlbCwgdHJhbnNpZW50LCB0aGlzLmNsYXp6KSBhcyBNO1xuICAgIHJldHVybiB0aGlzLnJlcG8udXBkYXRlKG1vZGVsLCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHNpbmdsZSBtb2RlbCBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyBkZWxldGUgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBtb2RlbCB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIG1vZGVsXG4gICAqL1xuICBhc3luYyBkZWxldGUoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAga2V5OiBQcmltYXJ5S2V5VHlwZSB8IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0gfCBzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMuZGVsZXRlKTtcbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgZW50cnkgd2l0aCBwayAke2tleX0gYCk7XG4gICAgcmV0dXJuIHRoaXMucmVwby5kZWxldGUoU3RyaW5nKGtleSksIC4uLmN0eEFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyBkZWxldGVBbGwgbWV0aG9kXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0ga2V5cyAtIFRoZSBrZXlzIG9mIHRoZSBtb2RlbHMgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIG1vZGVsc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIGtleXM6IFByaW1hcnlLZXlUeXBlW10gfCBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10gfCBzdHJpbmc+IHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjdHhdLCB0aGlzLnJlYWRBbGwpO1xuICAgIGlmICh0eXBlb2Yga2V5cyA9PT0gXCJzdHJpbmdcIikga2V5cyA9IEpTT04ucGFyc2Uoa2V5cykgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIHRoaXMucmVwby5kZWxldGVBbGwoa2V5cywgLi4uY3R4QXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIG1vZGVscyBmcm9tIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyByZWFkQWxsIG1ldGhvZFxuICAgKiBAcGFyYW0ge0N0eH0gY3R4IC0gVGhlIEZhYnJpYyBjaGFpbmNvZGUgY29udGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGtleXMgLSBUaGUga2V5cyBvZiB0aGUgbW9kZWxzIHRvIHJlYWRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJldHJpZXZlZCBtb2RlbHNcbiAgICovXG4gIGFzeW5jIHJlYWRBbGwoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAga2V5czogUHJpbWFyeUtleVR5cGVbXSB8IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXSB8IHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGN0eF0sIHRoaXMucmVhZEFsbCk7XG4gICAgaWYgKHR5cGVvZiBrZXlzID09PSBcInN0cmluZ1wiKSBrZXlzID0gSlNPTi5wYXJzZShrZXlzKSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnJlYWRBbGwoa2V5cywgLi4uY3R4QXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGluIHRoZSBzdGF0ZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHJlcG9zaXRvcnkncyB1cGRhdGVBbGwgbWV0aG9kXG4gICAqIEBwYXJhbSB7Q3R4fSBjdHggLSBUaGUgRmFicmljIGNoYWluY29kZSBjb250ZXh0XG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWxzIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZCBtb2RlbHNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFsbChcbiAgICBjdHg6IEN0eCB8IEZhYnJpY0NvbnRyYWN0Q29udGV4dCxcbiAgICBtb2RlbHM6IHN0cmluZyB8IE1bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHN0cmluZyB8IE1bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbLi4uYXJncywgY3R4XSwgdGhpcy51cGRhdGVBbGwpO1xuICAgIGlmICh0eXBlb2YgbW9kZWxzID09PSBcInN0cmluZ1wiKVxuICAgICAgbW9kZWxzID0gKEpTT04ucGFyc2UobW9kZWxzKSBhcyBbXSlcbiAgICAgICAgLm1hcCgobSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShtKSlcbiAgICAgICAgLm1hcCgobSkgPT4gbmV3IHRoaXMuY2xhenoobSkpIGFzIGFueTtcblxuICAgIGxvZy5pbmZvKGB1cGRhdGluZyAke21vZGVscy5sZW5ndGh9IGVudHJpZXMgdG8gdGhlIHRhYmxlYCk7XG4gICAgcmV0dXJuIHRoaXMucmVwby51cGRhdGVBbGwobW9kZWxzIGFzIHVua25vd24gYXMgTVtdLCAuLi5jdHhBcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBxdWVyeSB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9ucyBhbmQgb3B0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzaW1wbGlmaWVkIHdheSB0byBxdWVyeSB0aGUgZGF0YWJhc2Ugd2l0aCBjb21tb24gcXVlcnkgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gZmlsdGVyIHJlY29yZHMuXG4gICAqIEBwYXJhbSBvcmRlckJ5IC0gVGhlIGZpZWxkIHRvIG9yZGVyIHJlc3VsdHMgYnkuXG4gICAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtvcmRlcj1PcmRlckRpcmVjdGlvbi5BU0NdIC0gVGhlIHNvcnQgZGlyZWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpbWl0XSAtIE9wdGlvbmFsIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NraXBdIC0gT3B0aW9uYWwgbnVtYmVyIG9mIHJlc3VsdHMgdG8gc2tpcC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgcXVlcnkgcmVzdWx0cyBhcyBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBhc3luYyBxdWVyeShcbiAgICBjb250ZXh0OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb248TT4gfCBzdHJpbmcsXG4gICAgb3JkZXJCeTogc3RyaW5nIHwga2V5b2YgTSxcbiAgICBvcmRlcjogT3JkZXJEaXJlY3Rpb24gfCBzdHJpbmcgPSBPcmRlckRpcmVjdGlvbi5BU0MsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgc2tpcD86IG51bWJlcixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHsgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGNvbnRleHRdLCB0aGlzLnF1ZXJ5KTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnF1ZXJ5KFxuICAgICAgY29uZGl0aW9uIGFzIENvbmRpdGlvbjxNPixcbiAgICAgIG9yZGVyQnkgYXMga2V5b2YgTSxcbiAgICAgIG9yZGVyIGFzIE9yZGVyRGlyZWN0aW9uLFxuICAgICAgbGltaXQsXG4gICAgICBza2lwLFxuICAgICAgLi4uY3R4QXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIHJhdyBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHthbnl9IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHtib29sZWFufSBkb2NzT25seSAtIFdoZXRoZXIgdG8gcmV0dXJuIG9ubHkgZG9jdW1lbnRzXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBxdWVyeSByZXN1bHRzXG4gICAqL1xuICBhc3luYyByYXcoXG4gICAgY3R4OiBDdHggfCBGYWJyaWNDb250cmFjdENvbnRleHQsXG4gICAgcmF3SW5wdXQ6IE1hbmdvUXVlcnkgfCBzdHJpbmcsXG4gICAgZG9jc09ubHk6IGJvb2xlYW4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxhbnkgfCBzdHJpbmc+IHtcbiAgICBjb25zdCB7IGN0eEFyZ3MgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjdHhdLCB0aGlzLnJhdyk7XG4gICAgaWYgKHR5cGVvZiByYXdJbnB1dCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJhd0lucHV0ID0gSlNPTi5wYXJzZShyYXdJbnB1dCkgYXMgTWFuZ29RdWVyeTtcbiAgICByZXR1cm4gRmFicmljQ3J1ZENvbnRyYWN0LmFkYXB0ZXIucmF3KHJhd0lucHV0LCBkb2NzT25seSwgLi4uY3R4QXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplKG1vZGVsOiBNKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRmFicmljQ3J1ZENvbnRyYWN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1vZGVsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXNlcmlhbGl6ZTxNIGV4dGVuZHMgTW9kZWw+KHN0cjogc3RyaW5nKTogTSB7XG4gICAgcmV0dXJuIChcbiAgICAgIEZhYnJpY0NydWRDb250cmFjdC5zZXJpYWxpemVyIGFzIHVua25vd24gYXMgU2VyaWFsaXplcjxNPlxuICAgICkuZGVzZXJpYWxpemUoc3RyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBpbml0KGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjdHhdLCB0aGlzLmluaXQpO1xuICAgIGxvZy5pbmZvKGBSdW5uaW5nIGNvbnRyYWN0ICR7dGhpcy5nZXROYW1lKCl9IGluaXRpYWxpemF0aW9uLi4uYCk7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgbG9nLmluZm8oYENvbnRyYWN0IGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZC5gKTtcbiAgfVxuXG4gIGFzeW5jIGhlYWx0aGNoZWNrKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICk6IFByb21pc2U8c3RyaW5nIHwgaGVhbHRoY2hlY2s+IHtcbiAgICBjb25zdCB7IGxvZyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2N0eF0sIHRoaXMuaGVhbHRoY2hlY2spO1xuICAgIGxvZy5pbmZvKGBSdW5uaW5nIEhlYWx0aGNoZWNrOiAke3RoaXMuaW5pdGlhbGl6ZWR9Li4uYCk7XG4gICAgcmV0dXJuIHsgaGVhbHRoY2hlY2s6IHRoaXMuaW5pdGlhbGl6ZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgaW4gdGhlIHN0YXRlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgcmVwb3NpdG9yeSdzIGNyZWF0ZUFsbCBtZXRob2RcbiAgICogQHBhcmFtIHtDdHh9IGN0eCAtIFRoZSBGYWJyaWMgY2hhaW5jb2RlIGNvbnRleHRcbiAgICogQHBhcmFtIHtNW119IG1vZGVscyAtIFRoZSBtb2RlbHMgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIG1vZGVsc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsKFxuICAgIGN0eDogQ3R4IHwgRmFicmljQ29udHJhY3RDb250ZXh0LFxuICAgIG1vZGVsczogc3RyaW5nIHwgTVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8c3RyaW5nIHwgTVtdPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjdHhdLCB0aGlzLmNyZWF0ZUFsbCk7XG5cbiAgICBpZiAodHlwZW9mIG1vZGVscyA9PT0gXCJzdHJpbmdcIilcbiAgICAgIG1vZGVscyA9IChKU09OLnBhcnNlKG1vZGVscykgYXMgW10pXG4gICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZGVzZXJpYWxpemUobSkpXG4gICAgICAgIC5tYXAoKG0pID0+IG5ldyB0aGlzLmNsYXp6KG0pKSBhcyBhbnk7XG5cbiAgICBsb2cuaW5mbyhgYWRkaW5nICR7bW9kZWxzLmxlbmd0aH0gZW50cmllcyB0byB0aGUgdGFibGVgKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmNyZWF0ZUFsbChtb2RlbHMgYXMgdW5rbm93biBhcyBNW10sIGN0eCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICBhcmdzOiBBUkdTLFxuICAgIG1ldGhvZDogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHN0cmluZ1xuICApOiBQcm9taXNlPFxuICAgIENvbnRleHR1YWxpemVkQXJnczxGYWJyaWNDb250cmFjdENvbnRleHQsIEFSR1M+ICYge1xuICAgICAgc3R1YjogQ2hhaW5jb2RlU3R1YjtcbiAgICAgIGlkZW50aXR5OiBDbGllbnRJZGVudGl0eTtcbiAgICB9XG4gID4ge1xuICAgIHJldHVybiBGYWJyaWNDcnVkQ29udHJhY3QubG9nQ3R4LmJpbmQodGhpcykoYXJncywgbWV0aG9kIGFzIGFueSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGFzeW5jIGxvZ0N0eDxBUkdTIGV4dGVuZHMgYW55W10+KFxuICAgIHRoaXM6IGFueSxcbiAgICBhcmdzOiBBUkdTLFxuICAgIG1ldGhvZDogc3RyaW5nXG4gICk6IFByb21pc2U8XG4gICAgQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgICBzdHViOiBDaGFpbmNvZGVTdHViO1xuICAgICAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xuICAgIH1cbiAgPjtcbiAgcHJvdGVjdGVkIHN0YXRpYyBhc3luYyBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICk6IFByb21pc2U8XG4gICAgQ29udGV4dHVhbGl6ZWRBcmdzPEZhYnJpY0NvbnRyYWN0Q29udGV4dCwgQVJHUz4gJiB7XG4gICAgICBzdHViOiBDaGFpbmNvZGVTdHViO1xuICAgICAgaWRlbnRpdHk6IENsaWVudElkZW50aXR5O1xuICAgIH1cbiAgPjtcbiAgcHJvdGVjdGVkIHN0YXRpYyBhc3luYyBsb2dDdHg8QVJHUyBleHRlbmRzIGFueVtdPihcbiAgICB0aGlzOiBhbnksXG4gICAgYXJnczogQVJHUyxcbiAgICBtZXRob2Q6ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxcbiAgICBDb250ZXh0dWFsaXplZEFyZ3M8RmFicmljQ29udHJhY3RDb250ZXh0LCBBUkdTPiAmIHtcbiAgICAgIHN0dWI6IENoYWluY29kZVN0dWI7XG4gICAgICBpZGVudGl0eTogQ2xpZW50SWRlbnRpdHk7XG4gICAgfVxuICA+IHtcbiAgICBpZiAoYXJncy5sZW5ndGggPCAxKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIGNvbnRleHQgcHJvdmlkZWRcIik7XG4gICAgY29uc3QgY3R4ID0gYXJncy5wb3AoKSBhcyBGYWJyaWNDb250cmFjdENvbnRleHQgfCBDb250ZXh0O1xuICAgIGlmIChjdHggaW5zdGFuY2VvZiBGYWJyaWNDb250cmFjdENvbnRleHQpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdHgsXG4gICAgICAgIGxvZzogY3R4LmxvZ2dlci5jbGVhcigpLmZvcih0aGlzKS5mb3IobWV0aG9kKSxcbiAgICAgICAgY3R4QXJnczogWy4uLmFyZ3MsIGN0eF0sXG4gICAgICAgIHN0dWI6IGN0eC5zdHViLFxuICAgICAgICBpZGVudGl0eTogY3R4LmlkZW50aXR5LFxuICAgICAgfTtcblxuICAgIGlmICghKGN0eCBpbnN0YW5jZW9mIEN0eCkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIHZhbGlkIGNvbnRleHQgcHJvdmlkZWRcIik7XG5cbiAgICBmdW5jdGlvbiBnZXRPcCgpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWV0aG9kO1xuICAgICAgc3dpdGNoIChtZXRob2QubmFtZSkge1xuICAgICAgICBjYXNlIE9wZXJhdGlvbktleXMuQ1JFQVRFOlxuICAgICAgICBjYXNlIE9wZXJhdGlvbktleXMuUkVBRDpcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLlVQREFURTpcbiAgICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLkRFTEVURTpcbiAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEw6XG4gICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEw6XG4gICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgcmV0dXJuIG1ldGhvZC5uYW1lO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBtZXRob2QubmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB7XG4gICAgICBjb3JyZWxhdGlvbklkOiBjdHguc3R1Yi5nZXRUeElEKCksXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgRmFicmljQ3J1ZENvbnRyYWN0LmFkYXB0ZXIuY29udGV4dChcbiAgICAgIGdldE9wKCksXG4gICAgICBvdmVycmlkZXMgYXMgYW55LFxuICAgICAgdGhpcy5jbGF6eixcbiAgICAgIGN0eFxuICAgICk7XG5cbiAgICBjb25zdCBsb2cgPSAoXG4gICAgICB0aGlzXG4gICAgICAgID8gY29udGV4dC5sb2dnZXIuZm9yKHRoaXMpLmZvcihtZXRob2QpXG4gICAgICAgIDogY29udGV4dC5sb2dnZXIuY2xlYXIoKS5mb3IodGhpcykuZm9yKG1ldGhvZClcbiAgICApIGFzIExvZ2dlck9mPEZhYnJpY0NvbnRyYWN0Q29udGV4dD47XG4gICAgcmV0dXJuIHtcbiAgICAgIGN0eDogY29udGV4dCxcbiAgICAgIGxvZzogbG9nLFxuICAgICAgc3R1YjogY29udGV4dC5zdHViLFxuICAgICAgaWRlbnRpdHk6IGNvbnRleHQuaWRlbnRpdHksXG4gICAgICBjdHhBcmdzOiBbLi4uYXJncywgY29udGV4dF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRmFicmljQ3J1ZENvbnRyYWN0IH0gZnJvbSBcIi4vY3J1ZC1jb250cmFjdFwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNYW5nb1F1ZXJ5IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuaW1wb3J0IHsgQ29udGV4dCBhcyBDdHgsIFRyYW5zYWN0aW9uIH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ1JVRCBjb250cmFjdCB2YXJpYW50IHRoYXQgc2VyaWFsaXplcy9kZXNlcmlhbGl6ZXMgcGF5bG9hZHNcbiAqIEBzdW1tYXJ5IEV4cG9zZXMgdGhlIHNhbWUgQ1JVRCBvcGVyYXRpb25zIGFzIEZhYnJpY0NydWRDb250cmFjdCBidXQgdGFrZXMgYW5kIHJldHVybnMgSlNPTiBzdHJpbmdzIHRvIGZhY2lsaXRhdGUgc2ltcGxlIGNsaWVudCBpbnRlcmFjdGlvbnMuXG4gKiBAdGVtcGxhdGUgTSAtIE1vZGVsIHR5cGUgaGFuZGxlZCBieSB0aGlzIGNvbnRyYWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBjb250cmFjdCBuYW1lXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIHRvIGluc3RhbnRpYXRlIG1vZGVscyBmcm9tIEpTT05cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgU2VyaWFsaXplZENydWRDb250cmFjdFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNvbnRyYWN0ID0gbmV3IFNlcmlhbGl6ZWRDcnVkQ29udHJhY3Q8TXlNb2RlbD4oJ015TW9kZWxDb250cmFjdCcsIE15TW9kZWwpO1xuICogLy8gQ2xpZW50IHN1Ym1pdHMgSlNPTiBzdHJpbmcgcGF5bG9hZHMgYW5kIHJlY2VpdmVzIEpTT04gc3RyaW5nIHJlc3BvbnNlc1xuICovXG5leHBvcnQgY2xhc3MgU2VyaWFsaXplZENydWRDb250cmFjdDxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPiBleHRlbmRzIEZhYnJpY0NydWRDb250cmFjdDxNPiB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY2xheno6IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIobmFtZSwgY2xhenopO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKClcbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKGNvbnRleHQ6IEN0eCwgbW9kZWw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmNyZWF0ZSk7XG4gICAgbG9nLmluZm8oYENyZWF0aW5nIG1vZGVsOiAke21vZGVsfWApO1xuXG4gICAgY29uc3QgbSA9IHRoaXMuZGVzZXJpYWxpemU8TT4obW9kZWwpO1xuXG4gICAgbG9nLmluZm8oYE1vZGVsIGRlc2VyaWFsaXplZDogJHtKU09OLnN0cmluZ2lmeShtKX1gKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKGF3YWl0IHN1cGVyLmNyZWF0ZShjdHggYXMgYW55LCBtKSkgYXMgTSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQoY29udGV4dDogQ3R4LCBrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLnJlYWQpO1xuICAgIGxvZy5pbmZvKGBSZWFkaW5nIGlkOiAke2tleX1gKTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoKGF3YWl0IHN1cGVyLnJlYWQoY3R4IGFzIGFueSwga2V5KSkgYXMgTSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoY29udGV4dDogQ3R4LCBtb2RlbDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMudXBkYXRlKTtcbiAgICBsb2cuaW5mbyhgVXBkYXRpbmcgbW9kZWw6ICR7bW9kZWx9YCk7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKChhd2FpdCBzdXBlci51cGRhdGUoY3R4IGFzIGFueSwgbW9kZWwpKSBhcyBNKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbigpXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShjb250ZXh0OiBDdHgsIGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuZGVsZXRlKTtcbiAgICBsb2cuaW5mbyhgRGVsZXRpbmcgaWQ6ICR7a2V5fWApO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSgoYXdhaXQgc3VwZXIuZGVsZXRlKGN0eCBhcyBhbnksIGtleSkpIGFzIE0pO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKClcbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKGNvbnRleHQ6IEN0eCwga2V5czogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJzZWRLZXlzOiBzdHJpbmdbXSA9IEpTT04ucGFyc2Uoa2V5cyk7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLmRlbGV0ZUFsbCk7XG5cbiAgICBsb2cuaW5mbyhgZGVsZXRpbmcgJHtwYXJzZWRLZXlzLmxlbmd0aH0gZW50cmllcyBmcm9tIHRoZSB0YWJsZWApO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgKChhd2FpdCBzdXBlci5kZWxldGVBbGwoY3R4IGFzIGFueSwgcGFyc2VkS2V5cykpIGFzIE1bXSkubWFwKFxuICAgICAgICAobSkgPT4gdGhpcy5zZXJpYWxpemUobSkgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChjb250ZXh0OiBDdHgsIGtleXM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFyc2VkS2V5czogc3RyaW5nW10gPSBKU09OLnBhcnNlKGtleXMpO1xuXG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLnJlYWRBbGwpO1xuICAgIGxvZy5pbmZvKGByZWFkaW5nICR7cGFyc2VkS2V5cy5sZW5ndGh9IGVudHJpZXMgZnJvbSB0aGUgdGFibGVgKTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIucmVhZEFsbChjdHggYXMgYW55LCBwYXJzZWRLZXlzKSkgYXMgTVtdKS5tYXAoKG0pID0+XG4gICAgICAgIHRoaXMuc2VyaWFsaXplKG0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbigpXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChjb250ZXh0OiBDdHgsIG1vZGVsczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMudXBkYXRlQWxsKTtcbiAgICBjb25zdCBsaXN0OiBzdHJpbmdbXSA9IEpTT04ucGFyc2UobW9kZWxzKTtcbiAgICBjb25zdCBtb2RlbExpc3Q6IE1bXSA9IGxpc3RcbiAgICAgIC5tYXAoKG0pID0+IHRoaXMuZGVzZXJpYWxpemUobSkpXG4gICAgICAubWFwKChtKSA9PiBuZXcgdGhpcy5jbGF6eihtKSk7XG5cbiAgICBsb2cuaW5mbyhgVXBkYXRpbmcgJHttb2RlbExpc3QubGVuZ3RofSBlbnRyaWVzIHRvIHRoZSB0YWJsZWApO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIudXBkYXRlQWxsKGN0eCBhcyBhbnksIG1vZGVsTGlzdCkpIGFzIE1bXSkubWFwKFxuICAgICAgICAobSkgPT4gdGhpcy5zZXJpYWxpemUobSkgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgb3ZlcnJpZGUgYXN5bmMgc3RhdGVtZW50KGNvbnRleHQ6IEN0eCwgbWV0aG9kOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGNvbnRleHRdLCB0aGlzLnN0YXRlbWVudCk7XG4gICAgYXJncyA9IGFyZ3MubWFwKChhKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsb2cuaW5mbyhgY2FsbGluZyBwcmVwYXJlZCBzdGF0ZW1lbnQgJHttZXRob2R9YCk7XG4gICAgbG9nLmRlYnVnKGB3aXRoIGFyZ3MgJHthcmdzfWApO1xuICAgIHJldHVybiBzdXBlci5zdGF0ZW1lbnQoY3R4LCBtZXRob2QsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBsaXN0QnkoXG4gICAgY29udGV4dDogQ3R4LFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9yZGVyOiBzdHJpbmcsXG4gICAgLi4uYXJnczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjb250ZXh0XSwgdGhpcy5saXN0QnkpO1xuICAgIHJldHVybiBzdXBlci5saXN0QnkoY3R4LCBrZXkgYXMga2V5b2YgTSwgb3JkZXIgYXMgT3JkZXJEaXJlY3Rpb24pO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBwYWdpbmF0ZUJ5KFxuICAgIGNvbnRleHQ6IEN0eCxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBvcmRlcjogc3RyaW5nLFxuICAgIHNpemU6IG51bWJlcixcbiAgICAuLi5hcmdzOiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoWy4uLmFyZ3MsIGNvbnRleHRdLCB0aGlzLnBhZ2luYXRlQnkpO1xuICAgIHJldHVybiBzdXBlci5wYWdpbmF0ZUJ5KGN0eCwga2V5LCBvcmRlciBhcyBhbnksIHNpemUpO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBmaW5kT25lQnkoXG4gICAgY29udGV4dDogQ3R4LFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgLi4uYXJnczogc3RyaW5nW11cbiAgKSB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFsuLi5hcmdzLCBjb250ZXh0XSwgdGhpcy5wYWdpbmF0ZUJ5KTtcbiAgICByZXR1cm4gc3VwZXIuZmluZE9uZUJ5KGN0eCwga2V5LCB2YWx1ZSwgLi4uYXJncyk7XG4gIH1cblxuICAvLyBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIG92ZXJyaWRlIGFzeW5jIHF1ZXJ5KFxuICAgIGNvbnRleHQ6IEN0eCxcbiAgICBjb25kaXRpb246IHN0cmluZyxcbiAgICBvcmRlckJ5OiBzdHJpbmcsXG4gICAgb3JkZXI6IHN0cmluZyxcbiAgICBsaW1pdD86IG51bWJlcixcbiAgICBza2lwPzogbnVtYmVyLFxuICAgIC4uLmFyZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5xdWVyeSk7XG4gICAgbGV0IGNvbmQ6IENvbmRpdGlvbjxhbnk+O1xuICAgIHRyeSB7XG4gICAgICBjb25kID0gQ29uZGl0aW9uLmZyb20oSlNPTi5wYXJzZShjb25kaXRpb24pKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKGBJbnZhbGlkIGNvbmRpdGlvbjogJHtlfWApO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIucXVlcnkoY3R4LCBjb25kLCBvcmRlckJ5LCBvcmRlciBhcyBhbnksIGxpbWl0LCBza2lwLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8vIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgb3ZlcnJpZGUgYXN5bmMgcmF3KFxuICAgIGNvbnRleHQ6IEN0eCxcbiAgICByYXdJbnB1dDogc3RyaW5nLFxuICAgIGRvY3NPbmx5OiBib29sZWFuLFxuICAgIC4uLmFyZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5yYXcpO1xuICAgIGNvbnN0IHBhcnNlZElucHV0OiBNYW5nb1F1ZXJ5ID0gSlNPTi5wYXJzZShyYXdJbnB1dCk7XG4gICAgcmV0dXJuIHN1cGVyLnJhdyhjdHgsIHBhcnNlZElucHV0LCBkb2NzT25seSwgLi4uYXJncyk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyBpbml0KGN0eDogQ3R4KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdChjdHgpO1xuICB9XG5cbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBvdmVycmlkZSBhc3luYyBoZWFsdGhjaGVjayhjb250ZXh0OiBDdHgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy51cGRhdGVBbGwpO1xuICAgIGxvZy5kZWJ1ZyhgUnVubmluZyBIZWFsdGhjaGVjazogJHt0aGlzLmluaXRpYWxpemVkfS4uLmApO1xuICAgIC8vVE9ETzogVFJJTSBOT1QgV09SS0lORyBDSEVDSyBMQVRFUlxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhd2FpdCBzdXBlci5oZWFsdGhjaGVjayhjdHggYXMgYW55KSk7XG4gIH1cblxuICBAVHJhbnNhY3Rpb24oKVxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoY29udGV4dDogQ3R4LCBtb2RlbHM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBsb2cgfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5jcmVhdGVBbGwpO1xuICAgIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShtb2RlbHMpO1xuICAgIGNvbnN0IG1vZGVsTGlzdDogTVtdID0gbGlzdFxuICAgICAgLm1hcCgobSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShtKSlcbiAgICAgIC5tYXAoKG0pID0+IG5ldyB0aGlzLmNsYXp6KG0pKTtcblxuICAgIGxvZy5pbmZvKGBBZGRpbmcgJHttb2RlbExpc3QubGVuZ3RofSBlbnRyaWVzIHRvIHRoZSB0YWJsZWApO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShcbiAgICAgICgoYXdhaXQgc3VwZXIuY3JlYXRlQWxsKGNvbnRleHQsIG1vZGVsTGlzdCkpIGFzIE1bXSkubWFwKFxuICAgICAgICAobSkgPT4gdGhpcy5zZXJpYWxpemUobSkgYXMgc3RyaW5nXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbi8vIGltcG9ydCB7IE1JU1NJTkdfUFJJVkFURV9EQVRBX0VSUk9SX01FU1NBR0UgfSBmcm9tIFwiLi4vY29udHJhY3RzL3ByaXZhdGUtZGF0YVwiO1xuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIG92ZXJmbG93IGVycm9yIGluIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbiBTbWFydCBDb250cmFjdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIE92ZXJmbG93RXJyb3JcbiAqIEBleHRlbmRzIEludGVybmFsRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBPdmVyZmxvd0Vycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIE92ZXJmbG93RXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBiYWxhbmNlIHRvIHBlcmZvcm0gYSB0cmFuc2FjdGlvbiBpbiBTbWFydCBDb250cmFjdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIEJhbGFuY2VFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEJhbGFuY2VFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBCYWxhbmNlRXJyb3IubmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGEgZmFpbHVyZSBpbiBiYWxhbmNlIHRvIHBlcmZvcm0gYSB0cmFuc2FjdGlvbiBpbiBTbWFydCBDb250cmFjdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRoZSBlcnJvciBtZXNzYWdlXG4gKlxuICogQGNsYXNzIEJhbGFuY2VFcnJvclxuICogQGV4dGVuZHMgSW50ZXJuYWxFcnJvclxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIEFsbG93YW5jZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIEFsbG93YW5jZUVycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGZhaWx1cmUgcmVnaXN0cmF0aW5nIG5ldyBlbnRpdGllc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdGhlIGVycm9yIG1lc3NhZ2VcbiAqXG4gKiBAY2xhc3MgUmVnaXN0cmF0aW9uRXJyb3JcbiAqXG4gKiBAY2F0ZWdvcnQgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb25FcnJvciBleHRlbmRzIEF1dGhvcml6YXRpb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBzdXBlcihtc2csIFJlZ2lzdHJhdGlvbkVycm9yLm5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWRcbiAqIEBzdW1tYXJ5IFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRcbiAqIHBlcnNpc3RlbmNlIGFkYXB0ZXIgb3IgY29uZmlndXJhdGlvbi4gSXQgZXh0ZW5kcyB0aGUgQmFzZUVycm9yIGNsYXNzIGFuZCBzZXRzIGEgNTAwIHN0YXR1cyBjb2RlLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwXG4gKiBAY2xhc3MgVW5zdXBwb3J0ZWRFcnJvclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFRocm93aW5nIGFuIFVuc3VwcG9ydGVkRXJyb3JcbiAqIGlmICghYWRhcHRlci5zdXBwb3J0c1RyYW5zYWN0aW9ucygpKSB7XG4gKiAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdUcmFuc2FjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhZGFwdGVyJyk7XG4gKiB9XG4gKlxuICogLy8gQ2F0Y2hpbmcgYW4gVW5zdXBwb3J0ZWRFcnJvclxuICogdHJ5IHtcbiAqICAgYXdhaXQgYWRhcHRlci5iZWdpblRyYW5zYWN0aW9uKCk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEVycm9yKSB7XG4gKiAgICAgY29uc29sZS5lcnJvcignT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIE1pc3NpbmdDb250ZXh0RXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgTWlzc2luZ0NvbnRleHRFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmF1dGhvcml6ZWRQcml2YXRlRGF0YUFjY2VzcyBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IgPSBcIk1JU1NJTkdfUFJJVkFURV9EQVRBX0VSUk9SX01FU1NBR0VcIikge1xuICAgIHN1cGVyKFVuYXV0aG9yaXplZFByaXZhdGVEYXRhQWNjZXNzLm5hbWUsIG1zZywgNDAzKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXJyb3IgdGhhdCBvY2N1cnMgd2hlbiBhIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIHN0ZXAgaXMgbm90IHBlcmZvcm1lZC5cbiAqXG4gKiBAY2xhc3MgTm90SW5pdGlhbGl6ZWRFcnJvclxuICogQGV4dGVuZHMgQmFzZUVycm9yXG4gKlxuICogQGNhdGVnb3J5IEVycm9yc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgRXJyb3J9IG1zZyAtIFRoZSBlcnJvciBtZXNzYWdlIG9yIGFuIEVycm9yIG9iamVjdCB0byB3cmFwLlxuICpcbiAqIEB0aHJvd3Mge05vdEluaXRpYWxpemVkRXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIHdoZW4gYSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBzdGVwIGlzIG5vdCBwZXJmb3JtZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uXG4gKiBpZiAoIWlzSW5pdGlhbGl6ZWQpIHtcbiAqICAgdGhyb3cgbmV3IE5vdEluaXRpYWxpemVkRXJyb3IoJ0FwcGxpY2F0aW9uIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICogfVxuICpcbiAqIC8vIENhdGNoaW5nIGFuIE5vdEluaXRpYWxpemVkRXJyb3JcbiAqIHRyeSB7XG4gKiAgIC8vIFBlcmZvcm0gb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEluaXRpYWxpemVkRXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKCdJbml0aWFsaXphdGlvbiBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RJbml0aWFsaXplZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKE5vdEluaXRpYWxpemVkRXJyb3IubmFtZSwgbXNnLCA0MDkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nUEtDU1MxMUxpYiBleHRlbmRzIEludGVybmFsRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBNaXNzaW5nUEtDU1MxMUxpYi5uYW1lLCA1MDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRvcnNlbWVudEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgRW5kb3JzZW1lbnRFcnJvci5uYW1lLCA1MDApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdHJpbmdGb3JtYXQgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPdmVyZmxvd0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3ZlcmZsb3ctc2FmZSBhZGRpdGlvbiBvcGVyYXRpb25cbiAqIEBzdW1tYXJ5IEFkZHMgdHdvIG51bWJlcnMgYW5kIHZlcmlmaWVzIG5vIG92ZXJmbG93IGJ5IHJldmVyc2UtY2hlY2tpbmcgdGhlIG9wZXJhbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gYSAtIEZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gU2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHN1bSBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb24gYWRkXG4gKiBAdGhyb3dzIHtPdmVyZmxvd0Vycm9yfSBvbiBhZGRpdGlvbiBvdmVyZmxvd1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItZmFicmljLnNoYXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYyA9IGEgKyBiO1xuICBpZiAoYSAhPT0gYyAtIGIgfHwgYiAhPT0gYyAtIGEpIHtcbiAgICB0aHJvdyBuZXcgT3ZlcmZsb3dFcnJvcihgQWRkaXRpb24gb3ZlcmZsb3c6ICR7YX0gKyAke2J9YCk7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE92ZXJmbG93LXNhZmUgc3VidHJhY3Rpb24gb3BlcmF0aW9uXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdHMgYiBmcm9tIGEgYW5kIHZhbGlkYXRlcyBubyBvdmVyZmxvdyBieSByZXZlcnNlLWNoZWNraW5nIHRoZSBvcGVyYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IGEgLSBNaW51ZW5kXG4gKiBAcGFyYW0ge251bWJlcn0gYiAtIFN1YnRyYWhlbmRcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRpZmZlcmVuY2UgYSAtIGJcbiAqIEBmdW5jdGlvbiBzdWJcbiAqIEB0aHJvd3Mge092ZXJmbG93RXJyb3J9IG9uIHN1YnRhY3Rpb24gb3ZlcmZsb3dcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGMgPSBhIC0gYjtcbiAgaWYgKGEgIT09IGMgKyBiIHx8IGIgIT09IGEgLSBjKSB7XG4gICAgdGhyb3cgbmV3IE92ZXJmbG93RXJyb3IoYFN1YnRyYWN0aW9uIG92ZXJmbG93OiAke2F9IC0gJHtifWApO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFNhZmUgSW50ZWdlciBQYXJzZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqXG4gKiBAZnVuY3Rpb24gc2FmZVBhcnNlSW50XG4gKlxuICogQHRocm93cyB7VmFsaWRhdGlvbkVycm9yfSBpZiBwYXJzZUludCByZXR1cm5zIE5hTlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWZhYnJpYy5zaGFyZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVQYXJzZUludChzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjaGVjayBpZiBzdHJpbmcgb25seSBoYXZlIGRpZ2l0c1xuICBjb25zdCBkaWdpdFJlZ2V4ID0gL15cXGQrJC87XG4gIGlmICghZGlnaXRSZWdleC50ZXN0KHN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgc3RyaW5nRm9ybWF0KFwiRmFpbGVkIHRvIHBhcnNlOiB7MH1cIiwgXCJzdHJpbmcgY29udGFpbnMgZGlnaXRzXCIpXG4gICAgKTtcbiAgfVxuICBjb25zdCBwYXJzZWRpbnQgPSBwYXJzZUludChzdHJpbmcpO1xuICBpZiAoaXNOYU4ocGFyc2VkaW50KSkge1xuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBzdHJpbmdGb3JtYXQoXCJGYWlsZWQgdG8gcGFyc2U6IHswfVwiLCBcInN0cmluZyBpcyBub3QgYSBwYXJzYWJsZSBpbnRlZ2VyXCIpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkaW50O1xufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsLCBjb2x1bW4sIHBrLCB0YWJsZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgTW9kZWxBcmcsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCB0b2tlbiBtZXRhZGF0YSBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbiBFUkMyMCB0b2tlbiBkZWZpbml0aW9uIHdpdGhpbiB0aGUgRmFicmljIEVSQzIwIHNhbXBsZSwgaW5jbHVkaW5nIG5hbWUsIHN5bWJvbCwgZGVjaW1hbHMsIGFuZCB0aGUgb3duaW5nIGlkZW50aXR5LiBVc2VkIHRvIGRlZmluZSB0aGUgdW5pcXVlIHRva2VuIG1hbmFnZWQgYnkgdGhlIGNvbnRyYWN0LlxuICogQHBhcmFtIHtNb2RlbEFyZzxFUkMyMFRva2VuPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgRVJDMjBUb2tlblxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRva2VuID0gbmV3IEVSQzIwVG9rZW4oeyBuYW1lOiBcIk15VG9rZW5cIiwgc3ltYm9sOiBcIk1US1wiLCBkZWNpbWFsczogMTgsIG93bmVyOiBcIng1MDk6Oi4uLlwiIH0pO1xuICogLy8gUGVyc2lzdCB0aHJvdWdoIGEgcmVwb3NpdG9yeTogYXdhaXQgcmVwby5jcmVhdGUodG9rZW4sIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobmV3IEVSQzIwVG9rZW4oey4uLn0pLCBjdHgpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkPW5hbWUsIHJlY29yZCwgZmxhZ3MpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogc3RvcmVkXG4gKiAgIFJlcG8tLT4+QXBwOiBtb2RlbFxuICovXG5AdGFibGUoXCJlcmMyMF90b2tlbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBUb2tlbiBleHRlbmRzIEJhc2VNb2RlbCB7XG4gIEBwayh7IHR5cGU6IFwiU3RyaW5nXCIgfSlcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiB1bmlxdWUgbmFtZVxuICAgKiBAc3VtbWFyeSBTZXJ2ZXMgYXMgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgRVJDMjAgdG9rZW4gZGVmaW5pdGlvbjsgdHlwaWNhbGx5IGEgaHVtYW4tcmVhZGFibGUgaWRlbnRpZmllclxuICAgKi9cbiAgbmFtZSE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPd25pbmcgaWRlbnRpdHkgb2YgdGhlIHRva2VuXG4gICAqIEBzdW1tYXJ5IFguNTA5IHN1YmplY3Qgb3IgTVNQIGlkZW50aXR5IHN0cmluZyB0aGF0IGRlbm90ZXMgd2hvIG93bnMvY29udHJvbHMgdGhlIHRva2VuIGRlZmluaXRpb25cbiAgICovXG4gIG93bmVyITogc3RyaW5nO1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiBzeW1ib2xcbiAgICogQHN1bW1hcnkgU2hvcnQgdGlja2VyLWxpa2Ugc3ltYm9sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0b2tlbiAoZS5nLiwgTVRLKVxuICAgKi9cbiAgc3ltYm9sITogc3RyaW5nO1xuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWNpbWFsIHByZWNpc2lvbiBmb3IgdG9rZW4gYW1vdW50c1xuICAgKiBAc3VtbWFyeSBOdW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHNlcGFyYXRvciB1c2VkIHdoZW4gZm9ybWF0dGluZyB0b2tlbiBiYWxhbmNlc1xuICAgKi9cbiAgZGVjaW1hbHMhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IobT86IE1vZGVsQXJnPEVSQzIwV2FsbGV0Pikge1xuICAgIHN1cGVyKG0pO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVSQzIwIHdhbGxldCBtb2RlbFxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIGhvbGRlciBhY2NvdW50IGZvciBhbiBFUkMyMCB0b2tlbiB3aXRoaW4gdGhlIEZhYnJpYyBuZXR3b3JrLCB0cmFja2luZyBiYWxhbmNlIGFuZCB0b2tlbiBhc3NvY2lhdGlvbi5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8RVJDMjBXYWxsZXQ+fSBbbV0gLSBPcHRpb25hbCBwYXJ0aWFsIGRhdGEgb3IgYW5vdGhlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIHRoZSBtb2RlbFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBFUkMyMFdhbGxldFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHdhbGxldCA9IG5ldyBFUkMyMFdhbGxldCh7IGlkOiBcImFjY3QxXCIsIHRva2VuOiBcIk15VG9rZW5cIiwgYmFsYW5jZTogMTAwMCB9KTtcbiAqIC8vIFVwZGF0ZSBiYWxhbmNlIHZpYSByZXBvc2l0b3J5OiBhd2FpdCByZXBvLnVwZGF0ZSh3YWxsZXQsIGN0eClcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFJlcG9cbiAqICAgQXBwLT4+UmVwbzogcmVhZChcImFjY3QxXCIsIGN0eClcbiAqICAgUmVwby0tPj5BcHA6IEVSQzIwV2FsbGV0XG4gKi9cbkB0YWJsZShcImVyYzIwX3dhbGxldHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRVJDMjBXYWxsZXQgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICBAcGsoeyB0eXBlOiBcIlN0cmluZ1wiIH0pXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2FsbGV0IHVuaXF1ZSBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFByaW1hcnkga2V5IGZvciB0aGUgd2FsbGV0OyBjb21tb25seSByZWZlcmVuY2VzIGFuIGFjY291bnQgb3IgaWRlbnRpdHlcbiAgICovXG4gIGlkITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFzc29jaWF0ZWQgdG9rZW4gbmFtZVxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSBFUkMyMFRva2VuIHRoaXMgd2FsbGV0IGhvbGRzOyBtYWludGFpbmVkIGFzIGEgcmVsYXRpb25zaGlwIGZvciBjYXNjYWRpbmcgdXBkYXRlcy9kZWxldGVzXG4gICAqL1xuICB0b2tlbiE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgQHJlcXVpcmVkKClcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUb2tlbiBiYWxhbmNlIGZvciB0aGlzIHdhbGxldFxuICAgKiBAc3VtbWFyeSBDdXJyZW50IGFtb3VudCBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBoZWxkIGJ5IHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlITogbnVtYmVyO1xuXG4gIEBjb2x1bW4oKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhcHRpdmUgZmxhZyBvciBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IE9wdGlvbmFsIGZpZWxkIHVzZWQgYnkgc29tZSBmbG93cyB0byBtYXJrIG5vbi10cmFuc2ZlcmFibGUgZnVuZHMgb3IgbWFuYWdlZCBjdXN0b2R5XG4gICAqL1xuICBjYXB0aXZlITogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxFUkMyMFdhbGxldD4pIHtcbiAgICBzdXBlcihtKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFUkMyMCBhbGxvd2FuY2UgbW9kZWxcbiAqIEBzdW1tYXJ5IENhcHR1cmVzIGFuIGFwcHJvdmFsIHJlbGF0aW9uc2hpcCB3aGVyZSBhbiBvd25lciBhbGxvd3MgYSBzcGVuZGVyIHRvIHRyYW5zZmVyIHVwIHRvIGEgY2VydGFpbiB2YWx1ZSBmcm9tIHRoZSBvd25lcidzIHdhbGxldC5cbiAqIEBwYXJhbSB7TW9kZWxBcmc8QWxsb3dhbmNlPn0gW21dIC0gT3B0aW9uYWwgcGFydGlhbCBkYXRhIG9yIGFub3RoZXIgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kZWxcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKiBAY2xhc3MgQWxsb3dhbmNlXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYWxsb3dhbmNlID0gbmV3IEFsbG93YW5jZSh7IG93bmVyOiBcImFjY3QxXCIsIHNwZW5kZXI6IFwiYWNjdDJcIiwgdmFsdWU6IDUwIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgQXBwLT4+QXBwOiBuZXcgQWxsb3dhbmNlKHsgb3duZXIsIHNwZW5kZXIsIHZhbHVlIH0pXG4gKi9cbkB0YWJsZShcImVyYzIwX2FsbG93YW5jZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgQWxsb3dhbmNlIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgQHBrKHsgdHlwZTogXCJTdHJpbmdcIiB9KVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFsbG93YW5jZSB1bmlxdWUgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBQcmltYXJ5IGtleSBmb3IgdGhlIGFsbG93YW5jZTsgdHlwaWNhbGx5IGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhcHByb3ZhbCByZWxhdGlvbnNoaXBcbiAgICovXG4gIEBjb2x1bW4oKVxuICBAcmVxdWlyZWQoKVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE93bmVyIHdhbGxldCBpZGVudGlmaWVyXG4gICAqIEBzdW1tYXJ5IFdhbGxldCB0aGF0IGF1dGhvcml6ZXMgdGhlIGFsbG93YW5jZVxuICAgKi9cbiAgb3duZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbmRlciB3YWxsZXQgaWRlbnRpZmllclxuICAgKiBAc3VtbWFyeSBXYWxsZXQgYWxsb3dlZCB0byBzcGVuZCB1cCB0byB0aGUgYXBwcm92ZWQgdmFsdWUgZnJvbSB0aGUgb3duZXJcbiAgICovXG4gIHNwZW5kZXIhOiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIEByZXF1aXJlZCgpXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwcm92ZWQgdmFsdWVcbiAgICogQHN1bW1hcnkgTWF4aW11bSB0b2tlbiBhbW91bnQgdGhlIHNwZW5kZXIgbWF5IHRyYW5zZmVyIG9uIGJlaGFsZiBvZiB0aGUgb3duZXJcbiAgICovXG4gIHZhbHVlITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG0/OiBNb2RlbEFyZzxBbGxvd2FuY2U+KSB7XG4gICAgc3VwZXIobSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25FcnJvcixcbiAgUmVwbyxcbiAgQ29udGV4dCxcbiAgVW5zdXBwb3J0ZWRFcnJvcixcbiAgUmVwb3NpdG9yeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25EZWxldGUsXG4gIG9uUmVhZCxcbiAgb25VcGRhdGUsXG4gIHJlYWRvbmx5LFxuICB0cmFuc2llbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljTW9kZWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgSExDb250ZXh0IH0gZnJvbSBcImZhYnJpYy1jb250cmFjdC1hcGlcIjtcbmltcG9ydCB7IEZhYnJpY0VSQzIwQ29udHJhY3QgfSBmcm9tIFwiLi4vY29udHJhY3RzL2VyYzIwL2VyYzIwY29udHJhY3RcIjtcbmltcG9ydCB7XG4gIGFwcGx5LFxuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgbWV0YWRhdGEsXG4gIE1ldGFkYXRhLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgRmFicmljRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIERlY29yYXRvciBmb3IgbWFya2luZyBtZXRob2RzIHRoYXQgcmVxdWlyZSBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqIENoZWNrcyB0aGUgb3duZXIgb2YgdGhlIHRva2VuIGJlZm9yZSBhbGxvd2luZyB0aGUgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBUb2tlbkNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3Qge1xuICogICBAT3duZXIoKVxuICogICBhc3luYyBNaW50KGN0eDogQ29udGV4dCwgYW1vdW50OiBudW1iZXIpIHtcbiAqICAgICAvLyBNaW50IHRva2VuIGxvZ2ljXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGNoZWNrcyBvd25lcnNoaXAgYXV0aG9yaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE93bmVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAoXG4gICAgICB0aGlzOiBGYWJyaWNFUkMyMENvbnRyYWN0LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApIHtcbiAgICAgIGNvbnN0IGN0eDogSExDb250ZXh0ID0gYXJnc1swXTtcbiAgICAgIGNvbnN0IGFjb3VudElkID0gY3R4LmNsaWVudElkZW50aXR5LmdldElEKCk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdCA9IGF3YWl0ICh0aGlzIGFzIEZhYnJpY0VSQzIwQ29udHJhY3QpW1xuICAgICAgICBcInRva2VuUmVwb3NpdG9yeVwiXG4gICAgICBdLnNlbGVjdCgpO1xuXG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBzZWxlY3QuZXhlY3V0ZShjdHgpO1xuXG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFwiTm8gdG9rZW5zIGF2YWlhbGJsZVwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUbyBtYW55IHRva2VuIGF2YWlsYWJsZSA6ICR7dG9rZW5zLmxlbmd0aH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vuc1swXS5vd25lciAhPSBhY291bnRJZCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICAgIGBVc2VyIG5vdCBhdXRob3JpemVkIHRvIHJ1biAke3Byb3BlcnR5S2V5fSBvbiB0aGUgdG9rZW5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvd25lZEJ5T25DcmVhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgUiBleHRlbmRzIFJlcG88TT4sXG4gIFYsXG4+KFxuICB0aGlzOiBSLFxuICBjb250ZXh0OiBDb250ZXh0PGFueT4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHN0dWIgfSA9IGNvbnRleHQgYXMgYW55O1xuXG4gIGNvbnN0IGNyZWF0b3IgPSBhd2FpdCBzdHViLmdldENyZWF0b3IoKTtcbiAgY29uc3Qgb3duZXIgPSBjcmVhdG9yLm1zcGlkO1xuXG4gIGNvbnN0IHNldE93bmVkQnlLZXlWYWx1ZSA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhcmdldDogTSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnRcbiAgKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgc2V0T3duZWRCeUtleVZhbHVlKG1vZGVsLCBrZXkgYXMgc3RyaW5nLCBvd25lcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvd25lZEJ5KCkge1xuICBjb25zdCBrZXkgPSBnZXRGYWJyaWNNb2RlbEtleShGYWJyaWNNb2RlbEtleXMuT1dORURCWSk7XG5cbiAgZnVuY3Rpb24gb3duZWRCeSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG9iajogYW55LCBhdHRyaWJ1dGU/OiBhbnkpIHtcbiAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgb25DcmVhdGUob3duZWRCeU9uQ3JlYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGdldEZhYnJpY01vZGVsS2V5KEZhYnJpY01vZGVsS2V5cy5PV05FREJZKSwgYXR0cmlidXRlKVxuICAgICAgKShvYmosIGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IG93bmVkQnksXG4gICAgICBhcmdzOiBbXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFicmljTW9kZWxLZXkoa2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmtleShGYWJyaWNNb2RlbEtleXMuRkFCUklDICsga2V5KTtcbn1cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc29sdmVyID0gPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pID0+IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb246IENvbGxlY3Rpb25SZXNvbHZlciA9IDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTVxuKSA9PiB7XG4gIHJldHVybiBgX18ke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9UHJpdmF0ZUNvbGxlY3Rpb25gO1xufTtcblxuZXhwb3J0IHR5cGUgU2VncmVnYXRlZERhdGFNZXRhZGF0YSA9IHtcbiAgY29sbGVjdGlvbnM6IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGtleXMubGVuZ3RoICE9PSBkYXRhLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsKTtcblxuICBjb25zdCByZWJ1aWx0ID0ga2V5cy5yZWR1Y2UoXG4gICAgKGFjYzogUmVjb3JkPGtleW9mIE0sIGFueT4sIGssIGkpID0+IHtcbiAgICAgIGNvbnN0IGMgPVxuICAgICAgICB0eXBlb2YgZGF0YVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gZGF0YVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICAgIDogZGF0YVtpXS5jb2xsZWN0aW9ucyhtb2RlbCk7XG4gICAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICAgICk7XG4gICAgICBhY2Nba10gPSBtb2RlbFtrXTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PlxuICApO1xuXG4gIGNvbnN0IHRvQ3JlYXRlID0gbmV3IHRoaXMuY2xhc3MocmVidWlsdCk7XG5cbiAgLy8gY29uc3Qgc2VncmVnYXRlZCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG5cbiAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMub3ZlcnJpZGUoeyBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uIH0gYXMgYW55KS5jcmVhdGUoXG4gICAgdG9DcmVhdGUsXG4gICAgY29udGV4dFxuICApO1xuICBPYmplY3QuYXNzaWduKG1vZGVsLCBjcmVhdGVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25SZWFkPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIHRoaXM6IFJlcG9zaXRvcnk8TSwgYW55PixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFNlZ3JlZ2F0ZWREYXRhTWV0YWRhdGFbXSxcbiAga2V5czogKGtleW9mIE0pW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGtleXMubGVuZ3RoICE9PSBkYXRhLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBTZWdyZWdhdGVkIGRhdGEga2V5cyBhbmQgbWV0YWRhdGEgbGVuZ3RoIG1pc21hdGNoYFxuICAgICk7XG5cbiAgY29uc3QgY29sbGVjdGlvblJlc29sdmVyID0gZGF0YVswXS5jb2xsZWN0aW9ucztcbiAgY29uc3QgY29sbGVjdGlvbiA9XG4gICAgdHlwZW9mIGNvbGxlY3Rpb25SZXNvbHZlciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBjb2xsZWN0aW9uUmVzb2x2ZXJcbiAgICAgIDogY29sbGVjdGlvblJlc29sdmVyKG1vZGVsKTtcblxuICBjb25zdCByZWJ1aWx0ID0ga2V5cy5yZWR1Y2UoXG4gICAgKGFjYzogUmVjb3JkPGtleW9mIE0sIGFueT4sIGssIGkpID0+IHtcbiAgICAgIGNvbnN0IGMgPVxuICAgICAgICB0eXBlb2YgZGF0YVtpXS5jb2xsZWN0aW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gZGF0YVtpXS5jb2xsZWN0aW9uc1xuICAgICAgICAgIDogZGF0YVtpXS5jb2xsZWN0aW9ucyhtb2RlbCk7XG4gICAgICBpZiAoYyAhPT0gY29sbGVjdGlvbilcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgYFNlZ3JlZ2F0ZWQgZGF0YSBjb2xsZWN0aW9uIG1pc21hdGNoOiAke2N9IHZzICR7Y29sbGVjdGlvbn1gXG4gICAgICAgICk7XG4gICAgICBhY2Nba10gPSBtb2RlbFtrXTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyBSZWNvcmQ8a2V5b2YgTSwgYW55PlxuICApO1xuXG4gIGNvbnN0IHRvQ3JlYXRlID0gbmV3IHRoaXMuY2xhc3MocmVidWlsdCk7XG5cbiAgLy8gY29uc3Qgc2VncmVnYXRlZCA9IE1vZGVsLnNlZ3JlZ2F0ZShtb2RlbCk7XG5cbiAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHRoaXMub3ZlcnJpZGUoeyBzZWdyZWdhdGVkOiBjb2xsZWN0aW9uIH0gYXMgYW55KS5jcmVhdGUoXG4gICAgdG9DcmVhdGUsXG4gICAgY29udGV4dFxuICApO1xuICBPYmplY3QuYXNzaWduKG1vZGVsLCBjcmVhdGVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlZ3JlZ2F0ZWREYXRhT25VcGRhdGU8TSBleHRlbmRzIE1vZGVsPihcbiAgdGhpczogUmVwb3NpdG9yeTxNLCBhbnk+LFxuICBjb250ZXh0OiBDb250ZXh0PEZhYnJpY0ZsYWdzPixcbiAgZGF0YTogU2VncmVnYXRlZERhdGFNZXRhZGF0YVtdLFxuICBrZXk6IGtleW9mIE1bXSxcbiAgbW9kZWw6IE0sXG4gIG9sZE1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWdyZWdhdGVkRGF0YU9uRGVsZXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBSZXBvc2l0b3J5PE0sIGFueT4sXG4gIFYgZXh0ZW5kcyBTZWdyZWdhdGVkRGF0YU1ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxGYWJyaWNGbGFncz4sXG4gIGRhdGE6IFZbXSxcbiAga2V5OiBrZXlvZiBNW10sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbmZ1bmN0aW9uIHNlZ3JlZ2F0ZWQoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcixcbiAgdHlwZTogRmFicmljTW9kZWxLZXlzLlBSSVZBVEUgfCBGYWJyaWNNb2RlbEtleXMuU0hBUkVEXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyU2VncmVnYXRlZCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBmdW5jdGlvbiBzZWdyZWdhdGVkRGVjKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgICAgaWYgKCFwcm9wZXJ0eUtleSkge1xuICAgICAgICBjb25zdCBwcm9wcyA9IE1ldGFkYXRhLnByb3BlcnRpZXModGFyZ2V0IGFzIENvbnN0cnVjdG9yKSB8fCBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIHR5cGUpKHRhcmdldCwgcHJvcCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IE1ldGFkYXRhLmtleSh0eXBlLCBwcm9wZXJ0eUtleSk7XG4gICAgICBjb25zdCBjb25zdHI6IENvbnN0cnVjdG9yID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yO1xuXG4gICAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5KSB8fCB7fTtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gbmV3IFNldChtZXRhLmNvbGxlY3Rpb25zIHx8IFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcbiAgICAgIG1ldGEuY29sbGVjdGlvbnMgPSBbLi4uY29sbGVjdGlvbnNdO1xuICAgICAgTWV0YWRhdGEuc2V0KGNvbnN0ciBhcyBDb25zdHJ1Y3Rvciwga2V5LCBtZXRhKTtcbiAgICB9XG4gICAgY29uc3QgZGVjczogYW55W10gPSBbXTtcbiAgICBpZiAoIXByb3BlcnR5S2V5KSB7XG4gICAgICAvLyBkZWNvcmF0ZWQgYXQgdGhlIGNsYXNzIGxldmVsXG4gICAgICBNZXRhZGF0YS5wcm9wZXJ0aWVzKHRhcmdldCBhcyBDb25zdHJ1Y3Rvcik/LmZvckVhY2goKHApID0+XG4gICAgICAgIHNlZ3JlZ2F0ZWQoY29sbGVjdGlvbiwgdHlwZSkodGFyZ2V0LCBwKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBtZXRhZGF0YSh0eXBlLCB0cnVlKSh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNzLnB1c2goXG4gICAgICAgIHRyYW5zaWVudCgpLFxuICAgICAgICBzZWdyZWdhdGVkRGVjLFxuICAgICAgICBvbkNyZWF0ZShcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uQ3JlYXRlLFxuICAgICAgICAgIHsgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmlvcml0eTogOTUsXG4gICAgICAgICAgICBncm91cDpcbiAgICAgICAgICAgICAgdHlwZW9mIGNvbGxlY3Rpb24gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICA/IGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICA6IGNvbGxlY3Rpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIG9uUmVhZChcbiAgICAgICAgICBzZWdyZWdhdGVkRGF0YU9uUmVhZCBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOlxuICAgICAgICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIDogY29sbGVjdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25VcGRhdGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPblVwZGF0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOlxuICAgICAgICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIDogY29sbGVjdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EZWxldGUoXG4gICAgICAgICAgc2VncmVnYXRlZERhdGFPbkRlbGV0ZSBhcyBhbnksXG4gICAgICAgICAgeyBjb2xsZWN0aW9uczogY29sbGVjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW9yaXR5OiA5NSxcbiAgICAgICAgICAgIGdyb3VwOlxuICAgICAgICAgICAgICB0eXBlb2YgY29sbGVjdGlvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gY29sbGVjdGlvblxuICAgICAgICAgICAgICAgIDogY29sbGVjdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KC4uLmRlY3MpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIC8vIHJldHVybiBhcHBseSgpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoXG4gIGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlciA9IEltcGxpY2l0UHJpdmF0ZUNvbGxlY3Rpb25cbikge1xuICBmdW5jdGlvbiBwcml2YXRlRGF0YShjb2xsZWN0aW9uOiBzdHJpbmcgfCBDb2xsZWN0aW9uUmVzb2x2ZXIpIHtcbiAgICByZXR1cm4gc2VncmVnYXRlZChjb2xsZWN0aW9uLCBGYWJyaWNNb2RlbEtleXMuUFJJVkFURSk7XG4gIH1cblxuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoRmFicmljTW9kZWxLZXlzLlBSSVZBVEUpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHByaXZhdGVEYXRhLFxuICAgICAgYXJnczogW2NvbGxlY3Rpb25dLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICBmdW5jdGlvbiBzaGFyZWREYXRhKGNvbGxlY3Rpb246IHN0cmluZyB8IENvbGxlY3Rpb25SZXNvbHZlcikge1xuICAgIHJldHVybiBzZWdyZWdhdGVkKGNvbGxlY3Rpb24sIEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpO1xuICB9XG5cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEZhYnJpY01vZGVsS2V5cy5TSEFSRUQpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHNoYXJlZERhdGEsXG4gICAgICBhcmdzOiBbY29sbGVjdGlvbl0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cbi8vXG4vLyBleHBvcnQgZnVuY3Rpb24gcHJpdmF0ZURhdGEoY29sbGVjdGlvbj86IHN0cmluZykge1xuLy8gICBpZiAoIWNvbGxlY3Rpb24pIHtcbi8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb2xsZWN0aW9uIG5hbWUgaXMgcmVxdWlyZWRcIik7XG4vLyAgIH1cbi8vXG4vLyAgIGNvbnN0IGtleTogc3RyaW5nID0gRmFicmljTW9kZWxLZXlzLlBSSVZBVEU7XG4vL1xuLy8gICByZXR1cm4gZnVuY3Rpb24gcHJpdmF0ZURhdGE8TSBleHRlbmRzIE1vZGVsPihcbi8vICAgICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LFxuLy8gICAgIGF0dHJpYnV0ZT86IGFueVxuLy8gICApIHtcbi8vICAgICBjb25zdCBjb25zdHIgPVxuLy8gICAgICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcikgOiBtb2RlbDtcbi8vXG4vLyAgICAgY29uc3QgbWV0YURhdGE6IGFueSA9IE1ldGFkYXRhLmdldChjb25zdHIpO1xuLy8gICAgIGNvbnN0IG1vZGVsZGF0YSA9IG1ldGFEYXRhPy5wcml2YXRlPy5jb2xsZWN0aW9ucyB8fCBbXTtcbi8vXG4vLyAgICAgcHJvcE1ldGFkYXRhKGtleSwge1xuLy8gICAgICAgLi4uKCFhdHRyaWJ1dGUgJiYge1xuLy8gICAgICAgICBjb2xsZWN0aW9uczogbW9kZWxkYXRhXG4vLyAgICAgICAgICAgPyBbLi4ubmV3IFNldChbLi4ubW9kZWxkYXRhLCBjb2xsZWN0aW9uXSldXG4vLyAgICAgICAgICAgOiBbY29sbGVjdGlvbl0sXG4vLyAgICAgICB9KSxcbi8vICAgICAgIGlzUHJpdmF0ZTogIWF0dHJpYnV0ZSxcbi8vICAgICB9KShhdHRyaWJ1dGUgPyBjb25zdHIgOiBtb2RlbCk7XG4vL1xuLy8gICAgIGlmIChhdHRyaWJ1dGUpIHtcbi8vICAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPVxuLy8gICAgICAgICAobWV0YURhdGE/LnByaXZhdGU/LlthdHRyaWJ1dGVdIGFzIGFueSk/LmNvbGxlY3Rpb25zIHx8IFtdO1xuLy8gICAgICAgcHJvcE1ldGFkYXRhKE1ldGFkYXRhLmtleShrZXksIGF0dHJpYnV0ZSksIHtcbi8vICAgICAgICAgY29sbGVjdGlvbnM6IGF0dHJpYnV0ZURhdGFcbi8vICAgICAgICAgICA/IFsuLi5uZXcgU2V0KFsuLi5hdHRyaWJ1dGVEYXRhLCBjb2xsZWN0aW9uXSldXG4vLyAgICAgICAgICAgOiBbY29sbGVjdGlvbl0sXG4vLyAgICAgICB9KShtb2RlbCwgYXR0cmlidXRlKTtcbi8vICAgICAgIHRyYW5zaWVudCgpKG1vZGVsLCBhdHRyaWJ1dGUpO1xuLy8gICAgIH1cbi8vICAgfTtcbi8vIH1cbiIsIi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIGV2ZW50cyBlbWl0dGVkIGJ5IGFuIEVSQzIwIGNvbnRyYWN0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGVudW0gaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZXZlbnRzIHRoYXQgY2FuIGJlIGVtaXR0ZWQgYnkgYW4gRVJDMjAgY29udHJhY3QuXG4gKiBUaGUgZXZlbnRzIGFyZSBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIEVJUC0yMCBzdGFuZGFyZC5cbiAqL1xuZXhwb3J0IGVudW0gRVJDMjBFdmVudHMge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgYHRyYW5zZmVyYCBmdW5jdGlvbiBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBhZGRyZXNzIG9mIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB0byAtIFRoZSBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRyYW5zZmVycmVkLlxuICAgKi9cbiAgVFJBTlNGRVIgPSBcIlRyYW5zZmVyXCIsXG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhbiBgYXBwcm92ZWAgZnVuY3Rpb24gaXMgY2FsbGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyIC0gVGhlIGFkZHJlc3Mgb2YgdGhlIHRva2VuIG93bmVyLlxuICAgKiBAcGFyYW0gc3BlbmRlciAtIFRoZSBhZGRyZXNzIG9mIHRoZSBhcHByb3ZlZCBzcGVuZGVyLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYW1vdW50IG9mIHRva2VucyBhcHByb3ZlZCBmb3IgdGhlIHNwZW5kZXIuXG4gICAqL1xuICBBUFBST1ZBTCA9IFwiQXBwcm92YWxcIixcbn1cbiIsImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgQ29uZGl0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBUcmFuc2FjdGlvbiB9IGZyb20gXCJmYWJyaWMtY29udHJhY3QtYXBpXCI7XG5pbXBvcnQgeyBhZGQsIHN1YiB9IGZyb20gXCIuLi8uLi9zaGFyZWQvbWF0aFwiO1xuaW1wb3J0IHtcbiAgQWxsb3dhbmNlRXJyb3IsXG4gIEJhbGFuY2VFcnJvcixcbiAgTm90SW5pdGlhbGl6ZWRFcnJvcixcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0QWRhcHRlciB9IGZyb20gXCIuLi9Db250cmFjdEFkYXB0ZXJcIjtcbmltcG9ydCB7IEFsbG93YW5jZSwgRVJDMjBUb2tlbiwgRVJDMjBXYWxsZXQgfSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IE93bmVyIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vRmFicmljQ29udHJhY3RSZXBvc2l0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IEZhYnJpY0NvbnRyYWN0Q29udGV4dCB9IGZyb20gXCIuLi9Db250cmFjdENvbnRleHRcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEZhYnJpY0NydWRDb250cmFjdCB9IGZyb20gXCIuLi9jcnVkL2NydWQtY29udHJhY3RcIjtcbmltcG9ydCB7IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyIH0gZnJvbSBcIi4uL0ZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyXCI7XG5pbXBvcnQgeyBFUkMyMEV2ZW50cyB9IGZyb20gXCIuLi8uLi9zaGFyZWQvZXJjMjAvZXJjMjAtY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVSQzIwIHRva2VuIGNvbnRyYWN0IGJhc2UgZm9yIEh5cGVybGVkZ2VyIEZhYnJpY1xuICogQHN1bW1hcnkgSW1wbGVtZW50cyBFUkMyMC1saWtlIHRva2VuIGxvZ2ljIHVzaW5nIHJlcG9zaXRvcmllcyBhbmQgYWRhcHRlcnMsIHByb3ZpZGluZyBzdGFuZGFyZCB0b2tlbiBvcGVyYXRpb25zIHN1Y2ggYXMgYmFsYW5jZSBxdWVyaWVzLCB0cmFuc2ZlcnMsIGFwcHJvdmFscywgbWludGluZyBhbmQgYnVybmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGNvbnRyYWN0IG5hbWUgdXNlZCB0byBzY29wZSB0b2tlbiBpZGVudGl0eVxuICogQG5vdGUgaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC0yMFxuICogQHJldHVybiB7dm9pZH1cbiAqIEBjbGFzcyBGYWJyaWNFUkMyMENvbnRyYWN0XG4gKiBAZXhhbXBsZVxuICogY2xhc3MgTXlUb2tlbkNvbnRyYWN0IGV4dGVuZHMgRmFicmljRVJDMjBDb250cmFjdCB7XG4gKiAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcignTXlUb2tlbicpOyB9XG4gKiB9XG4gKiAvLyBUaGUgY29udHJhY3QgZXhwb3NlcyBtZXRob2RzIGxpa2UgVHJhbnNmZXIsIEFwcHJvdmUsIE1pbnQsIEJ1cm4sIGV0Yy5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IENvbnRyYWN0XG4gKiAgIHBhcnRpY2lwYW50IFdhbGxldFJlcG9cbiAqICAgcGFydGljaXBhbnQgVG9rZW5SZXBvXG4gKiAgIHBhcnRpY2lwYW50IExlZGdlclxuICogICBDbGllbnQtPj5Db250cmFjdDogVHJhbnNmZXIoY3R4LCB0bywgdmFsdWUpXG4gKiAgIENvbnRyYWN0LT4+V2FsbGV0UmVwbzogcmVhZChmcm9tKVxuICogICBDb250cmFjdC0+PldhbGxldFJlcG86IHJlYWQodG8pXG4gKiAgIENvbnRyYWN0LT4+TGVkZ2VyOiBwdXRTdGF0ZSh1cGRhdGVkIGJhbGFuY2VzKVxuICogICBDb250cmFjdC0tPj5DbGllbnQ6IHN1Y2Nlc3NcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZhYnJpY0VSQzIwQ29udHJhY3QgZXh0ZW5kcyBGYWJyaWNDcnVkQ29udHJhY3Q8RVJDMjBXYWxsZXQ+IHtcbiAgcHJpdmF0ZSB3YWxsZXRSZXBvc2l0b3J5OiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8RVJDMjBXYWxsZXQ+O1xuXG4gIHByaXZhdGUgdG9rZW5SZXBvc2l0b3J5OiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8RVJDMjBUb2tlbj47XG5cbiAgcHJpdmF0ZSBhbGxvd2FuY2VSZXBvc2l0b3J5OiBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnk8QWxsb3dhbmNlPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSwgRVJDMjBXYWxsZXQpO1xuXG4gICAgRmFicmljRVJDMjBDb250cmFjdC5hZGFwdGVyID1cbiAgICAgIEZhYnJpY0VSQzIwQ29udHJhY3QuYWRhcHRlciB8fCBuZXcgRmFicmljQ29udHJhY3RBZGFwdGVyKCk7XG5cbiAgICB0aGlzLndhbGxldFJlcG9zaXRvcnkgPSBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkuZm9yTW9kZWwoXG4gICAgICBFUkMyMFdhbGxldCxcbiAgICAgIEZhYnJpY0VSQzIwQ29udHJhY3QuYWRhcHRlci5hbGlhc1xuICAgICk7XG5cbiAgICB0aGlzLnRva2VuUmVwb3NpdG9yeSA9IEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeS5mb3JNb2RlbChcbiAgICAgIEVSQzIwVG9rZW4sXG4gICAgICBGYWJyaWNFUkMyMENvbnRyYWN0LmFkYXB0ZXIuYWxpYXNcbiAgICApO1xuXG4gICAgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5ID0gRmFicmljQ29udHJhY3RSZXBvc2l0b3J5LmZvck1vZGVsKFxuICAgICAgQWxsb3dhbmNlLFxuICAgICAgRmFicmljRVJDMjBDb250cmFjdC5hZGFwdGVyLmFsaWFzXG4gICAgKTtcbiAgfVxuXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgVG9rZW5OYW1lKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuVG9rZW5OYW1lKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBhbHJlYWR5IHNldCBmaXJzdCB0byBleGVjdXRlIHRoZSBmdW5jdGlvblxuICAgIGF3YWl0IHRoaXMuQ2hlY2tJbml0aWFsaXplZChjdHggYXMgYW55KTtcblxuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpO1xuICAgIGNvbnN0IHRva2VuID0gKGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCkpWzBdO1xuXG4gICAgcmV0dXJuIHRva2VuLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzeW1ib2wgb2YgdGhlIHRva2VuLiBFLmcuIOKAnEhJWOKAnS5cbiAgICpcbiAgICogQHBhcmFtIHtDb250ZXh0fSBjb250ZXh0IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9IFJldHVybnMgdGhlIHN5bWJvbCBvZiB0aGUgdG9rZW5cbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgU3ltYm9sKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuVG9rZW5OYW1lKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBhbHJlYWR5IHNldCBmaXJzdCB0byBleGVjdXRlIHRoZSBmdW5jdGlvblxuICAgIGF3YWl0IHRoaXMuQ2hlY2tJbml0aWFsaXplZChjdHggYXMgYW55KTtcblxuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpO1xuICAgIGNvbnN0IHRva2VuID0gKGF3YWl0IHNlbGVjdC5leGVjdXRlKGN0eCkpWzBdO1xuXG4gICAgcmV0dXJuIHRva2VuLnN5bWJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWNpbWFscyB0aGUgdG9rZW4gdXNlc1xuICAgKiBlLmcuIDgsIG1lYW5zIHRvIGRpdmlkZSB0aGUgdG9rZW4gYW1vdW50IGJ5IDEwMDAwMDAwMCB0byBnZXQgaXRzIHVzZXIgcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY29udGV4dCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHNcbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgRGVjaW1hbHMoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5Ub2tlbk5hbWUpO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy50b2tlblJlcG9zaXRvcnkuc2VsZWN0KCk7XG4gICAgY29uc3QgdG9rZW4gPSAoYXdhaXQgc2VsZWN0LmV4ZWN1dGUoY3R4KSlbMF07XG5cbiAgICByZXR1cm4gdG9rZW4uZGVjaW1hbHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b3RhbCB0b2tlbiBzdXBwbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY29udGV4dCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIHRoZSB0b3RhbCB0b2tlbiBzdXBwbHlcbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgVG90YWxTdXBwbHkoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5Ub2tlbk5hbWUpO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy53YWxsZXRSZXBvc2l0b3J5LnNlbGVjdCgpO1xuICAgIGNvbnN0IHdhbGxldHMgPSBhd2FpdCBzZWxlY3QuZXhlY3V0ZShjdHgpO1xuXG4gICAgaWYgKHdhbGxldHMubGVuZ3RoID09IDApIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUaGUgdG9rZW4gJHt0aGlzLmdldE5hbWUoKX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG5cbiAgICBsZXQgdG90YWwgPSAwO1xuXG4gICAgd2FsbGV0cy5mb3JFYWNoKCh3YWxsZXQpID0+IHtcbiAgICAgIHRvdGFsICs9IHdhbGxldC5iYWxhbmNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhbGFuY2VPZiByZXR1cm5zIHRoZSBiYWxhbmNlIG9mIHRoZSBnaXZlbiBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGN0eCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3duZXIgVGhlIG93bmVyIGZyb20gd2hpY2ggdGhlIGJhbGFuY2Ugd2lsbCBiZSByZXRyaWV2ZWRcbiAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyB0aGUgYWNjb3VudCBiYWxhbmNlXG4gICAqL1xuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIGFzeW5jIEJhbGFuY2VPZihjb250ZXh0OiBDb250ZXh0LCBvd25lcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLlRva2VuTmFtZSk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkucmVhZChvd25lciwgY3R4KTtcblxuICAgIHJldHVybiB3YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBUcmFuc2ZlciB0cmFuc2ZlcnMgdG9rZW5zIGZyb20gY2xpZW50IGFjY291bnQgdG8gcmVjaXBpZW50IGFjY291bnQuXG4gICAqIEBkZXNjcmlwdGlvbiByZWNpcGllbnQgYWNjb3VudCBtdXN0IGJlIGEgdmFsaWQgY2xpZW50SUQgYXMgcmV0dXJuZWQgYnkgdGhlIENsaWVudEFjY291bnRJRCgpIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSByZWNpcGllbnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBhbW91bnQgb2YgdG9rZW4gdG8gYmUgdHJhbnNmZXJyZWRcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybiB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICovXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIFRyYW5zZmVyKFxuICAgIGNvbnRleHQ6IENvbnRleHQsXG4gICAgdG86IHN0cmluZyxcbiAgICB2YWx1ZTogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5UcmFuc2Zlcik7XG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3QgZnJvbSA9IGN0eC5pZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgY29uc3QgdHJhbnNmZXJSZXNwID0gYXdhaXQgdGhpcy5fdHJhbnNmZXIoZnJvbSwgdG8sIHZhbHVlLCBjdHgpO1xuICAgIGlmICghdHJhbnNmZXJSZXNwKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkZhaWxlZCB0byB0cmFuc2ZlclwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlciBgdmFsdWVgIGFtb3VudCBvZiB0b2tlbnMgZnJvbSBgZnJvbWAgdG8gYHRvYC5cbiAgICpcbiAgICogQHBhcmFtIHtDb250ZXh0fSBjb250ZXh0IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmcm9tIFRoZSBzZW5kZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSByZWNpcGllbnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBhbW91bnQgb2YgdG9rZW4gdG8gYmUgdHJhbnNmZXJyZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybiB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICovXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIFRyYW5zZmVyRnJvbShcbiAgICBjb250ZXh0OiBDb250ZXh0LFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIHZhbHVlOiBudW1iZXJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkJ1cm5Gcm9tKTtcbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICAvLyBSZXRyaWV2ZSB0aGUgYWxsb3dhbmNlIG9mIHRoZSBzcGVuZGVyXG5cbiAgICBjb25zdCBzcGVuZGVyID0gY3R4LmlkZW50aXR5LmdldElEKCk7XG5cbiAgICBjb25zdCBhbGxvd2FuY2UgPSBhd2FpdCB0aGlzLl9nZXRBbGxvd2FuY2UoZnJvbSwgc3BlbmRlciwgY3R4KTtcbiAgICBpZiAoIWFsbG93YW5jZSB8fCBhbGxvd2FuY2UudmFsdWUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWxsb3dhbmNlRXJyb3IoXG4gICAgICAgIGBzcGVuZGVyICR7c3BlbmRlcn0gaGFzIG5vIGFsbG93YW5jZSBmcm9tICR7ZnJvbX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRBbGxvd2FuY2UgPSBhbGxvd2FuY2UudmFsdWU7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhbnNmZXJyZWQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBhbGxvd2FuY2VcbiAgICBpZiAoY3VycmVudEFsbG93YW5jZSA8IHZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgQmFsYW5jZUVycm9yKFxuICAgICAgICBcIlRoZSBzcGVuZGVyIGRvZXMgbm90IGhhdmUgZW5vdWdoIGFsbG93YW5jZSB0byBzcGVuZC5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEZWNyZWFzZSB0aGUgYWxsb3dhbmNlXG4gICAgY29uc3QgdXBkYXRlZEFsbG93YW5jZSA9IHN1YihjdXJyZW50QWxsb3dhbmNlLCB2YWx1ZSk7XG4gICAgY29uc3QgbmV3QWxsb3dhbmNlID0gT2JqZWN0LmFzc2lnbih7fSwgYWxsb3dhbmNlLCB7XG4gICAgICB2YWx1ZTogdXBkYXRlZEFsbG93YW5jZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuYWxsb3dhbmNlUmVwb3NpdG9yeS51cGRhdGUobmV3QWxsb3dhbmNlLCBjdHgpO1xuXG4gICAgLy9SZWFsaXplIHRoZSB0cmFuc2ZlclxuICAgIGNvbnN0IHRyYW5zZmVyUmVzcCA9IGF3YWl0IHRoaXMuX3RyYW5zZmVyKGZyb20sIHRvLCB2YWx1ZSwgY3R4KTtcbiAgICBpZiAoIXRyYW5zZmVyUmVzcCkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gdHJhbnNmZXJcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBfdHJhbnNmZXIoXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBjdHg6IEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICApIHtcbiAgICBjb25zdCBsb2cgPSBjdHgubG9nZ2VyO1xuXG4gICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICBcImNhbm5vdCB0cmFuc2ZlciB0byBhbmQgZnJvbSBzYW1lIGNsaWVudCBhY2NvdW50XCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgLy8gdHJhbnNmZXIgb2YgMCBpcyBhbGxvd2VkIGluIEVSQzIwLCBzbyBqdXN0IHZhbGlkYXRlIGFnYWluc3QgbmVnYXRpdmUgYW1vdW50c1xuICAgICAgdGhyb3cgbmV3IEJhbGFuY2VFcnJvcihcInRyYW5zZmVyIGFtb3VudCBjYW5ub3QgYmUgbmVnYXRpdmVcIik7XG4gICAgfVxuXG4gICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgc2VuZGVyXG5cbiAgICBjb25zdCBmcm9tV2FsbGV0ID0gYXdhaXQgdGhpcy53YWxsZXRSZXBvc2l0b3J5LnJlYWQoZnJvbSwgY3R4KTtcblxuICAgIGNvbnN0IGZyb21CYWxhbmNlID0gZnJvbVdhbGxldC5iYWxhbmNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNlbmRlciBoYXMgZW5vdWdoIHRva2VucyB0byBzcGVuZC5cbiAgICBpZiAoZnJvbUJhbGFuY2UgPCB2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEJhbGFuY2VFcnJvcihgY2xpZW50IGFjY291bnQgJHtmcm9tfSBoYXMgaW5zdWZmaWNpZW50IGZ1bmRzLmApO1xuICAgIH1cblxuICAgIC8vIFJldHJpZXZlIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHJlY2VwaWVudFxuXG4gICAgbGV0IHRvV2FsbGV0OiBFUkMyMFdhbGxldDtcbiAgICBsZXQgbmV3VG9XYWxsZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdG9XYWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkucmVhZCh0bywgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEJhc2VFcnJvcikge1xuICAgICAgICBpZiAoZS5jb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgd2FsbGV0IGZvciB0aGUgbWludGVyXG4gICAgICAgICAgdG9XYWxsZXQgPSBuZXcgRVJDMjBXYWxsZXQoe1xuICAgICAgICAgICAgaWQ6IHRvLFxuICAgICAgICAgICAgYmFsYW5jZTogMCxcbiAgICAgICAgICAgIHRva2VuOiBhd2FpdCB0aGlzLlRva2VuTmFtZShjdHggYXMgYW55KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBuZXdUb1dhbGxldCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRvQmFsYW5jZSA9IHRvV2FsbGV0LmJhbGFuY2U7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJhbGFuY2VcbiAgICBjb25zdCBmcm9tVXBkYXRlZEJhbGFuY2UgPSBzdWIoZnJvbUJhbGFuY2UsIHZhbHVlKTtcbiAgICBjb25zdCB0b1VwZGF0ZWRCYWxhbmNlID0gYWRkKHRvQmFsYW5jZSwgdmFsdWUpO1xuXG4gICAgY29uc3QgdXBkYXRlZEZyb21XYWxsZXQgPSBPYmplY3QuYXNzaWduKHt9LCBmcm9tV2FsbGV0LCB7XG4gICAgICBiYWxhbmNlOiBmcm9tVXBkYXRlZEJhbGFuY2UsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkudXBkYXRlKHVwZGF0ZWRGcm9tV2FsbGV0LCBjdHgpO1xuXG4gICAgY29uc3QgdXBkYXRlZFRvV2FsbGV0ID0gT2JqZWN0LmFzc2lnbih7fSwgdG9XYWxsZXQsIHtcbiAgICAgIGJhbGFuY2U6IHRvVXBkYXRlZEJhbGFuY2UsXG4gICAgfSk7XG5cbiAgICBpZiAobmV3VG9XYWxsZXQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5jcmVhdGUodXBkYXRlZFRvV2FsbGV0LCBjdHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkudXBkYXRlKHVwZGF0ZWRUb1dhbGxldCwgY3R4KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IHRoZSBUcmFuc2ZlciBldmVudFxuICAgIGNvbnN0IHRyYW5zZmVyRXZlbnQgPSB7IGZyb20sIHRvLCB2YWx1ZTogdmFsdWUgfTtcblxuICAgIHRoaXMucmVwb1xuICAgICAgLnJlZnJlc2goXG4gICAgICAgIEVSQzIwVG9rZW4gYXMgYW55LFxuICAgICAgICBFUkMyMEV2ZW50cy5UUkFOU0ZFUixcbiAgICAgICAgXCJcIixcbiAgICAgICAgdHJhbnNmZXJFdmVudCxcbiAgICAgICAgY3R4IGFzIHVua25vd24gYXMgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICAgICApXG4gICAgICAuY2F0Y2goKGUpID0+IGxvZy5lcnJvcihgRmFpbGVkIHRvIG5vdGlmeSB0cmFuc2ZlcjogJHtlfWApKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgc3BlbmRlcmAgdG8gc3BlbmQgYHZhbHVlYCBhbW91bnQgb2YgdG9rZW5zIGZyb20gdGhlIG93bmVyLiBOZXcgQXBwcm92ZSBjYWxscyBvdmVycmlkZSB0aGUgcHJldmlvdXMgYWxsb3dhbmNlLlxuICAgKiBAbm90ZSBodHRwczovL2VpcHMuZXRoZXJldW0ub3JnL0VJUFMvZWlwLTIwXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY3R4IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzcGVuZGVyIFRoZSBzcGVuZGVyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBhcHByb3ZlZCBmb3IgdHJhbnNmZXJcbiAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybiB3aGV0aGVyIHRoZSBhcHByb3ZhbCB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAgICovXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIEFwcHJvdmUoXG4gICAgY29udGV4dDogQ29udGV4dCxcbiAgICBzcGVuZGVyOiBzdHJpbmcsXG4gICAgdmFsdWU6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGN0eCwgY3R4QXJncyB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkFwcHJvdmUpO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3Qgb3duZXIgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgIGxldCBhbGxvd2FuY2UgPSBhd2FpdCB0aGlzLl9nZXRBbGxvd2FuY2Uob3duZXIsIHNwZW5kZXIsIGN0eCk7XG5cbiAgICBjb25zdCBvd25lcldhbGxldCA9IGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5yZWFkKG93bmVyLCAuLi5jdHhBcmdzKTtcblxuICAgIGlmIChvd25lcldhbGxldC5iYWxhbmNlIDwgdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlRXJyb3IoYGNsaWVudCBhY2NvdW50ICR7b3duZXJ9IGhhcyBpbnN1ZmZpY2llbnQgZnVuZHMuYCk7XG4gICAgfVxuXG4gICAgaWYgKGFsbG93YW5jZSkge1xuICAgICAgLy8gT3ZlcndyaXRlIHRoZSBhbGxvd2FuY2VcbiAgICAgIGFsbG93YW5jZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5LnVwZGF0ZShhbGxvd2FuY2UsIC4uLmN0eEFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGxvd2FuY2UgPSBuZXcgQWxsb3dhbmNlKHtcbiAgICAgICAgb3duZXI6IG93bmVyLFxuICAgICAgICBzcGVuZGVyOiBzcGVuZGVyLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5LmNyZWF0ZShhbGxvd2FuY2UsIC4uLmN0eEFyZ3MpO1xuICAgIH1cblxuICAgIC8vIEVtaXQgdGhlIEFwcHJvdmFsIGV2ZW50XG4gICAgY29uc3QgYXBwcm92YWxFdmVudCA9IHsgb3duZXIsIHNwZW5kZXIsIHZhbHVlOiB2YWx1ZSB9O1xuICAgIHRoaXMucmVwby5yZWZyZXNoKFxuICAgICAgRVJDMjBUb2tlbiBhcyBhbnksXG4gICAgICBFUkMyMEV2ZW50cy5BUFBST1ZBTCxcbiAgICAgIFwiXCIsXG4gICAgICBhcHByb3ZhbEV2ZW50LFxuICAgICAgY3R4IGFzIHVua25vd24gYXMgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICAgKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiB0b2tlbnMgd2hpY2ggYCBgIGlzIGFsbG93ZWQgdG8gd2l0aGRyYXcgZnJvbSBgb3duZXJgLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGN0eCB0aGUgdHJhbnNhY3Rpb24gY29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3duZXIgVGhlIG93bmVyIG9mIHRva2Vuc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gc3BlbmRlciBUaGUgc3BlbmRlciB3aG8gYXJlIGFibGUgdG8gdHJhbnNmZXIgdGhlIHRva2Vuc1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm4gdGhlIGFtb3VudCBvZiByZW1haW5pbmcgdG9rZW5zIGFsbG93ZWQgdG8gc3BlbnRcbiAgICovXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgQWxsb3dhbmNlKFxuICAgIGNvbnRleHQ6IENvbnRleHQsXG4gICAgb3duZXI6IHN0cmluZyxcbiAgICBzcGVuZGVyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkFsbG93YW5jZSk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICBjb25zdCBhbGxvd2FuY2UgPSBhd2FpdCB0aGlzLl9nZXRBbGxvd2FuY2Uob3duZXIsIHNwZW5kZXIsIGN0eCk7XG5cbiAgICBpZiAoIWFsbG93YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEFsbG93YW5jZUVycm9yKFxuICAgICAgICBgc3BlbmRlciAke3NwZW5kZXJ9IGhhcyBubyBhbGxvd2FuY2UgZnJvbSAke293bmVyfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhbGxvd2FuY2UudmFsdWU7XG4gIH1cblxuICBhc3luYyBfZ2V0QWxsb3dhbmNlKFxuICAgIG93bmVyOiBzdHJpbmcsXG4gICAgc3BlbmRlcjogc3RyaW5nLFxuICAgIGN0eDogRmFicmljQ29udHJhY3RDb250ZXh0XG4gICk6IFByb21pc2U8QWxsb3dhbmNlPiB7XG4gICAgY29uc3QgYWxsb3dhbmNlQ29uZGl0aW9uID0gQ29uZGl0aW9uLmFuZChcbiAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8QWxsb3dhbmNlPihcIm93bmVyXCIpLmVxKG93bmVyKSxcbiAgICAgIENvbmRpdGlvbi5hdHRyaWJ1dGU8QWxsb3dhbmNlPihcInNwZW5kZXJcIikuZXEoc3BlbmRlcilcbiAgICApO1xuXG4gICAgY29uc3QgYWxsb3dhbmNlID0gYXdhaXQgdGhpcy5hbGxvd2FuY2VSZXBvc2l0b3J5XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZShhbGxvd2FuY2VDb25kaXRpb24pXG4gICAgICAuZXhlY3V0ZShjdHgpO1xuICAgIHJldHVybiBhbGxvd2FuY2U/LlswXTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PSBFeHRlbmRlZCBGdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU2V0IG9wdGlvbmFsIGluZm9tYXRpb24gZm9yIGEgdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7Q29udGV4dH0gY3R4IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0b2tlblxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3ltYm9sIFRoZSBzeW1ib2wgb2YgdGhlIHRva2VuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkZWNpbWFscyBUaGUgZGVjaW1hbHMgb2YgdGhlIHRva2VuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0b3RhbFN1cHBseSBUaGUgdG90YWxTdXBwbHkgb2YgdGhlIHRva2VuXG4gICAqL1xuICBAVHJhbnNhY3Rpb24oKVxuICBhc3luYyBJbml0aWFsaXplKGNvbnRleHQ6IENvbnRleHQsIHRva2VuOiBFUkMyMFRva2VuKSB7XG4gICAgY29uc3QgeyBjdHggfSA9IGF3YWl0IHRoaXMubG9nQ3R4KFtjb250ZXh0XSwgdGhpcy5Jbml0aWFsaXplKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBub3QgYWxyZWFkeSBzZXQsIGNsaWVudCBpcyBub3QgYXV0aG9yaXplZCB0byBjaGFuZ2UgdGhlbSBvbmNlIGludGl0aWFsaXplZFxuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpLmV4ZWN1dGUoY3R4KTtcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIFwiY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQsIGNsaWVudCBpcyBub3QgYXV0aG9yaXplZCB0byBjaGFuZ2UgdGhlbVwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRva2VuLm93bmVyID0gY3R4LmlkZW50aXR5LmdldElEKCk7XG5cbiAgICBhd2FpdCB0aGlzLnRva2VuUmVwb3NpdG9yeS5jcmVhdGUodG9rZW4sIGN0eCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrcyB0aGF0IGNvbnRyYWN0IG9wdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgQFRyYW5zYWN0aW9uKGZhbHNlKVxuICBhc3luYyBDaGVja0luaXRpYWxpemVkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQpO1xuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMudG9rZW5SZXBvc2l0b3J5LnNlbGVjdCgpLmV4ZWN1dGUoY3R4KTtcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW5pdGlhbGl6ZWRFcnJvcihcbiAgICAgICAgXCJjb250cmFjdCBvcHRpb25zIG5lZWQgdG8gYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGFueSBmdW5jdGlvbiwgY2FsbCBJbml0aWFsaXplKCkgdG8gaW5pdGlhbGl6ZSBjb250cmFjdFwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNaW50IGNyZWF0ZXMgbmV3IHRva2VucyBhbmQgYWRkcyB0aGVtIHRvIG1pbnRlcidzIGFjY291bnQgYmFsYW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgYmFsYW5jZVxuICAgKi9cbiAgQE93bmVyKClcbiAgQFRyYW5zYWN0aW9uKClcbiAgYXN5bmMgTWludChjb250ZXh0OiBDb250ZXh0LCBhbW91bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuTWludCk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICAvLyBHZXQgSUQgb2Ygc3VibWl0dGluZyBjbGllbnQgaWRlbnRpdHlcbiAgICBjb25zdCBtaW50ZXIgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgIGlmIChhbW91bnQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIm1pbnQgYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpO1xuICAgIH1cblxuICAgIGxldCBtaW50ZXJXYWxsZXQ6IEVSQzIwV2FsbGV0O1xuICAgIHRyeSB7XG4gICAgICBtaW50ZXJXYWxsZXQgPSBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkucmVhZChtaW50ZXIsIGN0eCk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gbWludGVyV2FsbGV0LmJhbGFuY2U7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRCYWxhbmNlID0gYWRkKGN1cnJlbnRCYWxhbmNlLCBhbW91bnQpO1xuXG4gICAgICBjb25zdCB1cGRhdGVkbWludGVyID0gT2JqZWN0LmFzc2lnbih7fSwgbWludGVyV2FsbGV0LCB7XG4gICAgICAgIGJhbGFuY2U6IHVwZGF0ZWRCYWxhbmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS51cGRhdGUodXBkYXRlZG1pbnRlciwgY3R4KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEJhc2VFcnJvcikge1xuICAgICAgICBpZiAoZS5jb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgd2FsbGV0IGZvciB0aGUgbWludGVyXG4gICAgICAgICAgY29uc3QgbmV3V2FsbGV0ID0gbmV3IEVSQzIwV2FsbGV0KHtcbiAgICAgICAgICAgIGlkOiBtaW50ZXIsXG4gICAgICAgICAgICBiYWxhbmNlOiBhbW91bnQsXG4gICAgICAgICAgICB0b2tlbjogYXdhaXQgdGhpcy5Ub2tlbk5hbWUoY29udGV4dCksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy53YWxsZXRSZXBvc2l0b3J5LmNyZWF0ZShuZXdXYWxsZXQsIGN0eCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtaXQgdGhlIFRyYW5zZmVyIGV2ZW50XG4gICAgY29uc3QgdHJhbnNmZXJFdmVudCA9IHsgZnJvbTogXCIweDBcIiwgdG86IG1pbnRlciwgdmFsdWU6IGFtb3VudCB9O1xuICAgIGNvbnN0IGV2ZW50SGFuZGxlciA9XG4gICAgICB0aGlzLnJlcG8uT2JzZXJ2ZXJIYW5kbGVyKCkgYXMgRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXI7XG4gICAgZXZlbnRIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIEVSQzIwVG9rZW4sXG4gICAgICBFUkMyMEV2ZW50cy5UUkFOU0ZFUixcbiAgICAgIFwiXCIsXG4gICAgICB0cmFuc2ZlckV2ZW50LFxuICAgICAgY3R4IGFzIHVua25vd24gYXMgRmFicmljQ29udHJhY3RDb250ZXh0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdXJuIHJlZGVlbSB0b2tlbnMgZnJvbSBtaW50ZXIncyBhY2NvdW50IGJhbGFuY2VcbiAgICpcbiAgICogQHBhcmFtIHtDb250ZXh0fSBjb250ZXh0IHRoZSB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnQgYW1vdW50IG9mIHRva2VucyB0byBiZSBidXJuZWRcbiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGJhbGFuY2VcbiAgICovXG4gIEBPd25lcigpXG4gIEBUcmFuc2FjdGlvbigpXG4gIGFzeW5jIEJ1cm4oY29udGV4dDogQ29udGV4dCwgYW1vdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuQnVybik7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICBjb25zdCBtaW50ZXIgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcblxuICAgIGNvbnN0IG1pbnRlcldhbGxldCA9IGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5yZWFkKG1pbnRlciwgY3R4KTtcblxuICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gbWludGVyV2FsbGV0LmJhbGFuY2U7XG5cbiAgICBpZiAoY3VycmVudEJhbGFuY2UgPCBhbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlRXJyb3IoYE1pbnRlciBoYXMgaW5zdWZmaWNpZW50IGZ1bmRzLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRCYWxhbmNlID0gc3ViKGN1cnJlbnRCYWxhbmNlLCBhbW91bnQpO1xuXG4gICAgY29uc3QgdXBkYXRlZG1pbnRlciA9IE9iamVjdC5hc3NpZ24oe30sIG1pbnRlcldhbGxldCwge1xuICAgICAgYmFsYW5jZTogdXBkYXRlZEJhbGFuY2UsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLndhbGxldFJlcG9zaXRvcnkudXBkYXRlKHVwZGF0ZWRtaW50ZXIsIGN0eCk7XG5cbiAgICBsb2cuaW5mbyhgJHthbW91bnR9IHRva2VucyB3ZXJlIGJ1cm5lZGApO1xuXG4gICAgLy8gRW1pdCB0aGUgVHJhbnNmZXIgZXZlbnRcbiAgICBjb25zdCB0cmFuc2ZlckV2ZW50ID0geyBmcm9tOiBtaW50ZXIsIHRvOiBcIjB4MFwiLCB2YWx1ZTogYW1vdW50IH07XG4gICAgY29uc3QgZXZlbnRIYW5kbGVyID1cbiAgICAgIHRoaXMucmVwby5PYnNlcnZlckhhbmRsZXIoKSBhcyBGYWJyaWNDb250cmFjdFJlcG9zaXRvcnlPYnNlcnZhYmxlSGFuZGxlcjtcbiAgICBldmVudEhhbmRsZXIudXBkYXRlT2JzZXJ2ZXJzKFxuICAgICAgRVJDMjBUb2tlbixcbiAgICAgIEVSQzIwRXZlbnRzLlRSQU5TRkVSLFxuICAgICAgXCJcIixcbiAgICAgIHRyYW5zZmVyRXZlbnQsXG4gICAgICBjdHggYXMgdW5rbm93biBhcyBGYWJyaWNDb250cmFjdENvbnRleHRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1cm5Gcm9tIHJlZGVlbSB0b2tlbnMgZnJvbSBhY2NvdW50IGFsbG93ZW5jZSBhbmQgYmFsYW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFjY291bnQgYWNjb3VudCBmcm9tIHdoZXJlIHRva2VucyB3aWxsIGJlIGJ1cm5lZFxuICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBiYWxhbmNlXG4gICAqL1xuICBAT3duZXIoKVxuICBAVHJhbnNhY3Rpb24oKVxuICBhc3luYyBCdXJuRnJvbShcbiAgICBjb250ZXh0OiBDb250ZXh0LFxuICAgIGFjY291bnQ6IHN0cmluZyxcbiAgICBhbW91bnQ6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuQnVybkZyb20pO1xuICAgIC8vIENoZWNrIGNvbnRyYWN0IG9wdGlvbnMgYXJlIGFscmVhZHkgc2V0IGZpcnN0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXG4gICAgYXdhaXQgdGhpcy5DaGVja0luaXRpYWxpemVkKGN0eCBhcyBhbnkpO1xuXG4gICAgY29uc3QgYWNjb3VudFdhbGxldCA9IGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS5yZWFkKGFjY291bnQsIGN0eCk7XG5cbiAgICBjb25zdCBjdXJyZW50QmFsYW5jZSA9IGFjY291bnRXYWxsZXQuYmFsYW5jZTtcblxuICAgIGlmIChjdXJyZW50QmFsYW5jZSA8IGFtb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEJhbGFuY2VFcnJvcihgJHthY2NvdW50fSBoYXMgaW5zdWZmaWNpZW50IGZ1bmRzLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRCYWxhbmNlID0gc3ViKGN1cnJlbnRCYWxhbmNlLCBhbW91bnQpO1xuXG4gICAgY29uc3QgdXBkYXRlZGFjY291bnQgPSBPYmplY3QuYXNzaWduKHt9LCBhY2NvdW50V2FsbGV0LCB7XG4gICAgICBiYWxhbmNlOiB1cGRhdGVkQmFsYW5jZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMud2FsbGV0UmVwb3NpdG9yeS51cGRhdGUodXBkYXRlZGFjY291bnQsIGN0eCk7XG5cbiAgICBsb2cuaW5mbyhgJHthbW91bnR9IHRva2VucyB3ZXJlIGJ1cm5lZCBmcm9tICR7YWNjb3VudH1gKTtcblxuICAgIC8vIEVtaXQgdGhlIFRyYW5zZmVyIGV2ZW50XG4gICAgY29uc3QgdHJhbnNmZXJFdmVudCA9IHsgZnJvbTogYWNjb3VudCwgdG86IFwiMHgwXCIsIHZhbHVlOiBhbW91bnQgfTtcbiAgICBjb25zdCBldmVudEhhbmRsZXIgPVxuICAgICAgdGhpcy5yZXBvLk9ic2VydmVySGFuZGxlcigpIGFzIEZhYnJpY0NvbnRyYWN0UmVwb3NpdG9yeU9ic2VydmFibGVIYW5kbGVyO1xuICAgIGV2ZW50SGFuZGxlci51cGRhdGVPYnNlcnZlcnMoXG4gICAgICBFUkMyMFRva2VuLFxuICAgICAgRVJDMjBFdmVudHMuVFJBTlNGRVIsXG4gICAgICBcIlwiLFxuICAgICAgdHJhbnNmZXJFdmVudCxcbiAgICAgIGN0eCBhcyB1bmtub3duIGFzIEZhYnJpY0NvbnRyYWN0Q29udGV4dFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xpZW50QWNjb3VudEJhbGFuY2UgcmV0dXJucyB0aGUgYmFsYW5jZSBvZiB0aGUgcmVxdWVzdGluZyBjbGllbnQncyBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnRleHR9IGNvbnRleHQgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyB0aGUgYWNjb3VudCBiYWxhbmNlXG4gICAqL1xuICBAVHJhbnNhY3Rpb24oZmFsc2UpXG4gIGFzeW5jIENsaWVudEFjY291bnRCYWxhbmNlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHsgY3R4IH0gPSBhd2FpdCB0aGlzLmxvZ0N0eChbY29udGV4dF0sIHRoaXMuVG9rZW5OYW1lKTtcbiAgICAvLyBDaGVjayBjb250cmFjdCBvcHRpb25zIGFyZSBhbHJlYWR5IHNldCBmaXJzdCB0byBleGVjdXRlIHRoZSBmdW5jdGlvblxuICAgIGF3YWl0IHRoaXMuQ2hlY2tJbml0aWFsaXplZChjdHggYXMgYW55KTtcblxuICAgIC8vIEdldCBJRCBvZiBzdWJtaXR0aW5nIGNsaWVudCBpZGVudGl0eVxuICAgIGNvbnN0IGNsaWVudEFjY291bnRJRCA9IGN0eC5pZGVudGl0eS5nZXRJRCgpO1xuXG4gICAgY29uc3QgY2xpZW50V2FsbGV0ID0gYXdhaXQgdGhpcy53YWxsZXRSZXBvc2l0b3J5LnJlYWQoY2xpZW50QWNjb3VudElELCBjdHgpO1xuXG4gICAgaWYgKCFjbGllbnRXYWxsZXQpIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlRXJyb3IoYFRoZSBhY2NvdW50ICR7Y2xpZW50QWNjb3VudElEfSBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIHJldHVybiBjbGllbnRXYWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8vIENsaWVudEFjY291bnRJRCByZXR1cm5zIHRoZSBpZCBvZiB0aGUgcmVxdWVzdGluZyBjbGllbnQncyBhY2NvdW50LlxuICAvLyBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgY2xpZW50IGFjY291bnQgSUQgaXMgdGhlIGNsaWVudElkIGl0c2VsZi5cbiAgLy8gVXNlcnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGVpciBvd24gYWNjb3VudCBpZCwgd2hpY2ggdGhleSBjYW4gdGhlbiBnaXZlIHRvIG90aGVycyBhcyB0aGUgcGF5bWVudCBhZGRyZXNzXG4gIEBUcmFuc2FjdGlvbihmYWxzZSlcbiAgYXN5bmMgQ2xpZW50QWNjb3VudElEKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICBjb25zdCB7IGN0eCB9ID0gYXdhaXQgdGhpcy5sb2dDdHgoW2NvbnRleHRdLCB0aGlzLkNsaWVudEFjY291bnRJRCk7XG4gICAgLy8gQ2hlY2sgY29udHJhY3Qgb3B0aW9ucyBhcmUgYWxyZWFkeSBzZXQgZmlyc3QgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICBhd2FpdCB0aGlzLkNoZWNrSW5pdGlhbGl6ZWQoY3R4IGFzIGFueSk7XG5cbiAgICAvLyBHZXQgSUQgb2Ygc3VibWl0dGluZyBjbGllbnQgaWRlbnRpdHlcbiAgICBjb25zdCBjbGllbnRBY2NvdW50SUQgPSBjdHguaWRlbnRpdHkuZ2V0SUQoKTtcbiAgICByZXR1cm4gY2xpZW50QWNjb3VudElEO1xuICB9XG59XG4iLCJpbXBvcnQgeyBGYWJyaWNFUkMyMENvbnRyYWN0IH0gZnJvbSBcIi4vZXJjMjBjb250cmFjdFwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4vRmFicmljQ29udHJhY3RTdGF0ZW1lbnRcIjtcblxuZXhwb3J0IGNvbnN0IGNvbnRyYWN0czogYW55W10gPSBbRmFicmljRVJDMjBDb250cmFjdF07XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbIkZhYnJpY0NvbnRyYWN0Q29udGV4dCIsIkNvbnRleHQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwic3R1YiIsInRoaXMiLCJnZXQiLCJ0aW1lc3RhbXAiLCJnZXREYXRlVGltZXN0YW1wIiwiaWRlbnRpdHkiLCJ0b1N0cmluZyIsImdlbmVyYXRlRmFicmljRXZlbnROYW1lIiwidGFibGUiLCJldmVudCIsIm93bmVyIiwicGFyYW1zIiwicHVzaCIsImpvaW4iLCJwYXJzZUV2ZW50TmFtZSIsIm5hbWUiLCJwYXJ0cyIsInNwbGl0IiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiRmFicmljQ29udHJhY3RSZXBvc2l0b3J5T2JzZXJ2YWJsZUhhbmRsZXIiLCJPYnNlcnZlckhhbmRsZXIiLCJzdXBwb3J0ZWRFdmVudHMiLCJPcGVyYXRpb25LZXlzIiwiQ1JFQVRFIiwiVVBEQVRFIiwiREVMRVRFIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwidXBkYXRlT2JzZXJ2ZXJzIiwiY2xhenoiLCJpZCIsImFyZ3MiLCJsb2ciLCJjdHgiLCJBZGFwdGVyIiwibG9nQ3R4IiwicGF5bG9hZCIsImluZGV4T2YiLCJkZWJ1ZyIsImV2ZW50TmFtZSIsInNldEV2ZW50IiwiQnVmZmVyIiwiZnJvbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJGYWJyaWNDb250cmFjdFJlcG9zaXRvcnkiLCJSZXBvc2l0b3J5IiwiYWRhcHRlciIsInRyYWNrZWRFdmVudHMiLCJGYWJyaWNTdGF0ZW1lbnQiLCJDb3VjaERCU3RhdGVtZW50IiwicmF3IiwicmF3SW5wdXQiLCJyZXN1bHRzIiwicGtBdHRyIiwiTW9kZWwiLCJwayIsImZyb21TZWxlY3RvciIsInR5cGUiLCJNZXRhZGF0YSIsImtleSIsIkRCS2V5cyIsIklEIiwic2VsZWN0U2VsZWN0b3IiLCJtYXAiLCJyIiwicHJvY2Vzc1JlY29yZCIsImJ1aWxkIiwic2VsZWN0b3JzIiwiQ291Y2hEQktleXMiLCJUQUJMRSIsInRhYmxlTmFtZSIsInF1ZXJ5Iiwic2VsZWN0b3IiLCJmaWVsZHMiLCJ3aGVyZUNvbmRpdGlvbiIsImNvbmRpdGlvbiIsInBhcnNlQ29uZGl0aW9uIiwiQ29uZGl0aW9uIiwiYW5kIiwiYXR0cmlidXRlIiwiZXEiLCJzZWxlY3RvcktleXMiLCJPYmplY3QiLCJrZXlzIiwidmFsdWVzIiwiQ291Y2hEQkdyb3VwT3BlcmF0b3IiLCJBTkQiLCJyZWR1Y2UiLCJhY2N1bSIsInZhbCIsIkVycm9yIiwiayIsIk9SIiwicyIsImVudHJpZXMiLCJyZXN1bHQiLCJmb3JFYWNoIiwiY29uc29sZSIsIndhcm4iLCJvcmRlckJ5U2VsZWN0b3IiLCJzb3J0IiwidmFsdWUiLCJyZWMiLCJDb3VjaERCT3BlcmF0b3IiLCJCSUdHRVIiLCJsaW1pdFNlbGVjdG9yIiwibGltaXQiLCJvZmZzZXRTZWxlY3RvciIsInNraXAiLCJGYWJyaWNNb2RlbEtleXMiLCJJZGVudGl0eVR5cGUiLCJGYWJyaWNGbGF2b3VyIiwiU2ltcGxlRGV0ZXJtaW5pc3RpY1NlcmlhbGl6ZXIiLCJKU09OU2VyaWFsaXplciIsImRlc2VyaWFsaXplIiwic3RyIiwiZGVzZXJpYWxpemF0aW9uIiwicGFyc2UiLCJzZXJpYWxpemUiLCJtb2RlbCIsInJlcXVpcmUiLCJzb3J0S2V5c1JlY3Vyc2l2ZSIsInByZVNlcmlhbGl6ZSIsInRvU2VyaWFsaXplIiwiYXNzaWduIiwiYXN5bmMiLCJvbmVUb09uZU9uQ3JlYXRlIiwiY29udGV4dCIsImRhdGEiLCJwcm9wZXJ0eVZhbHVlIiwiaW5uZXJSZXBvIiwicmVwb3NpdG9yeUZyb21UeXBlTWV0YWRhdGEiLCJhbGlhcyIsInJlYWQiLCJjYWNoZU1vZGVsRm9yUG9wdWxhdGUiLCJjbGFzcyIsIkludGVybmFsRXJyb3IiLCJyZXBvIiwiZm9yTW9kZWwiLCJjcmVhdGVkIiwiY3JlYXRlIiwib25lVG9PbmVPblVwZGF0ZSIsImNhc2NhZGUiLCJ1cGRhdGUiLCJDYXNjYWRlIiwiQ0FTQ0FERSIsInVwZGF0ZWQiLCJjcmVhdGVPclVwZGF0ZSIsIm9uZVRvT25lT25EZWxldGUiLCJkZWxldGVkIiwiZGVsZXRlIiwib25lVG9NYW55T25DcmVhdGUiLCJwcm9wZXJ0eVZhbHVlcyIsImFycmF5VHlwZSIsImV2ZXJ5IiwiaXRlbSIsInVuaXF1ZVZhbHVlcyIsIlNldCIsInBrTmFtZSIsIm0iLCJyZWNvcmQiLCJhZGQiLCJvbmVUb01hbnlPbkRlbGV0ZSIsImFyZUFsbFNhbWVUeXBlIiwiaXNJbnN0YW50aWF0ZWQiLCJ2IiwicG9wdWxhdGUiLCJuZXN0ZWQiLCJpc0FyciIsIkFycmF5IiwiaXNBcnJheSIsImZldGNoUG9wdWxhdGVWYWx1ZXMiLCJjIiwicHJvcE5hbWUiLCJwcm9wS2V5VmFsdWVzIiwiY2FjaGVLZXkiLCJwcm9LZXlWYWx1ZSIsImdldFBvcHVsYXRlS2V5IiwiZSIsInJlcyIsIkNvbnRyYWN0TG9nZ2VyIiwiTWluaUxvZ2dlciIsImNvbmYiLCJsb2dnZXIiLCJsb2dnaW5nIiwiZ2V0TG9nZ2VyIiwibGV2ZWwiLCJtc2ciLCJzdGFjayIsIk51bWVyaWNMb2dMZXZlbHMiLCJjb25maWciLCJtZXRob2QiLCJMb2dMZXZlbCIsImluZm8iLCJ2ZXJib3NlIiwiZXJyb3IiLCJzaWxseSIsImNhbGwiLCJjcmVhdGVMb2ciLCJmYWN0b3J5Iiwib2JqZWN0IiwiTG9nZ2luZyIsInNldEZhY3RvcnkiLCJjcmVhdGVkQnlPbkZhYnJpY0NyZWF0ZVVwZGF0ZSIsInVzZXIiLCJnZXRJRCIsIlVuc3VwcG9ydGVkRXJyb3IiLCJwa0ZhYnJpY09uQ3JlYXRlIiwic2V0UHJpbWFyeUtleVZhbHVlIiwidGFyZ2V0IiwicHJvcGVydHlLZXkiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsInNlcXVlbmNlTmFtZSIsInNlcXVlbmNlIiwiU2VxdWVuY2UiLCJuZXh0IiwiRmFicmljQ29udHJhY3RBZGFwdGVyIiwiQ291Y2hEQkFkYXB0ZXIiLCJnZXRDbGllbnQiLCJ0ZXh0RGVjb2RlciIsIlRleHREZWNvZGVyIiwic2VyaWFsaXplciIsInJlcG9zaXRvcnkiLCJzY29wZSIsImZvciIsImNvbXBvc2VkS2V5IiwiY3JlYXRlQ29tcG9zaXRlS2V5IiwiU3RyaW5nIiwicHV0U3RhdGUiLCJwYXJzZUVycm9yIiwicmVhZFN0YXRlIiwiY3R4QXJncyIsImRlbGV0ZVN0YXRlIiwiZm9yUHJpdmF0ZSIsImNvbGxlY3Rpb24iLCJ0b092ZXJyaWRlIiwicXVlcnlSZXN1bHQiLCJxdWVyeVJlc3VsdFBhZ2luYXRlZCIsImZuIiwiUHJveHkiLCJwcm9wIiwicmVjZWl2ZXIiLCJpbmNsdWRlcyIsIlJlZmxlY3QiLCJhcHBseSIsInRoaXNBcmciLCJhcmdzTGlzdCIsInB1dFByaXZhdGVEYXRhIiwiZGVsZXRlUHJpdmF0ZURhdGEiLCJnZXRQcml2YXRlRGF0YSIsImdldFByaXZhdGVEYXRhUXVlcnlSZXN1bHQiLCJpdGVyYXRvciIsImNvdW50IiwicmVhY2hlZEJvb2ttYXJrIiwibGFzdEtleSIsInJlY29yZEtleSIsInJlY29yZFZhbHVlIiwiS2V5IiwiUmVjb3JkIiwiY2xvc2UiLCJtZXRhZGF0YSIsImZldGNoZWRSZWNvcmRzQ291bnQiLCJib29rbWFyayIsImRvbmUiLCJTZXJpYWxpemF0aW9uRXJyb3IiLCJnZXRTdGF0ZSIsIk5vdEZvdW5kRXJyb3IiLCJnZXRRdWVyeVJlc3VsdCIsIl9pZCIsIiRndCIsIiRndGUiLCJpdCIsImdldFF1ZXJ5UmVzdWx0V2l0aFBhZ2luYXRpb24iLCJtZXJnZU1vZGVscyIsImV4dHJhY3QiLCJmaW5hbE1vZGVsIiwicG9wIiwiZGVjb2RlIiwiYnVmZmVyIiwiZmxhZ3MiLCJvcGVyYXRpb24iLCJiYXNlRmxhZ3MiLCJzZWdyZWdhdGVkIiwiY29ycmVsYXRpb25JZCIsImdldFR4SUQiLCJjbGllbnRJZGVudGl0eSIsImluZGV4IiwibW9kZWxzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXN1bHRJdGVyYXRvciIsImlzSGlzdG9yeSIsImFsbFJlc3VsdHMiLCJqc29uUmVzIiwiVHhJZCIsInR4SWQiLCJUaW1lc3RhbXAiLCJWYWx1ZSIsImVyciIsImRvY3NPbmx5IiwicmVzcG9uc2UiLCJTdGF0ZW1lbnQiLCJjcmVhdGVBbGwiLCJ0YWJsZUxhYmVsIiwiYWxsIiwiaSIsInVwZGF0ZUFsbCIsInByZXBhcmUiLCJzZWdyZWdhdGUiLCJtYXBwZWRQcm9wIiwiY29sdW1uTmFtZSIsImlzUmVzZXJ2ZWQiLCJ0cmFuc2llbnQiLCJyZXZlcnQiLCJvYmoiLCJvYiIsImNyZWF0ZVByZWZpeCIsInVwZGF0ZVByZWZpeCIsImNyZWF0ZUFsbFByZWZpeCIsImlkcyIsInJlY29yZHMiLCJ1cGRhdGVBbGxQcmVmaXgiLCJyZWFzb24iLCJmaWx0ZXIiLCJhIiwiY2xlYXIiLCJtZXNzYWdlIiwiQ29uZmxpY3RFcnJvciIsIkJhZFJlcXVlc3RFcnJvciIsIlF1ZXJ5RXJyb3IiLCJQYWdpbmdFcnJvciIsIk1pZ3JhdGlvbkVycm9yIiwiT2JzZXJ2ZXJFcnJvciIsIkF1dGhvcml6YXRpb25FcnJvciIsIkZvcmJpZGRlbkVycm9yIiwiQ29ubmVjdGlvbkVycm9yIiwiZGVjb3JhdGlvbiIsIkRlY29yYXRpb24iLCJmbGF2b3VyZWRBcyIsIlBlcnNpc3RlbmNlS2V5cyIsIkNSRUFURURfQlkiLCJkZWZpbmUiLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIlVQREFURURfQlkiLCJvbkNyZWF0ZVVwZGF0ZSIsImRlY29yYXRvciIsInBrRGVjIiwib3B0aW9ucyIsImdyb3Vwc29ydCIsImF0dHIiLCJyZXF1aXJlZCIsInJlYWRvbmx5IiwiQ09MVU1OIiwiZXh0ZW5kIiwiRmFicmljUHJvcGVydHkiLCJGYWJyaWNPYmplY3QiLCJvbmVUb09uZURlYyIsImpvaW5Db2x1bW5PcHRzIiwiZmsiLCJtZXRhIiwiam9pblRhYmxlIiwicmVsYXRpb24iLCJPTkVfVE9fT05FIiwiTnVtYmVyIiwiQmlnSW50Iiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsImFmdGVyQW55Iiwib25lVG9NYW55RGVjIiwiam9pblRhYmxlT3B0cyIsIk9ORV9UT19NQU5ZIiwibGlzdCIsIm9uZVRvTWFueU9uVXBkYXRlIiwic2V0Q3VycmVudCIsIkRldGVybWluaXN0aWNTZXJpYWxpemVyIiwiRmFicmljQ3J1ZENvbnRyYWN0IiwiQ29udHJhY3QiLCJpbml0aWFsaXplZCIsImxpc3RCeSIsIm9yZGVyIiwicGFnaW5hdGVCeSIsInNpemUiLCJmaW5kT25lQnkiLCJzdGF0ZW1lbnQiLCJnZXRUcmFuc2llbnREYXRhIiwibWVyZ2UiLCJ0cmFuc2llbnRNYXAiLCJnZXRUcmFuc2llbnQiLCJoYXMiLCJkZWxldGVBbGwiLCJyZWFkQWxsIiwib3JkZXJCeSIsIk9yZGVyRGlyZWN0aW9uIiwiQVNDIiwiaW5pdCIsImdldE5hbWUiLCJoZWFsdGhjaGVjayIsImJpbmQiLCJDdHgiLCJnZXRPcCIsIlJFQUQiLCJSRUFEX0FMTCIsIm92ZXJyaWRlcyIsIlNlcmlhbGl6ZWRDcnVkQ29udHJhY3QiLCJwYXJzZWRLZXlzIiwibW9kZWxMaXN0IiwiY29uZCIsInBhcnNlZElucHV0IiwiX19kZWNvcmF0ZSIsIlRyYW5zYWN0aW9uIiwicHJvdG90eXBlIiwiT3ZlcmZsb3dFcnJvciIsIkJhbGFuY2VFcnJvciIsIkFsbG93YW5jZUVycm9yIiwiUmVnaXN0cmF0aW9uRXJyb3IiLCJNaXNzaW5nQ29udGV4dEVycm9yIiwiVW5hdXRob3JpemVkUHJpdmF0ZURhdGFBY2Nlc3MiLCJCYXNlRXJyb3IiLCJOb3RJbml0aWFsaXplZEVycm9yIiwiTWlzc2luZ1BLQ1NTMTFMaWIiLCJFbmRvcnNlbWVudEVycm9yIiwiYiIsInN1YiIsInNhZmVQYXJzZUludCIsInN0cmluZyIsImRpZ2l0UmVnZXgiLCJ0ZXN0IiwiVmFsaWRhdGlvbkVycm9yIiwic3RyaW5nRm9ybWF0IiwicGFyc2VkaW50IiwicGFyc2VJbnQiLCJpc05hTiIsIkVSQzIwVG9rZW4iLCJCYXNlTW9kZWwiLCJjb2x1bW4iLCJFUkMyMFdhbGxldCIsIkFsbG93YW5jZSIsIk93bmVyIiwiZGVzY3JpcHRvciIsIm9yaWdpbmFsTWV0aG9kIiwiYWNvdW50SWQiLCJzZWxlY3QiLCJ0b2tlbnMiLCJleGVjdXRlIiwib3duZWRCeU9uQ3JlYXRlIiwiY3JlYXRvciIsImdldENyZWF0b3IiLCJtc3BpZCIsInNldE93bmVkQnlLZXlWYWx1ZSIsIm93bmVkQnkiLCJnZXRGYWJyaWNNb2RlbEtleSIsIk9XTkVEQlkiLCJGQUJSSUMiLCJJbXBsaWNpdFByaXZhdGVDb2xsZWN0aW9uIiwic2VncmVnYXRlZERhdGFPbkNyZWF0ZSIsImNvbGxlY3Rpb25SZXNvbHZlciIsImNvbGxlY3Rpb25zIiwicmVidWlsdCIsImFjYyIsInRvQ3JlYXRlIiwib3ZlcnJpZGUiLCJzZWdyZWdhdGVkRGF0YU9uUmVhZCIsInNlZ3JlZ2F0ZWREYXRhT25VcGRhdGUiLCJvbGRNb2RlbCIsInNlZ3JlZ2F0ZWREYXRhT25EZWxldGUiLCJpbm5lclNlZ3JlZ2F0ZWQiLCJzZWdyZWdhdGVkRGVjIiwicHJvcHMiLCJwcm9wZXJ0aWVzIiwiY29uc3RyIiwic2V0IiwiZGVjcyIsInAiLCJwcmlvcml0eSIsImdyb3VwIiwib25SZWFkIiwicHJpdmF0ZURhdGEiLCJQUklWQVRFIiwic2hhcmVkRGF0YSIsIlNIQVJFRCIsIkVSQzIwRXZlbnRzIiwiRmFicmljRVJDMjBDb250cmFjdCIsIndhbGxldFJlcG9zaXRvcnkiLCJ0b2tlblJlcG9zaXRvcnkiLCJhbGxvd2FuY2VSZXBvc2l0b3J5IiwiVG9rZW5OYW1lIiwiQ2hlY2tJbml0aWFsaXplZCIsInRva2VuIiwiU3ltYm9sIiwic3ltYm9sIiwiRGVjaW1hbHMiLCJkZWNpbWFscyIsIlRvdGFsU3VwcGx5Iiwid2FsbGV0cyIsInRvdGFsIiwid2FsbGV0IiwiYmFsYW5jZSIsIkJhbGFuY2VPZiIsIlRyYW5zZmVyIiwidG8iLCJ0cmFuc2ZlclJlc3AiLCJfdHJhbnNmZXIiLCJUcmFuc2ZlckZyb20iLCJCdXJuRnJvbSIsInNwZW5kZXIiLCJhbGxvd2FuY2UiLCJfZ2V0QWxsb3dhbmNlIiwiY3VycmVudEFsbG93YW5jZSIsInVwZGF0ZWRBbGxvd2FuY2UiLCJuZXdBbGxvd2FuY2UiLCJmcm9tV2FsbGV0IiwiZnJvbUJhbGFuY2UiLCJ0b1dhbGxldCIsIm5ld1RvV2FsbGV0IiwiY29kZSIsInRvQmFsYW5jZSIsImZyb21VcGRhdGVkQmFsYW5jZSIsInRvVXBkYXRlZEJhbGFuY2UiLCJ1cGRhdGVkRnJvbVdhbGxldCIsInVwZGF0ZWRUb1dhbGxldCIsInRyYW5zZmVyRXZlbnQiLCJyZWZyZXNoIiwiVFJBTlNGRVIiLCJjYXRjaCIsIkFwcHJvdmUiLCJvd25lcldhbGxldCIsImFwcHJvdmFsRXZlbnQiLCJBUFBST1ZBTCIsImFsbG93YW5jZUNvbmRpdGlvbiIsIndoZXJlIiwiSW5pdGlhbGl6ZSIsIk1pbnQiLCJhbW91bnQiLCJtaW50ZXIiLCJtaW50ZXJXYWxsZXQiLCJjdXJyZW50QmFsYW5jZSIsInVwZGF0ZWRCYWxhbmNlIiwidXBkYXRlZG1pbnRlciIsIm5ld1dhbGxldCIsImV2ZW50SGFuZGxlciIsIkJ1cm4iLCJhY2NvdW50IiwiYWNjb3VudFdhbGxldCIsInVwZGF0ZWRhY2NvdW50IiwiQ2xpZW50QWNjb3VudEJhbGFuY2UiLCJjbGllbnRBY2NvdW50SUQiLCJjbGllbnRXYWxsZXQiLCJDbGllbnRBY2NvdW50SUQiLCJfX21ldGFkYXRhIiwiY29udHJhY3RzIiwiVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQWtDTSxNQUFPQSw4QkFBOEJDO0lBS3pDLFdBQUFDO1FBQ0VDO0FBQ0Q7SUFPRCxRQUFJQztRQUNGLE9BQU9DLEtBQUtDLElBQUk7QUFDakI7SUFPRCxhQUFhQztRQUNYLE9BQU9GLEtBQUtELEtBQUtJO0FBQ2xCO0lBT0QsWUFBSUM7UUFDRixPQUFPSixLQUFLQyxJQUFJO0FBQ2pCO0lBRVEsUUFBQUk7UUFDUCxPQUFPLGFBQWFMLEtBQUtELE9BQU8sZUFBZTtBQUNoRDs7O1NDNURhTyx3QkFDZEMsT0FDQUMsT0FDQUM7SUFFQSxNQUFNQyxTQUFTLEVBQUNILE9BQU9DO0lBQ3ZCLElBQUlDLE9BQU9DLE9BQU9DLEtBQUtGO0lBQ3ZCLE9BQU9DLE9BQU9FLEtBQUs7QUFDckI7O0FBc0JNLFNBQVVDLGVBQWVD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
|