@sbb-esta/lyne-elements-experimental-dev 5.0.0-next.3-dev.1780480299 → 5.0.0-next.3-dev.1780484105
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.
|
@@ -1287,7 +1287,7 @@ var SeatReservationBaseElement = (() => {
|
|
|
1287
1287
|
const hasOverhangingElements = this._isOverhangingElementsPresent(coachItem.dimension.w, allElemenets);
|
|
1288
1288
|
const areaElements = coachItem.graphicElements?.filter((graphicalElement) => !this.notAreaElements.includes(graphicalElement.icon)).map((ele) => this._getCalculatedDimensionPositionElement(ele, coachItem.dimension, true));
|
|
1289
1289
|
const otherElements = coachItem.graphicElements?.filter((graphicalElement) => this.notAreaElements.includes(graphicalElement.icon)).map((ele) => this._getCalculatedDimensionPositionElement(ele, coachItem.dimension, false));
|
|
1290
|
-
const serviceElements = coachItem.serviceElements?.map((ele) => this._getCalculatedDimensionPositionElement(ele, coachItem.dimension,
|
|
1290
|
+
const serviceElements = coachItem.serviceElements?.map((ele) => this._getCalculatedDimensionPositionElement(ele, coachItem.dimension, true));
|
|
1291
1291
|
const borderMiddleElement = this._getCalculatedMiddleBorderElement(coachItem);
|
|
1292
1292
|
const calcCoachDimension = this.getCalculatedDimension({ ...coachItem.dimension });
|
|
1293
1293
|
const coachSturcture = {
|
|
@@ -1473,4 +1473,4 @@ var SeatReservationBaseElement = (() => {
|
|
|
1473
1473
|
//#endregion
|
|
1474
1474
|
export { SbbSeatReservationSelectedCoachEvent, SbbSeatReservationSelectedPlacesEvent, SeatReservationBaseElement };
|
|
1475
1475
|
|
|
1476
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZm9yY2VUeXBlLFxuICBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQsXG4gIFNiYkVsZW1lbnQsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50TW91bnRpbmcsXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBQbGFjZVRyYXZlbENsYXNzLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyxcbiAgVHJhdmVsRGlyZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuXG5lbnVtIFNjcm9sbERpcmVjdGlvbiB7XG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgbGVmdCA9ICdsZWZ0Jyxcbn1cblxuaW50ZXJmYWNlIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZWF0cmVzZXJ2YXRpb25TdHJ1Y3R1cmUge1xuICBkZWNrczogU2VhdHJlc2VydmF0aW9uRGVja1tdO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uRGVjayB7XG4gIGRlY2tJbmRleDogbnVtYmVyO1xuICBkZWNrQ29hY2hlczogQ29hY2hTdHJ1Y3R1cmVbXTtcbn1cblxuaW50ZXJmYWNlIENvYWNoU3RydWN0dXJlIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGFyZWFFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgc2VydmljZUVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBvdGhlckVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBib3JkZXJNaWRkbGVFbGVtZW50OiBCYXNlRWxlbWVudDtcbiAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogYm9vbGVhbjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNiYlNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RldGFpbDogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM7XG5cbiAgcHVibGljIGdldCBkZXRhaWwoKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMge1xuICAgIHJldHVybiB0aGlzLl9kZXRhaWw7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoZGV0YWlsOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcykge1xuICAgIHN1cGVyKCdzZWxlY3RlZHBsYWNlcycsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7XG4gICAgdGhpcy5fZGV0YWlsID0gZGV0YWlsO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RldGFpbDogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaDtcblxuICBwdWJsaWMgZ2V0IGRldGFpbCgpOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoIHtcbiAgICByZXR1cm4gdGhpcy5fZGV0YWlsO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRldGFpbDogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCkge1xuICAgIHN1cGVyKCdzZWxlY3RlZGNvYWNoJywgeyBidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KTtcbiAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIC8vIERlc2NyaWJlcyB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gZm9yIHRoZSBhcmVhIGljb25zLCB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaWNvbnNcbiAgcHJvdGVjdGVkIGdsb2JhbEFyZWFJY29uRGltOiBFbGVtZW50RGltZW5zaW9uID0geyB3OiAyLCBoOiAyIH07XG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIERlc2NyaWJlcyB0aGUgcGFkZGluZyBmb3IgdGhlIGljb24gd2l0aGluIHRoZSBhcmVhIGFzIGEgcGVyY2VudGFnZSBzaXplIG9mIHRoZSBhcmVhIHNlbGYuIDgwJSAoMC44IHBlcmNlbnQpIGNvcnJlc3BvbmRzXG4gIC8vIHRvIGEgZ29vZCBvcHRpY2FsIHNpemUgYW5kIGNyZWF0ZXMgYSBnb29kIHBhZGRpbmcgZnJvbSB0aGUgYXJlYSB0aSBpY29uXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvblBhZGRpbmc6IG51bWJlciA9IDAuODtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZTogU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgIGRlY2tzOiBbXSxcbiAgfTtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByb3RlY3RlZCBub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG5vdEFyZWFFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgICAnQ09NUEFSVE1FTlRfV0FMTCcsXG4gIF07XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgXTtcblxuICBwcml2YXRlIF9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICBwcml2YXRlIF9zY3JvbGxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFN0YXJ0U2Nyb2xsUG9zID0gLTE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQWRkIGJsdXIgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVudGlyZSBjb21wb25lbnQgdG8gZGV0ZWN0IHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBjb21wb25lbnRcbiAgICAvLyBieSB1c2luZyB0YWIgbmF2aWdhdGlvbiBvciBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHJlc2V0IHRoZSBzZWxlY3RlZCBjb2FjaCBhbmQgcGxhY2UuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5fb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykpIHtcbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwcmVzZWxlY3RDb2FjaEluZGV4JykpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0/LmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTtcbiAgICB0aGlzLl9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTtcbiAgICB0aGlzLl9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk7XG4gIH1cblxuICAvKiogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlcycsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgID8gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGlmIChzZWF0UmVzZXJ2YXRpb25EZWNrICYmIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBoZWlnaHQgb2Ygb25lIGNvYWNoIGluY2x1ZGluZyBib3JkZXIgcGFkZGluZ1xuICAgICAgY29uc3QgY29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyA9XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaCAqIHRoaXMuYmFzZUdyaWRTaXplICsgdGhpcy5jb2FjaEJvcmRlclBhZGRpbmc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGdhcCBiZXR3ZWVuIG11bHRpcGxlIGNvYWNoIHRoZSBkZWNrcy5cbiAgICAgIC8vIE5vIGdhcCBleGlzdCBpZiBqdXN0IG9uZSBjb2FjaCBkZWNrIGV4aXN0LlxuICAgICAgY29uc3QgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSAodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hEZWNrcztcblxuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCcsXG4gICAgICAgIGAke2NvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgKiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoICsgZ2FwQmV0d2VlbkNvYWNoRGVja3N9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrcycsIGAke3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIEluaXQgdGhlIGNvYWNoTmF2QnV0dG9uRGltIGRpbWVuc2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgbmF2aWdhdGlvbiBsYXRlclxuICAgICAgY29uc3QgbmF2Q29hY2hlc0xpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVzTGlzdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICA/IGZpcnN0TGlFbGVEaW1lbnNpb24uaGVpZ2h0XG4gICAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uLndpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrKSB7XG4gICAgICAvLyBJbml0IHRoZSBzdGFydCBvZmZzZXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgY29hY2ggc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb25zXG4gICAgICBsZXQgY3VyckNhbGNUcmlnZ2VyUG9zID0gMDtcbiAgICAgIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5kZWNrQ29hY2hlc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgLy8gVGhlIGdhcCBpcyBtYXliZSBhZGp1c3RlZCBpZiBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY3MgZXhpc3RcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hTdHJ1Y3R1cmUud2lkdGggK1xuICAgICAgICAgICghY29hY2hTdHJ1Y3R1cmUuaGFzT3ZlcmhhbmdpbmdFbGVtZW50c1xuICAgICAgICAgICAgPyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzXG4gICAgICAgICAgICA6IDIgKiB0aGlzLmdhcEJldHdlZW5Db2FjaGVzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoU3RydWN0dXJlLndpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncpLFxuICAgICAgaDogTWF0aC5yb3VuZCh0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCksXG4gICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnkpLFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvLyBGSVhNRTogdGhlIG5hbWUgb2YgdGhpcyB2YXJpYWJsZSBhcHBlYXJzIGFzIGV2ZW50IG5hbWUgaW4gdGhlIHJlYWRtZVxuICAgIC8vICBkdWUgdG8gYSBidWcgaW4gdGhlIGN1c3RvbS1lbGVtZW50cy1tYW5pZmVzdCBsaWJyYXJ5LlxuICAgIC8vICBodHRwczovL2dpdGh1Yi5jb20vb3Blbi13Yy9jdXN0b20tZWxlbWVudHMtbWFuaWZlc3QvaXNzdWVzLzE0OVxuICAgIGNvbnN0IHNlbGVjdGVkcGxhY2VzID0gdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcztcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7U2JiU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudH1cbiAgICAgKiBFbWl0cyB3aGVuIGEgcGxhY2Ugd2FzIHNlbGVjdGVkIGFuZCByZXR1cm5zIGEgUGxhY2UgYXJyYXkgd2l0aCBhbGwgc2VsZWN0ZWQgcGxhY2VzLlxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgU2JiU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudChzZWxlY3RlZHBsYWNlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1twbGFjZURlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gRklYTUU6IHRoZSBuYW1lIG9mIHRoaXMgdmFyaWFibGUgYXBwZWFycyBhcyBldmVudCBuYW1lIGluIHRoZSByZWFkbWVcbiAgICAvLyAgZHVlIHRvIGEgYnVnIGluIHRoZSBjdXN0b20tZWxlbWVudHMtbWFuaWZlc3QgbGlicmFyeS5cbiAgICAvLyAgaHR0cHM6Ly9naXRodWIuY29tL29wZW4td2MvY3VzdG9tLWVsZW1lbnRzLW1hbmlmZXN0L2lzc3Vlcy8xNDlcbiAgICBjb25zdCBzZWxlY3RlZGNvYWNoID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCh0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgaWYgKHNlbGVjdGVkY29hY2gpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge1NiYlNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2hFdmVudH1cbiAgICAgICAqIEVtaXRzIHdoZW4gYSBjb2FjaCB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBDb2FjaFNlbGVjdGlvblxuICAgICAgICovXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFNiYlNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2hFdmVudChzZWxlY3RlZGNvYWNoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBsYWNlRWxlbWVudElkKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlTnVtYmVyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGNvYWNoRGVja0luZGV4ICsgJy0nICsgY29hY2hJbmRleCArICctJyArIHBsYWNlTnVtYmVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBjb2FjaCBsYXlvdXRzIHdpdGggZGlmZmVyZW50IGRlY2tzLFxuICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gZXh0ZW5kIHRoZSBvZmZzZXQgd2l0aCBlbXB0eSBjb2FjaGVzXG4gICAqIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHN0YWJsZSB2ZWhpY2xlIGxheW91dC5cbiAgICpcbiAgICogICAgICAgICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICovXG4gIHByaXZhdGUgX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTogdm9pZCB7XG4gICAgLy8gUHJlZmlsbCBvZmZzZXQgY291bnRlcnMgd2l0aCAwIHN0YXJ0IGluZGV4XG4gICAgY29uc3QgY29hY2hPZmZzZXRJbmRleENvdW50ZXIgPSBBcnJheSh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkuZmlsbCgwKTtcbiAgICAvLyBUYWtlcyB0aGUgbG93ZXIgZGVjayB3aGljaCBjb250YWlucyB0aGUgbWF4IG51bWJlcnMgb2YgY29hY2hlc1xuICAgIGNvbnN0IGxvd2VyRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV07XG5cbiAgICBsb3dlckRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChsb3dlckNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVja0NvYWNoSXRlbSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zW2NvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldXTtcbiAgICAgICAgaWYgKGxvd2VyQ29hY2hJdGVtLmlkICE9IGRlY2tDb2FjaEl0ZW0/LmlkKSB7XG4gICAgICAgICAgLy8gQWRkIEVtcHR5IG9mZnNldCBjb2FjaCB0byBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb25cbiAgICAgICAgICBjb25zdCBlbXB0eU9mZnNldENvYWNoID0ge1xuICAgICAgICAgICAgLi4ubG93ZXJDb2FjaEl0ZW0sXG4gICAgICAgICAgICBwbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3BlcnR5SWRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHJhdmVsQ2xhc3M6IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2ldLmNvYWNoSXRlbXMuc3BsaWNlKFxuICAgICAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0sXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZW1wdHlPZmZzZXRDb2FjaCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0rKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBvZiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiBBcnJheSBiYXNlZCBvbiB0aGUgdHJhbnNmZXJyZWQgcGxhY2VzXG4gICAqIHRoYXQgaGF2ZSB0aGUgc3RhdGUgU0VMRUNURUQgd2l0aGluIHRoZSBzZWF0UmVzZXJ2YXRpb24gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIF9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcGxhY2Ugc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzID0gW107XG5cbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/LmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PlxuICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29hY2gucGxhY2VzXG4gICAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgICBwbGFjZUlkLFxuICAgICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbiwgY29hY2hEZWNrSW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zXG4gICAqIEBwYXJhbSBjdXJyU2VsZWN0ZWRQbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgY3VyclNlbGVjdGVkUGxhY2U/OiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFjdXJyU2VsZWN0ZWRQbGFjZSB8fCBjdXJyU2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQpIHtcbiAgICAgICAgY29uc3QgcGxhY2VFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChwbGFjZVNlbGVjdGlvbi5pZCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChwbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9SZW1vdmVzIGFsbCBzZWxlY3RlZCBwbGFjZXMgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICBpZiAoY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoY29hY2hEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2NvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmRlY2tJbmRleCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4LFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaC5wbGFjZXMpO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCwgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBwbGFjZVxuICAgICAgPyB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJhdGlvbiBvZiB0aGUgdXNlZCBkb2N1bWVudHMgZm9udC1zaXplIHdoaWNoIG5lZWRzXG4gICAqIHRvIGJlIGRldGVybWluZWQgaW4gb3JkZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBDU1MgdmFsdWVzIHdpdGggcmVtXG4gICAqICovXG4gIHByaXZhdGUgX2RldGVybWluZUJhc2VGb250U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBjb25zdCBiYXNlRm9udFNpemUgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250U2l6ZSwgMTApO1xuICAgICAgLy9jYWxjdWxhdGUgcmVtIG9mIDFweFxuICAgICAgY29uc3Qgb25lUGl4ZWxJblJlbSA9IDEgLyBiYXNlRm9udFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtJywgYCR7b25lUGl4ZWxJblJlbSArICdyZW0nfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBkYXRhIGZvciBkaXNwbGF5aW5nIG5hdmlnYXRpb24gYXJlYS5cbiAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIHdoaWNoIGFyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGR1cmluZyB1c2Ugb2YgYSBjb21wb25lbnQ6XG4gICAqICAgIC0gY29hY2ggaWRcbiAgICogICAgLSBsaXN0IG9mIHNlcnZpY2UgaWNvbnNcbiAgICogICAgLSBjbGFzcyAoZmlyc3QsIHNlY29uZCwgYW55KVxuICAgKiAgICAtIHdoZXRoZXIgdGhlcmUgaXMgYSBkcml2ZXIgYXJlYSBsZWZ0IG9yIHJpZ2h0XG4gICAqICovXG4gIHByaXZhdGUgX3ByZXBhcmVDb2FjaEl0ZW1EZXRhaWxzRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBsb3dlckRlY2s6IENvYWNoSXRlbVtdID1cbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zO1xuXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cyA9IFtdO1xuXG4gICAgICBsb3dlckRlY2suZm9yRWFjaCgoY29hY2gsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUlkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGxhY2VzOiBQbGFjZVtdID0gW107XG5cbiAgICAgICAgLy8gQ29sbGVjdCBhbGwgaW1wb3J0YW50IG5hdmlnYXRpb24gZGF0YSB0byBiZSByZW5kZXJlZFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgICAubWFwKChzcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHNyLmNvYWNoSXRlbXNbaW5kZXhdO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZvckVhY2goKGNvYWNoOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRyYXZlbENsYXNzZXMucHVzaCguLi5jb2FjaC50cmF2ZWxDbGFzcyk7XG4gICAgICAgICAgICBwcm9wZXJ0eUlkcy5wdXNoKC4uLihjb2FjaC5wcm9wZXJ0eUlkcyA/IGNvYWNoLnByb3BlcnR5SWRzIDogW10pKTtcbiAgICAgICAgICAgIHBsYWNlcy5wdXNoKC4uLihjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMgOiBbXSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBjb2FjaC5pZCxcbiAgICAgICAgICB0cmF2ZWxDbGFzczogdGhpcy5fcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzKSxcbiAgICAgICAgICBwcm9wZXJ0eUlkczogdGhpcy5fcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24ocHJvcGVydHlJZHMpLFxuICAgICAgICAgIGlzRHJpdmVyQXJlYTogY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzLmxlbmd0aCA9PT0gMCA6IHRydWUsXG4gICAgICAgICAgaXNMb2NvbW90aXZlOiB0aGlzLl9pc0xvY29tb3RpdmUoY29hY2gpLFxuICAgICAgICAgIGRyaXZlckFyZWFTaWRlOiB0aGlzLl9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKGNvYWNoKSxcbiAgICAgICAgICBmcmVlUGxhY2VzOiB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2gocGxhY2VzKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyAjVElNTy00NTg1OFxuICAvLyBGaW5kcyB0aGUgb3B0aW1hbCBpY29uIHNpemUgYmFzZWQgb24gYWxsIHNlcnZpY2VFbGVtZW50cyBhbmQgdGhlaXIgZGltZW5zaW9uLlxuICAvLyBUaGlzIHNldHMgdGhlIGdsb2JhbEFyZWFJY29uRGltIGFuZCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBlbGVtZW50cy5cbiAgLy8gVGhpcyBnaXZlcyB1cyBhIG1heGltdW0gdW5pZm9ybSBpY29uIHNpemUgd2l0aGluIHRoZSBhcmVhIGVsZW1lbnRzXG4gIHByaXZhdGUgX3ByZXBhcmVPcHRpbWl6ZUFyZWFJY29uRGltZW5zaW9uQnlNZWRpYW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgYWxsU2VydmljZURpbWVuc2lvbnM6IEVsZW1lbnREaW1lbnNpb25bXSA9IFtdO1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZvckVhY2goKGRlY2spID0+XG4gICAgICAgIGRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChjb2FjaCkgPT5cbiAgICAgICAgICBjb2FjaC5zZXJ2aWNlRWxlbWVudHM/LmZvckVhY2goKGljb24pID0+IGFsbFNlcnZpY2VEaW1lbnNpb25zLnB1c2goaWNvbi5kaW1lbnNpb24pKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChhbGxTZXJ2aWNlRGltZW5zaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgYWxsU2VydmljZURpbWVuc2lvbnMuc29ydChcbiAgICAgICAgICAoZGltMTogRWxlbWVudERpbWVuc2lvbiB8IHVuZGVmaW5lZCwgZGltMjogRWxlbWVudERpbWVuc2lvbiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRpbTEgJiYgZGltMikge1xuICAgICAgICAgICAgICBjb25zdCBtYXhEaW0xID0gZGltMS53ICsgZGltMS5oO1xuICAgICAgICAgICAgICBjb25zdCBtYXhEaW0yID0gZGltMi53ICsgZGltMi5oO1xuICAgICAgICAgICAgICBpZiAobWF4RGltMSA+IG1heERpbTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhEaW0xIDwgbWF4RGltMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBiZXN0IGljb24gc2l6ZSBieSBtZWRpYW5cbiAgICAgICAgY29uc3QgbWVkaWFuSWNvblNpemUgPSBhbGxTZXJ2aWNlRGltZW5zaW9uc1tNYXRoLmZsb29yKGFsbFNlcnZpY2VEaW1lbnNpb25zLmxlbmd0aCAvIDIpXSE7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBkZXRlcm1pbmVkIG1lZGlhbiBpY29uIHNpemUgYXMgZ2xvYmFsIGNhbGN1bGF0ZWQgYXJlYSBpY29uIGRpbWVuc2lvblxuICAgICAgICB0aGlzLmdsb2JhbEFyZWFJY29uRGltID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKG1lZGlhbkljb25TaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZpbmQgdGhlIG1heGltdW0gY29hY2ggaGVpZ2h0IGZyb20gYWxsIGRlY2tzXG4gICAgICAgIGNvbnN0IG1heENvYWNoSGVpZ2h0ID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLmZsYXRNYXAoKGRlY2spID0+IGRlY2suY29hY2hJdGVtcy5tYXAoKGNvYWNoKSA9PiBjb2FjaC5kaW1lbnNpb24uaCkpXG4gICAgICAgICAgLnJlZHVjZSgobWF4LCBoZWlnaHQpID0+IE1hdGgubWF4KG1heCwgaGVpZ2h0KSwgMCk7XG5cbiAgICAgICAgLy9jYWxjdWxhdGUgMjAlIG9mIG1heGltdW0gaGVpZ2h0IGFzIGljb24gZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGljb25EaW1lbnNpb24gPSBNYXRoLmZsb29yKG1heENvYWNoSGVpZ2h0ICogMC4yKTtcbiAgICAgICAgdGhpcy5nbG9iYWxBcmVhSWNvbkRpbSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbih7XG4gICAgICAgICAgdzogaWNvbkRpbWVuc2lvbixcbiAgICAgICAgICBoOiBpY29uRGltZW5zaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSk6IFBsYWNlVHJhdmVsQ2xhc3Mge1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ0ZJUlNUJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJ0ZJUlNUJztcbiAgICB9XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignU0VDT05EJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJ1NFQ09ORCc7XG4gICAgfVxuICAgIHJldHVybiAnQU5ZX0NMQVNTJztcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2FjaERyaXZlckFyZWFzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgKGdyYXBoaWNhbEVsZW1lbnRzKSA9PiBncmFwaGljYWxFbGVtZW50cy5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICk7XG5cbiAgICBpZiAoY29hY2hEcml2ZXJBcmVhcyAmJiBjb2FjaERyaXZlckFyZWFzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBkcml2ZXIgYXJlYSBwb3NpdGlvbiB3aGV0aGVyIGl0IGlzIHByZXNlbnQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpbiBhIGNvYWNoXG4gICAgICBjb25zdCBoYXNMZWZ0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaGFzUmlnaHREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA+IDApIHx8IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAhIWhhc0xlZnREcml2ZXJBcmVhLFxuICAgICAgICByaWdodDogISFoYXNSaWdodERyaXZlckFyZWEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24gPSAocHJvcGVydHlJZHM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghcHJvcGVydHlJZHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaHJ1bmtQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJ1bmtQcm9wZXJ0eUlkcyA/IHNocnVua1Byb3BlcnR5SWRzIDogW107XG4gIH07XG5cbiAgLy8gSW5pdGlhbGx5IGNhbGN1bGF0ZXMgYWxsIHRoZSBuZWNlc3NhcnkgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGFsbCBjb2FjaCBlbGVtZW50cywgYXJlYSBlbGVtZW50cywgc2VydmljZSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUgPSB7XG4gICAgICAgIGRlY2tzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrOiBTZWF0cmVzZXJ2YXRpb25EZWNrID0ge1xuICAgICAgICAgIGRlY2tJbmRleDogaW5kZXgsXG4gICAgICAgICAgZGVja0NvYWNoZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcz8uZm9yRWFjaCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PiBlLmljb24gJiYgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGUuaWNvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhbGxFbGVtZW5ldHMgPVxuICAgICAgICAgICAgZmlsdGVyZWRBcmVhRWxlbWVudHNcbiAgICAgICAgICAgICAgPy5jb25jYXQoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyB8fCBbXSlcbiAgICAgICAgICAgICAgLmNvbmNhdChjb2FjaEl0ZW0ucGxhY2VzIHx8IFtdKSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24udyxcbiAgICAgICAgICAgIGFsbEVsZW1lbmV0cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHNcbiAgICAgICAgICAgID8uZmlsdGVyKFxuICAgICAgICAgICAgICAoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgdHJ1ZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG90aGVyRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcigoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlRWxlbWVudHMgPSBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzPy5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgIHRoaXMuX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoZWxlLCBjb2FjaEl0ZW0uZGltZW5zaW9uLCBmYWxzZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJNaWRkbGVFbGVtZW50ID0gdGhpcy5fZ2V0Q2FsY3VsYXRlZE1pZGRsZUJvcmRlckVsZW1lbnQoY29hY2hJdGVtKTtcbiAgICAgICAgICBjb25zdCBjYWxjQ29hY2hEaW1lbnNpb24gPSB0aGlzLmdldENhbGN1bGF0ZWREaW1lbnNpb24oeyAuLi5jb2FjaEl0ZW0uZGltZW5zaW9uIH0pO1xuICAgICAgICAgIC8vIENvbGxlY3QgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3Igc2luZ2xlIGNvYWNoXG4gICAgICAgICAgY29uc3QgY29hY2hTdHVyY3R1cmU6IENvYWNoU3RydWN0dXJlID0ge1xuICAgICAgICAgICAgd2lkdGg6IGNhbGNDb2FjaERpbWVuc2lvbi53LFxuICAgICAgICAgICAgaGVpZ2h0OiBjYWxjQ29hY2hEaW1lbnNpb24uaCxcbiAgICAgICAgICAgIG90aGVyRWxlbWVudHM6IG90aGVyRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBzZXJ2aWNlRWxlbWVudHM6IHNlcnZpY2VFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGFyZWFFbGVtZW50czogYXJlYUVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgYm9yZGVyTWlkZGxlRWxlbWVudDogYm9yZGVyTWlkZGxlRWxlbWVudCxcbiAgICAgICAgICAgIGhhc092ZXJoYW5naW5nRWxlbWVudHM6IGhhc092ZXJoYW5naW5nRWxlbWVudHMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suZGVja0NvYWNoZXMucHVzaChjb2FjaFN0dXJjdHVyZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzLnB1c2goc2VhdFJlc2VydmF0aW9uRGVjayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIG9mIHRoZSBtaWRkbGUgYm9yZGVyLlxuICAgKiBUbyBjYWxjdWxhdGUgdGhlIHN0YXJ0ICsgZW5kIGNvb3JkaW5hdGUgYW5kIHRoZSBkaW1lbnNpb24gb2YgdGhlIG1pZGRsZSBib3JkZXIgY29hY2ggZ3JhcGhpYyxcbiAgICogdGhlIGV4aXN0aW5nIGRvY2tpbmcgY29hY2ggZ3JhcGhpY3MgYXJlIGFuYWx5c2VkIGFuZCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgcG9zaXRpb24gYW5kIGRpZW1lbnNpb24gaW5mb3JtYXRpb24uXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9nZXRDYWxjdWxhdGVkTWlkZGxlQm9yZGVyRWxlbWVudChjb2FjaDogQ29hY2hJdGVtKTogQmFzZUVsZW1lbnQge1xuICAgIGNvbnN0IGJvcmRlckhlaWdodCA9IChjb2FjaC5kaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyKSAqIHRoaXMuYmFzZUdyaWRTaXplO1xuICAgIC8vIERlZmF1bHQgLSB3aXRob3V0IGZpbmRpbmcgZG9ja2luZyBib3JkZXIgZWxlbWVudHMsIHRoZSBtaWRkbGUgYm9yZGVyIGdvZXMgZnJvbSAwIHBvc2l0aW9uIHVudGlsIGNvYWNoIHdpZHRoIGVuZFxuICAgIGxldCBzdGFydEJvcmRlck9mZnNldFggPSAwO1xuICAgIGxldCBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53O1xuXG4gICAgaWYgKGNvYWNoLmdyYXBoaWNFbGVtZW50cykge1xuICAgICAgLy8gRG9ja2luZ0VsZW1lbnRlIGRlZmluZXMgdGhlIGVsZW1lbnRzIHdoZXJlIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIHJlYWxseSBzdGFydHMgYW5kIGVuZHNcbiAgICAgIGNvbnN0IGRvY2tpbmdFbGVtZW50cyA9IHRoaXMuX2dldEZpcnN0TGFzdERvY2tpbmdFbGVtZW50cyhjb2FjaC5ncmFwaGljRWxlbWVudHMpO1xuXG4gICAgICAvLyBUd28gZG9ja2luZyBjb2FjaCBlbGVtZW50cyBleGlzdCAobm9ybWFsIGNhc2UgLSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudClcbiAgICAgIGlmIChkb2NraW5nRWxlbWVudHM/Lmxlbmd0aCA9PSAyKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0RG9ja2luZ0VsZW1lbnQgPSBkb2NraW5nRWxlbWVudHNbMF07XG4gICAgICAgIGNvbnN0IGxhc3REb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1sxXTtcbiAgICAgICAgY29uc3QgZW5kQm9yZGVyT2Zmc2V0WCA9XG4gICAgICAgICAgZmlyc3REb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09IDBcbiAgICAgICAgICAgID8gbGFzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGZpcnN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG5cbiAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID1cbiAgICAgICAgICBmaXJzdERvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT0gMFxuICAgICAgICAgICAgPyBmaXJzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53XG4gICAgICAgICAgICA6IGxhc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcblxuICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZW5kQm9yZGVyT2Zmc2V0WCAtIHN0YXJ0Qm9yZGVyT2Zmc2V0WDtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgb25lIGRvY2tpbmcgYm9yZGVyIGNvYWNoIGVsZW1lbnRzIGV4aXN0IChzdGFydCBvciBlbmQgZG9ja2luZyBlbGVtZW50KVxuICAgICAgZWxzZSBpZiAoZG9ja2luZ0VsZW1lbnRzPy5sZW5ndGggPT0gMSkge1xuICAgICAgICBjb25zdCBkb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1swXTtcblxuICAgICAgICAvLyBNaWRkbGVCb3JkZXIgc3RhcnRzIGZyb20gbGVmdCBkb2NraW5nIGVsZW1lbnQgdW50aWwgY29hY2ggZW5kXG4gICAgICAgIGlmIChkb2NraW5nRWxlbWVudC5wb3NpdGlvbi54ID09PSAwKSB7XG4gICAgICAgICAgc3RhcnRCb3JkZXJPZmZzZXRYID0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgICAgYm9yZGVyV2lkdGggPSBjb2FjaC5kaW1lbnNpb24udyAtIGRvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pZGRsZUJvcmRlciBzdGFydHMgZnJvbSBwb3NpdGlvbiB4IDAgdW50aWwgZG9ja2luZyBlbGVtZW50IG9uIHRoZSByaWdodCBjb2FjaCBzaWRlXG4gICAgICAgIGVsc2UgaWYgKGRvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggIT09IDApIHtcbiAgICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5T2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgKiAtMTtcbiAgICAvLyBUaGUgYm9yZGVyIGhhcyB0byBiZSBtb3ZlZCBtYW51YWwgYnkgMXB4IGxlZnQgYW5kIGFsc28gc3RyZXRjaGVkIGJ5IDJweCB0byBnZXQgYSBjbG9zZWQgYm9yZGVyIGxpbmUgdG8gdGhlIGNvYWNoIHN0YXJ0IGFuZCBlbmQgYm9yZGVyIGVsZW1lbnRzLCB3aXRob3V0IDFweCB3aGl0ZSBnYXAuXG4gICAgY29uc3QgcG9zID0geyB4OiBNYXRoLmZsb29yKHN0YXJ0Qm9yZGVyT2Zmc2V0WCAqIHRoaXMuYmFzZUdyaWRTaXplKSAtIDEsIHk6IHlPZmZzZXQsIHo6IDAgfTtcbiAgICBjb25zdCBkaW0gPSB7IHc6IE1hdGguZmxvb3IoYm9yZGVyV2lkdGggKiB0aGlzLmJhc2VHcmlkU2l6ZSkgKyAyLCBoOiBib3JkZXJIZWlnaHQgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogcG9zLFxuICAgICAgZGltZW5zaW9uOiBkaW0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdyYXBoaWNhbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdGFydCBhbmQgZW5kIGJvcmRlciBlbGVtZW50cyBvZiB0aGUgY29hY2guXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50W11cbiAgICovXG4gIHByaXZhdGUgX2dldEZpcnN0TGFzdERvY2tpbmdFbGVtZW50cyhncmFwaGljRWxlbWVudHM6IEJhc2VFbGVtZW50W10pOiBCYXNlRWxlbWVudFtdIHtcbiAgICAvLyBHZXQgYWxsIHJlbGV2YW50IGRvY2tpbmcgZWxlbWVudHMgYW5kIHNvcnRzIHRoZW0gYWdhaW4gYWNjb3JkaW5nIHRvIHRoZWlyIHggcG9zaXRpb24gY29vcmRpbmF0ZXMsXG4gICAgLy8gdGh1cyB0aGUgc3RhcnQgYW5kIGVuZCBkb2NraW5nIGVsZW1lbnRzIHdvdWxkIGJlIGRlZmluZWRcbiAgICBjb25zdCBmaWx0ZXJlZERvY2tpbmdFbGVtZW50cyA9IChcbiAgICAgIGdyYXBoaWNFbGVtZW50cy5maWx0ZXIoKGVsZSkgPT4gdGhpcy5taWRkbGVCb3JkZXJEb2NraW5nRWxlbWVudHMuaW5jbHVkZXMoZWxlLmljb24hKSkgfHwgW11cbiAgICApLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IHBvc0EgPSBhLnBvc2l0aW9uLng7XG4gICAgICBjb25zdCBwb3NCID0gYi5wb3NpdGlvbi54O1xuICAgICAgaWYgKHBvc0EgPiBwb3NCKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgaWYgKHBvc0EgPCBwb3NCKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzLmZpbHRlcihcbiAgICAgIChfLCBpbmRleCkgPT4gaW5kZXggPT0gMCB8fCBpbmRleCA9PSBmaWx0ZXJlZERvY2tpbmdFbGVtZW50cy5sZW5ndGggLSAxLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCBwb3NpdGlvbnMgYW5kIGRpbWVuc2lvbnMgb2YgZ3JhcGhpY2FsLCBzZXJ2aWNlIGFuZCBhcmVhIGVsZW1lbnRzXG4gICAqIEByZXR1cm5zIEJhc2VFbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KFxuICAgIGVsZW1lbnQ6IEJhc2VFbGVtZW50LFxuICAgIGNvYWNoRGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzQ2FsY0FyZWFFbGVtZW50OiBib29sZWFuLFxuICApOiBCYXNlRWxlbWVudCB7XG4gICAgY29uc3QgZGltID0geyAuLi5lbGVtZW50LmRpbWVuc2lvbiB9O1xuICAgIGNvbnN0IHBvcyA9IHsgLi4uZWxlbWVudC5wb3NpdGlvbiB9O1xuICAgIGNvbnN0IHJvdGF0aW9uID0gZWxlbWVudC5yb3RhdGlvbiB8fCAwO1xuICAgIGNvbnN0IGlzTm90Rml4ZWRSb3RhdGlvbkdyYXBoaWNhbEVsZW1lbnQgPVxuICAgICAgdGhpcy5ub3RBcmVhRWxlbWVudHMuY29uY2F0KHRoaXMubm90Rml4ZWRSb3RhdGFibGVBcmVhSWNvbnMpLmluZGV4T2YoZWxlbWVudC5pY29uISkgPT09IC0xO1xuICAgIGNvbnN0IGNhbGNSb3RhdGlvbiA9XG4gICAgICB0aGlzLmFsaWduVmVydGljYWwgJiYgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA/IHJvdGF0aW9uIC0gOTAgOiByb3RhdGlvbjtcbiAgICBsZXQgYXJlYU1vdW50aW5nOiBFbGVtZW50TW91bnRpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIGZvciBBcmVhRWxlbWVudHNcbiAgICBpZiAoaXNDYWxjQXJlYUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGlzTm90VGFibGVHcmFwaGljID0gZWxlbWVudC5pY29uPy5pbmRleE9mKCdUQUJMRScpID09PSAtMTtcbiAgICAgIGNvbnN0IGFyZWFQcm9wZXJ0eSA9IGVsZW1lbnQuaWNvbiAmJiBpc05vdFRhYmxlR3JhcGhpYyA/IGVsZW1lbnQuaWNvbiA6IG51bGw7XG4gICAgICBjb25zdCBzdHJldGNoSGVpZ2h0ID1cbiAgICAgICAgdGhpcy5pc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKGVsZW1lbnQsIGNvYWNoRGltZW5zaW9uKSAmJiBhcmVhUHJvcGVydHkgIT09ICdFTlRSWV9FWElUJztcblxuICAgICAgaWYgKGVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBhcmVhTW91bnRpbmcgPSAndXBwZXItYm9yZGVyJztcbiAgICAgICAgcG9zLnkgLT0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAtIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLyAzO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnBvc2l0aW9uLnkgKyBlbGVtZW50LmRpbWVuc2lvbi5oID09PSBjb2FjaERpbWVuc2lvbi5oKSB7XG4gICAgICAgIGFyZWFNb3VudGluZyA9ICdsb3dlci1ib3JkZXInO1xuICAgICAgICBpZiAoIXN0cmV0Y2hIZWlnaHQpIHtcbiAgICAgICAgICBwb3MueSArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmV0Y2hIZWlnaHQpIHtcbiAgICAgICAgZGltLmggKz0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAtIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLyAzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbiBmb3IgYWxsIG90aGVyIGdyYXBoaWNhbCBlbGVtZW50c1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGVsZW1lbnQucG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBwb3MueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29hY2hEaW1lbnNpb24uaCA9PT0gZWxlbWVudC5wb3NpdGlvbi55ICsgZWxlbWVudC5kaW1lbnNpb24uaCkge1xuICAgICAgICBkaW0uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkaW0udyA9IE1hdGguZmxvb3IoZGltLncgKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG4gICAgZGltLmggPSBNYXRoLmZsb29yKGRpbS5oICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgcG9zLnggPSBNYXRoLmZsb29yKHBvcy54ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuICAgIHBvcy55ID0gTWF0aC5mbG9vcihwb3MueSAqIHRoaXMuYmFzZUdyaWRTaXplKTtcblxuICAgIGNvbnN0IGljb24gPVxuICAgICAgZWxlbWVudC5pY29uICYmIGVsZW1lbnQuaWNvbi5lbmRzV2l0aCgnRFJJVkVSX0FSRUEnKVxuICAgICAgICA/IGVsZW1lbnQuaWNvbj8uY29uY2F0KCdfJywgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS52ZWhpY2xlVHlwZSlcbiAgICAgICAgOiBlbGVtZW50Lmljb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogaWNvbixcbiAgICAgIHJvdGF0aW9uOiBjYWxjUm90YXRpb24sXG4gICAgICBkaW1lbnNpb246IGRpbSxcbiAgICAgIHBvc2l0aW9uOiBwb3MsXG4gICAgICBtb3VudGluZzogYXJlYU1vdW50aW5nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzZWxlY3RlZCBwbGFjZSBIVE1MIGVsZW1lbnQgYnkgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEByZXR1cm5zIEhUTUxFbGVtZW50IG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldFBsYWNlSHRtbEVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZFxuICAgICAgPyB0aGlzLnNoYWRvd1Jvb3Q/LmdldEVsZW1lbnRCeUlkKHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHx8IG51bGxcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleHRyYWN0ZWQgY29hY2ggZGVjayBpbmRleCBmcm9tIHBsYWNlIGlkXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGVja0luZGV4QnlQbGFjZUlkKHBsYWNlSWQ6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGRlY2tJbmRleCA9IHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5xdWVyeVNlbGVjdG9yKCcjJyArIHBsYWNlSWQpXG4gICAgICA/LmdldEF0dHJpYnV0ZSgnZGF0YS1kZWNrLWluZGV4Jyk7XG4gICAgaWYgKGRlY2tJbmRleCAmJiAhaXNOYU4oK2RlY2tJbmRleCkpIHtcbiAgICAgIHJldHVybiArZGVja0luZGV4O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWRDb2FjaEluZGV4KGNvYWNoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb2FjaEluZGV4ID49IDAgJiZcbiAgICAgIGNvYWNoSW5kZXggPD0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBleGlzdGluZyBjb2FjaCBkZWNrIGluZGV4IGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgY29hY2guXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5lY2Vzc2FyeSB0byBnZXQgYW4gYXZhaWxhYmxlIGNvYWNoIGRlY2sgaW5kZXggZHVyaW5nIGtleWJvYXJkIG5hdmlnYXRpb24sIHdoaWNoIGNhbiB2YXJ5IGJldHdlZW4gY29hY2hlcyB3aXRoIGRpZmZlcmVudCBkZWNrcy5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gbmF2aWdhdGluZyBmcm9tIGEgY29hY2ggd2l0aCB0d28gZGVja3MgdG8gYSBjb2FjaCB3aXRoIG9uZSBkZWNrLlxuICAgKlxuICAgKiAgICAgICBbb29vXS1bb29vXS1bb29vXVxuICAgKiBbb29vXS1bb29vXS1bb29vXS1bb29vXS1bb29vXVxuICAgKlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldEV4aXN0aW5nQ29hY2hEZWNrSW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XVxuICAgICAgICAucGxhY2VzICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleDtcbiAgICB9XG5cbiAgICAvLyBGaW5kIG5leHQgcG9zc2libGUgY29hY2ggZGVjayBpbmRleCB3aGVyZSBwbGFjZXMgZXhpc3RcbiAgICBjb25zdCBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXggPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnMuZmluZEluZGV4KFxuICAgICAgKHNlYXRSZXNlcnZhdGlvbikgPT5cbiAgICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXNbdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XS5wbGFjZXMgIT09IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA+PSBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXhcbiAgICAgID8gdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgIDogbmV4dEF2YWlsYWJsZURlY2tDb2FjaEluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGEgc2VsZWN0ZWQgcGxhY2UgaXMgc2xpZ2h0bHkgaGlkZGVuIGJ5IHRoZSBvdmVyZmxvdyBzY3JvbGwgY29udGVudCBhbmQgaXMgc3RpbGwgY2xpY2tlZCxcbiAgICogdGhlIG1ldGhvZCB0cmllcyB0byBzY3JvbGwgdGhlIHNlbGVjdGVkIHBsYWNlIGludG8gdGhlIG5lYXJlc3Qgdmlld3BvcnQsIHNvIHRoYXQgaXQgaXMgY29tcGxldGVseSB2aXNpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgPy5nZXRFbGVtZW50QnlJZChwbGFjZUlkKVxuICAgICAgPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JywgaW5saW5lOiAnbmVhcmVzdCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2tzIGlmIGFueSBwbGFjZXMgb3IgZ3JhcGhpY2FsIGVsZW1lbnRzIChlLmcuIHRvaWxldCBhcmVhLCBldGMuKSBhcmUgb3ZlcmhhbmdpbmcgdGhlIGNvYWNoIGJvcmRlcnNcbiAgICogQHBhcmFtIGNvYWNoSXRlbVdpZHRoXG4gICAqIEBwYXJhbSBlbGVtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBfaXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICBjb2FjaEl0ZW1XaWR0aDogbnVtYmVyLFxuICAgIGVsZW1lbnRzOiAoUGxhY2UgfCBCYXNlRWxlbWVudClbXSB8IHVuZGVmaW5lZCxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVsZW1lbnRzPy5zb21lKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnBvc2l0aW9uLnggPT09IDAgfHwgZWxlbWVudC5wb3NpdGlvbi54ICsgZWxlbWVudC5kaW1lbnNpb24udyA+PSBjb2FjaEl0ZW1XaWR0aCxcbiAgICAgICkgPz8gZmFsc2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlckFyZWFzIGZvciBvbmUgY29hY2hcbiAgICogQHBhcmFtIGNvYWNoSXRlbVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNMb2NvbW90aXZlKGNvYWNoSXRlbTogQ29hY2hJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSXRlbT8uZ3JhcGhpY0VsZW1lbnRzPy5maW5kKFxuICAgICAgICAoZWxlbWVudDogQmFzZUVsZW1lbnQpID0+IGVsZW1lbnQuaWNvbiA9PT0gJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICAgKSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgU2VhdFJlc2VydmF0aW9uIGxvc2VzIGZvY3VzLCB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgdXNlciB0YWJzIG91dCBvciBjbGlja3Mgc29tZXdoZXJlIGVsc2UuXG4gICAqIFRoZW4gd2UgcmVzZXQgdGhlIGZvY3VzZWQgZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIF9vbkxlYXZlU2VhdFJlc2VydmF0aW9uQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBaUNBLElBQUs7Q0FBTCxTQUFLLGlCQUFlO0NBQ2xCLGdCQUFBLFdBQUE7Q0FDQSxnQkFBQSxVQUFBO0FBQ0YsR0FISyxvQkFBQSxrQkFBZSxDQUFBLEVBQUE7QUE4QnBCLElBQU0seUJBQXlCO0FBQy9CLElBQU0sd0JBQWtDO0NBQ3RDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztBQUdGLElBQWEsd0NBQWIsY0FBMkQsTUFBSztDQUc5RCxJQUFXLFNBQU07RUFDZixPQUFP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
|
|
1476
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzLWV4cGVyaW1lbnRhbC9zZWF0LXJlc2VydmF0aW9uL3NlYXQtcmVzZXJ2YXRpb24vc2VhdC1yZXNlcnZhdGlvbi1iYXNlLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZm9yY2VUeXBlLFxuICBpc0Fycm93S2V5T3JQYWdlS2V5c1ByZXNzZWQsXG4gIFNiYkVsZW1lbnQsXG59IGZyb20gJ0BzYmItZXN0YS9seW5lLWVsZW1lbnRzL2NvcmUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2ZXIsIHR5cGUgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZXZlbnRPcHRpb25zLCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7XG4gIG1hcENvYWNoSW5mb3NUb0NvYWNoU2VsZWN0aW9uLFxuICBtYXBJY29uVG9TdmcsXG4gIG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBtYXBQbGFjZUluZm9zVG9QbGFjZVNlbGVjdGlvbixcbn0gZnJvbSAnLi4vY29tbW9uL21hcHBlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJhc2VFbGVtZW50LFxuICBDb2FjaEl0ZW0sXG4gIENvYWNoSXRlbURldGFpbHMsXG4gIENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzLFxuICBFbGVtZW50RGltZW5zaW9uLFxuICBFbGVtZW50TW91bnRpbmcsXG4gIEVsZW1lbnRQb3NpdGlvbixcbiAgUGxhY2UsXG4gIFBsYWNlU2VsZWN0aW9uLFxuICBQbGFjZVRyYXZlbENsYXNzLFxuICBTZWF0UmVzZXJ2YXRpb24sXG4gIFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoLFxuICBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcyxcbiAgVHJhdmVsRGlyZWN0aW9uLFxufSBmcm9tICcuLi9jb21tb24vdHlwZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTZWF0UmVzZXJ2YXRpb25QbGFjZUNvbnRyb2xFbGVtZW50IH0gZnJvbSAnLi4vc2VhdC1yZXNlcnZhdGlvbi1wbGFjZS1jb250cm9sL3NlYXQtcmVzZXJ2YXRpb24tcGxhY2UtY29udHJvbC5jb21wb25lbnQudHMnO1xuXG5lbnVtIFNjcm9sbERpcmVjdGlvbiB7XG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgbGVmdCA9ICdsZWZ0Jyxcbn1cblxuaW50ZXJmYWNlIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTZWF0cmVzZXJ2YXRpb25TdHJ1Y3R1cmUge1xuICBkZWNrczogU2VhdHJlc2VydmF0aW9uRGVja1tdO1xufVxuXG5pbnRlcmZhY2UgU2VhdHJlc2VydmF0aW9uRGVjayB7XG4gIGRlY2tJbmRleDogbnVtYmVyO1xuICBkZWNrQ29hY2hlczogQ29hY2hTdHJ1Y3R1cmVbXTtcbn1cblxuaW50ZXJmYWNlIENvYWNoU3RydWN0dXJlIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGFyZWFFbGVtZW50czogQmFzZUVsZW1lbnRbXTtcbiAgc2VydmljZUVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBvdGhlckVsZW1lbnRzOiBCYXNlRWxlbWVudFtdO1xuICBib3JkZXJNaWRkbGVFbGVtZW50OiBCYXNlRWxlbWVudDtcbiAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogYm9vbGVhbjtcbn1cblxuY29uc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyA9IDM7XG5jb25zdCBBTExPV0VEX1NFUlZJQ0VfSUNPTlM6IHN0cmluZ1tdID0gW1xuICAnc2Etdm8nLFxuICAnc2EtcnMnLFxuICAnc2EtYWJ0ZWlsa2luZGVyd2FnZW4nLFxuICAnc2Etd3InLFxuICAnc2EtZmEnLFxuICAnc2EtYnonLFxuICAnc2EtcnonLFxuXTtcblxuZXhwb3J0IGNsYXNzIFNiYlNlYXRSZXNlcnZhdGlvblNlbGVjdGVkUGxhY2VzRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RldGFpbDogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXM7XG5cbiAgcHVibGljIGdldCBkZXRhaWwoKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMge1xuICAgIHJldHVybiB0aGlzLl9kZXRhaWw7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoZGV0YWlsOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZFBsYWNlcykge1xuICAgIHN1cGVyKCdzZWxlY3RlZHBsYWNlcycsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7XG4gICAgdGhpcy5fZGV0YWlsID0gZGV0YWlsO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTYmJTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RldGFpbDogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaDtcblxuICBwdWJsaWMgZ2V0IGRldGFpbCgpOiBTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoIHtcbiAgICByZXR1cm4gdGhpcy5fZGV0YWlsO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRldGFpbDogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCkge1xuICAgIHN1cGVyKCdzZWxlY3RlZGNvYWNoJywgeyBidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KTtcbiAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlYXRSZXNlcnZhdGlvbkJhc2VFbGVtZW50IGV4dGVuZHMgU2JiRWxlbWVudCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHNlbGVjdGVkcGxhY2VzOiAnc2VsZWN0ZWRwbGFjZXMnLFxuICAgIHNlbGVjdGVkY29hY2g6ICdzZWxlY3RlZGNvYWNoJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb25zIGFycmF5IGNvbnRhaW5zIGFsbCBjb2FjaGVzIGFuZCBwbGFjZXMgKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBBcnJheSB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2VhdFJlc2VydmF0aW9uczogU2VhdFJlc2VydmF0aW9uW10gPSBudWxsITtcblxuICAvKiogRGlzcGxheXMgYW4gYXJyb3cgc2hvd2luZyB3aGF0IGRpcmVjdGlvbiBkb2VzIHRyYWluIGRyaXZlKi9cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndHJhdmVsLWRpcmVjdGlvbicsIHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgYWNjZXNzb3IgdHJhdmVsRGlyZWN0aW9uOiBUcmF2ZWxEaXJlY3Rpb24gPSAnTk9ORSc7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIG5hdmlnYXRpb24gY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnaGFzLW5hdmlnYXRpb24nLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBoYXNOYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogVGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2FsaWduLXZlcnRpY2FsJywgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSwgdXNlRGVmYXVsdDogdHJ1ZSB9KVxuICBwdWJsaWMgYWNjZXNzb3IgYWxpZ25WZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3MgYmFzZSBncmlkIHNpemUgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2Jhc2UtZ3JpZC1zaXplJywgdHlwZTogTnVtYmVyIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBiYXNlR3JpZFNpemU6IG51bWJlciA9IDE2O1xuXG4gIC8qKiBUaGUgc2VhdCByZXNlcnZhdGlvbiBhcmVhJ3Mgd2lkdGggKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2hlaWdodCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgaGVpZ2h0OiBudW1iZXIgPSBudWxsITtcblxuICAvKiogTWF4aW1hbCBudW1iZXIgb2YgcG9zc2libGUgY2xpY2thYmxlIHNlYXRzICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdtYXgtc2VhdC1yZXNlcnZhdGlvbnMnLCB0eXBlOiBOdW1iZXIgfSlcbiAgcHVibGljIGFjY2Vzc29yIG1heFNlYXRSZXNlcnZhdGlvbnM6IG51bWJlciA9IC0xO1xuXG4gIC8qKiBNYXhpbWFsIG51bWJlciBvZiBwb3NzaWJsZSBjbGlja2FibGUgYmljeWNsZSBwbGFjZXMgKi9cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ21heC1iaWN5Y2xlLXJlc2VydmF0aW9ucycsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbWF4QmljeWNsZVJlc2VydmF0aW9uczogbnVtYmVyID0gLTE7XG5cbiAgLyoqIEFueSBjbGljayBmdW5jdGlvbmFsaXR5IGlzIHByZXZlbnRlZCAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAncHJldmVudC1wbGFjZS1jbGljaycsIHR5cGU6IEJvb2xlYW4gfSlcbiAgcHVibGljIGFjY2Vzc29yIHByZXZlbnRQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQGZvcmNlVHlwZSgpXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3ByZXNlbGVjdC1jb2FjaC1pbmRleCcsIHR5cGU6IE51bWJlciB9KVxuICBwdWJsaWMgYWNjZXNzb3IgcHJlc2VsZWN0Q29hY2hJbmRleDogbnVtYmVyID0gLTE7XG5cbiAgLyoqIFRoZSBzZWF0IHJlc2VydmF0aW9uIHRpdGxlIGluZm9ybWF0aW9uIGF0IHBsYWNlLWNvbnRyb2xzLCBuYXZpZ2F0aW9uLWNvYWNoZXMgYW5kIG5hdmlnYXRpb24tc2VydmljZXMgY2FuIGJlIHRvZ2dsZWQgYnkgdGhpcyBwcm9wZXJ0eSAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnc2hvdy10aXRsZS1pbmZvJywgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3Igc2hvd1RpdGxlSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpIHByb3RlY3RlZCBhY2Nlc3NvciBzZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgZm9jdXNlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBAc3RhdGUoKSBwcm90ZWN0ZWQgYWNjZXNzb3IgaG92ZXJlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIERlc2NyaWJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYm9yZGVyIG9mIHRoZSBjb2FjaCBhbmQgdGhlIHBsYWNlcyBpbiBwaXhlbHNcbiAgcHJvdGVjdGVkIGNvYWNoQm9yZGVyUGFkZGluZyA9IDY7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgaW4gcGl4ZWxzXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hlcyA9IDQ7XG4gIC8vIFRoZSBjYWxjdWxhdGVkIGNvYWNoQm9yZGVyT2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGNvYWNoIGJvcmRlciBncmFwaGljLFxuICAvLyBidXQgYWxzbyB0byBwb3NpdGlvbiBvdGhlciBncmFwaGljcyB0aGF0IGFyZSBhbGlnbmVkIGRpcmVjdGx5IHRvIHRoZSBjb2FjaCBib3JkZXIuXG4gIHByb3RlY3RlZCBjb2FjaEJvcmRlck9mZnNldCA9IHRoaXMuY29hY2hCb3JkZXJQYWRkaW5nIC8gdGhpcy5iYXNlR3JpZFNpemU7XG4gIC8vIERlc2NyaWJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXMgZGVja3MgYnkgbXVsdGlwbGUgZGVjayB2aXN1YWxpemF0aW9uXG4gIHByb3RlY3RlZCBnYXBCZXR3ZWVuQ29hY2hEZWNrcyA9IDQ4O1xuICAvLyBEZXNjcmliZXMgdGhlIGZpeCB3aWR0aCBvZiBjb2FjaCBuYXZpZ2F0aW9uIGJ1dHRvblxuICBwcm90ZWN0ZWQgY29hY2hOYXZCdXR0b25EaW06IG51bWJlciA9IDA7XG4gIC8vIERlc2NyaWJlcyB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gZm9yIHRoZSBhcmVhIGljb25zLCB3aGljaCBpcyB1c2VkIHRvIHNldCB0aGUgbWF4IHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaWNvbnNcbiAgcHJvdGVjdGVkIGdsb2JhbEFyZWFJY29uRGltOiBFbGVtZW50RGltZW5zaW9uID0geyB3OiAyLCBoOiAyIH07XG4gIC8vICNUSU1PLTQ1ODU4XG4gIC8vIERlc2NyaWJlcyB0aGUgcGFkZGluZyBmb3IgdGhlIGljb24gd2l0aGluIHRoZSBhcmVhIGFzIGEgcGVyY2VudGFnZSBzaXplIG9mIHRoZSBhcmVhIHNlbGYuIDgwJSAoMC44IHBlcmNlbnQpIGNvcnJlc3BvbmRzXG4gIC8vIHRvIGEgZ29vZCBvcHRpY2FsIHNpemUgYW5kIGNyZWF0ZXMgYSBnb29kIHBhZGRpbmcgZnJvbSB0aGUgYXJlYSB0aSBpY29uXG4gIHByb3RlY3RlZCBnbG9iYWxBcmVhSWNvblBhZGRpbmc6IG51bWJlciA9IDAuODtcbiAgcHJvdGVjdGVkIGNvYWNoSXRlbURldGFpbHNFbGVtZW50czogQ29hY2hJdGVtRGV0YWlsc1tdID0gW107XG4gIHByb3RlY3RlZCBjdXJyU2Nyb2xsRGlyZWN0aW9uOiBTY3JvbGxEaXJlY3Rpb24gPSBTY3JvbGxEaXJlY3Rpb24ucmlnaHQ7XG4gIHByb3RlY3RlZCBtYXhDYWxjQ29hY2hlc1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHNjcm9sbE5hdmlnYXRpb25BcmVhRGltOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvbjogQ29hY2hTY3JvbGxUcmlnZ2VyUG9pbnRbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbmF2aWdhdGlvblNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjb2FjaFNjcm9sbEFyZWE6IEhUTUxFbGVtZW50ID0gbnVsbCE7XG4gIHByb3RlY3RlZCBjdXJyU2VsZWN0ZWRQbGFjZTogUGxhY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGN1cnJTZWxlY3RlZENvYWNoSW5kZXg6IG51bWJlciA9IC0xO1xuICBwcm90ZWN0ZWQgY3VyclNlbGVjdGVkRGVja0luZGV4OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgcHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlczogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXMgPSB7XG4gICAgc2VhdHM6IFtdLFxuICAgIGJpY3ljbGVzOiBbXSxcbiAgfTtcbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvbldpdGhvdXROYXZpZ2F0aW9uSGFzRm9jdXMgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc0F1dG9TY3JvbGxpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzS2V5Ym9hcmROYXZpZ2F0aW9uID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNNdWx0aXBsZURlY2tzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBoYXNTZWF0UmVzZXJ2YXRpb25OYXRpdmVGb2N1cyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQga2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzID0ge1xuICAgIEFycm93TGVmdDogJ0Fycm93TGVmdCcsXG4gICAgQXJyb3dSaWdodDogJ0Fycm93UmlnaHQnLFxuICAgIEFycm93VXA6ICdBcnJvd1VwJyxcbiAgICBBcnJvd0Rvd246ICdBcnJvd0Rvd24nLFxuICAgIFRhYjogJ1RhYicsXG4gICAgRW50ZXI6ICdFbnRlcicsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJvdGVjdGVkIHNlYXRSZXNlcnZhdGlvblN0cnVjdHVyZTogU2VhdHJlc2VydmF0aW9uU3RydWN0dXJlID0ge1xuICAgIGRlY2tzOiBbXSxcbiAgfTtcblxuICAvLyBBcmVhIGljb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBmaXhlZCBkdXJpbmcgcm90YXRpb24gd2hlbiB2ZXJ0aWNhbCBtb2RlIGlzIHNlbGVjdGVkXG4gIHByb3RlY3RlZCBub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucyA9IFsnRU5UUllfRVhJVCddO1xuXG4gIC8vIEdyYXBoaWNzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW5kZXJlZCB3aXRoIGFuIGFyZWFcbiAgcHJvdGVjdGVkIG5vdEFyZWFFbGVtZW50cyA9IFtcbiAgICAnRFJJVkVSX0FSRUEnLFxuICAgICdEUklWRVJfQVJFQV9OT19WRVJUSUNBTF9XQUxMJyxcbiAgICAnQ09BQ0hfUEFTU0FHRScsXG4gICAgJ0NPQUNIX1dBTExfTk9fUEFTU0FHRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0UnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX0hJR0gnLFxuICAgICdDT01QQVJUTUVOVF9QQVNTQUdFX01JRERMRScsXG4gICAgJ0NPTVBBUlRNRU5UX1BBU1NBR0VfTE9XJyxcbiAgICAnQ09NUEFSVE1FTlRfV0FMTCcsXG4gIF07XG5cbiAgLy8gR3JhcGhpY3MgdGhhdCBzaG91bGQgbm90IGJlIHJlbmRlcmVkIHdpdGggYW4gYXJlYVxuICBwcm90ZWN0ZWQgbWlkZGxlQm9yZGVyRG9ja2luZ0VsZW1lbnRzID0gW1xuICAgICdEUklWRVJfQVJFQScsXG4gICAgJ0RSSVZFUl9BUkVBX05PX1ZFUlRJQ0FMX1dBTEwnLFxuICAgICdDT0FDSF9QQVNTQUdFJyxcbiAgICAnQ09BQ0hfV0FMTF9OT19QQVNTQUdFJyxcbiAgXTtcblxuICBwcml2YXRlIF9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICBwcml2YXRlIF9zY3JvbGxUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdFN0YXJ0U2Nyb2xsUG9zID0gLTE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gQWRkIGJsdXIgZXZlbnQgbGlzdGVuZXIgb24gdGhlIGVudGlyZSBjb21wb25lbnQgdG8gZGV0ZWN0IHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBjb21wb25lbnRcbiAgICAvLyBieSB1c2luZyB0YWIgbmF2aWdhdGlvbiBvciBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQuIEluIHRoaXMgY2FzZSwgd2UgY2FuIHJlc2V0IHRoZSBzZWxlY3RlZCBjb2FjaCBhbmQgcGxhY2UuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5fb25MZWF2ZVNlYXRSZXNlcnZhdGlvbkNvbXBvbmVudCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2VhdFJlc2VydmF0aW9ucycpKSB7XG4gICAgICB0aGlzLmhhc011bHRpcGxlRGVja3MgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/Lmxlbmd0aCA+IDE7XG5cbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5faW5pdFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLmluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2Jhc2VHcmlkU2l6ZScpKSB7XG4gICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgIHRoaXMuc3R5bGU/LnNldFByb3BlcnR5KCctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWdyaWQtc2l6ZScsIGAke3RoaXMuYmFzZUdyaWRTaXplfXB4YCk7XG4gICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgIHRoaXMuaW5pdE5hdmlnYXRpb25TZWxlY3Rpb25CeVNjcm9sbEV2ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlaWdodCBpcyB1c2VkLCB0aGUgYmFzZUdyaWRTaXplIG11c3QgYmUgcmVjYWxjdWxhdGVkXG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnaGVpZ2h0JykgJiYgISF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uTGF5ZXIgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdIHx8IG51bGw7XG4gICAgICBpZiAoc2VhdFJlc2VydmF0aW9uTGF5ZXI/LmNvYWNoSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplID0gdGhpcy5oZWlnaHQgLyBzZWF0UmVzZXJ2YXRpb25MYXllci5jb2FjaEl0ZW1zWzBdLmRpbWVuc2lvbi5oO1xuICAgICAgICB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ID0gdGhpcy5jb2FjaEJvcmRlclBhZGRpbmcgLyB0aGlzLmJhc2VHcmlkU2l6ZTtcbiAgICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoJy0tc2JiLXNlYXQtcmVzZXJ2YXRpb24tZ3JpZC1zaXplJywgYCR7dGhpcy5iYXNlR3JpZFNpemV9cHhgKTtcblxuICAgICAgICB0aGlzLl9pbml0UHJlcGFyZVNlYXRSZXNlcnZhdGlvbkRhdGEoKTtcbiAgICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdhbGlnblZlcnRpY2FsJykpIHtcbiAgICAgIHRoaXMuX2luaXRQcmVwYXJlU2VhdFJlc2VydmF0aW9uRGF0YSgpO1xuICAgICAgdGhpcy5pbml0TmF2aWdhdGlvblNlbGVjdGlvbkJ5U2Nyb2xsRXZlbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdwcmVzZWxlY3RDb2FjaEluZGV4JykpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2l0aG91dCwgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCkgd291bGQgZmFpbCB3aXRoIE5QRSBiZWNhdXNlXG4gICAgICAvLyB0aGUgY29hY2hTY3JvbGxBcmVhIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb1NlbGVjdGVkTmF2Q29hY2godGhpcy5wcmVzZWxlY3RDb2FjaEluZGV4KSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG5hdmlnYXRlQnlEaXJlY3Rpb25CdG4oYnRuRGlyZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgICBsZXQgbmF2aWdhdGVUb0NvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgaWYgKGJ0bkRpcmVjdGlvbiA9PSAnRElSRUNUSU9OX0xFRlQnICYmIG5hdmlnYXRlVG9Db2FjaEluZGV4ID4gMCkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggLSAxIDogMDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnRuRGlyZWN0aW9uID09ICdESVJFQ1RJT05fUklHSFQnICYmXG4gICAgICBuYXZpZ2F0ZVRvQ29hY2hJbmRleCA8XG4gICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0/LmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICkge1xuICAgICAgbmF2aWdhdGVUb0NvYWNoSW5kZXggPVxuICAgICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT0gLTEgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggKyAxIDogMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuYXZpZ2F0ZVRvQ29hY2hJbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBjYW4gYmUgcHJlcGFyZWQgb25jZSBmb3IgdGhlIGVudGlyZSBjb21wb25lbnRcbiAgICogaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJyaW5nIGl0ZXJhdGlvbiBwcm9jZXNzZXMgaW4gcmVuZGVyaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfaW5pdFByZXBhcmVTZWF0UmVzZXJ2YXRpb25EYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2RldGVybWluZUJhc2VGb250U2l6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVEZWNrcykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2tzLCB3ZSBuZWVkIHRvIGNoZWNrXG4gICAgICAvLyB3aGV0aGVyIGVtcHR5IGNvYWNoZXMgbmVlZCB0byBiZSBhZGRlZCBvbiBkaWZmZXJlbnQgZGVjayBsZXZlbHNcbiAgICAgIHRoaXMuX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmVwYXJlQ29hY2hJdGVtRGV0YWlsc0RhdGEoKTtcbiAgICB0aGlzLl9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTtcbiAgICB0aGlzLl9wcmVwYXJlT3B0aW1pemVBcmVhSWNvbkRpbWVuc2lvbkJ5TWVkaWFuKCk7XG4gIH1cblxuICAvKiogSW5pdCBzY3JvbGwgZXZlbnQgaGFuZGxpbmcgZm9yIGNvYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJvdGVjdGVkIGluaXROYXZpZ2F0aW9uU2VsZWN0aW9uQnlTY3JvbGxFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvYWNoU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX193cmFwcGVyLXNjcm9sbGFyZWEnLFxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Nyb2xsQXJlYSA9IHRoaXMuc2hhZG93Um9vdD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICcjc2JiLXNyX19uYXZpZ2F0aW9uLWxpc3QtY29hY2hlcycsXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0IHNlYXRSZXNlcnZhdGlvbkRlY2sgPSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgID8gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XVxuICAgICAgOiBudWxsO1xuICAgIGlmIChzZWF0UmVzZXJ2YXRpb25EZWNrICYmIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBoZWlnaHQgb2Ygb25lIGNvYWNoIGluY2x1ZGluZyBib3JkZXIgcGFkZGluZ1xuICAgICAgY29uc3QgY29hY2hIZWlnaHRXaXRoQm9yZGVyUGFkZGluZyA9XG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbkRlY2suY29hY2hJdGVtc1swXS5kaW1lbnNpb24uaCAqIHRoaXMuYmFzZUdyaWRTaXplICsgdGhpcy5jb2FjaEJvcmRlclBhZGRpbmc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGdhcCBiZXR3ZWVuIG11bHRpcGxlIGNvYWNoIHRoZSBkZWNrcy5cbiAgICAgIC8vIE5vIGdhcCBleGlzdCBpZiBqdXN0IG9uZSBjb2FjaCBkZWNrIGV4aXN0LlxuICAgICAgY29uc3QgZ2FwQmV0d2VlbkNvYWNoRGVja3MgPSAodGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDEpICogdGhpcy5nYXBCZXR3ZWVuQ29hY2hEZWNrcztcblxuICAgICAgdGhpcy5zdHlsZT8uc2V0UHJvcGVydHkoXG4gICAgICAgICctLXNiYi1zZWF0LXJlc2VydmF0aW9uLWhlaWdodCcsXG4gICAgICAgIGAke2NvYWNoSGVpZ2h0V2l0aEJvcmRlclBhZGRpbmcgKiB0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoICsgZ2FwQmV0d2VlbkNvYWNoRGVja3N9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1kZWNrcycsIGAke3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsTmF2aWdhdGlvbkFyZWFEaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgPyB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMubmF2aWdhdGlvblNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgIC8vIEluaXQgdGhlIGNvYWNoTmF2QnV0dG9uRGltIGRpbWVuc2lvbiwgd2hpY2ggaXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgbmF2aWdhdGlvbiBsYXRlclxuICAgICAgY29uc3QgbmF2Q29hY2hlc0xpc3QgPSB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnF1ZXJ5U2VsZWN0b3IoJ3VsID4gbGknKSBhcyBIVE1MVUxpc3RFbGVtZW50O1xuICAgICAgaWYgKG5hdkNvYWNoZXNMaXN0KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGlFbGVEaW1lbnNpb24gPSBuYXZDb2FjaGVzTGlzdD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29hY2hOYXZCdXR0b25EaW0gPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICA/IGZpcnN0TGlFbGVEaW1lbnNpb24uaGVpZ2h0XG4gICAgICAgICAgOiBmaXJzdExpRWxlRGltZW5zaW9uLndpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWNoU2Nyb2xsQXJlYSAmJiBzZWF0UmVzZXJ2YXRpb25EZWNrKSB7XG4gICAgICAvLyBJbml0IHRoZSBzdGFydCBvZmZzZXQgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgY29hY2ggc2Nyb2xsIHRyaWdnZXIgcG9zaXRpb25zXG4gICAgICBsZXQgY3VyckNhbGNUcmlnZ2VyUG9zID0gMDtcbiAgICAgIHRoaXMuc2Nyb2xsQ29hY2hlc0FyZWFXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICA/IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuXG4gICAgICAvLyBQcmVjYWxjdWxhdGUgdHJpZ2dlciBzY3JvbGwgcG9zaXRpb24gYXJyYXkgZGVwZW5kcyBvbiBjb2FjaCB3aWR0aFxuICAgICAgdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uID0gc2VhdFJlc2VydmF0aW9uRGVjay5jb2FjaEl0ZW1zLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29hY2hTdHJ1Y3R1cmUgPVxuICAgICAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uU3RydWN0dXJlLmRlY2tzW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5kZWNrQ29hY2hlc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9zWCA9IGN1cnJDYWxjVHJpZ2dlclBvcztcblxuICAgICAgICAvLyBDYWxjdWxhdGlvbiBvZiB0aGUgZW5kIHNjcm9sbCB0cmlnZ2VyIHBvc2l0aW9uIG9mIGEgY29hY2gsIGluY2x1ZGluZyB0aGUgZ2FwIGJldHdlZW4gdGhlIGNvYWNoZXNcbiAgICAgICAgLy8gVGhlIGdhcCBpcyBtYXliZSBhZGp1c3RlZCBpZiBvdmVyaGFuZ2luZyBwbGFjZXMgb3IgZ3JhcGhpY3MgZXhpc3RcbiAgICAgICAgY3VyckNhbGNUcmlnZ2VyUG9zICs9XG4gICAgICAgICAgY29hY2hTdHJ1Y3R1cmUud2lkdGggK1xuICAgICAgICAgICghY29hY2hTdHJ1Y3R1cmUuaGFzT3ZlcmhhbmdpbmdFbGVtZW50c1xuICAgICAgICAgICAgPyB0aGlzLmdhcEJldHdlZW5Db2FjaGVzXG4gICAgICAgICAgICA6IDIgKiB0aGlzLmdhcEJldHdlZW5Db2FjaGVzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFBvc1gsXG4gICAgICAgICAgZW5kOiBjdXJyQ2FsY1RyaWdnZXJQb3MsXG4gICAgICAgICAgd2lkdGg6IGNvYWNoU3RydWN0dXJlLndpZHRoLFxuICAgICAgICB9IGFzIENvYWNoU2Nyb2xsVHJpZ2dlclBvaW50O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBtYXhpbXVtIGNhbGN1bGF0ZWQgY29hY2ggd2lkdGhcbiAgICAgIHRoaXMubWF4Q2FsY0NvYWNoZXNXaWR0aCA9IGN1cnJDYWxjVHJpZ2dlclBvcyAtIHRoaXMuZ2FwQmV0d2VlbkNvYWNoZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCBldmVudCBoYW5kbGVyIG1hbmFnZWQgdGhlIGVuZCBvZiBzY3JvbGxpbmcgaW5zaWRlIHRoZSBjb2FjaCBzY3JvbGwgYXJlYS5cbiAgICogVGltZW91dCBldmVudCBoYW5kbGluZyB0byBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC5cbiAgICogSXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgU2FmYXJpIGJyb3dzZXIgZG9lcyBub3QgaGFuZGxlIHNjcm9sbGVuZCBldmVudCxcbiAgICogYW5kIHdlIHRoZXJlZm9yZSBpbWl0YXRlIHRoaXMgZXZlbnQgLT4gc2Nyb2xsZW5kLlxuICAgKi9cbiAgQGV2ZW50T3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSlcbiAgcHJvdGVjdGVkIGNvYWNoQXJlYVNjcm9sbGVuZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsVGltZW91dCkge1xuICAgICAgLy8gRmlyc3QsIHdlIGNsZWFyZWQgdGhlIHJlZ2lzdGVyZWQgdGltZW91dCwgYXMgdGhlIHNjcm9sbGluZyBpcyBzdGlsbCBydW5uaW5nXG4gICAgICAvLyBhbmQgdGh1cyB3ZSBwcmV2ZW50IHRoZSBleGVjdXRpb24gb2YgdGhlIF9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCBmdW5jdGlvblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRpbWVvdXQpO1xuICAgIH1cbiAgICAvLyBJZiBubyBmdXJ0aGVyIHNjcm9sbCBldmVudCBpcyBmaXJlZCwgdGhlIG5leHQgdGltZW91dCBjYW4gZXhlY3V0ZSB0aGUgaW5uZXIgZnVuY3Rpb24gX2hhbmRsZUNvYWNoQXJlYVNjcm9sbGVuZEV2ZW50IHdpdGhvdXQgY2xlYXJpbmdcbiAgICB0aGlzLl9zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9oYW5kbGVDb2FjaEFyZWFTY3JvbGxlbmRFdmVudCgpLCAxNTApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIG5vIG5hdmlnYXRpb24gZXhpc3RzIChwcm9wZXJ0eSBzZXR0aW5nIC0+IGhhc05hdmlnYXRpb24pIGFuZCBhIHRhYmxlIGNvYWNoIGdldHMgdGhlIGZvY3VzLFxuICAgKiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoIG11c3QgYmUgYXV0b21hdGljYWxseSBwcmVzZWxlY3RlZCB0byBjb250cm9sIHRoZSBwbGFjZSBuYXZpZ2F0aW9uIHZpYSBrZXlib2FyZFxuICAgKlxuICAgKiBAcGFyYW0gZm9jdXNDb2FjaEluZGV4XG4gICAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c1RhYmxlQ29hY2hBbmRQcmVzZWxlY3RQbGFjZShmb2N1c0NvYWNoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25XaXRob3V0TmF2aWdhdGlvbkhhc0ZvY3VzICYmICF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uV2l0aG91dE5hdmlnYXRpb25IYXNGb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPVxuICAgICAgICBmb2N1c0NvYWNoSW5kZXggPT09IDBcbiAgICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoLTEpXG4gICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGZvY3VzQ29hY2hJbmRleCk7XG4gICAgICB0aGlzLnByZXNlbGVjdFBsYWNlSW5Db2FjaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBXaWxsIGJlIHRyaWdnZXJlZCBieSBmb2N1cyBuYXZpZ2F0aW9uIGRpcmVjdGlvbiAqL1xuICBwcm90ZWN0ZWQgb25Gb2N1c05hdkRpcmVjdGlvbkJ1dHRvbigpOiB2b2lkIHtcbiAgICAvLyBJZiBhbnkgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYnV0dG9uIChyaWdodHxsZWZ0KSBnZXQgdGhlIGZvY3VzLCBzbyB3ZSBoYXZlIG1hbnVhbCByZXNldCB0aGUgcHJldmlvdXMgZm9jdXNDb2FjaEluZGV4LlxuICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgfVxuXG4gIC8qKiBUQUIgS2V5IEV2ZW50IGhhbmRsaW5nIGZvciBDb2FjaCBOYXZpZ2F0aW9uICovXG4gIHByb3RlY3RlZCBvbktleU5hdmlnYXRpb25OYXZDb2FjaEJ1dHRvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBjdXJyTmF2Q29hY2hCdXR0b25JbmRleDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5UYWIpIHtcbiAgICAgIHRoaXMuX2hhbmRsZVRhYktleU5hdmlnYXRpb24oZXZlbnQsICduYXZpZ2F0aW9uJywgY3Vyck5hdkNvYWNoQnV0dG9uSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEJ5IHVzaW5nIGFueSBvdGhlciBrZXkgKG5vIFRBQikgaW5zaWRlIHRoZSBOYXZpZ2F0aW9uIGFyZWEsIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBieSB1c2luZyB0aGUgbG9naWMgZnJvbSBrZXlib2FyZFNlYXRtYXBFdmVudEhhbmRsaW5nXG4gICAgaWYgKGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdlbmVyYWwgVEFCIEtleSBFdmVudCBoYW5kbGluZyBmb3IgdGFiIG5hdmlnYXRpb24gaW5zaWRlIHRoZSBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEgYW5kIHRoZSBzZWF0bWFwIGFyZWEgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVGFiS2V5TmF2aWdhdGlvbihcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICBldmVudEFyZWE6IHN0cmluZyxcbiAgICBjdXJyVGFiSW5kZXg/OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByZXNzZWRLZXkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgcHJlc3NlZFNoaWZ0VGFiID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICBpZiAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiKSB7XG4gICAgICAvLyBIYW5kbGUgVEFCIGtleSBldmVudCBuYXZpZ2F0aW9uIGZvciBjb2FjaCBuYXZpZ2F0aW9uIGFyZWEuXG4gICAgICAvLyBGcHIgY29hY2ggbmF2aWdhdGlvbiB3ZSBqdXN0IGNvbnRyb2wgdGhlIGZvY3VzIGluZGV4IHRvIHZpc3VhbGl6ZSBmb2N1cyBzdHlsZSBmb3IgbmF2IGNvYWNoIGJ1dHRvblxuICAgICAgaWYgKGV2ZW50QXJlYSA9PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgaWYgKGN1cnJUYWJJbmRleCA9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSB8fFxuICAgICAgICAgICAgIXByZXNzZWRTaGlmdFRhYiB8fFxuICAgICAgICAgICAgdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHNbY3VyclRhYkluZGV4XS5pc0RyaXZlckFyZWEgfHxcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBjdXJyVGFiSW5kZXg7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcmVzc2VkU2hpZnRUYWIgJiYgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSkge1xuICAgICAgICAgICAgLy9JZiB0aGUgRm9yIGJhY2sgdGFiYmluZywgd2UganVtcFxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1BsYWNlRWxlbWVudCh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJUYWJJbmRleCE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihjdXJyVGFiSW5kZXghKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBUQUIga2V5IGV2ZW50IG5hdmlnYXRpb24gZm9yIHNlYXRtYXAgYXJlYVxuICAgICAgZWxzZSBpZiAoZXZlbnRBcmVhID09ICdzZWF0bWFwJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAocHJlc3NlZFNoaWZ0VGFiKSB7XG4gICAgICAgICAgdGhpcy5fbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKCdQUkVWX1RBQicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hdmlnYXRlQ29hY2hOYXZpZ2F0aW9uQnlLZXlib2FyZCgnTkVYVF9UQUInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXNhdGlvbiBvZiBLZXlib2FyZCBTZWF0bWFwIGV2ZW50IGhhbmRsaW5nIHRvIG5hdmlnYXRpb24gYmV0d2VlbiBlYWNoIHBsYWNlcyBpbnNpZGUgYSBzZWxlY3RlZCBjb2FjaCBieSB1c2luZyBbYXJyb3ddIGtleXMuXG4gICAqIFdpdGggdGhlIFtUQUJdIGtleSB0aGUgdXNlciBuYXZpZ2F0aW9uIGdvZXMgdG8gdGhlIG5leHQgY29hY2ggbmF2aWdhdGlvbiBlbGVtZW50IGFuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQuXG4gICAqL1xuICBwcm90ZWN0ZWQga2V5Ym9hcmRTZWF0bWFwRXZlbnRIYW5kbGluZyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzVGFiTmV4dCA9IGV2ZW50LmtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuVGFiO1xuICAgIGNvbnN0IGlzVGFiUHJldiA9IGV2ZW50LnNoaWZ0S2V5ICYmIGlzVGFiTmV4dDtcblxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QgYW5kIHRoZSBmaXJzdCBvciBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkLCB0aGUgdGhlIHVzZSB0cmllcyB0byBsZWF2ZSB0aGUgc2VhdCByZXNlcnZhdGlvbiBjb21wb25lbnQgYnkgdXNpbmcgdGFiLFxuICAgIC8vIHNvIHdlIGNhbiByZXR1cm4gaGVyZSBhbmQgYWxsb3cgdGhlIG5hdGl2ZSBmb2N1cyB0byBsZWF2ZSB0aGUgY29tcG9uZW50LlxuICAgIGlmIChcbiAgICAgICghdGhpcy5oYXNOYXZpZ2F0aW9uICYmIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9PT0gMCAmJiBpc1RhYlByZXYpIHx8XG4gICAgICAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cy5sZW5ndGggLSAxICYmIGlzVGFiTmV4dClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzc2VkS2V5ID0gZXZlbnQua2V5O1xuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgLy8gQ2hlY2sgYW55IGtleWJvYXJkIGV2ZW50IHdhcyB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBzZWF0IHJlc2VydmF0aW9uIGNvbXBvbmVudCxcbiAgICAvLyBzbyB3ZSBjYW4gc2F5IHRoZSBuYXRpdmUgYnJvd3NlciBmb2N1cyBsaWVzIG9uIHRoZSBjb21wb25lbnRcbiAgICBpZiAoIXRoaXMuaGFzU2VhdFJlc2VydmF0aW9uTmF0aXZlRm9jdXMgJiYgKGlzVGFiTmV4dCB8fCBpc1RhYlByZXYpKSB7XG4gICAgICB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgcGxhY2UgaXMgc2VsZWN0ZWQgYW5kIFRBQiBLZXkgY29tYmluYXRpb24gaXN0IHByZXNzZWQsXG4gICAgLy8gdGhlbiB3ZSBoYW5kbGUgdGhlIG5leHQgb3IgcHJldmlvdXMgY29hY2ggc2VsZWN0aW9uXG4gICAgaWYgKGlzVGFiTmV4dCkge1xuICAgICAgdGhpcy5faGFuZGxlVGFiS2V5TmF2aWdhdGlvbihldmVudCwgJ3NlYXRtYXAnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcnJvdyBLZXlib2FyZCBuYXZpZ2F0aW9uIHRvIGNvbnRyb2wgcGxhY2VzIGluc2lkZSB0aGUgc2VhdG1hcFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggIT09IC0xICYmIGlzQXJyb3dLZXlPclBhZ2VLZXlzUHJlc3NlZChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN3aXRjaCAocHJlc3NlZEtleSkge1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBwcmVzc2VkTGVmdEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93blxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRMZWZ0S2V5TWFwcGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZFJpZ2h0S2V5TWFwcGluZzogc3RyaW5nID0gdGhpcy5hbGlnblZlcnRpY2FsXG4gICAgICAgICAgICAgID8gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRSaWdodEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1VwOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNzZWRVcEtleU1hcHBpbmc6IHN0cmluZyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgICAgICAgICA/IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93TGVmdFxuICAgICAgICAgICAgICA6IHByZXNzZWRLZXk7XG4gICAgICAgICAgICB0aGlzLl9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRVcEtleU1hcHBpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd246XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcHJlc3NlZERvd25LZXlNYXBwaW5nOiBzdHJpbmcgPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgICAgICAgICAgPyB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0XG4gICAgICAgICAgICAgIDogcHJlc3NlZEtleTtcbiAgICAgICAgICAgIHRoaXMuX25hdmlnYXRlVG9QbGFjZUJ5S2V5Ym9hcmQocHJlc3NlZERvd25LZXlNYXBwaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBwbGFjZSBpbnNpZGUgdGhlIGNvYWNoIGlmIG5hdmlnYXRlZCB2aWEga2V5Ym9hcmQsXG4gICAqIG90aGVyd2lzZSB0aGUgY29hY2ggZ3JpZCBpcyBzZWxlY3RlZCAobmVjZXNzYXJ5IGZvciBTY3JlZW5SZWFkZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk6IHZvaWQge1xuICAgIC8vIE5vIHByZXNlbGVjdCBwbGFjZSBieSBtYW51YWwgc2VhdG1hcCBzY3JvbGxpbmdcbiAgICBpZiAoIXRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gYXV0byBwbGFjZSBwcmVzZWxlY3Rpb24gYnkgcnVubmluZyB0aGUgcHJlc2VsZWN0IGNvYWNoIGluZGV4XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZ0luaXRQcmVzZWxlY3RDb2FjaEluZGV4KSB7XG4gICAgICB0aGlzLl9pc1J1bm5pbmdJbml0UHJlc2VsZWN0Q29hY2hJbmRleCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBEcml2ZXJBcmVhIG9yIEVtcHR5IGNvYWNoIChubyBwbGFjZXMpLCBubyBwbGFjZSBpcyBzZWxlY3RhYmxlLCBzbyB3ZSByZXR1cm4gZGlyZWN0bHlcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdICYmXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50c1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLmlzRHJpdmVyQXJlYVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSB3aGVuIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCBhbmQgY29hY2hlcyBhcmUgc2Nyb2xsZWQgYnkgYXV0byBzY3JvbGxpbmcsXG4gICAgLy8gdGhlbiB3ZSBjYW4gc2V0IHRoZSBmb2N1cyBvbiB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIGNvYWNoLlxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuaXNBdXRvU2Nyb2xsaW5nKSB7XG4gICAgICBjb25zdCBjbG9zZXN0UGxhY2UgPSB0aGlzLl9nZXRDbG9zZXN0UGxhY2VCeUtleURpcmVjdGlvbigpO1xuICAgICAgLy9JZiBjbG9zZXN0UGxhY2UgZXhpc3QsIHdlIGhhdmUgdG8gdW5mb2N1cyBwcmV2aW91cyBmb2N1c2VkIHBsYWNlXG4gICAgICBpZiAoY2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGxhY2VFbGVtZW50KGNsb3Nlc3RQbGFjZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGEgY29hY2ggd2FzIHNlbGVjdGVkIHdpdGggbm8gcGxhY2VzLCB0aGVuIHdlIGhhdmUgdG8gZm9jdXMgdGhlIGNvYWNoR3JpZFxuICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gY2FzZXMgd2hlcmUgdGhlIHByZXNlbGVjdGlvbiBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgbm9ybWFsIGNsaWNraW5nIG9yIHZpYSBzY3JlZW4gcmVhZGVyIHZpYSB0YWIsXG4gICAgLy8gd2Ugb25seSBmb2N1cyB0aGUgdGFibGUgd2l0aG91dCBkaXJlY3RseSBmb2N1c2luZyB0aGUgcGxhY2UuXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcblxuICAgICAgdGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9TZWxlY3RlZE5hdkNvYWNoKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5faXNWYWxpZENvYWNoSW5kZXgoc2VsZWN0ZWROYXZDb2FjaEluZGV4KSAmJlxuICAgICAgc2VsZWN0ZWROYXZDb2FjaEluZGV4ICE9PSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuaG92ZXJlZENvYWNoSW5kZXggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXg7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IHRydWU7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IHNlbGVjdGVkTmF2Q29hY2hJbmRleDtcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gdGhpcy5fZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpO1xuICAgICAgdGhpcy5fc2V0U2Nyb2xsRGlyZWN0aW9uQnlDb2FjaEluZGV4KCk7XG5cbiAgICAgIGNvbnN0IHNjcm9sbFRvQ29hY2hQb3NYID0gdGhpcy5fZ2V0Q29hY2hTY3JvbGxQb3NpdGlvblgoKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWRDb2FjaEluZGV4U2Nyb2xsYWJsZSA9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ICE9PSAtMSB8fCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPiAwO1xuXG4gICAgICAvLyBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gYWxsb3dzIHNjcm9sbGluZyB0byB0aGUgbmV4dCB3YWdvbiBvciBub3RcbiAgICAgIGlmIChpc1NlbGVjdGVkQ29hY2hJbmRleFNjcm9sbGFibGUgJiYgdGhpcy5faXNTY3JvbGxhYmxlVG9TZWxlY3RlZENvYWNoKCkpIHtcbiAgICAgICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogdGhpcy5hbGlnblZlcnRpY2FsID8gc2Nyb2xsVG9Db2FjaFBvc1ggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxUb0NvYWNoUG9zWCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBzZWxlY3RlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihzZWxlY3RlZE5hdkNvYWNoSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBmb2N1c1BsYWNlRWxlbWVudChwbGFjZTogUGxhY2UgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy51bmZvY3VzUGxhY2VFbGVtZW50KCk7XG4gICAgaWYgKHBsYWNlKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gcGxhY2U7XG4gICAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VFbGVtZW50ID0gdGhpcy5fZ2V0UGxhY2VIdG1sRWxlbWVudCgpO1xuICAgICAgaWYgKHNlbGVjdGVkUGxhY2VFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAnZm9jdXMnKTtcblxuICAgICAgICAvL1RyeSB0byBzY3JvbGwgZm9jdXNlZCBwbGFjZSBpbnRvIHRoZSB2aWV3cG9ydFxuICAgICAgICBjb25zdCBkZWxheVNjcm9sbEluVmlld3BvcnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4LFxuICAgICAgICAgICAgcGxhY2UubnVtYmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2Nyb2xsUGxhY2VJbnRvTmVhcmVzdFZpZXdwb3J0KHBsYWNlSWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dChkZWxheVNjcm9sbEluVmlld3BvcnQpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdW5mb2N1c1BsYWNlRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICBpZiAoc2VsZWN0ZWRQbGFjZUVsZW1lbnQpIHtcbiAgICAgIHNlbGVjdGVkUGxhY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgna2V5Zm9jdXMnLCAndW5mb2N1cycpO1xuICAgICAgdGhpcy5fc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQobnVsbCk7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbihcbiAgICBlbGVtZW50RGltZW5zaW9uOiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGNvYWNoRGltZW5zaW9uPzogRWxlbWVudERpbWVuc2lvbixcbiAgICBpc09yaWdpbkhlaWdodD86IGJvb2xlYW4sXG4gICAgaXNTdHJldGNoSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudERpbWVuc2lvbiB7XG4gICAgaWYgKGNvYWNoRGltZW5zaW9uICYmICFpc09yaWdpbkhlaWdodCkge1xuICAgICAgLy8gU2luY2UgdGhlIGhlaWdodCBvZiB0aGUgY29hY2ggaGFzIGJlZW4gdmlzdWFsbHkgZXhwYW5kZWQgdG8gbWFpbnRhaW4gYSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBib3JkZXIgb2YgdGhlIGNvYWNoIGFuZCB0aGUgcGxhY2VzLFxuICAgICAgLy8gc29tZSBncmFwaGljcyBtdXN0IGFsc28gYmUgYWRhcHRlZCB0byB0aGUgaGVpZ2h0LCB3aGljaCBlbmQgd2l0aCB0aGUgYm9yZGVycyBvZiB0aGUgY29hY2hcbiAgICAgIGVsZW1lbnREaW1lbnNpb24uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0ICogMjtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJldGNoSGVpZ2h0KSB7XG4gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBncmFwaGljcyBhcmUgYXNzaWduZWQgZGlyZWN0bHkgYXQgdGhlIGJvcmRlciBvZiB0aGUgY29hY2gsXG4gICAgICAvLyB0aGVzZSBncmFwaGljcyBtdXN0IGJlIGV4cGFuZGVkIGluIGhlaWdodCBieSBhIGNvYWNoQm9yZGVyT2Zmc2V0IGluIG9yZGVyIHRvIHJlYWNoIHRoZWlyIG9yaWdpbmFsIHZpc3VhbCBwb3NpdGlvblxuICAgICAgZWxlbWVudERpbWVuc2lvbi5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHc6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50RGltZW5zaW9uLncpLFxuICAgICAgaDogTWF0aC5yb3VuZCh0aGlzLmJhc2VHcmlkU2l6ZSAqIGVsZW1lbnREaW1lbnNpb24uaCksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWxjdWxhdGVkUG9zaXRpb24oXG4gICAgZWxlbWVudFBvc2l0aW9uOiBFbGVtZW50UG9zaXRpb24sXG4gICAgZWxlbWVudERpbWVuc2lvbj86IEVsZW1lbnREaW1lbnNpb24sXG4gICAgY29hY2hEaW1lbnNpb24/OiBFbGVtZW50RGltZW5zaW9uLFxuICAgIGlzT3JpZ2luSGVpZ2h0PzogYm9vbGVhbixcbiAgKTogRWxlbWVudFBvc2l0aW9uIHtcbiAgICBpZiAoY29hY2hEaW1lbnNpb24gJiYgZWxlbWVudERpbWVuc2lvbikge1xuICAgICAgY29uc3QgZW5kUG9zSGVpZ2h0ID0gaXNPcmlnaW5IZWlnaHRcbiAgICAgICAgPyBjb2FjaERpbWVuc2lvbi5oXG4gICAgICAgIDogY29hY2hEaW1lbnNpb24uaCArIHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBjb2FjaCwgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgWSBjb29yZGluYXRlIHdpdGggdGhlIGFkZGl0aW9uYWwgYm9yZGVyIHBhZGRpbmdcbiAgICAgIGlmIChlbGVtZW50UG9zaXRpb24ueSA9PT0gMCkge1xuICAgICAgICBlbGVtZW50UG9zaXRpb24ueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50UG9zaXRpb24ueSArIGVsZW1lbnREaW1lbnNpb24uaCA9PT0gZW5kUG9zSGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbi55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IE1hdGgucm91bmQodGhpcy5iYXNlR3JpZFNpemUgKiBlbGVtZW50UG9zaXRpb24ueCksXG4gICAgICB5OiBNYXRoLnJvdW5kKHRoaXMuYmFzZUdyaWRTaXplICogZWxlbWVudFBvc2l0aW9uLnkpLFxuICAgICAgejogZWxlbWVudFBvc2l0aW9uLnosXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRlY3RzIGlmIGEgKGdyYXBoaWNhbCkgZWxlbWVudCBpcyBvbiB0aGUgYm9yZGVyIHdpdGggaXRzIHBvc2l0aW9uICh1cHBlciBvciBsb3dlciBib3JkZXIpLlxuICAgKiBAcGFyYW0gYmFzZUVsZW1lbnRcbiAgICogQHBhcmFtIGNvYWNoRGltZW5zaW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0VsZW1lbnREaXJlY3RseU9uQm9yZGVyKFxuICAgIGJhc2VFbGVtZW50OiBCYXNlRWxlbWVudCxcbiAgICBjb2FjaERpbWVuc2lvbjogRWxlbWVudERpbWVuc2lvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgPT09IDAgfHxcbiAgICAgIGJhc2VFbGVtZW50LnBvc2l0aW9uLnkgKyBiYXNlRWxlbWVudC5kaW1lbnNpb24uaCA9PT0gY29hY2hEaW1lbnNpb24uaFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIGFsbCBhdmFpbGFibGUgc2VhdHMgdG9nZXRoZXIgZGVwZW5kaW5nIG9uIHRoZSBzZWF0IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHBsYWNlc1xuICAgKiBAcmV0dXJucyBBbiBPYmplY3Qgd2l0aCBjb3VudCBvZiBmcmVlIHNlYXRzIGFuZCBmcmVlIGJpY3ljbGUgcGxhY2VzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChcbiAgICBwbGFjZXM6IFBsYWNlW10gfCB1bmRlZmluZWQsXG4gICk6IENvYWNoTnVtYmVyT2ZGcmVlUGxhY2VzIHtcbiAgICBjb25zdCBhY2N1bXVsYXRvcjogQ29hY2hOdW1iZXJPZkZyZWVQbGFjZXMgPSB7IHNlYXRzOiAwLCBiaWN5Y2xlczogMCB9O1xuICAgIGNvbnN0IGZyZWVQbGFjZXMgPSBwbGFjZXM/LnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJQbGFjZTogUGxhY2UpID0+IHtcbiAgICAgIGlmIChjdXJyUGxhY2Uuc3RhdGUgIT09ICdGUkVFJykge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG4gICAgICAvLyBDb3VudCB1cCBkZXBlbmRpbmcgb24gc2VhdCB0eXBlXG4gICAgICBpZiAoY3VyclBsYWNlLnR5cGUgPT09ICdTRUFUJykge1xuICAgICAgICBhY2N1bXVsYXRvci5zZWF0cysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjdW11bGF0b3IuYmljeWNsZXMrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCBhY2N1bXVsYXRvcik7XG4gICAgcmV0dXJuIGZyZWVQbGFjZXMgPyBmcmVlUGxhY2VzIDogYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQXQgdGhlIGVuZCBvZiBhIHNjcm9sbCBFdmVudCBmcm9tIHRoZSBjb2FjaCBzY3JvbGxhYmxlIGFyZWEsXG4gICAqIHRoZSByZWFjaGVkIGNvYWNoIGlzIG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29hY2hBcmVhU2Nyb2xsZW5kRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZmluZFNjcm9sbENvYWNoSW5kZXggPSB0aGlzLmlzQXV0b1Njcm9sbGluZ1xuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgIDogdGhpcy5fZ2V0Q29hY2hJbmRleEJ5U2Nyb2xsVHJpZ2dlclBvc2l0aW9uKCk7XG5cbiAgICAvLyBUSU1PLTQzNzA1XG4gICAgLy8gSWYgYSBwbGFjZSB3YXMgc2VsZWN0ZWQgYnkgbW91c2UgY2xpY2sgKHByZXZlbnRDb2FjaFNjcm9sbEJ5UGxhY2VDbGljaykgYmVmb3JlIHRyaWdnZXJpbmcgdGhpcyBzY3JvbGxlbmQgbWV0aG9kLFxuICAgIC8vIHRoZW4gdGhpcyBzY3JvbGxpbmcgd2FzIHRyaWdnZXJlZCBieSB0aGUgbWV0aG9kIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQsIGFuZCBpdCBpcyBvbmx5IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGwgKHNjcm9sbEludG9WaWV3KSxcbiAgICAvLyB3aGVyZSBhIGxlc3MgdmlzaWJsZSBwbGFjZSBoYXMgYmVlbiBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC4gSW4gY2FzZSBvZiBhIHBsYWNlIGFkanVzdG1lbnQgYnkgY2xpY2ssIHdlIGNhbiByZXR1cm4gaGVyZS5cbiAgICBpZiAodGhpcy5wcmV2ZW50Q29hY2hTY3JvbGxCeVBsYWNlQ2xpY2spIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVuZHNjcm9sbGluZyBpcyBqdXN0IGEgcGxhY2UgYWRqdXN0bWVudCBzY3JvbGxpbmcgKHBsYWNlIGhhcyAyIGdyaWQgc2l6ZSB1bml0cylcbiAgICAgIGNvbnN0IGlzQ29hY2hTY3JvbGxpbmcgPVxuICAgICAgICBNYXRoLmFicyh0aGlzLl9sYXN0U3RhcnRTY3JvbGxQb3MgLSB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxMZWZ0KSA+XG4gICAgICAgIHRoaXMuYmFzZUdyaWRTaXplICogMjtcbiAgICAgIGlmIChpc0NvYWNoU2Nyb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFN0YXJ0U2Nyb2xsUG9zID0gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcblxuICAgIC8vIEFmdGVyIGNvYWNoIHNjcm9sbGVuZCBldmVudCB3ZSBjYW4gcmVzZXQgdGhlIGhvdmVyZWQgY29hY2ggaW5kZXhcbiAgICB0aGlzLmhvdmVyZWRDb2FjaEluZGV4ID0gLTE7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHVzZXMgdGhlIHNjcm9sbGJhciB3aXRob3V0IGludGVyYWN0aW5nIHdpdGggdGhlIHNlYXQgcmVzZXJ2YXRpb24sXG4gICAgLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbmRleCBpcyAtMSwgYW5kIHdlIGhhdmUgdG8gc2V0IHRoaXMgdmFsdWUgd2l0aCBmaW5kU2Nyb2xsQ29hY2hJbmRleC5cbiAgICBpZiAodGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID0gZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsYWJsZVRvU2VsZWN0ZWRDb2FjaCgpKSB7XG4gICAgICB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPSBmaW5kU2Nyb2xsQ29hY2hJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgZmluZFNjcm9sbENvYWNoSW5kZXggPCB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgICA/IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgIDogZmluZFNjcm9sbENvYWNoSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQXV0b1Njcm9sbGluZykge1xuICAgICAgLy9XaGVuIHVzZXIgaXMgc2Nyb2xsaW5nIHZpYSBzY3JvbGxiYXIsIGl0IGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0byB0aGUgZm9jdXNlZCBjb2FjaCBpbiB0aGUgbWFpbiBuYXZpZ2F0aW9uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihmaW5kU2Nyb2xsQ29hY2hJbmRleCk7XG4gICAgfVxuICAgIHRoaXMucHJldmVudENvYWNoU2Nyb2xsQnlQbGFjZUNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVDdXJyZW50U2VsZWN0ZWRDb2FjaCgpO1xuXG4gICAgaWYgKCF0aGlzLmhhc05hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMucHJlc2VsZWN0UGxhY2VJbkNvYWNoKCk7XG4gICAgICB0aGlzLmlzQXV0b1Njcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgbWFpbiBuYXZpZ2F0aW9uIHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIHNlbGVjdGVkTmF2Q29hY2hJbmRleC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgY2VudHJhbCBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBuYXYgY29hY2ggdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSBzZWxlY3RlZE5hdkNvYWNoSW5kZXhcbiAgICovXG4gIHByaXZhdGUgX3Njcm9sbFRvU2VsZWN0ZWROYXZpZ2F0aW9uQnV0dG9uKHNlbGVjdGVkTmF2Q29hY2hJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy9UaW1lIGRlbGF5IHRvIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlciBleGVjdXRpbmcgY2FsbGluZyBzY3JvbGxUbyBmdW5jdGlvbnMgKGNvYWNoZXMgc2Nyb2xsaW5nKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhKSB7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25BcmVhQ2VudGVyZWRQb3NYID0gdGhpcy5zY3JvbGxOYXZpZ2F0aW9uQXJlYURpbSAvIDI7XG4gICAgICAgIGNvbnN0IHNjcm9sbEJ1dHRvbk9mZnNldFggPSBzZWxlY3RlZE5hdkNvYWNoSW5kZXggKiB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXRYID1cbiAgICAgICAgICBzY3JvbGxCdXR0b25PZmZzZXRYIC0gbmF2aWdhdGlvbkFyZWFDZW50ZXJlZFBvc1ggKyB0aGlzLmNvYWNoTmF2QnV0dG9uRGltO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TY3JvbGxBcmVhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IHNjcm9sbE9mZnNldFggOiAwLFxuICAgICAgICAgIGxlZnQ6IHRoaXMuYWxpZ25WZXJ0aWNhbCA/IDAgOiBzY3JvbGxPZmZzZXRYLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5ldyBTY3JvbGxEaXJlY3Rpb24gYnkgdGhlIG5ldyBnaXZlbiB0YXJnZXQgY29hY2ggaW5kZXguXG4gICAqL1xuICBwcml2YXRlIF9zZXRTY3JvbGxEaXJlY3Rpb25CeUNvYWNoSW5kZXgoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyU2Nyb2xsRGlyZWN0aW9uID1cbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA+IHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgICAgID8gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0XG4gICAgICAgIDogU2Nyb2xsRGlyZWN0aW9uLmxlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Nyb2xsIHN0YXJ0IG9yIGVuZCBwb3NpdGlvbiBYIGZyb20gdGhlIHNlbGVjdGVkIGNvYWNoLlxuICAgKiBJbiBjYXNlIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBuYXZpZ2F0aW5nIHRocm91Z2ggcGxhY2VzIGJ5IGtleWJvYXJkIGFuZCBnb2VzIHRvIHByZXZpb3VzIGNvYWNoLFxuICAgKiB0aGVuIHdlIHJldHVybiB0aGUgZW5kIHBvc2l0aW9uIG9mIHRoZSBjb2FjaCB0byBnZXQgdGhlIGNsb3Nlc3Qgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBuZXh0IGZvY3VzIHBsYWNlLlxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoU2Nyb2xsUG9zaXRpb25YKCk6IG51bWJlciB7XG4gICAgY29uc3QgY29hY2hUcmlnZ2VyUG9pbnQgPSB0aGlzLnRyaWdnZXJDb2FjaFBvc2l0aW9uc0NvbGxlY3Rpb25bdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4XTtcbiAgICBjb25zdCBpc0ZvY3VzUGxhY2VGcm9tUHJldmlvdXNDb2FjaFBvc2l0aW9uID1cbiAgICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gJiZcbiAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgIGNvYWNoVHJpZ2dlclBvaW50LndpZHRoID4gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoO1xuXG4gICAgcmV0dXJuIGlzRm9jdXNQbGFjZUZyb21QcmV2aW91c0NvYWNoUG9zaXRpb25cbiAgICAgID8gY29hY2hUcmlnZ2VyUG9pbnQuZW5kIC0gdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoXG4gICAgICA6IGNvYWNoVHJpZ2dlclBvaW50LnN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZvY3VzIG9uIHRoZSBIVE1MIHRhYmxlIChncmlkKSBjYXB0aW9uIGVsZW1lbnQgc28gdGhhdCB0aGUgaGVhZGluZyBpcyByZWFkIG91dCB3aGVuIHVzaW5nIGEgU2NyZWVuUmVhZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Rm9jdXNUb1NlbGVjdGVkQ29hY2hHcmlkKCk6IHZvaWQge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYW4gYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgY29hY2ggbmF2aWdhdGlvbiwgdGhlbiB0aGUgbmF2aWdhdGVkIHRhYmxlIGlzIGZvY3VzYWJsZS5cbiAgICBpZiAodGhpcy5pc0NvYWNoR3JpZEZvY3VzYWJsZSAmJiB0aGlzLmhhc1NlYXRSZXNlcnZhdGlvbk5hdGl2ZUZvY3VzKSB7XG4gICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gZmFsc2U7XG4gICAgICBjb25zdCBjb2FjaFRhYmxlQ2FwdGlvbkVsZW1lbnQgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcjc2JiLXNyLWNvYWNoLWNhcHRpb24tJyArIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICkgYXMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ7XG4gICAgICBpZiAoY29hY2hUYWJsZUNhcHRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvYWNoVGFibGVDYXB0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Nyb2xsZWQgcG9zaXRpb24gY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHRvIHRoZSBzZWxlY3RlZCB3YWdvblxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIF9pc1Njcm9sbGFibGVUb1NlbGVjdGVkQ29hY2goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VyclNjcm9sbFBvc1ggPSB0aGlzLmFsaWduVmVydGljYWxcbiAgICAgID8gdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsVG9wXG4gICAgICA6IHRoaXMuY29hY2hTY3JvbGxBcmVhLnNjcm9sbExlZnQ7XG4gICAgY29uc3QgY29hY2hTY3JvbGxXaW5kb3dXaWR0aCA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWF4U2Nyb2xsV2lkdGhBcmVhID0gdGhpcy5tYXhDYWxjQ29hY2hlc1dpZHRoIC0gY29hY2hTY3JvbGxXaW5kb3dXaWR0aDtcbiAgICBjb25zdCBjdXJyQ29hY2hUcmlnZ2VyID0gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3MgPVxuICAgICAgY3VyclNjcm9sbFBvc1ggPT09IHRoaXMudHJpZ2dlckNvYWNoUG9zaXRpb25zQ29sbGVjdGlvblt0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnN0YXJ0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIChjdXJyU2Nyb2xsUG9zWCA8IG1heFNjcm9sbFdpZHRoQXJlYSB8fCBjdXJyU2Nyb2xsUG9zWCA+IGN1cnJDb2FjaFRyaWdnZXIuc3RhcnQpICYmXG4gICAgICAhaXNTY3JvbGxQb3NTYW1lVG9DdXJyQ29hY2hQb3NcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvYWNoIGluZGV4IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBzY3JvbGwgYXJlYVxuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByaXZhdGUgX2dldENvYWNoSW5kZXhCeVNjcm9sbFRyaWdnZXJQb3NpdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuYWxpZ25WZXJ0aWNhbFxuICAgICAgPyB0aGlzLmNvYWNoU2Nyb2xsQXJlYS5zY3JvbGxUb3BcbiAgICAgIDogdGhpcy5jb2FjaFNjcm9sbEFyZWEuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCBzY3JvbGxPZmZzZXRYID0gc2Nyb2xsUG9zICsgdGhpcy5zY3JvbGxDb2FjaGVzQXJlYVdpZHRoIC8gMjtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyQ29hY2hQb3NpdGlvbnNDb2xsZWN0aW9uLmZpbmRJbmRleChcbiAgICAgIChjb2FjaFRyaWdnZXIpID0+IHNjcm9sbE9mZnNldFggPj0gY29hY2hUcmlnZ2VyLnN0YXJ0ICYmIHNjcm9sbE9mZnNldFggPD0gY29hY2hUcmlnZ2VyLmVuZCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgcGxhY2Ugb2YgY3VycmVudCBzZWxlY3RlZCBjb2FjaCBieSB0YWJsZSBjZWxsIGNvb3JkaW5hdGUgMC0wIGlkLlxuICAgKiBAcmV0dXJucyBQbGFjZSBvciBudWxsXG4gICAqL1xuICBwcml2YXRlIF9nZXRGaXJzdFBsYWNlSW5TZWxlY3RlZENvYWNoKCk6IFBsYWNlIHwgbnVsbCB7XG4gICAgbGV0IGZpcnN0UGxhY2U6IFBsYWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY29hY2ggPVxuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW3RoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleF07XG4gICAgY29uc3QgZmlyc3RDZWxsSWQgPVxuICAgICAgJ2NlbGwtJyArIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgJy0nICsgdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4ICsgJy0wLTAnO1xuICAgIGNvbnN0IHBsYWNlTnVtYmVyID1cbiAgICAgIHRoaXMuc2hhZG93Um9vdFxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KCcjJyArIGZpcnN0Q2VsbElkKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8U2JiU2VhdFJlc2VydmF0aW9uUGxhY2VDb250cm9sRWxlbWVudD4oJ3NiYi1zZWF0LXJlc2VydmF0aW9uLXBsYWNlLWNvbnRyb2wnKVxuICAgICAgICA/LmdldEF0dHJpYnV0ZSgndGV4dCcpIHx8IG51bGw7XG5cbiAgICBpZiAoY29hY2ggJiYgcGxhY2VOdW1iZXIpIHtcbiAgICAgIGZpcnN0UGxhY2UgPSBjb2FjaC5wbGFjZXM/LmZpbmQoKHBsYWNlKSA9PiBwbGFjZS5udW1iZXIgPT09IHBsYWNlTnVtYmVyKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RQbGFjZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgcHJlc3NlZEtleTogc3RyaW5nLFxuICAgIGNvYWNoOiBDb2FjaEl0ZW0sXG4gICk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmN1cnJTZWxlY3RlZFBsYWNlIHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd1JpZ2h0IHx8XG4gICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnRcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggRE9XTlxuICAgIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93RG93biAmJlxuICAgICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbi55ICsgMiA9PT0gY29hY2guZGltZW5zaW9uLmggJiZcbiAgICAgICEhdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ICsgMV1cbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCArIDE7XG4gICAgfVxuICAgIC8vQ0hFQ0sgREVDSyBTV0lUQ0ggVVBcbiAgICBlbHNlIGlmIChcbiAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2UucG9zaXRpb24ueSA9PT0gMCAmJlxuICAgICAgISF0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggLSAxXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVG8gZ2V0IHRoZSBjb3JyZWN0IGNsb3Nlc3QgcGxhY2Ugb2YgY3VycmVudCBwcmVzc2VkIGtleSBhbmQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcGxhY2UsXG4gICAqIHdlIGhhdmUgdG8gaW52ZXN0aWdhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggcGxhY2UgdG8gZmluZCB0aGUgY2xvc2VzdCBwbGFjZSBvZiB0aGUgY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQuXG4gICAqIEBwYXJhbSBwcmVzc2VkS2V5XG4gICAqIEByZXR1cm5zIFBsYWNlIG9yIG51bGxcbiAgICovXG4gIHByaXZhdGUgX2dldENsb3Nlc3RQbGFjZUJ5S2V5RGlyZWN0aW9uKHByZXNzZWRLZXk/OiBzdHJpbmcpOiBQbGFjZSB8IG51bGwge1xuICAgIGNvbnN0IGNvYWNoID1cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdO1xuICAgIGxldCBjbG9zZXN0UGxhY2UgPSBudWxsO1xuICAgIGxldCBjb2FjaFBsYWNlcyA9IGNvYWNoLnBsYWNlcztcbiAgICBsZXQgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IG51bGw7XG5cbiAgICBpZiAoY29hY2hQbGFjZXMpIHtcbiAgICAgIC8vIElmIG5vIHBsYWNlIHNldCwgdGhlbiB3ZSB1c2UgaW5pdGlhbCB0aGUgbGVmdC10b3AgcGxhY2Ugb24gdGhlIGNvYWNoXG4gICAgICBpZiAoIXRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEZpcnN0UGxhY2VJblNlbGVjdGVkQ29hY2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZFBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbiA9IHsgLi4udGhpcy5jdXJyU2VsZWN0ZWRQbGFjZS5wb3NpdGlvbiB9O1xuXG4gICAgICAgICAgaWYgKHByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgdXNlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciBjb2FjaCBkZWNrIChVcCAtPiBEb3duIHwgRG93biAtPiBVcCkuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHRha2UgdGhlIGNvYWNoIHBsYWNlcyB3ZSBoYXZlIHRvIGNoZWNrZWQgZnJvbSB0aGUgdGFyZ2V0IGRlY2sgbm93LlxuICAgICAgICAgICAgc3dpdGNoZWRDb2FjaERlY2tJbmRleCA9IHRoaXMuX2dldFN3aXRjaGVkQ29hY2hEZWNrSW5kZXhCeUtleU5hdmlnYXRpb24oXG4gICAgICAgICAgICAgIHByZXNzZWRLZXksXG4gICAgICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzd2l0Y2hlZENvYWNoRGVja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIEFzc2lnbiBjaGVjayBwbGFjZXMgZnJvbSB0aGUgdGFyZ2V0IHN3aXRjaCBkZWNrXG4gICAgICAgICAgICAgIGNvYWNoUGxhY2VzID1cbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbc3dpdGNoZWRDb2FjaERlY2tJbmRleF0uY29hY2hJdGVtc1tcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleFxuICAgICAgICAgICAgICAgIF0ucGxhY2VzIHx8IFtdO1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHVwZGF0ZSB5IGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ID1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlZENvYWNoRGVja0luZGV4IDwgdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXggPyBjb2FjaC5kaW1lbnNpb24uaCA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Ugb2YgY29hY2hQbGFjZXMpIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGtleSBwcmVzc2VkLCB0aGVuIHdlIHRyeSB0byBmaW5kIHRoZSBwbGFjZSBvZiB0aGUgY3VycmVudCBjdXJyU2Nyb2xsRGlyZWN0aW9uXG4gICAgICAgICAgICBpZiAoIXByZXNzZWRLZXkpIHtcbiAgICAgICAgICAgICAgLy8gRmluZCBwbGFjZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgY29hY2ggYnkgeSBjb29yZGluYXRlLiBDdXJyZW50IGN1cnJTY3JvbGxEaXJlY3Rpb24gaXMgUklHSFRcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLnJpZ2h0ICYmXG4gICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL0ZpbmQgcGxhY2UgZnJvbSB0aGUgcmlnaHQgc2lkZSBvZiBjb2FjaCBieSB5IGNvb3JkaW5hdGUuIEN1cnJlbnQgY3VyclNjcm9sbERpcmVjdGlvbiBpcyBMRUZUXG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VyclNjcm9sbERpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLmxlZnQgJiZcbiAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocGxhY2UubnVtYmVyICE9PSB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlPy5udW1iZXIpIHtcbiAgICAgICAgICAgICAgICAvL0tleSBbUmlnaHRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgc21hbGxlc3QgbGFyZ2VyIHggcGxhY2UgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBsYWNlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dSaWdodCAmJlxuICAgICAgICAgICAgICAgICAgKHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSB8fFxuICAgICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgLSAxKSAmJlxuICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA+IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCAmJlxuICAgICAgICAgICAgICAgICAgKCFjbG9zZXN0UGxhY2UgfHwgcGxhY2UucG9zaXRpb24ueCA8IGNsb3Nlc3RQbGFjZS5wb3NpdGlvbi54KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsYWNlID0gcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vS2V5IFtEb3duXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIHNtYWxsZXN0IGxhcmdlciB5IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dEb3duICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnggPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueCArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi55ID4gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi55IDwgY2xvc2VzdFBsYWNlLnBvc2l0aW9uLnkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW0xlZnRdIG5hdmlnYXRpb24sIHdlIGNoZWNrIHRoZSBwbGFjZSBjb29yZGluYXRlcyBvZiB0aGUgeC1heGlzIHRvIGdldCB0aGUgZ3JlYXRlc3Qgc21hbGxlciB4IHBsYWNlIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwbGFjZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dMZWZ0ICYmXG4gICAgICAgICAgICAgICAgICAocGxhY2UucG9zaXRpb24ueSA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi55IHx8XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPT09IGN1cnJTZWxlY3RlZFBsYWNlUG9zaXRpb24ueSArIDEpICYmXG4gICAgICAgICAgICAgICAgICBwbGFjZS5wb3NpdGlvbi54IDwgY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54ICYmXG4gICAgICAgICAgICAgICAgICAoIWNsb3Nlc3RQbGFjZSB8fCBwbGFjZS5wb3NpdGlvbi54ID4gY2xvc2VzdFBsYWNlLnBvc2l0aW9uLngpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjbG9zZXN0UGxhY2UgPSBwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9LZXkgW1VwXSBuYXZpZ2F0aW9uLCB3ZSBjaGVjayB0aGUgcGxhY2UgY29vcmRpbmF0ZXMgb2YgdGhlIHktYXhpcyB0byBnZXQgdGhlIGdyZWF0ZXN0IHNtYWxsZXIgeSBwbGFjZSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93VXAgJiZcbiAgICAgICAgICAgICAgICAgIChwbGFjZS5wb3NpdGlvbi54ID09PSBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnggfHxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2UucG9zaXRpb24ueCA9PT0gY3VyclNlbGVjdGVkUGxhY2VQb3NpdGlvbi54IC0gMSkgJiZcbiAgICAgICAgICAgICAgICAgIHBsYWNlLnBvc2l0aW9uLnkgPCBjdXJyU2VsZWN0ZWRQbGFjZVBvc2l0aW9uLnkgJiZcbiAgICAgICAgICAgICAgICAgICghY2xvc2VzdFBsYWNlIHx8IHBsYWNlLnBvc2l0aW9uLnkgPiBjbG9zZXN0UGxhY2UucG9zaXRpb24ueSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGNsb3Nlc3RQbGFjZSA9IHBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIGEgcGxhY2UgaGFzIGJlZW4gZm91bmQgaW4gdGhlIGNoYW5naW5nIHN3aXRjaCBjb2FjaCxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXBkYXRlIHRoZSBjdXJyU2VsZWN0ZWREZWNrSW5kZXhcbiAgICAgICAgICBpZiAoc3dpdGNoZWRDb2FjaERlY2tJbmRleCAhPT0gbnVsbCAmJiBjbG9zZXN0UGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID0gc3dpdGNoZWRDb2FjaERlY2tJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RQbGFjZTtcbiAgfVxuXG4gIC8vIEhhbmRsaW5nIGZvciBUYWIgbmF2aWdhdGlvbiBpZiBhIHBsYWNlIGlzIHNlbGVjdGVkIGluc2lkZSB0aGUgY29hY2guXG4gIC8vIFRoaXMgY29udHJvbHMgdGhlIGZvY3VzZWQgY29hY2ggZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBjb2FjaC5cbiAgcHJpdmF0ZSBfbmF2aWdhdGVDb2FjaE5hdmlnYXRpb25CeUtleWJvYXJkKHRhYkRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VyckZvY3VzSW5kZXggPVxuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT09IC0xXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhcbiAgICAgICAgOiB0aGlzLmZvY3VzZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gQ2hlY2sgbmV4dCBvciBwcmV2IHRhYiBpcyBwcmVzc2VkLCB0aGVuIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBhdmFpbGFibGUgY29hY2ggaW5kZXggdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXNcbiAgICBjb25zdCBuZXdGb2N1c2FibGVJbmRleDogbnVtYmVyID1cbiAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJ1xuICAgICAgICA/IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZUNvYWNoSW5kZXgoY3VyckZvY3VzSW5kZXgpXG4gICAgICAgIDogdGhpcy5nZXRQcmV2QXZhaWxhYmxlQ29hY2hJbmRleChjdXJyRm9jdXNJbmRleCk7XG5cbiAgICBpZiAodGhpcy5oYXNOYXZpZ2F0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFBsYWNlRWxlbWVudCA9IHRoaXMuX2dldFBsYWNlSHRtbEVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IHBsYWNlSW5Db2FjaEhhc0ZvY3VzID0gc2VsZWN0ZWRQbGFjZUVsZW1lbnRcbiAgICAgICAgPyBzZWxlY3RlZFBsYWNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2tleWZvY3VzJykgPT09ICdmb2N1cydcbiAgICAgICAgOiBmYWxzZTtcblxuICAgICAgLy8gSWYgd2UgdGFiIGJhY2sgKFBSRVZfVEFCKSBhbmQgdGhlIGZvY3VzIGlzIGN1cnJlbnRseSBvbiBwbGFjZSxcbiAgICAgIC8vIHdlIHJlbW92ZSB0aGUgc2VsZWN0ZWQgc3RhdGUgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hdmlnYXRpb24gY29hY2ggYW5kIG9ubHkgc2V0IHRoZSBmb2N1cyBzdGF0dXMgdG8gaXRcbiAgICAgIGlmICh0YWJEaXJlY3Rpb24gPT09ICdQUkVWX1RBQicgJiYgdGhpcy5zZWxlY3RlZENvYWNoSW5kZXggPT09IGN1cnJGb2N1c0luZGV4KSB7XG4gICAgICAgIC8vIElmIHdlIFRBQiBiYWNrIGFuZCBoYXZlIGEgc2VsZWN0ZWQgcGxhY2VzIGluc2lkZSB0aGUgY3VycmVudCBjb2FjaCwgdGhlbiB3ZSBtb3ZlIG91dCBmcm9tIHRoZSBzZWF0bWFwIGFuZCBzZXQgdGhlIGZvY3VzIHRvIHRoZSBjdXJyZW50IHNlbGVjdGVkIGNvYWNoXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cyB8fCB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IGN1cnJGb2N1c0luZGV4O1xuICAgICAgICAgIHRoaXMudW5mb2N1c1BsYWNlRWxlbWVudCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBjb2FjaCBpcyBzZWxlY3RlZCBhbmQgd2UgVEFCIGJhY2ssIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGZpcnN0IGNvYWNoIGluIHRoZSBuYXZpZ2F0aW9uIHRvIGdldCBiYWNrIHRvIHRoZSBub3JtYWwgdGFiIG5hdmlnYXRpb24uXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmb2N1c2VkSW5kZXggZnJvbSB0aGUgZmlyc3QgY29hY2ggYW5kIHNldCBpdCBhZ2FpbiBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgIGVsc2UgaWYgKGN1cnJGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gUmVmb2N1cyB0aGUgZmlyc3QgY29hY2hcbiAgICAgICAgICB0aGlzLl9yZWZvY3VzQ3VycmVudEZvY3VzZWROYXZDb2FjaChjdXJyRm9jdXNJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldHMgdGhlIGZvY3VzIG9uIHRoZSBuZXcgbmF2aWdhdGlvbiBjb2FjaFxuICAgICAgZWxzZSBpZiAobmV3Rm9jdXNhYmxlSW5kZXggIT09IHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gbmV3Rm9jdXNhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZSBsYXN0IGNvYWNoIGlzIHNlbGVjdGVkIGFuZCB3ZSBUQUIsIHdlIGhhdmUgdG8gc2V0IHRoZSBuYXRpdmUgZm9jdXMgb24gdGhlIGxhc3QgY29hY2ggaW4gdGhlIG5hdmlnYXRpb24gdG8gZ2V0IGJhY2sgdG8gdGhlIG5vcm1hbCB0YWIgbmF2aWdhdGlvbi5cbiAgICAgIC8vIFRvIGRvIHRoaXMsIHdlIGhhdmUgIHRvIHJlbW92ZSB0aGUgZm9jdXNlZEluZGV4IGZyb20gdGhlIGZpcnN0IGNvYWNoIGFuZCBzZXQgaXQgYWdhaW4gYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgZWxzZSBpZiAoXG4gICAgICAgIHRhYkRpcmVjdGlvbiA9PT0gJ05FWFRfVEFCJyAmJlxuICAgICAgICBuZXdGb2N1c2FibGVJbmRleCA9PT0gdGhpcy5jb2FjaEl0ZW1EZXRhaWxzRWxlbWVudHMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlZm9jdXMgdGhlIGxhc3QgY29hY2hcbiAgICAgICAgdGhpcy5fcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goY3VyckZvY3VzSW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCA9IG5ld0ZvY3VzYWJsZUluZGV4O1xuICAgICAgICAvLyBJZiBhbnkgcGxhY2Ugd2FzIGZvY3VzZWQgaW4gY29hY2gsIHNvIHdlIHNldCBmb2N1c2VkIGFnYWluXG4gICAgICAgIGlmIChwbGFjZUluQ29hY2hIYXNGb2N1cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gcGxhY2Ugd2FzIHNlbGVjdGVkLCB0aGVuIHdlIHNlbGVjdCB0aGUgY29hY2ggZ3JpZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ29hY2hHcmlkRm9jdXNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRGb2N1c1RvU2VsZWN0ZWRDb2FjaEdyaWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCeSBUYWIgTmF2aWdhdGlvbiwgcGVyZm9ybSBhdXRvbWF0aWMgc2Nyb2xsaW5nIHRvIHRoZSBmb2N1c2VkIHdhZ29uXG4gICAgICB0aGlzLl9zY3JvbGxUb1NlbGVjdGVkTmF2aWdhdGlvbkJ1dHRvbihuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICAgIC8vIElmIG5vIG5hdmlnYXRpb24gZXhpc3QsIHdlIHNjcm9sbCBkaXJlY3RseSB0byB0aGUgbmV4dCB0YWJhYmxlIGNvYWNoXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdGb2N1c2FibGVJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVmb2N1c2VkIHRoZSBjdXJyZW50IGZvY3VzZWQgKHZpc3VhbCkgbmF2IGNvYWNoIHRvIGdldCB0aGUgbmF0aXZlIGZvY3VzIGJhY2sgdG8gdGhlIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBfcmVmb2N1c0N1cnJlbnRGb2N1c2VkTmF2Q29hY2goZm9jdXNJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSBmb2N1c0luZGV4KSwgMCk7XG4gIH1cblxuICBwcml2YXRlIF9uYXZpZ2F0ZVRvUGxhY2VCeUtleWJvYXJkKHByZXNzZWRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDb2FjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZlbnRQbGFjZUNsaWNrKSB7XG4gICAgICBjb25zdCBmaW5kQ2xvc2VzdFBsYWNlID0gdGhpcy5fZ2V0Q2xvc2VzdFBsYWNlQnlLZXlEaXJlY3Rpb24ocHJlc3NlZEtleSk7XG5cbiAgICAgIGlmIChmaW5kQ2xvc2VzdFBsYWNlKSB7XG4gICAgICAgIHRoaXMuZm9jdXNQbGFjZUVsZW1lbnQoZmluZENsb3Nlc3RQbGFjZSk7XG4gICAgICB9XG4gICAgICAvLyBObyBjbG9zZXN0IHBsYWNlIGZvdW5kIGJ5IGtleSBuYXZpZ2F0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHQgfHxcbiAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0xlZnQgfHxcbiAgICAgICAgICAodGhpcy5hbGlnblZlcnRpY2FsICYmXG4gICAgICAgICAgICAocHJlc3NlZEtleSA9PT0gdGhpcy5rZXlib2FyZE5hdmlnYXRpb25FdmVudHMuQXJyb3dVcCB8fFxuICAgICAgICAgICAgICBwcmVzc2VkS2V5ID09PSB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkV2ZW50cy5BcnJvd0Rvd24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBwcmVzc2VkIGtleSB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGNvYWNoIGluZGV4XG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRDb2FjaEluZGV4ID1cbiAgICAgICAgICAgIHByZXNzZWRLZXkgPT09IHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uRXZlbnRzLkFycm93UmlnaHRcbiAgICAgICAgICAgICAgPyB0aGlzLmdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KClcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KCk7XG5cbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWROYXZDb2FjaChuZXdTZWxlY3RlZENvYWNoSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLmNvYWNoSXRlbXMubGVuZ3RoIC0gMVxuICAgICAgPyBzdGFydEluZGV4ICsgMVxuICAgICAgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByZXZBdmFpbGFibGVDb2FjaEluZGV4KGN1cnJlbnRJbmRleD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGN1cnJlbnRJbmRleCA/PyB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgcmV0dXJuIHN0YXJ0SW5kZXggPiAwID8gc3RhcnRJbmRleCAtIDEgOiBzdGFydEluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKHBsYWNlU2VsZWN0aW9uOiBQbGFjZVNlbGVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHBsYWNlVHlwZVByb3AgPSBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/ICdzZWF0cycgOiAnYmljeWNsZXMnO1xuICAgIGNvbnN0IG1heFJlc2VydmF0aW9ucyA9XG4gICAgICBwbGFjZVNlbGVjdGlvbi5wbGFjZVR5cGUgPT09ICdTRUFUJyA/IHRoaXMubWF4U2VhdFJlc2VydmF0aW9ucyA6IHRoaXMubWF4QmljeWNsZVJlc2VydmF0aW9ucztcbiAgICBjb25zdCBjdXJyU2VsZWN0ZWRQbGFjZXMgPSB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzW3BsYWNlVHlwZVByb3BdO1xuXG4gICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1twbGFjZVR5cGVQcm9wXSA9IHRoaXMuX3VwZGF0ZVNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzKFxuICAgICAgY3VyclNlbGVjdGVkUGxhY2VzLFxuICAgICAgbWF4UmVzZXJ2YXRpb25zLFxuICAgICAgcGxhY2VTZWxlY3Rpb24sXG4gICAgKTtcbiAgICAvLyBGSVhNRTogdGhlIG5hbWUgb2YgdGhpcyB2YXJpYWJsZSBhcHBlYXJzIGFzIGV2ZW50IG5hbWUgaW4gdGhlIHJlYWRtZVxuICAgIC8vICBkdWUgdG8gYSBidWcgaW4gdGhlIGN1c3RvbS1lbGVtZW50cy1tYW5pZmVzdCBsaWJyYXJ5LlxuICAgIC8vICBodHRwczovL2dpdGh1Yi5jb20vb3Blbi13Yy9jdXN0b20tZWxlbWVudHMtbWFuaWZlc3QvaXNzdWVzLzE0OVxuICAgIGNvbnN0IHNlbGVjdGVkcGxhY2VzID0gdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcztcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7U2JiU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudH1cbiAgICAgKiBFbWl0cyB3aGVuIGEgcGxhY2Ugd2FzIHNlbGVjdGVkIGFuZCByZXR1cm5zIGEgUGxhY2UgYXJyYXkgd2l0aCBhbGwgc2VsZWN0ZWQgcGxhY2VzLlxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgU2JiU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRQbGFjZXNFdmVudChzZWxlY3RlZHBsYWNlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMoXG4gICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgbWF4UmVzZXJ2YXRpb25zOiBudW1iZXIsXG4gICAgcGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uLFxuICApOiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbltdIHtcbiAgICAvLyBBZGQgc2VsZWN0ZWQgcGxhY2UgdG8gc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXNcbiAgICBpZiAocGxhY2VTZWxlY3Rpb24uc3RhdGUgPT09ICdTRUxFQ1RFRCcpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUGxhY2VEZWNrSW5kZXggPSB0aGlzLl9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY29uc3Qgc2VhdFJlc2VydmF0aW9uU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgIHBsYWNlU2VsZWN0aW9uLFxuICAgICAgICBzZWxlY3RlZFBsYWNlRGVja0luZGV4LFxuICAgICAgKTtcbiAgICAgIGlmIChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMucHVzaChzZWF0UmVzZXJ2YXRpb25TZWxlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgcGxhY2UgZnJvbSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlc1xuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSBzZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5maWx0ZXIoXG4gICAgICAgIChfc2VsZWN0ZWRQbGFjZSkgPT4gX3NlbGVjdGVkUGxhY2UuaWQgIT09IHBsYWNlU2VsZWN0aW9uLmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIHdoZXRoZXIgbWF4UmVzZXJ2YXRpb24gaXMgYWN0aXZhdGVkIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0ZWQgcGxhY2VzIGlzIHJlYWNoZWRcbiAgICBpZiAobWF4UmVzZXJ2YXRpb25zID4gLTEgJiYgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMubGVuZ3RoID4gbWF4UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCByZXNldFdpdGhQbGFjZVNlbGVjdGlvbiA9IG1heFJlc2VydmF0aW9ucyA+IDAgPyBwbGFjZVNlbGVjdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMgPSB0aGlzLl9yZXNldEFsbFBsYWNlU2VsZWN0aW9ucyhcbiAgICAgICAgc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMsXG4gICAgICAgIHJlc2V0V2l0aFBsYWNlU2VsZWN0aW9uLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1cnJlbnRTZWxlY3RlZFBsYWNlSW5Db2FjaChwbGFjZVNlbGVjdGlvbjogUGxhY2VTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBwbGFjZURlY2tJbmRleCA9IHRoaXMuX2dldERlY2tJbmRleEJ5UGxhY2VJZChwbGFjZVNlbGVjdGlvbi5pZCk7XG4gICAgY29uc3QgY29hY2hJbmRleCA9IHBsYWNlU2VsZWN0aW9uLmNvYWNoSW5kZXg7XG5cbiAgICBpZiAocGxhY2VEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFjZSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1twbGFjZURlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XS5wbGFjZXM/LmZpbmQoXG4gICAgICAocGxhY2UpID0+IHBsYWNlLm51bWJlciA9PSBwbGFjZVNlbGVjdGlvbi5udW1iZXIsXG4gICAgKTtcblxuICAgIGlmICghcGxhY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleCA9IHBsYWNlRGVja0luZGV4O1xuICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCA9IGNvYWNoSW5kZXg7XG4gICAgdGhpcy5jdXJyU2VsZWN0ZWRQbGFjZSA9IHBsYWNlO1xuXG4gICAgaWYgKHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCAhPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZChwbGFjZSk7XG5cbiAgICAvLyBUaW1lIGRlbGF5IHRvIHdhaXQgZm9yIHN0YXR1cyB1cGRhdGUgcHJvY2VzcyBhdCBjbGlja2VkIHBsYWNlXG4gICAgY29uc3QgZGVsYXlTY3JvbGxJblZpZXdwb3J0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VTZWxlY3Rpb24uaWQpO1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5U2Nyb2xsSW5WaWV3cG9ydCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VycmVudFNlbGVjdGVkQ29hY2goKTogdm9pZCB7XG4gICAgLy9Pbmx5IGlmIHRoZSBzZWxlY3RlZENvYWNoSW5kZXggaGFzIGNoYW5nZWQsIGFuIHVwZGF0ZSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dFxuICAgIGlmICh0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXggPT0gdGhpcy5zZWxlY3RlZENvYWNoSW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZvY3VzaW5kZXggaGFzIGJlZW4gc2V0ICghPSAtMSksIGl0IGNhbiBiZSB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0ZWRDb2FjaEluZGV4XG4gICAgaWYgKHRoaXMuZm9jdXNlZENvYWNoSW5kZXggIT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXNlZENvYWNoSW5kZXggPSB0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb2FjaEluZGV4ID0gdGhpcy5jdXJyU2VsZWN0ZWRDb2FjaEluZGV4O1xuXG4gICAgLy8gRklYTUU6IHRoZSBuYW1lIG9mIHRoaXMgdmFyaWFibGUgYXBwZWFycyBhcyBldmVudCBuYW1lIGluIHRoZSByZWFkbWVcbiAgICAvLyAgZHVlIHRvIGEgYnVnIGluIHRoZSBjdXN0b20tZWxlbWVudHMtbWFuaWZlc3QgbGlicmFyeS5cbiAgICAvLyAgaHR0cHM6Ly9naXRodWIuY29tL29wZW4td2MvY3VzdG9tLWVsZW1lbnRzLW1hbmlmZXN0L2lzc3Vlcy8xNDlcbiAgICBjb25zdCBzZWxlY3RlZGNvYWNoID0gdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCh0aGlzLnNlbGVjdGVkQ29hY2hJbmRleCk7XG4gICAgaWYgKHNlbGVjdGVkY29hY2gpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUge1NiYlNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2hFdmVudH1cbiAgICAgICAqIEVtaXRzIHdoZW4gYSBjb2FjaCB3YXMgc2VsZWN0ZWQgYW5kIHJldHVybnMgYSBDb2FjaFNlbGVjdGlvblxuICAgICAgICovXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFNiYlNlYXRSZXNlcnZhdGlvblNlbGVjdGVkQ29hY2hFdmVudChzZWxlY3RlZGNvYWNoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFBsYWNlRWxlbWVudElkKFxuICAgIGNvYWNoRGVja0luZGV4OiBudW1iZXIsXG4gICAgY29hY2hJbmRleDogbnVtYmVyLFxuICAgIHBsYWNlTnVtYmVyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICdzZWF0LXJlc2VydmF0aW9uX19wbGFjZS1idXR0b24tJyArIGNvYWNoRGVja0luZGV4ICsgJy0nICsgY29hY2hJbmRleCArICctJyArIHBsYWNlTnVtYmVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBjb2FjaCBsYXlvdXRzIHdpdGggZGlmZmVyZW50IGRlY2tzLFxuICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gZXh0ZW5kIHRoZSBvZmZzZXQgd2l0aCBlbXB0eSBjb2FjaGVzXG4gICAqIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHN0YWJsZSB2ZWhpY2xlIGxheW91dC5cbiAgICpcbiAgICogICAgICAgICAgICAgW29vb10tW29vb10tW29vb11cbiAgICogW29vb10tW29vb10tW29vb10tW29vb10tW29vb11cbiAgICovXG4gIHByaXZhdGUgX2luaXRFbXB0eUNvYWNoRGVja09mZnNldHMoKTogdm9pZCB7XG4gICAgLy8gUHJlZmlsbCBvZmZzZXQgY291bnRlcnMgd2l0aCAwIHN0YXJ0IGluZGV4XG4gICAgY29uc3QgY29hY2hPZmZzZXRJbmRleENvdW50ZXIgPSBBcnJheSh0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMSkuZmlsbCgwKTtcbiAgICAvLyBUYWtlcyB0aGUgbG93ZXIgZGVjayB3aGljaCBjb250YWlucyB0aGUgbWF4IG51bWJlcnMgb2YgY29hY2hlc1xuICAgIGNvbnN0IGxvd2VyRGVjayA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLnNlYXRSZXNlcnZhdGlvbnMubGVuZ3RoIC0gMV07XG5cbiAgICBsb3dlckRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChsb3dlckNvYWNoSXRlbTogQ29hY2hJdGVtKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVja0NvYWNoSXRlbSA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1tpXS5jb2FjaEl0ZW1zW2NvYWNoT2Zmc2V0SW5kZXhDb3VudGVyW2ldXTtcbiAgICAgICAgaWYgKGxvd2VyQ29hY2hJdGVtLmlkICE9IGRlY2tDb2FjaEl0ZW0/LmlkKSB7XG4gICAgICAgICAgLy8gQWRkIEVtcHR5IG9mZnNldCBjb2FjaCB0byBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb25cbiAgICAgICAgICBjb25zdCBlbXB0eU9mZnNldENvYWNoID0ge1xuICAgICAgICAgICAgLi4ubG93ZXJDb2FjaEl0ZW0sXG4gICAgICAgICAgICBwbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3BlcnR5SWRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBncmFwaGljRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHJhdmVsQ2xhc3M6IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2ldLmNvYWNoSXRlbXMuc3BsaWNlKFxuICAgICAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0sXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZW1wdHlPZmZzZXRDb2FjaCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29hY2hPZmZzZXRJbmRleENvdW50ZXJbaV0rKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBvZiBTZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbiBBcnJheSBiYXNlZCBvbiB0aGUgdHJhbnNmZXJyZWQgcGxhY2VzXG4gICAqIHRoYXQgaGF2ZSB0aGUgc3RhdGUgU0VMRUNURUQgd2l0aGluIHRoZSBzZWF0UmVzZXJ2YXRpb24gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIF9pbml0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgcGxhY2Ugc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRTZWF0UmVzZXJ2YXRpb25QbGFjZXMuc2VhdHMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzID0gW107XG5cbiAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnM/LmZvckVhY2goKHNlYXRSZXNlcnZhdGlvbjogU2VhdFJlc2VydmF0aW9uLCBjb2FjaERlY2tJbmRleDogbnVtYmVyKSA9PlxuICAgICAgc2VhdFJlc2VydmF0aW9uLmNvYWNoSXRlbXMubWFwKChjb2FjaDogQ29hY2hJdGVtLCBjb2FjaEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29hY2gucGxhY2VzXG4gICAgICAgICAgPy5maWx0ZXIoKHBsYWNlKSA9PiBwbGFjZS5zdGF0ZSA9PT0gJ1NFTEVDVEVEJylcbiAgICAgICAgICA/LmZvckVhY2goKHBsYWNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZUlkID0gdGhpcy5nZXRQbGFjZUVsZW1lbnRJZChjb2FjaERlY2tJbmRleCwgY29hY2hJbmRleCwgcGxhY2UubnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXNlbGVjdGVkUGxhY2VTZWxlY3Rpb246IFBsYWNlU2VsZWN0aW9uID0gbWFwUGxhY2VJbmZvc1RvUGxhY2VTZWxlY3Rpb24oXG4gICAgICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgICAgICBwbGFjZUlkLFxuICAgICAgICAgICAgICBzZWF0UmVzZXJ2YXRpb24uZGVja0NvYWNoSW5kZXgsXG4gICAgICAgICAgICAgIGNvYWNoSW5kZXgsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbjogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsID1cbiAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24ocHJlc2VsZWN0ZWRQbGFjZVNlbGVjdGlvbiwgY29hY2hEZWNrSW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uLnBsYWNlVHlwZSA9PT0gJ1NFQVQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlYXRSZXNlcnZhdGlvblBsYWNlcy5zZWF0cy5wdXNoKHNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VhdFJlc2VydmF0aW9uUGxhY2VzLmJpY3ljbGVzLnB1c2goc2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbCBzZWxlY3RlZCBwbGFjZXMgd2lsbCBiZSByZXNldCBvciB0aGUgY3VycmVudFNlbGVjdGVkUGxhY2Ugd2FzIGdpdmVuLCB0aGVuIHdlIHJlc2V0IGFsbCBleGNlcHQgY3VycmVudFNlbGVjdGVkUGxhY2VcbiAgICogQHBhcmFtIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zXG4gICAqIEBwYXJhbSBjdXJyU2VsZWN0ZWRQbGFjZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRBbGxQbGFjZVNlbGVjdGlvbnMoXG4gICAgcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnM6IFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uW10sXG4gICAgY3VyclNlbGVjdGVkUGxhY2U/OiBQbGFjZVNlbGVjdGlvbixcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25bXSB7XG4gICAgLy9GaW5kIGFsbCBwbGFjZXMgdG8gYmUgbmVlZGVkIHVuc2VsZWN0XG4gICAgZm9yIChjb25zdCBwbGFjZVNlbGVjdGlvbiBvZiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucykge1xuICAgICAgaWYgKCFjdXJyU2VsZWN0ZWRQbGFjZSB8fCBjdXJyU2VsZWN0ZWRQbGFjZS5pZCAhPT0gcGxhY2VTZWxlY3Rpb24uaWQpIHtcbiAgICAgICAgY29uc3QgcGxhY2VFbGVtZW50ID0gdGhpcy5zaGFkb3dSb290Py5nZXRFbGVtZW50QnlJZChwbGFjZVNlbGVjdGlvbi5pZCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChwbGFjZUVsZW1lbnQpIHtcbiAgICAgICAgICBwbGFjZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdGF0ZScsICdGUkVFJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9SZW1vdmVzIGFsbCBzZWxlY3RlZCBwbGFjZXMgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGxhY2VcbiAgICBpZiAoY3VyclNlbGVjdGVkUGxhY2UpIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gcmVzZXJ2YXRpb25QbGFjZVNlbGVjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoX3NlbGVjdGVkUGxhY2UpID0+IF9zZWxlY3RlZFBsYWNlLmlkID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5pZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb25zID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgIGN1cnJTZWxlY3RlZFBsYWNlOiBQbGFjZVNlbGVjdGlvbixcbiAgICBjb2FjaERlY2tJbmRleDogbnVtYmVyIHwgbnVsbCxcbiAgKTogU2VhdFJlc2VydmF0aW9uUGxhY2VTZWxlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoY29hY2hEZWNrSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvYWNoID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zW2NvYWNoRGVja0luZGV4XS5jb2FjaEl0ZW1zW2N1cnJTZWxlY3RlZFBsYWNlLmNvYWNoSW5kZXhdO1xuICAgIGNvbnN0IHBsYWNlID0gY29hY2gucGxhY2VzPy5maW5kKChwbGFjZSkgPT4gcGxhY2UubnVtYmVyID09PSBjdXJyU2VsZWN0ZWRQbGFjZS5udW1iZXIpO1xuXG4gICAgcmV0dXJuIHBsYWNlXG4gICAgICA/IG1hcFBsYWNlQW5kQ29hY2hUb1NlYXRSZXNlcnZhdGlvblBsYWNlU2VsZWN0aW9uKFxuICAgICAgICAgIHBsYWNlLFxuICAgICAgICAgIGNvYWNoLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmlkLFxuICAgICAgICAgIGN1cnJTZWxlY3RlZFBsYWNlLmRlY2tJbmRleCxcbiAgICAgICAgICBjdXJyU2VsZWN0ZWRQbGFjZS5jb2FjaEluZGV4LFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWF0UmVzZXJ2YXRpb25TZWxlY3RlZENvYWNoKFxuICAgIGNvYWNoSW5kZXg6IG51bWJlcixcbiAgKTogU2VhdFJlc2VydmF0aW9uU2VsZWN0ZWRDb2FjaCB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4XS5jb2FjaEl0ZW1zW2NvYWNoSW5kZXhdKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb2FjaCA9IHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1tjb2FjaEluZGV4XTtcbiAgICBjb25zdCBjb2FjaE51bWJlck9mRnJlZVBsYWNlcyA9IHRoaXMuZ2V0QXZhaWxhYmxlRnJlZVBsYWNlc051bUZyb21Db2FjaChjb2FjaC5wbGFjZXMpO1xuICAgIHJldHVybiBtYXBDb2FjaEluZm9zVG9Db2FjaFNlbGVjdGlvbihjb2FjaEluZGV4LCBjb2FjaCwgY29hY2hOdW1iZXJPZkZyZWVQbGFjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQocGxhY2U6IFBsYWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY3VyclNlbGVjdGVkUGxhY2VFbGVtZW50SWQgPSBwbGFjZVxuICAgICAgPyB0aGlzLmdldFBsYWNlRWxlbWVudElkKFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4LFxuICAgICAgICAgIHRoaXMuY3VyclNlbGVjdGVkQ29hY2hJbmRleCxcbiAgICAgICAgICBwbGFjZS5udW1iZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJhdGlvbiBvZiB0aGUgdXNlZCBkb2N1bWVudHMgZm9udC1zaXplIHdoaWNoIG5lZWRzXG4gICAqIHRvIGJlIGRldGVybWluZWQgaW4gb3JkZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBDU1MgdmFsdWVzIHdpdGggcmVtXG4gICAqICovXG4gIHByaXZhdGUgX2RldGVybWluZUJhc2VGb250U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzU2VydmVyKSB7XG4gICAgICBjb25zdCBiYXNlRm9udFNpemUgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5mb250U2l6ZSwgMTApO1xuICAgICAgLy9jYWxjdWxhdGUgcmVtIG9mIDFweFxuICAgICAgY29uc3Qgb25lUGl4ZWxJblJlbSA9IDEgLyBiYXNlRm9udFNpemU7XG4gICAgICB0aGlzLnN0eWxlPy5zZXRQcm9wZXJ0eSgnLS1zYmItc2VhdC1yZXNlcnZhdGlvbi1vbmUtcHgtcmVtJywgYCR7b25lUGl4ZWxJblJlbSArICdyZW0nfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBkYXRhIGZvciBkaXNwbGF5aW5nIG5hdmlnYXRpb24gYXJlYS5cbiAgICogQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIHdoaWNoIGFyZSBub3QgZ29pbmcgdG8gY2hhbmdlIGR1cmluZyB1c2Ugb2YgYSBjb21wb25lbnQ6XG4gICAqICAgIC0gY29hY2ggaWRcbiAgICogICAgLSBsaXN0IG9mIHNlcnZpY2UgaWNvbnNcbiAgICogICAgLSBjbGFzcyAoZmlyc3QsIHNlY29uZCwgYW55KVxuICAgKiAgICAtIHdoZXRoZXIgdGhlcmUgaXMgYSBkcml2ZXIgYXJlYSBsZWZ0IG9yIHJpZ2h0XG4gICAqICovXG4gIHByaXZhdGUgX3ByZXBhcmVDb2FjaEl0ZW1EZXRhaWxzRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWF0UmVzZXJ2YXRpb25zKSB7XG4gICAgICBjb25zdCBsb3dlckRlY2s6IENvYWNoSXRlbVtdID1cbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zW3RoaXMuc2VhdFJlc2VydmF0aW9ucy5sZW5ndGggLSAxXS5jb2FjaEl0ZW1zO1xuXG4gICAgICB0aGlzLmNvYWNoSXRlbURldGFpbHNFbGVtZW50cyA9IFtdO1xuXG4gICAgICBsb3dlckRlY2suZm9yRWFjaCgoY29hY2gsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUlkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGxhY2VzOiBQbGFjZVtdID0gW107XG5cbiAgICAgICAgLy8gQ29sbGVjdCBhbGwgaW1wb3J0YW50IG5hdmlnYXRpb24gZGF0YSB0byBiZSByZW5kZXJlZFxuICAgICAgICB0aGlzLnNlYXRSZXNlcnZhdGlvbnNcbiAgICAgICAgICAubWFwKChzcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHNyLmNvYWNoSXRlbXNbaW5kZXhdO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZvckVhY2goKGNvYWNoOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRyYXZlbENsYXNzZXMucHVzaCguLi5jb2FjaC50cmF2ZWxDbGFzcyk7XG4gICAgICAgICAgICBwcm9wZXJ0eUlkcy5wdXNoKC4uLihjb2FjaC5wcm9wZXJ0eUlkcyA/IGNvYWNoLnByb3BlcnR5SWRzIDogW10pKTtcbiAgICAgICAgICAgIHBsYWNlcy5wdXNoKC4uLihjb2FjaC5wbGFjZXMgPyBjb2FjaC5wbGFjZXMgOiBbXSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29hY2hJdGVtRGV0YWlsc0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBjb2FjaC5pZCxcbiAgICAgICAgICB0cmF2ZWxDbGFzczogdGhpcy5fcHJlcGFyZVRyYXZlbENsYXNzTmF2aWdhdGlvbih0cmF2ZWxDbGFzc2VzKSxcbiAgICAgICAgICBwcm9wZXJ0eUlkczogdGhpcy5fcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24ocHJvcGVydHlJZHMpLFxuICAgICAgICAgIGlzRHJpdmVyQXJlYTogY29hY2gucGxhY2VzID8gY29hY2gucGxhY2VzLmxlbmd0aCA9PT0gMCA6IHRydWUsXG4gICAgICAgICAgaXNMb2NvbW90aXZlOiB0aGlzLl9pc0xvY29tb3RpdmUoY29hY2gpLFxuICAgICAgICAgIGRyaXZlckFyZWFTaWRlOiB0aGlzLl9wcmVwYXJlRHJpdmVyQXJlYVNpZGVOYXZpZ2F0aW9uKGNvYWNoKSxcbiAgICAgICAgICBmcmVlUGxhY2VzOiB0aGlzLmdldEF2YWlsYWJsZUZyZWVQbGFjZXNOdW1Gcm9tQ29hY2gocGxhY2VzKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyAjVElNTy00NTg1OFxuICAvLyBGaW5kcyB0aGUgb3B0aW1hbCBpY29uIHNpemUgYmFzZWQgb24gYWxsIHNlcnZpY2VFbGVtZW50cyBhbmQgdGhlaXIgZGltZW5zaW9uLlxuICAvLyBUaGlzIHNldHMgdGhlIGdsb2JhbEFyZWFJY29uRGltIGFuZCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIHNlYXQgcmVzZXJ2YXRpb24gYXJlYSBlbGVtZW50cy5cbiAgLy8gVGhpcyBnaXZlcyB1cyBhIG1heGltdW0gdW5pZm9ybSBpY29uIHNpemUgd2l0aGluIHRoZSBhcmVhIGVsZW1lbnRzXG4gIHByaXZhdGUgX3ByZXBhcmVPcHRpbWl6ZUFyZWFJY29uRGltZW5zaW9uQnlNZWRpYW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgY29uc3QgYWxsU2VydmljZURpbWVuc2lvbnM6IEVsZW1lbnREaW1lbnNpb25bXSA9IFtdO1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmZvckVhY2goKGRlY2spID0+XG4gICAgICAgIGRlY2suY29hY2hJdGVtcy5mb3JFYWNoKChjb2FjaCkgPT5cbiAgICAgICAgICBjb2FjaC5zZXJ2aWNlRWxlbWVudHM/LmZvckVhY2goKGljb24pID0+IGFsbFNlcnZpY2VEaW1lbnNpb25zLnB1c2goaWNvbi5kaW1lbnNpb24pKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChhbGxTZXJ2aWNlRGltZW5zaW9ucy5sZW5ndGgpIHtcbiAgICAgICAgYWxsU2VydmljZURpbWVuc2lvbnMuc29ydChcbiAgICAgICAgICAoZGltMTogRWxlbWVudERpbWVuc2lvbiB8IHVuZGVmaW5lZCwgZGltMjogRWxlbWVudERpbWVuc2lvbiB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRpbTEgJiYgZGltMikge1xuICAgICAgICAgICAgICBjb25zdCBtYXhEaW0xID0gZGltMS53ICsgZGltMS5oO1xuICAgICAgICAgICAgICBjb25zdCBtYXhEaW0yID0gZGltMi53ICsgZGltMi5oO1xuICAgICAgICAgICAgICBpZiAobWF4RGltMSA+IG1heERpbTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhEaW0xIDwgbWF4RGltMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBiZXN0IGljb24gc2l6ZSBieSBtZWRpYW5cbiAgICAgICAgY29uc3QgbWVkaWFuSWNvblNpemUgPSBhbGxTZXJ2aWNlRGltZW5zaW9uc1tNYXRoLmZsb29yKGFsbFNlcnZpY2VEaW1lbnNpb25zLmxlbmd0aCAvIDIpXSE7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBkZXRlcm1pbmVkIG1lZGlhbiBpY29uIHNpemUgYXMgZ2xvYmFsIGNhbGN1bGF0ZWQgYXJlYSBpY29uIGRpbWVuc2lvblxuICAgICAgICB0aGlzLmdsb2JhbEFyZWFJY29uRGltID0gdGhpcy5nZXRDYWxjdWxhdGVkRGltZW5zaW9uKG1lZGlhbkljb25TaXplKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZpbmQgdGhlIG1heGltdW0gY29hY2ggaGVpZ2h0IGZyb20gYWxsIGRlY2tzXG4gICAgICAgIGNvbnN0IG1heENvYWNoSGVpZ2h0ID0gdGhpcy5zZWF0UmVzZXJ2YXRpb25zXG4gICAgICAgICAgLmZsYXRNYXAoKGRlY2spID0+IGRlY2suY29hY2hJdGVtcy5tYXAoKGNvYWNoKSA9PiBjb2FjaC5kaW1lbnNpb24uaCkpXG4gICAgICAgICAgLnJlZHVjZSgobWF4LCBoZWlnaHQpID0+IE1hdGgubWF4KG1heCwgaGVpZ2h0KSwgMCk7XG5cbiAgICAgICAgLy9jYWxjdWxhdGUgMjAlIG9mIG1heGltdW0gaGVpZ2h0IGFzIGljb24gZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGljb25EaW1lbnNpb24gPSBNYXRoLmZsb29yKG1heENvYWNoSGVpZ2h0ICogMC4yKTtcbiAgICAgICAgdGhpcy5nbG9iYWxBcmVhSWNvbkRpbSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbih7XG4gICAgICAgICAgdzogaWNvbkRpbWVuc2lvbixcbiAgICAgICAgICBoOiBpY29uRGltZW5zaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcmVwYXJlVHJhdmVsQ2xhc3NOYXZpZ2F0aW9uKHRyYXZlbENsYXNzZXM6IFBsYWNlVHJhdmVsQ2xhc3NbXSk6IFBsYWNlVHJhdmVsQ2xhc3Mge1xuICAgIGlmICh0cmF2ZWxDbGFzc2VzLmluZGV4T2YoJ0ZJUlNUJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJ0ZJUlNUJztcbiAgICB9XG4gICAgaWYgKHRyYXZlbENsYXNzZXMuaW5kZXhPZignU0VDT05EJykgIT09IC0xKSB7XG4gICAgICByZXR1cm4gJ1NFQ09ORCc7XG4gICAgfVxuICAgIHJldHVybiAnQU5ZX0NMQVNTJztcbiAgfVxuXG4gIHByaXZhdGUgX3ByZXBhcmVEcml2ZXJBcmVhU2lkZU5hdmlnYXRpb24oXG4gICAgY29hY2hJdGVtOiBDb2FjaEl0ZW0sXG4gICk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb2FjaERyaXZlckFyZWFzID0gY29hY2hJdGVtLmdyYXBoaWNFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgKGdyYXBoaWNhbEVsZW1lbnRzKSA9PiBncmFwaGljYWxFbGVtZW50cy5pY29uID09PSAnRFJJVkVSX0FSRUEnLFxuICAgICk7XG5cbiAgICBpZiAoY29hY2hEcml2ZXJBcmVhcyAmJiBjb2FjaERyaXZlckFyZWFzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENoZWNraW5nIHRoZSBkcml2ZXIgYXJlYSBwb3NpdGlvbiB3aGV0aGVyIGl0IGlzIHByZXNlbnQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBpbiBhIGNvYWNoXG4gICAgICBjb25zdCBoYXNMZWZ0RHJpdmVyQXJlYSA9XG4gICAgICAgIGNvYWNoRHJpdmVyQXJlYXMuZmluZCgoZHJpdmVyQXJlYUVsZW1lbnQpID0+IGRyaXZlckFyZWFFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaGFzUmlnaHREcml2ZXJBcmVhID1cbiAgICAgICAgY29hY2hEcml2ZXJBcmVhcy5maW5kKChkcml2ZXJBcmVhRWxlbWVudCkgPT4gZHJpdmVyQXJlYUVsZW1lbnQucG9zaXRpb24ueCA+IDApIHx8IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAhIWhhc0xlZnREcml2ZXJBcmVhLFxuICAgICAgICByaWdodDogISFoYXNSaWdodERyaXZlckFyZWEsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJlcGFyZVNlcnZpY2VJY29uc05hdmlnYXRpb24gPSAocHJvcGVydHlJZHM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghcHJvcGVydHlJZHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaHJ1bmtQcm9wZXJ0eUlkcyA9IHByb3BlcnR5SWRzXG4gICAgICA/Lm1hcChmdW5jdGlvbiAocHJvcGVydHlJZDogc3RyaW5nKToge1xuICAgICAgICBwSWQ6IHN0cmluZztcbiAgICAgICAgc3ZnTmFtZTogc3RyaW5nO1xuICAgICAgfSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGVtcG9yYXJ5IG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IGlkIHRvIGl0J3Mgc3ZnTmFtZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgaWNvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwSWQ6IHByb3BlcnR5SWQsXG4gICAgICAgICAgc3ZnTmFtZTogbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lID8gbWFwSWNvblRvU3ZnW3Byb3BlcnR5SWRdPy5zdmdOYW1lIDogJycsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLy9maWx0ZXIgb3V0IG9iamVjdHMgc2VydmljZSBpY29ucyB3aGljaCBhcmUgbm90IGluIEFMTE9XRURfU0VSVklDRV9JQ09OU1xuICAgICAgLmZpbHRlcigocHJvcGVydHlUb1N2ZykgPT4gQUxMT1dFRF9TRVJWSUNFX0lDT05TLmluZGV4T2YocHJvcGVydHlUb1N2Zy5zdmdOYW1lKSAhPT0gLTEpXG4gICAgICAvL21ha2UgaXQgZGlzdGluY3QgYnkgc3ZnTmFtZVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHZhbHVlLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICBzZWxmLm1hcCgocHJvcFN2ZykgPT4gcHJvcFN2Zy5zdmdOYW1lKS5pbmRleE9mKHZhbHVlLnN2Z05hbWUpID09PSBpbmRleCxcbiAgICAgIClcbiAgICAgIC8vIGdvIGJhY2sgdG8gcHJvcGVydHlJZCBzdHJpbmcgZnJvbSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICAubWFwKChwcm9wZXJ0eVRvU3ZnKSA9PiBwcm9wZXJ0eVRvU3ZnLnBJZClcbiAgICAgIC8vIHRha2UgZmlyc3QgTUFYX1NFUlZJQ0VfUFJPUEVSVElFUyByZWdhcmRsZXNzIG9mIHRoZSBpbnB1dCBmcm9tIEJhY2tlbmQsIG90aGVyd2lzZSB0aGUgbGF5b3V0IGNvdWxkIGJlIGRlc3Ryb3llZFxuICAgICAgLnNsaWNlKDAsIE1BWF9TRVJWSUNFX1BST1BFUlRJRVMpO1xuICAgIHJldHVybiBzaHJ1bmtQcm9wZXJ0eUlkcyA/IHNocnVua1Byb3BlcnR5SWRzIDogW107XG4gIH07XG5cbiAgLy8gSW5pdGlhbGx5IGNhbGN1bGF0ZXMgYWxsIHRoZSBuZWNlc3NhcnkgcG9zaXRpb25zIGFuZCBkaW1lbnNpb25zIG9mIGFsbCBjb2FjaCBlbGVtZW50cywgYXJlYSBlbGVtZW50cywgc2VydmljZSBlbGVtZW50c1xuICBwcml2YXRlIF9wcmVwYXJlU2VhdFJlc2VydmF0aW9uU3RydWN0dXJlSW5mb3JtYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhdFJlc2VydmF0aW9ucykge1xuICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUgPSB7XG4gICAgICAgIGRlY2tzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9ucy5mb3JFYWNoKChzZWF0UmVzZXJ2YXRpb246IFNlYXRSZXNlcnZhdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBzZWF0UmVzZXJ2YXRpb25EZWNrOiBTZWF0cmVzZXJ2YXRpb25EZWNrID0ge1xuICAgICAgICAgIGRlY2tJbmRleDogaW5kZXgsXG4gICAgICAgICAgZGVja0NvYWNoZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNlYXRSZXNlcnZhdGlvbj8uY29hY2hJdGVtcz8uZm9yRWFjaCgoY29hY2hJdGVtOiBDb2FjaEl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PiBlLmljb24gJiYgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGUuaWNvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhbGxFbGVtZW5ldHMgPVxuICAgICAgICAgICAgZmlsdGVyZWRBcmVhRWxlbWVudHNcbiAgICAgICAgICAgICAgPy5jb25jYXQoY29hY2hJdGVtLnNlcnZpY2VFbGVtZW50cyB8fCBbXSlcbiAgICAgICAgICAgICAgLmNvbmNhdChjb2FjaEl0ZW0ucGxhY2VzIHx8IFtdKSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBoYXNPdmVyaGFuZ2luZ0VsZW1lbnRzID0gdGhpcy5faXNPdmVyaGFuZ2luZ0VsZW1lbnRzUHJlc2VudChcbiAgICAgICAgICAgIGNvYWNoSXRlbS5kaW1lbnNpb24udyxcbiAgICAgICAgICAgIGFsbEVsZW1lbmV0cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFyZWFFbGVtZW50cyA9IGNvYWNoSXRlbS5ncmFwaGljRWxlbWVudHNcbiAgICAgICAgICAgID8uZmlsdGVyKFxuICAgICAgICAgICAgICAoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgIXRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgdHJ1ZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG90aGVyRWxlbWVudHMgPSBjb2FjaEl0ZW0uZ3JhcGhpY0VsZW1lbnRzXG4gICAgICAgICAgICA/LmZpbHRlcigoZ3JhcGhpY2FsRWxlbWVudDogQmFzZUVsZW1lbnQpID0+XG4gICAgICAgICAgICAgIHRoaXMubm90QXJlYUVsZW1lbnRzLmluY2x1ZGVzKGdyYXBoaWNhbEVsZW1lbnQuaWNvbiEpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoZWxlKSA9PlxuICAgICAgICAgICAgICB0aGlzLl9nZXRDYWxjdWxhdGVkRGltZW5zaW9uUG9zaXRpb25FbGVtZW50KGVsZSwgY29hY2hJdGVtLmRpbWVuc2lvbiwgZmFsc2UpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzZXJ2aWNlRWxlbWVudHMgPSBjb2FjaEl0ZW0uc2VydmljZUVsZW1lbnRzPy5tYXAoKGVsZSkgPT5cbiAgICAgICAgICAgIHRoaXMuX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoZWxlLCBjb2FjaEl0ZW0uZGltZW5zaW9uLCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGJvcmRlck1pZGRsZUVsZW1lbnQgPSB0aGlzLl9nZXRDYWxjdWxhdGVkTWlkZGxlQm9yZGVyRWxlbWVudChjb2FjaEl0ZW0pO1xuICAgICAgICAgIGNvbnN0IGNhbGNDb2FjaERpbWVuc2lvbiA9IHRoaXMuZ2V0Q2FsY3VsYXRlZERpbWVuc2lvbih7IC4uLmNvYWNoSXRlbS5kaW1lbnNpb24gfSk7XG4gICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBzaW5nbGUgY29hY2hcbiAgICAgICAgICBjb25zdCBjb2FjaFN0dXJjdHVyZTogQ29hY2hTdHJ1Y3R1cmUgPSB7XG4gICAgICAgICAgICB3aWR0aDogY2FsY0NvYWNoRGltZW5zaW9uLncsXG4gICAgICAgICAgICBoZWlnaHQ6IGNhbGNDb2FjaERpbWVuc2lvbi5oLFxuICAgICAgICAgICAgb3RoZXJFbGVtZW50czogb3RoZXJFbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50czogc2VydmljZUVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgYXJlYUVsZW1lbnRzOiBhcmVhRWxlbWVudHMgfHwgW10sXG4gICAgICAgICAgICBib3JkZXJNaWRkbGVFbGVtZW50OiBib3JkZXJNaWRkbGVFbGVtZW50LFxuICAgICAgICAgICAgaGFzT3ZlcmhhbmdpbmdFbGVtZW50czogaGFzT3ZlcmhhbmdpbmdFbGVtZW50cyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2VhdFJlc2VydmF0aW9uRGVjay5kZWNrQ29hY2hlcy5wdXNoKGNvYWNoU3R1cmN0dXJlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWF0UmVzZXJ2YXRpb25TdHJ1Y3R1cmUuZGVja3MucHVzaChzZWF0UmVzZXJ2YXRpb25EZWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gb2YgdGhlIG1pZGRsZSBib3JkZXIuXG4gICAqIFRvIGNhbGN1bGF0ZSB0aGUgc3RhcnQgKyBlbmQgY29vcmRpbmF0ZSBhbmQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgbWlkZGxlIGJvcmRlciBjb2FjaCBncmFwaGljLFxuICAgKiB0aGUgZXhpc3RpbmcgZG9ja2luZyBjb2FjaCBncmFwaGljcyBhcmUgYW5hbHlzZWQgYW5kIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBwb3NpdGlvbiBhbmQgZGllbWVuc2lvbiBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgX2dldENhbGN1bGF0ZWRNaWRkbGVCb3JkZXJFbGVtZW50KGNvYWNoOiBDb2FjaEl0ZW0pOiBCYXNlRWxlbWVudCB7XG4gICAgY29uc3QgYm9yZGVySGVpZ2h0ID0gKGNvYWNoLmRpbWVuc2lvbi5oICsgdGhpcy5jb2FjaEJvcmRlck9mZnNldCAqIDIpICogdGhpcy5iYXNlR3JpZFNpemU7XG4gICAgLy8gRGVmYXVsdCAtIHdpdGhvdXQgZmluZGluZyBkb2NraW5nIGJvcmRlciBlbGVtZW50cywgdGhlIG1pZGRsZSBib3JkZXIgZ29lcyBmcm9tIDAgcG9zaXRpb24gdW50aWwgY29hY2ggd2lkdGggZW5kXG4gICAgbGV0IHN0YXJ0Qm9yZGVyT2Zmc2V0WCA9IDA7XG4gICAgbGV0IGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLnc7XG5cbiAgICBpZiAoY29hY2guZ3JhcGhpY0VsZW1lbnRzKSB7XG4gICAgICAvLyBEb2NraW5nRWxlbWVudGUgZGVmaW5lcyB0aGUgZWxlbWVudHMgd2hlcmUgdGhlIGJvcmRlciBvZiB0aGUgY29hY2ggcmVhbGx5IHN0YXJ0cyBhbmQgZW5kc1xuICAgICAgY29uc3QgZG9ja2luZ0VsZW1lbnRzID0gdGhpcy5fZ2V0Rmlyc3RMYXN0RG9ja2luZ0VsZW1lbnRzKGNvYWNoLmdyYXBoaWNFbGVtZW50cyk7XG5cbiAgICAgIC8vIFR3byBkb2NraW5nIGNvYWNoIGVsZW1lbnRzIGV4aXN0IChub3JtYWwgY2FzZSAtIHN0YXJ0IGFuZCBlbmQgZG9ja2luZyBlbGVtZW50KVxuICAgICAgaWYgKGRvY2tpbmdFbGVtZW50cz8ubGVuZ3RoID09IDIpIHtcbiAgICAgICAgY29uc3QgZmlyc3REb2NraW5nRWxlbWVudCA9IGRvY2tpbmdFbGVtZW50c1swXTtcbiAgICAgICAgY29uc3QgbGFzdERvY2tpbmdFbGVtZW50ID0gZG9ja2luZ0VsZW1lbnRzWzFdO1xuICAgICAgICBjb25zdCBlbmRCb3JkZXJPZmZzZXRYID1cbiAgICAgICAgICBmaXJzdERvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT0gMFxuICAgICAgICAgICAgPyBsYXN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLndcbiAgICAgICAgICAgIDogZmlyc3REb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcblxuICAgICAgICBzdGFydEJvcmRlck9mZnNldFggPVxuICAgICAgICAgIGZpcnN0RG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCA9PSAwXG4gICAgICAgICAgICA/IGZpcnN0RG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLndcbiAgICAgICAgICAgIDogbGFzdERvY2tpbmdFbGVtZW50LmRpbWVuc2lvbi53O1xuXG4gICAgICAgIGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLncgLSBlbmRCb3JkZXJPZmZzZXRYIC0gc3RhcnRCb3JkZXJPZmZzZXRYO1xuICAgICAgfVxuICAgICAgLy8gT25seSBvbmUgZG9ja2luZyBib3JkZXIgY29hY2ggZWxlbWVudHMgZXhpc3QgKHN0YXJ0IG9yIGVuZCBkb2NraW5nIGVsZW1lbnQpXG4gICAgICBlbHNlIGlmIChkb2NraW5nRWxlbWVudHM/Lmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGNvbnN0IGRvY2tpbmdFbGVtZW50ID0gZG9ja2luZ0VsZW1lbnRzWzBdO1xuXG4gICAgICAgIC8vIE1pZGRsZUJvcmRlciBzdGFydHMgZnJvbSBsZWZ0IGRvY2tpbmcgZWxlbWVudCB1bnRpbCBjb2FjaCBlbmRcbiAgICAgICAgaWYgKGRvY2tpbmdFbGVtZW50LnBvc2l0aW9uLnggPT09IDApIHtcbiAgICAgICAgICBzdGFydEJvcmRlck9mZnNldFggPSBkb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcbiAgICAgICAgICBib3JkZXJXaWR0aCA9IGNvYWNoLmRpbWVuc2lvbi53IC0gZG9ja2luZ0VsZW1lbnQuZGltZW5zaW9uLnc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWlkZGxlQm9yZGVyIHN0YXJ0cyBmcm9tIHBvc2l0aW9uIHggMCB1bnRpbCBkb2NraW5nIGVsZW1lbnQgb24gdGhlIHJpZ2h0IGNvYWNoIHNpZGVcbiAgICAgICAgZWxzZSBpZiAoZG9ja2luZ0VsZW1lbnQucG9zaXRpb24ueCAhPT0gMCkge1xuICAgICAgICAgIGJvcmRlcldpZHRoID0gY29hY2guZGltZW5zaW9uLncgLSBkb2NraW5nRWxlbWVudC5kaW1lbnNpb24udztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlPZmZzZXQgPSB0aGlzLmNvYWNoQm9yZGVyUGFkZGluZyAqIC0xO1xuICAgIC8vIFRoZSBib3JkZXIgaGFzIHRvIGJlIG1vdmVkIG1hbnVhbCBieSAxcHggbGVmdCBhbmQgYWxzbyBzdHJldGNoZWQgYnkgMnB4IHRvIGdldCBhIGNsb3NlZCBib3JkZXIgbGluZSB0byB0aGUgY29hY2ggc3RhcnQgYW5kIGVuZCBib3JkZXIgZWxlbWVudHMsIHdpdGhvdXQgMXB4IHdoaXRlIGdhcC5cbiAgICBjb25zdCBwb3MgPSB7IHg6IE1hdGguZmxvb3Ioc3RhcnRCb3JkZXJPZmZzZXRYICogdGhpcy5iYXNlR3JpZFNpemUpIC0gMSwgeTogeU9mZnNldCwgejogMCB9O1xuICAgIGNvbnN0IGRpbSA9IHsgdzogTWF0aC5mbG9vcihib3JkZXJXaWR0aCAqIHRoaXMuYmFzZUdyaWRTaXplKSArIDIsIGg6IGJvcmRlckhlaWdodCB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiBwb3MsXG4gICAgICBkaW1lbnNpb246IGRpbSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ3JhcGhpY2FsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgYm9yZGVyIGVsZW1lbnRzIG9mIHRoZSBjb2FjaC5cbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRbXVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Rmlyc3RMYXN0RG9ja2luZ0VsZW1lbnRzKGdyYXBoaWNFbGVtZW50czogQmFzZUVsZW1lbnRbXSk6IEJhc2VFbGVtZW50W10ge1xuICAgIC8vIEdldCBhbGwgcmVsZXZhbnQgZG9ja2luZyBlbGVtZW50cyBhbmQgc29ydHMgdGhlbSBhZ2FpbiBhY2NvcmRpbmcgdG8gdGhlaXIgeCBwb3NpdGlvbiBjb29yZGluYXRlcyxcbiAgICAvLyB0aHVzIHRoZSBzdGFydCBhbmQgZW5kIGRvY2tpbmcgZWxlbWVudHMgd291bGQgYmUgZGVmaW5lZFxuICAgIGNvbnN0IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzID0gKFxuICAgICAgZ3JhcGhpY0VsZW1lbnRzLmZpbHRlcigoZWxlKSA9PiB0aGlzLm1pZGRsZUJvcmRlckRvY2tpbmdFbGVtZW50cy5pbmNsdWRlcyhlbGUuaWNvbiEpKSB8fCBbXVxuICAgICkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgcG9zQSA9IGEucG9zaXRpb24ueDtcbiAgICAgIGNvbnN0IHBvc0IgPSBiLnBvc2l0aW9uLng7XG4gICAgICBpZiAocG9zQSA+IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBpZiAocG9zQSA8IHBvc0IpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWREb2NraW5nRWxlbWVudHMuZmlsdGVyKFxuICAgICAgKF8sIGluZGV4KSA9PiBpbmRleCA9PSAwIHx8IGluZGV4ID09IGZpbHRlcmVkRG9ja2luZ0VsZW1lbnRzLmxlbmd0aCAtIDEsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYWxjdWxhdGVkIHBvc2l0aW9ucyBhbmQgZGltZW5zaW9ucyBvZiBncmFwaGljYWwsIHNlcnZpY2UgYW5kIGFyZWEgZWxlbWVudHNcbiAgICogQHJldHVybnMgQmFzZUVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgX2dldENhbGN1bGF0ZWREaW1lbnNpb25Qb3NpdGlvbkVsZW1lbnQoXG4gICAgZWxlbWVudDogQmFzZUVsZW1lbnQsXG4gICAgY29hY2hEaW1lbnNpb246IEVsZW1lbnREaW1lbnNpb24sXG4gICAgaXNDYWxjQXJlYUVsZW1lbnQ6IGJvb2xlYW4sXG4gICk6IEJhc2VFbGVtZW50IHtcbiAgICBjb25zdCBkaW0gPSB7IC4uLmVsZW1lbnQuZGltZW5zaW9uIH07XG4gICAgY29uc3QgcG9zID0geyAuLi5lbGVtZW50LnBvc2l0aW9uIH07XG4gICAgY29uc3Qgcm90YXRpb24gPSBlbGVtZW50LnJvdGF0aW9uIHx8IDA7XG4gICAgY29uc3QgaXNOb3RGaXhlZFJvdGF0aW9uR3JhcGhpY2FsRWxlbWVudCA9XG4gICAgICB0aGlzLm5vdEFyZWFFbGVtZW50cy5jb25jYXQodGhpcy5ub3RGaXhlZFJvdGF0YWJsZUFyZWFJY29ucykuaW5kZXhPZihlbGVtZW50Lmljb24hKSA9PT0gLTE7XG4gICAgY29uc3QgY2FsY1JvdGF0aW9uID1cbiAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCAmJiBpc05vdEZpeGVkUm90YXRpb25HcmFwaGljYWxFbGVtZW50ID8gcm90YXRpb24gLSA5MCA6IHJvdGF0aW9uO1xuICAgIGxldCBhcmVhTW91bnRpbmc6IEVsZW1lbnRNb3VudGluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb24gZm9yIEFyZWFFbGVtZW50c1xuICAgIGlmIChpc0NhbGNBcmVhRWxlbWVudCkge1xuICAgICAgY29uc3QgaXNOb3RUYWJsZUdyYXBoaWMgPSBlbGVtZW50Lmljb24/LmluZGV4T2YoJ1RBQkxFJykgPT09IC0xO1xuICAgICAgY29uc3QgYXJlYVByb3BlcnR5ID0gZWxlbWVudC5pY29uICYmIGlzTm90VGFibGVHcmFwaGljID8gZWxlbWVudC5pY29uIDogbnVsbDtcbiAgICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPVxuICAgICAgICB0aGlzLmlzRWxlbWVudERpcmVjdGx5T25Cb3JkZXIoZWxlbWVudCwgY29hY2hEaW1lbnNpb24pICYmIGFyZWFQcm9wZXJ0eSAhPT0gJ0VOVFJZX0VYSVQnO1xuXG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIGFyZWFNb3VudGluZyA9ICd1cHBlci1ib3JkZXInO1xuICAgICAgICBwb3MueSAtPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQucG9zaXRpb24ueSArIGVsZW1lbnQuZGltZW5zaW9uLmggPT09IGNvYWNoRGltZW5zaW9uLmgpIHtcbiAgICAgICAgYXJlYU1vdW50aW5nID0gJ2xvd2VyLWJvcmRlcic7XG4gICAgICAgIGlmICghc3RyZXRjaEhlaWdodCkge1xuICAgICAgICAgIHBvcy55ICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgLSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC8gMztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RyZXRjaEhlaWdodCkge1xuICAgICAgICBkaW0uaCArPSB0aGlzLmNvYWNoQm9yZGVyT2Zmc2V0IC0gdGhpcy5jb2FjaEJvcmRlck9mZnNldCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9uIGZvciBhbGwgb3RoZXIgZ3JhcGhpY2FsIGVsZW1lbnRzXG4gICAgZWxzZSB7XG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbi55ID09PSAwKSB7XG4gICAgICAgIHBvcy55IC09IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2FjaERpbWVuc2lvbi5oID09PSBlbGVtZW50LnBvc2l0aW9uLnkgKyBlbGVtZW50LmRpbWVuc2lvbi5oKSB7XG4gICAgICAgIGRpbS5oICs9IHRoaXMuY29hY2hCb3JkZXJPZmZzZXQgKiAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpbS53ID0gTWF0aC5mbG9vcihkaW0udyAqIHRoaXMuYmFzZUdyaWRTaXplKTtcbiAgICBkaW0uaCA9IE1hdGguZmxvb3IoZGltLmggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG5cbiAgICBwb3MueCA9IE1hdGguZmxvb3IocG9zLnggKiB0aGlzLmJhc2VHcmlkU2l6ZSk7XG4gICAgcG9zLnkgPSBNYXRoLmZsb29yKHBvcy55ICogdGhpcy5iYXNlR3JpZFNpemUpO1xuXG4gICAgY29uc3QgaWNvbiA9XG4gICAgICBlbGVtZW50Lmljb24gJiYgZWxlbWVudC5pY29uLmVuZHNXaXRoKCdEUklWRVJfQVJFQScpXG4gICAgICAgID8gZWxlbWVudC5pY29uPy5jb25jYXQoJ18nLCB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5jdXJyU2VsZWN0ZWREZWNrSW5kZXhdLnZlaGljbGVUeXBlKVxuICAgICAgICA6IGVsZW1lbnQuaWNvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBpY29uLFxuICAgICAgcm90YXRpb246IGNhbGNSb3RhdGlvbixcbiAgICAgIGRpbWVuc2lvbjogZGltLFxuICAgICAgcG9zaXRpb246IHBvcyxcbiAgICAgIG1vdW50aW5nOiBhcmVhTW91bnRpbmcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIHBsYWNlIEhUTUwgZWxlbWVudCBieSBjdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZC5cbiAgICogQHJldHVybnMgSFRNTEVsZW1lbnQgb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0UGxhY2VIdG1sRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmN1cnJTZWxlY3RlZFBsYWNlRWxlbWVudElkXG4gICAgICA/IHRoaXMuc2hhZG93Um9vdD8uZ2V0RWxlbWVudEJ5SWQodGhpcy5jdXJyU2VsZWN0ZWRQbGFjZUVsZW1lbnRJZCkgfHwgbnVsbFxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2FjaCBkZWNrIGluZGV4IGZyb20gcGxhY2UgaWRcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIF9nZXREZWNrSW5kZXhCeVBsYWNlSWQocGxhY2VJZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgZGVja0luZGV4ID0gdGhpcy5zaGFkb3dSb290XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJyMnICsgcGxhY2VJZClcbiAgICAgID8uZ2V0QXR0cmlidXRlKCdkYXRhLWRlY2staW5kZXgnKTtcbiAgICBpZiAoZGVja0luZGV4ICYmICFpc05hTigrZGVja0luZGV4KSkge1xuICAgICAgcmV0dXJuICtkZWNrSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZENvYWNoSW5kZXgoY29hY2hJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvYWNoSW5kZXggPj0gMCAmJlxuICAgICAgY29hY2hJbmRleCA8PSB0aGlzLnNlYXRSZXNlcnZhdGlvbnNbdGhpcy5zZWF0UmVzZXJ2YXRpb25zLmxlbmd0aCAtIDFdLmNvYWNoSXRlbXMubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV4aXN0aW5nIGNvYWNoIGRlY2sgaW5kZXggZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBjb2FjaC5cbiAgICogVGhpcyBtZXRob2QgaXMgbmVjZXNzYXJ5IHRvIGdldCBhbiBhdmFpbGFibGUgY29hY2ggZGVjayBpbmRleCBkdXJpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiBjb2FjaGVzIHdpdGggZGlmZmVyZW50IGRlY2tzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBuYXZpZ2F0aW5nIGZyb20gYSBjb2FjaCB3aXRoIHR3byBkZWNrcyB0byBhIGNvYWNoIHdpdGggb25lIGRlY2suXG4gICAqXG4gICAqICAgICAgIFtvb29dLVtvb29dLVtvb29dXG4gICAqIFtvb29dLVtvb29dLVtvb29dLVtvb29dLVtvb29dXG4gICAqXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RXhpc3RpbmdDb2FjaERlY2tJbmRleCgpOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VhdFJlc2VydmF0aW9uc1t0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleF0uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdXG4gICAgICAgIC5wbGFjZXMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4O1xuICAgIH1cblxuICAgIC8vIEZpbmQgbmV4dCBwb3NzaWJsZSBjb2FjaCBkZWNrIGluZGV4IHdoZXJlIHBsYWNlcyBleGlzdFxuICAgIGNvbnN0IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleCA9IHRoaXMuc2VhdFJlc2VydmF0aW9ucy5maW5kSW5kZXgoXG4gICAgICAoc2VhdFJlc2VydmF0aW9uKSA9PlxuICAgICAgICBzZWF0UmVzZXJ2YXRpb24uY29hY2hJdGVtc1t0aGlzLmN1cnJTZWxlY3RlZENvYWNoSW5kZXhdLnBsYWNlcyAhPT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY3VyclNlbGVjdGVkRGVja0luZGV4ID49IG5leHRBdmFpbGFibGVEZWNrQ29hY2hJbmRleFxuICAgICAgPyB0aGlzLmN1cnJTZWxlY3RlZERlY2tJbmRleFxuICAgICAgOiBuZXh0QXZhaWxhYmxlRGVja0NvYWNoSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBzZWxlY3RlZCBwbGFjZSBpcyBzbGlnaHRseSBoaWRkZW4gYnkgdGhlIG92ZXJmbG93IHNjcm9sbCBjb250ZW50IGFuZCBpcyBzdGlsbCBjbGlja2VkLFxuICAgKiB0aGUgbWV0aG9kIHRyaWVzIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgcGxhY2UgaW50byB0aGUgbmVhcmVzdCB2aWV3cG9ydCwgc28gdGhhdCBpdCBpcyBjb21wbGV0ZWx5IHZpc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSBwbGFjZUlkXG4gICAqL1xuICBwcml2YXRlIF9zY3JvbGxQbGFjZUludG9OZWFyZXN0Vmlld3BvcnQocGxhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaGFkb3dSb290XG4gICAgICA/LmdldEVsZW1lbnRCeUlkKHBsYWNlSWQpXG4gICAgICA/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICduZWFyZXN0JyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgYW55IHBsYWNlcyBvciBncmFwaGljYWwgZWxlbWVudHMgKGUuZy4gdG9pbGV0IGFyZWEsIGV0Yy4pIGFyZSBvdmVyaGFuZ2luZyB0aGUgY29hY2ggYm9yZGVyc1xuICAgKiBAcGFyYW0gY29hY2hJdGVtV2lkdGhcbiAgICogQHBhcmFtIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIF9pc092ZXJoYW5naW5nRWxlbWVudHNQcmVzZW50KFxuICAgIGNvYWNoSXRlbVdpZHRoOiBudW1iZXIsXG4gICAgZWxlbWVudHM6IChQbGFjZSB8IEJhc2VFbGVtZW50KVtdIHwgdW5kZWZpbmVkLFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZWxlbWVudHM/LnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQucG9zaXRpb24ueCA9PT0gMCB8fCBlbGVtZW50LnBvc2l0aW9uLnggKyBlbGVtZW50LmRpbWVuc2lvbi53ID49IGNvYWNoSXRlbVdpZHRoLFxuICAgICAgKSA/PyBmYWxzZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyQXJlYXMgZm9yIG9uZSBjb2FjaFxuICAgKiBAcGFyYW0gY29hY2hJdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pc0xvY29tb3RpdmUoY29hY2hJdGVtOiBDb2FjaEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29hY2hJdGVtPy5ncmFwaGljRWxlbWVudHM/LmZpbmQoXG4gICAgICAgIChlbGVtZW50OiBCYXNlRWxlbWVudCkgPT4gZWxlbWVudC5pY29uID09PSAnRFJJVkVSX0FSRUFfTk9fVkVSVElDQUxfV0FMTCcsXG4gICAgICApICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGNhbGxlZCB3aGVuIHRoZSBTZWF0UmVzZXJ2YXRpb24gbG9zZXMgZm9jdXMsIHdoYXQgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHRhYnMgb3V0IG9yIGNsaWNrcyBzb21ld2hlcmUgZWxzZS5cbiAgICogVGhlbiB3ZSByZXNldCB0aGUgZm9jdXNlZCBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgX29uTGVhdmVTZWF0UmVzZXJ2YXRpb25Db21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5mb2N1c2VkQ29hY2hJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnVuZm9jdXNQbGFjZUVsZW1lbnQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpQ0EsSUFBSztDQUFMLFNBQUssaUJBQWU7Q0FDbEIsZ0JBQUEsV0FBQTtDQUNBLGdCQUFBLFVBQUE7QUFDRixHQUhLLG9CQUFBLGtCQUFlLENBQUEsRUFBQTtBQThCcEIsSUFBTSx5QkFBeUI7QUFDL0IsSUFBTSx3QkFBa0M7Q0FDdEM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0FBR0YsSUFBYSx3Q0FBYixjQUEyRCxNQUFLO0NBRzlELElBQVcsU0FBTTtFQUNmLE9BQU8s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
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sbb-esta/lyne-elements-experimental-dev",
|
|
3
|
-
"version": "5.0.0-next.3-dev.
|
|
3
|
+
"version": "5.0.0-next.3-dev.1780484105",
|
|
4
4
|
"description": "Lyne Design System",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"design system",
|
|
7
7
|
"web components",
|
|
8
8
|
"lit",
|
|
9
9
|
"storybook",
|
|
10
|
-
"https://github.com/sbb-design-systems/lyne-components/commit/
|
|
10
|
+
"https://github.com/sbb-design-systems/lyne-components/commit/5f0bb6577187f3d557a9def0e6f5f8d31b93a316"
|
|
11
11
|
],
|
|
12
12
|
"type": "module",
|
|
13
13
|
"exports": {
|
|
@@ -830,7 +830,7 @@ var ne = 3, re = [
|
|
|
830
830
|
deckCoaches: []
|
|
831
831
|
};
|
|
832
832
|
e?.coachItems?.forEach((e) => {
|
|
833
|
-
let t = (e.graphicElements?.filter((e) => e.icon && !this.notAreaElements.includes(e.icon)))?.concat(e.serviceElements || []).concat(e.places || []) || [], r = this._isOverhangingElementsPresent(e.dimension.w, t), i = e.graphicElements?.filter((e) => !this.notAreaElements.includes(e.icon)).map((t) => this._getCalculatedDimensionPositionElement(t, e.dimension, !0)), a = e.graphicElements?.filter((e) => this.notAreaElements.includes(e.icon)).map((t) => this._getCalculatedDimensionPositionElement(t, e.dimension, !1)), o = e.serviceElements?.map((t) => this._getCalculatedDimensionPositionElement(t, e.dimension, !
|
|
833
|
+
let t = (e.graphicElements?.filter((e) => e.icon && !this.notAreaElements.includes(e.icon)))?.concat(e.serviceElements || []).concat(e.places || []) || [], r = this._isOverhangingElementsPresent(e.dimension.w, t), i = e.graphicElements?.filter((e) => !this.notAreaElements.includes(e.icon)).map((t) => this._getCalculatedDimensionPositionElement(t, e.dimension, !0)), a = e.graphicElements?.filter((e) => this.notAreaElements.includes(e.icon)).map((t) => this._getCalculatedDimensionPositionElement(t, e.dimension, !1)), o = e.serviceElements?.map((t) => this._getCalculatedDimensionPositionElement(t, e.dimension, !0)), s = this._getCalculatedMiddleBorderElement(e), c = this.getCalculatedDimension({ ...e.dimension }), l = {
|
|
834
834
|
width: c.w,
|
|
835
835
|
height: c.h,
|
|
836
836
|
otherElements: a || [],
|