igniteui-angular 15.1.10 → 15.1.11

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.
@@ -890,10 +890,6 @@ export class IgxGridBaseDirective extends DisplayDensityBase {
890
890
  this.clearSort();
891
891
  this._sortingOptions = Object.assign(this._sortingOptions, value);
892
892
  }
893
- /**
894
- * @hidden
895
- * @internal
896
- */
897
893
  get sortingOptions() {
898
894
  return this._sortingOptions;
899
895
  }
@@ -7041,4 +7037,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImpor
7041
7037
  }], selectRowOnClick: [{
7042
7038
  type: Input
7043
7039
  }] } });
7044
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFNSCxZQUFZLEVBQ1osZUFBZSxFQUNmLGVBQWUsRUFDZixTQUFTLEVBRVQsVUFBVSxFQUVWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFFTixLQUFLLEVBR0wsU0FBUyxFQUlULFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTywwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLG1EQUFtRCxDQUFDO0FBRXpHLE9BQU8s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cUJLLHNCQUFzQjtzQkFEaEMsS0FBSztnQkEwQksscUJBQXFCO3NCQUQvQixLQUFLO2dCQW1CSyxjQUFjO3NCQUR4QixLQUFLO2dCQWtCSyxZQUFZO3NCQUR0QixLQUFLO2dCQXVCSyxjQUFjO3NCQUR4QixLQUFLO2dCQXlCSyxZQUFZO3NCQUR0QixLQUFLO2dCQXFHSyxvQkFBb0I7c0JBRDlCLEtBQUs7Z0JBMENLLG1CQUFtQjtzQkFEN0IsS0FBSztnQkEyREsseUJBQXlCO3NCQURuQyxLQUFLO2dCQTZFSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBc0RLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBcURLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBc0JLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBc0JLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBK2dCQyxlQUFlO3NCQURyQixZQUFZO3VCQUFDLFlBQVk7Z0JBd3NCZixlQUFlO3NCQUR6QixLQUFLO2dCQW1ISyxNQUFNO3NCQURoQixLQUFLO2dCQWdWSyxZQUFZO3NCQUR0QixLQUFLO2dCQTBsQ0ssZ0JBQWdCO3NCQUQxQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQsIGZvcm1hdE51bWJlciwgZ2V0TG9jYWxlTnVtYmVyRm9ybWF0LCBOdW1iZXJGb3JtYXRTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBjcmVhdGVDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBMT0NBTEVfSUQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXREYXRlLCByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgJ2lnbml0ZXVpLXRyaWFsLXdhdGVybWFyayc7XG5pbXBvcnQgeyBTdWJqZWN0LCBwaXBlLCBmcm9tRXZlbnQsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBmaXJzdCwgZmlsdGVyLCB0aHJvdHRsZVRpbWUsIG1hcCwgc2hhcmVSZXBsYXksIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lQXJyYXksIG1lcmdlT2JqZWN0cywgY29tcGFyZU1hcHMsIHJlc29sdmVOZXN0ZWRQYXRoLCBpc09iamVjdCwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncywgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90ZXh0LWhpZ2hsaWdodC90ZXh0LWhpZ2hsaWdodC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSVN1bW1hcnlFeHByZXNzaW9uIH0gZnJvbSAnLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5JztcbmltcG9ydCB7IFJvd0VkaXRQb3NpdGlvblN0cmF0ZWd5LCBJUGlubmluZ0NvbmZpZyB9IGZyb20gJy4vZ3JpZC5jb21tb24nO1xuaW1wb3J0IHsgSWd4R3JpZFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXIvZ3JpZC10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dEaXJlY3RpdmUgfSBmcm9tICcuL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgSWd4VG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZVxufSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uU2VydmljZSwgU3RhdGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7XG4gICAgSWd4Um93QWRkVGV4dERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdFRleHREaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdEFjdGlvbnNEaXJlY3RpdmVcbn0gZnJvbSAnLi9ncmlkLnJvd0VkaXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWROYXZpZ2F0aW9uU2VydmljZSwgSUFjdGl2ZU5vZGUgfSBmcm9tICcuL2dyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSwgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXYXRjaENoYW5nZXMgfSBmcm9tICcuL3dhdGNoLWNoYW5nZXMnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JpZFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9ncmlkLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UgfSBmcm9tICcuL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50IH0gZnJvbSAnLi9zdW1tYXJpZXMvc3VtbWFyeS1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4RWRpdFJvdywgSWd4Q2VsbCwgSWd4QWRkUm93IH0gZnJvbSAnLi9jb21tb24vY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzLCBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGVtcGxhdGUtb3V0bGV0L3RlbXBsYXRlX291dGxldC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLXNlYXJjaC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQgfSBmcm9tICcuL3Jlc2l6aW5nL3Jlc2l6ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoYXJTZXBhcmF0ZWRWYWx1ZURhdGEgfSBmcm9tICcuLi9zZXJ2aWNlcy9jc3YvY2hhci1zZXBhcmF0ZWQtdmFsdWUtZGF0YSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSBmcm9tICcuL3Jlc2l6aW5nL3Jlc2l6aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyaW5nU3RyYXRlZ3ksIElGaWx0ZXJpbmdTdHJhdGVneSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHtcbiAgICBJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCBJZ3hIZWFkZXJFeHBhbmRJbmRpY2F0b3JEaXJlY3RpdmUsXG4gICAgSWd4SGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JEaXJlY3RpdmUsIElneEV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlLCBJZ3hTb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZSxcbiAgICBJZ3hTb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmUsIElneFNvcnRIZWFkZXJJY29uRGlyZWN0aXZlXG59IGZyb20gJy4vZ3JpZC9ncmlkLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHtcbiAgICBHcmlkS2V5ZG93blRhcmdldFR5cGUsXG4gICAgR3JpZFNlbGVjdGlvbk1vZGUsXG4gICAgR3JpZFN1bW1hcnlQb3NpdGlvbixcbiAgICBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSxcbiAgICBGaWx0ZXJNb2RlLFxuICAgIENvbHVtblBpbm5pbmdQb3NpdGlvbixcbiAgICBSb3dQaW5uaW5nUG9zaXRpb24sXG4gICAgR3JpZFBhZ2luZ01vZGUsXG4gICAgR3JpZFZhbGlkYXRpb25UcmlnZ2VyXG59IGZyb20gJy4vY29tbW9uL2VudW1zJztcbmltcG9ydCB7XG4gICAgSUdyaWRDZWxsRXZlbnRBcmdzLFxuICAgIElSb3dTZWxlY3Rpb25FdmVudEFyZ3MsXG4gICAgSVBpbkNvbHVtbkV2ZW50QXJncyxcbiAgICBJR3JpZEVkaXRFdmVudEFyZ3MsXG4gICAgSVJvd0RhdGFFdmVudEFyZ3MsXG4gICAgSUNvbHVtblJlc2l6ZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3MsXG4gICAgSUNvbHVtbk1vdmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkS2V5ZG93bkV2ZW50QXJncyxcbiAgICBJUm93RHJhZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElSb3dEcmFnRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkQ2xpcGJvYXJkRXZlbnQsXG4gICAgSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzLFxuICAgIElTZWFyY2hJbmZvLFxuICAgIElDZWxsUG9zaXRpb24sXG4gICAgSVJvd1RvZ2dsZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Sb3dFdmVudEFyZ3MsXG4gICAgSUdyaWRTY3JvbGxFdmVudEFyZ3MsXG4gICAgSUdyaWRFZGl0RG9uZUV2ZW50QXJncyxcbiAgICBJQWN0aXZlTm9kZUNoYW5nZUV2ZW50QXJncyxcbiAgICBJU29ydGluZ0V2ZW50QXJncyxcbiAgICBJRmlsdGVyaW5nRXZlbnRBcmdzLFxuICAgIElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZEV2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5naW5nRXZlbnRBcmdzLFxuICAgIElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJnc1xufSBmcm9tICcuL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IHsgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9hZHZhbmNlZC1maWx0ZXJpbmcvYWR2YW5jZWQtZmlsdGVyaW5nLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBDb2x1bW5UeXBlLFxuICAgIEdyaWRTZXJ2aWNlVHlwZSxcbiAgICBHcmlkVHlwZSxcbiAgICBJR3JpZEZvcm1Hcm91cENyZWF0ZWRFdmVudEFyZ3MsXG4gICAgSUdyaWRWYWxpZGF0aW9uU3RhdHVzRXZlbnRBcmdzLFxuICAgIElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRSb3dEcmFnR2hvc3RDb250ZXh0LFxuICAgIElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkUm93RWRpdFRleHRUZW1wbGF0ZUNvbnRleHQsXG4gICAgSWd4R3JpZFJvd1RlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkVGVtcGxhdGVDb250ZXh0LFxuICAgIElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hSb3dTZWxlY3RvclRlbXBsYXRlQ29udGV4dCxcbiAgICBJR1hfR1JJRF9TRVJWSUNFX0JBU0UsXG4gICAgSVNpemVJbmZvLFxuICAgIFJvd1R5cGVcbn0gZnJvbSAnLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcFBvc2l0aW9uIH0gZnJvbSAnLi9tb3ZpbmcvbW92aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlLCBJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZSB9IGZyb20gJy4vc2VsZWN0aW9uL3Jvdy1zZWxlY3RvcnMnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29sdW1uR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dEcmFnR2hvc3REaXJlY3RpdmUsIElneERyYWdJbmRpY2F0b3JJY29uRGlyZWN0aXZlIH0gZnJvbSAnLi9yb3ctZHJhZy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4U25hY2tiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zbmFja2Jhci9zbmFja2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBJZ3hBY3Rpb25TdHJpcENvbXBvbmVudCB9IGZyb20gJy4uL2FjdGlvbi1zdHJpcC9hY3Rpb24tc3RyaXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRSb3dDb21wb25lbnQgfSBmcm9tICcuL2dyaWQvZ3JpZC1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElQYWdlRXZlbnRBcmdzIH0gZnJvbSAnLi4vcGFnaW5hdG9yL3BhZ2luYXRvci1pbnRlcmZhY2VzJztcbmltcG9ydCB7IElneFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkR3JvdXBCeUFyZWFDb21wb25lbnQgfSBmcm9tICcuL2dyb3VwaW5nL2dyaWQtZ3JvdXAtYnktYXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4RmxhdFRyYW5zYWN0aW9uRmFjdG9yeSwgVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uLWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJU29ydGluZ09wdGlvbnMgfSBmcm9tICcuL2NvbHVtbnMvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBHcmlkU2VsZWN0aW9uUmFuZ2UsIElneEdyaWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFZlcnRpY2FsQWxpZ25tZW50LCBIb3Jpem9udGFsQWxpZ25tZW50LCBQb3NpdGlvblNldHRpbmdzLCBPdmVybGF5U2V0dGluZ3MgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS9wb3NpdGlvbi9jb25uZWN0ZWQtcG9zaXRpb25pbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgQ29udGFpbmVyUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24vY29udGFpbmVyLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbC9hYnNvbHV0ZS1zY3JvbGwtc3RyYXRlZ3knO1xuaW1wb3J0IHsgQWN0aW9uLCBTdGF0ZVVwZGF0ZUV2ZW50LCBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSUdyaWRTb3J0aW5nU3RyYXRlZ3kgfSBmcm9tICcuL2NvbW1vbi9zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IERlZmF1bHREYXRhQ2xvbmVTdHJhdGVneSwgSURhdGFDbG9uZVN0cmF0ZWd5IH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtY2xvbmUtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZENlbGxDb21wb25lbnQgfSBmcm9tICcuL2NlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4vZ3JpZC9ncmlkLXZhbGlkYXRpb24uc2VydmljZSc7XG5cbmxldCBGQUtFX1JPV19JRCA9IC0xO1xuY29uc3QgREVGQVVMVF9JVEVNU19QRVJfUEFHRSA9IDE1O1xuY29uc3QgTUlOSU1VTV9DT0xVTU5fV0lEVEggPSAxMzY7XG4vLyBCeSBkZWZhdWx0IHJvdyBlZGl0aW5nIG92ZXJsYXkgb3V0bGV0IGlzIGluc2lkZSBncmlkIGJvZHkgc28gdGhhdCBvdmVybGF5IGlzIGhpZGRlbiBiZWxvdyBncmlkIGhlYWRlciB3aGVuIHNjcm9sbGluZy5cbi8vIEluIGNhc2VzIHdoZW4gZ3JpZCBoYXMgMS0yIHJvd3MgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIGluIGdyaWQgYm9keSBhbmQgcm93IGVkaXRpbmcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd24gYWJvdmUgaGVhZGVyLlxuLy8gRGVmYXVsdCByb3cgZWRpdGluZyBvdmVybGF5IGhlaWdodCBpcyBoaWdoZXIgdGhlbiByb3cgaGVpZ2h0IHRoYXQgaXMgd2h5IHRoZSBjYXNlIGlzIHZhbGlkIGFsc28gZm9yIHJvdyB3aXRoIDIgcm93cy5cbi8vIE1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gaXMgbm90IHBvc3NpYmxlLCBjYXVzZSByb3cgZWRpdGluZyBvdmVybGF5IGlzIHN0aWxsIG5vdCBzaG93biBhbmQgd2UgZG9uJ3Qga25vdyBpdHMgaGVpZ2h0LFxuLy8gYnV0IGluIHRoZSBzYW1lIHRpbWUgd2UgbmVlZCB0byBzZXQgcm93IGVkaXRpbmcgb3ZlcmxheSBvdXRsZXQgYmVmb3JlIG9wZW5pbmcgdGhlIG92ZXJsYXkgaXRzZWxmLlxuY29uc3QgTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCA9IDI7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElneEdyaWRCYXNlRGlyZWN0aXZlIGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIGltcGxlbWVudHMgR3JpZFR5cGUsXG4gICAgT25Jbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkaXNwbGF5IHRpbWUgZm9yIHRoZSByb3cgYWRkaW5nIHNuYWNrYmFyIG5vdGlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyA2MDAwbXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc25hY2tiYXJEaXNwbGF5VGltZSA9IDYwMDA7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0byBhdXRvLWdlbmVyYXRlIHRoZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gV2hlbiBzZXQgdG8gdHJ1ZSwgaXQgd2lsbCBvdmVycmlkZSBhbGwgY29sdW1ucyBkZWNsYXJlZCB0aHJvdWdoIGNvZGUgb3IgaW4gbWFya3VwLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvR2VuZXJhdGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGNvbGxlY3Rpb25cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBjb2xsZWN0aW9uIGlzIG9ubHkgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGNoYW5naW5nIGl0IHdpbGwgbm90IGNhdXNlIGFueSBjaGFuZ2VzIGluIHRoZSBnZW5lcmF0ZWQgY29sdW1ucyBhdCBydW50aW1lXG4gICAgICogdW5sZXNzIHRoZSBncmlkIGlzIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkLiBUbyBtb2RpZnkgdGhlIGNvbHVtbnMgdmlzaWJsZSBpbiB0aGUgVUkgYXQgcnVudGltZSwgcGxlYXNlIHVzZSB0aGVpclxuICAgICAqIFtoaWRkZW5dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvZG9jcy90eXBlc2NyaXB0L2xhdGVzdC9jbGFzc2VzL0lneENvbHVtbkNvbXBvbmVudC5odG1sI2hpZGRlbikgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIGRhdGE9W0RhdGFdIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVFeGNsdWRlXT1cIlsnUHJvZHVjdE5hbWUnLCAnQ291bnQnXVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IERhdGEgPSBbeyAnSWQnOiAnMScsICdQcm9kdWN0TmFtZSc6ICduYW1lMScsICdEZXNjcmlwdGlvbic6ICdkZXNjcmlwdGlvbjEnLCAnQ291bnQnOiA1IH1dXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXV0b0dlbmVyYXRlRXhjbHVkZTogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgY29sdW1ucyBtb3ZpbmcgaXMgZW5hYmxlZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vdmluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHdoZW4gZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkVGVtcGxhdGVdPVwibXlUZW1wbGF0ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZW1wdHlHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIGZvciBhZGRpbmcgcm93IFVJIHdoZW4gZ3JpZCBpcyBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFthZGRSb3dFbXB0eVRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZFJvd0VtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHdoZW4gbG9hZGluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFtsb2FkaW5nR3JpZFRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxvYWRpbmdHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0L1NldCBJZ3hTdW1tYXJ5Um93IGhlaWdodFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzdW1tYXJ5Um93SGVpZ2h0KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVJvd0hlaWdodCA9IHZhbHVlIHwgMDtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5zdW1tYXJ5SGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5yZWZsb3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VtbWFyeVJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5oYXNTdW1tYXJpemVkQ29sdW1ucyAmJiB0aGlzLnJvb3RTdW1tYXJpZXNFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeVJvd0hlaWdodCB8fCB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNhbGNNYXhTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNDb2x1bW5zVG9BdXRvc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuc29tZSh4ID0+IHgud2lkdGggPT09ICdmaXQtY29udGVudCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGF0YSBjbG9uZSBzdHJhdGVneSBvZiB0aGUgZ3JpZCB3aGVuIGluIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2RhdGFDbG9uZVN0cmF0ZWd5XT1cImN1c3RvbUNsb25lU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBkYXRhQ2xvbmVTdHJhdGVneSgpOiBJRGF0YUNsb25lU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUNsb25lU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkYXRhQ2xvbmVTdHJhdGVneShzdHJhdGVneTogSURhdGFDbG9uZVN0cmF0ZWd5KSB7XG4gICAgICAgIGlmIChzdHJhdGVneSkge1xuICAgICAgICAgICAgdGhpcy5fZGF0YUNsb25lU3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgY29weSBiZWhhdmlvciBvZiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjbGlwYm9hcmRPcHRpb25zID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgY29weSBiZWhhdmlvclxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluY2x1ZGUgdGhlIGNvbHVtbnMgaGVhZGVycyBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlIZWFkZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbHkgdGhlIGNvbHVtbnMgZm9ybWF0dGVycyAoaWYgYW55KSBvbiB0aGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlGb3JtYXR0ZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNlcGFyYXRvciB1c2VkIGZvciBmb3JtYXR0aW5nIHRoZSBjb3B5IG91dHB1dC4gRGVmYXVsdHMgdG8gYFxcdGAuXG4gICAgICAgICAqL1xuICAgICAgICBzZXBhcmF0b3I6ICdcXHQnXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUgb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggZmlsdGVyaW5nIHdhcyBwZXJmb3JtZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UpPVwiZmlsdGVyaW5nRXhwclRyZWVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgIChhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSk9XCJhZHZhbmNlZEZpbHRlcmluZ0V4cHJUcmVlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBncmlkIGlzIHNjcm9sbGVkIGhvcml6b250YWxseS92ZXJ0aWNhbGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChncmlkU2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBncmlkU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFNjcm9sbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYCBjb21wb25lbnQgaW5zdGVhZFxuICAgICAqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgY3VycmVudCBwYWdlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgICogICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYCBjb21wb25lbnQgaW5zdGVhZFxuICAgICAqXG4gICAgICogRW1pdHRlZCB3aGVuIGBwZXJQYWdlYCBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ3JpZCBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHBlclBhZ2VDaGFuZ2UpPVwib25QZXJQYWdlQ2hhbmdlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QZXJQYWdlQ2hhbmdlKHBlclBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5wZXJQYWdlID0gcGVyUGFnZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBlclBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMi4wLiBXZSBzdWdnZXN0IHVzaW5nIGByb3dDbGFzc2VzYCBwcm9wZXJ0eSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN0eWxpbmcgY2xhc3NlcyBhcHBsaWVkIHRvIGFsbCBldmVuIGBJZ3hHcmlkUm93Q29tcG9uZW50YHMgaW4gdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2V2ZW5Sb3dDU1NdPVwiJ2lneC1ncmlkLS1teS1ldmVuLWNsYXNzJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZXZlblJvd0NTUyA9ICdpZ3gtZ3JpZF9fdHItLWV2ZW4nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4yLjAuIFdlIHN1Z2dlc3QgdXNpbmcgYHJvd0NsYXNzZXNgIHByb3BlcnR5IGluc3RlYWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3R5bGluZyBjbGFzc2VzIGFwcGxpZWQgdG8gYWxsIG9kZCBgSWd4R3JpZFJvd0NvbXBvbmVudGBzIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtldmVuUm93Q1NTXT1cIidpZ3gtZ3JpZC0tbXktb2RkLWNsYXNzJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb2RkUm93Q1NTID0gJ2lneC1ncmlkX190ci0tb2RkJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjb25kaXRpb25hbCBjbGFzcyBzZWxlY3RvciB0byB0aGUgZ3JpZCdzIHJvdyBlbGVtZW50LlxuICAgICAqIEFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwsIGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzLFxuICAgICAqIHdoZXJlIHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIENTUyBjbGFzcyBhbmQgdGhlIHZhbHVlIGlzXG4gICAgICogZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYm9vbGVhbiwgb3IgYm9vbGVhbiwgbGlrZSBzbzpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY2FsbGJhY2sgPSAocm93OiBSb3dUeXBlKSA9PiB7IHJldHVybiByb3cuc2VsZWN0ZWQgPiA2OyB9XG4gICAgICogcm93Q2xhc3NlcyA9IHsgJ2NsYXNzTmFtZScgOiB0aGlzLmNhbGxiYWNrIH07XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3Jvd0NsYXNzZXNdID0gXCJyb3dDbGFzc2VzXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dDbGFzc2VzOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNvbmRpdGlvbmFsIHN0eWxlIHByb3BlcnRpZXMgb24gdGhlIGdyaWQgcm93IGVsZW1lbnQuXG4gICAgICogSXQgYWNjZXB0cyBhbiBvYmplY3QgbGl0ZXJhbCB3aGVyZSB0aGUga2V5cyBhcmVcbiAgICAgKiB0aGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdGhlIHZhbHVlIGlzIGFuIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBzdHlsZXMgPSB7XG4gICAgICogIGJhY2tncm91bmQ6ICd5ZWxsb3cnLFxuICAgICAqICBjb2xvcjogKHJvdzogUm93VHlwZSkgPT4gcm93LnNlbGVjdGVkIDogJ3JlZCc6ICd3aGl0ZSdcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3Jvd1N0eWxlc109XCJzdHlsZXNcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd1N0eWxlcyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcmltYXJ5S2V5OiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSB1bmlxdWUgdmFsdWVzIHN0cmF0ZWd5IHVzZWQgYnkgdGhlIEV4Y2VsIFN0eWxlIEZpbHRlcmluZ1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyBhIGNhbGxiYWNrIGZvciBsb2FkaW5nIHVuaXF1ZSBjb2x1bW4gdmFsdWVzIG9uIGRlbWFuZC5cbiAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIHByb3ZpZGVkLCB0aGUgdW5pcXVlIHZhbHVlcyBpdCBnZW5lcmF0ZXMgd2lsbCBiZSB1c2VkIGJ5IHRoZSBFeGNlbCBTdHlsZSBGaWx0ZXJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidleGNlbFN0eWxlRmlsdGVyJ1wiIFt1bmlxdWVDb2x1bW5WYWx1ZXNTdHJhdGVneV09XCJjb2x1bW5WYWx1ZXNTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3k6IChjb2x1bW46IENvbHVtblR5cGUsXG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgZG9uZTogKHZhbHVlczogYW55W10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB7IHJlYWQ6IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2soJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZm9ybUdyb3VwIGlzIGNyZWF0ZWQgb24gZWRpdCBvZiByb3cvY2VsbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAoZm9ybUdyb3VwQ3JlYXRlZCk9XCJmb3JtR3JvdXBDcmVhdGVkKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmb3JtR3JvdXBDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEZvcm1Hcm91cENyZWF0ZWRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZ3JpZCdzIHZhbGlkYXRpb24gc3RhdHVzIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHZhbGlkYXRpb25TdGF0dXNDaGFuZ2UpPVwidmFsaWRhdGlvblN0YXR1c0NoYW5nZSgkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsaWRhdGlvblN0YXR1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRWYWxpZGF0aW9uU3RhdHVzRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChzZWxlY3RlZCk9XCJvbkNlbGxTZWxlY3QoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiAgRW1pdHRlZCB3aGVuIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAocm93U2VsZWN0aW9uQ2hhbmdpbmcpPVwicm93U2VsZWN0aW9uQ2hhbmdpbmcoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1NlbGVjdGlvbkNoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93U2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEVtaXR0ZWQgd2hlbiBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAoY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcpPVwiY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblNlbGVjdGlvbkNoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgYElneENvbHVtbkNvbXBvbmVudGAgaXMgcGlubmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjb2x1bW4gbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBwaW5uZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBpbmRleCB0aGF0IHRoZSBjb2x1bW4gaXMgaW5zZXJ0ZWQgYXQgbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGVudGVycyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdEVudGVyKT1cImVkaXRTdGFydCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXRFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgZXhpdHMgZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXRFeGl0KT1cImVkaXRFeGl0KCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdEV4aXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBoYXMgYmVlbiBlZGl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEV2ZW50IGlzIGZpcmVkIGFmdGVyIGVkaXRpbmcgaXMgY29tcGxldGVkLCB3aGVuIHRoZSBjZWxsIGlzIGV4aXRpbmcgZWRpdCBtb2RlLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdCk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY2VsbCBoYXMgYmVlbiBlZGl0ZWQgYW5kIGVkaXRpbmcgaGFzIGJlZW4gY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBleGl0aW5nIGVkaXQgbW9kZSBmb3IgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93IGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdCh0cnVlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyByb3dzIGR1cmluZyBlZGl0IG1vZGUsIHNlbGVjdGluZyBhbiB1bi1lZGl0YWJsZSBjZWxsIGluIHRoZSBlZGl0ZWQgcm93LFxuICAgICAqIHBlcmZvcm1pbmcgcGFnaW5nIG9wZXJhdGlvbiwgY29sdW1uIHJlc2l6aW5nLCBwaW5uaW5nLCBtb3Zpbmcgb3IgaGl0dGluZyBgRG9uZWBcbiAgICAgKiBidXR0b24gaW5zaWRlIG9mIHRoZSByb3dFZGl0aW5nT3ZlcmxheSwgb3IgaGl0dGluZyB0aGUgYEVudGVyYCBrZXkgd2hpbGUgZWRpdGluZyBhIGNlbGwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdERvbmUpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcm93IGVkaXRpbmcgaXMgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXRzIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KGZhbHNlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyBoaXR0aW5nIGBFc2NgIGtleSBkdXJpbmcgY2VsbCBlZGl0aW5nIGFuZCB3aGVuIGNsaWNrIG9uIHRoZSBgQ2FuY2VsYCBidXR0b25cbiAgICAgKiBpbiB0aGUgcm93IGVkaXRpbmcgb3ZlcmxheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbHVtbiBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtbkluaXQpPVwiaW5pdENvbHVtbnMoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbkluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHNvcnRpbmcgZXhwcmVzc2lvbnMgYXJlIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElTb3J0aW5nRXZlbnRBcmdzYCBvYmplY3QuIGBzb3J0aW5nRXhwcmVzc2lvbnNgIGtleSBob2xkcyB0aGUgc29ydGluZyBleHByZXNzaW9ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKHNvcnRpbmcpPVwic29ydGluZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHNvcnRpbmcgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChzb3J0aW5nRG9uZSk9XCJzb3J0aW5nRG9uZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbiB8IElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJRmlsdGVyaW5nRXZlbnRBcmdzYCBvYmplY3QuIGBmaWx0ZXJpbmdFeHByZXNzaW9uc2Aga2V5IGhvbGRzIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBjb2x1bW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChmaWx0ZXJpbmcpPVwiZmlsdGVyaW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgVUkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyB0cmVlIG9mIHRoZSBjb2x1bW4gZm9yIHdoaWNoIGZpbHRlcmluZyB3YXMgcGVyZm9ybWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZmlsdGVyaW5nRG9uZSk9XCJmaWx0ZXJpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmdEb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHBhZ2luZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBvYmplY3QgY29uc2lzdGluZyBvZiB0aGUgcHJldmlvdXMgYW5kIG5leHQgcGFnZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChwYWdpbmdEb25lKT1cInBhZ2luZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhZ2luZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZvciB0aGUgbmV3IGBJZ3hHcmlkUm93Q29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dBZGRlZCk9XCJyb3dBZGRlZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGRlbGV0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElSb3dEYXRhRXZlbnRBcmdzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dEZWxldGVkKT1cInJvd0RlbGV0ZWQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1taXRlZCB3aGVuIGRlbGV0aW5nIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogUmV0dXJucyBhbiBgSUdyaWRFZGl0RXZlbnRBcmdzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dEZWxldGUpPVwicm93RGVsZXRlKCRldmVudClcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQganVzdCBiZWZvcmUgdGhlIG5ld2x5IGFkZGVkIHJvdyBpcyBjb21taXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIFJldHVybnMgYW4gYElHcmlkRWRpdEV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93QWRkKT1cInJvd0FkZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNvbHVtbiBpcyByZXNpemVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QncyBvbGQgYW5kIG5ldyB3aWR0aC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtblJlc2l6ZWQpPVwicmVzaXppbmcoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5SZXNpemVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIHJpZ2h0IGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAgb2JqZWN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbnRleHRNZW51KT1cImNvbnRleHRNZW51KCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb250ZXh0TWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyBkb3VibGUgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChkb3VibGVDbGljayk9XCJkYmxDbGljaygkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZG91YmxlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIGNvbHVtbiB2aXNpYmlsaXR5IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFyZ3M6IHsgY29sdW1uOiBhbnksIG5ld1ZhbHVlOiBib29sZWFuIH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2luZyk9XCJ2aXNpYmlsaXR5Q2hhbmdpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblZpc2liaWxpdHlDaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY29sdW1uIHZpc2liaWxpdHkgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQXJnczogeyBjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgbmV3VmFsdWU6IGJvb2xlYW4gfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAoY29sdW1uVmlzaWJpbGl0eUNoYW5nZWQpPVwidmlzaWJpbGl0eUNoYW5nZWQoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblZpc2liaWxpdHlDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY29sdW1uIG1vdmluZyBzdGFydHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIG1vdmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtbk1vdmluZ1N0YXJ0KT1cIm1vdmluZ1N0YXJ0KCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbk1vdmluZ1N0YXJ0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBkdXJpbmcgdGhlIGNvbHVtbiBtb3Zpbmcgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3RzLiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIChjb2x1bW5Nb3ZpbmcpPVwibW92aW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY29sdW1uIG1vdmluZyBlbmRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3RzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAoY29sdW1uTW92aW5nRW5kKT1cIm1vdmluZ0VuZHMoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbk1vdmluZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbk1vdmluZ0VuZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBrZXlkb3duIGlzIHRyaWdnZXJlZCBvdmVyIGVsZW1lbnQgaW5zaWRlIGdyaWQncyBib2R5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIG9ubHkgaWYgdGhlIGtleSBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQgaW4gdGhlIGdyaWQuXG4gICAgICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZSwgdGFyZ2V0IG9iamVjdCBhbmQgdGhlIG9yaWdpbmFsIGV2ZW50LiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAoZ3JpZEtleWRvd24pPVwiY3VzdG9tS2V5ZG93bigkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZ3JpZEtleWRvd24gPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkS2V5ZG93bkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBzdGFydCBkcmFnZ2luZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJuIHRoZSBkcmFnZ2VkIHJvdy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RHJhZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RHJhZ1N0YXJ0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRyb3BwaW5nIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm4gdGhlIGRyb3BwZWQgcm93LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RHJhZ0VuZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvcHkgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGaXJlZCBvbmx5IGlmIGNvcHkgYmVoYXZpb3IgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBbYGNsaXBib2FyZE9wdGlvbnNgXXtAbGluayBJZ3hHcmlkQmFzZURpcmVjdGl2ZSNjbGlwYm9hcmRPcHRpb25zfS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZ3JpZENvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2xpcGJvYXJkRXZlbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBleHBhbnNpb25TdGF0ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1hcDxhbnksIGJvb2xlYW4+PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBleHBhbmRlZCBzdGF0ZSBvZiBhIHJvdyBnZXRzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKHJvd1RvZ2dsZSk9XCJyb3dUb2dnbGUoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1RvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1RvZ2dsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGlubmVkIHN0YXRlIG9mIGEgcm93IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKHJvd1Bpbm5pbmcpPVwicm93UGluKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dQaW5uaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluUm93RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBwaW5uZWQgc3RhdGUgb2YgYSByb3cgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJlbXBsb3llZURhdGFcIiAocm93UGlubmVkKT1cInJvd1BpbigkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93UGlubmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluUm93RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1taXRlZCB3aGVuIHRoZSBhY3RpdmUgbm9kZSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChhY3RpdmVOb2RlQ2hhbmdlKT1cImFjdGl2ZU5vZGVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFjdGl2ZU5vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElBY3RpdmVOb2RlQ2hhbmdlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc29ydGluZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChzb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UpPVwic29ydGluZ0V4cHJDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNvcnRpbmdFeHByZXNzaW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFeHByZXNzaW9uW10+KCk7XG5cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhbiBleHBvcnQgcHJvY2VzcyBpcyBpbml0aWF0ZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0b29sYmFyRXhwb3J0aW5nKGV2ZW50OiBJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCB0b29sYmFyRXhwb3J0aW5nID0gZXZlbnQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB0b29sYmFyRXhwb3J0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiBFbmQgb2YgdG9vbGJhciByZWxhdGVkIGRlZmluaXRpb25zICovXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbWFraW5nIGEgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSYW5nZSBzZWxlY3Rpb24gY2FuIGJlIG1hZGUgZWl0aGVyIHRocm91Z2ggZHJhZyBzZWxlY3Rpb24gb3IgdGhyb3VnaCBrZXlib2FyZCBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJhbmdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRTZWxlY3Rpb25SYW5nZT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIGFmdGVyIHRoZSBuZ0FmdGVyVmlld0luaXQgaG9vay4gQXQgdGhpcyBwb2ludCB0aGUgZ3JpZCBleGlzdHMgaW4gdGhlIERPTSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW5kZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGxvY2FsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHRoZSBncmlkJ3MgZGF0YSB2aWV3IGlzIGNoYW5nZWQgYmVjYXVzZSBvZiBhIGRhdGEgb3BlcmF0aW9uLCByZWJpbmRpbmcsIGV0Yy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGRhdGFDaGFuZ2luZyk9J2hhbmRsZURhdGFDaGFuZ2luZ0V2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRhdGFDaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUZvck9mRGF0YUNoYW5naW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgZ3JpZCdzIGRhdGEgdmlldyBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YgYSBkYXRhIG9wZXJhdGlvbiwgcmViaW5kaW5nLCBldGMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChkYXRhQ2hhbmdlZCk9J2hhbmRsZURhdGFDaGFuZ2VkRXZlbnQoKSc+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZGF0YUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneFNuYWNrYmFyQ29tcG9uZW50KVxuICAgIHB1YmxpYyBhZGRSb3dTbmFja2JhcjogSWd4U25hY2tiYXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQpXG4gICAgcHVibGljIHJlc2l6ZUxpbmU6IElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsb2FkaW5nT3ZlcmxheScsIHsgcmVhZDogSWd4VG9nZ2xlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ092ZXJsYXk6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nT3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneENvbHVtbkNvbXBvbmVudCwgeyByZWFkOiBJZ3hDb2x1bW5Db21wb25lbnQsIGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIGNvbHVtbkxpc3Q6IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+ID0gbmV3IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KCk7XG5cbiAgICBAQ29udGVudENoaWxkKElneEFjdGlvblN0cmlwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBhY3Rpb25TdHJpcDogSWd4QWN0aW9uU3RyaXBDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEEgdGVtcGxhdGUgcmVmZXJlbmNlIGZvciB0aGUgdGVtcGxhdGUgd2hlbiB0aGUgZmlsdGVyZWQgZ3JpZCBpcyBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogY29uc3QgZW1wdHlUZW1wYWx0ZSA9IHRoaXMuZ3JpZC5lbXB0eUdyaWRUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdlbXB0eUZpbHRlcmVkR3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBlbXB0eUZpbHRlcmVkR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSByZWZlcmVuY2UgZm9yIHRoZSB0ZW1wbGF0ZSB3aGVuIHRoZSBncmlkIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBlbXB0eVRlbXBhbHRlID0gdGhpcy5ncmlkLmVtcHR5R3JpZFRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFbXB0eUdyaWQnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZW1wdHlHcmlkRGVmYXVsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0TG9hZGluZ0dyaWQnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ0dyaWREZWZhdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcGFyZW50VmlydERpcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBoZWFkU2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIHJvd1NlbGVjdG9yc1RlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneFJvd1NlbGVjdG9yVGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dEcmFnR2hvc3REaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBkcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RHJhZ0dob3N0Q29udGV4dD4+O1xuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdXNlZCBmb3Igcm93IGRyYWcgZ2hvc3QuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUgfHwgdGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXMuZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIHJvdyBkcmFnIGdob3N0LlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RHJhZ0dob3N0PlxuICAgICAqICAgIDxpZ3gtaWNvbj5tZW51PC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RHJhZ0dob3N0Q29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndmVydGljYWxTY3JvbGxDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndmVydGljYWxTY3JvbGxIb2xkZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHZlcnRpY2FsU2Nyb2xsOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc2NyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgc2NyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnaGVhZFNlbGVjdG9yQmFzZVRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlclNlbGVjdG9yQmFzZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdmb290ZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgZm9vdGVyOiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIGdldCBoZWFkZXJDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJGb3JPZjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlclNlbGVjdG9yQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVyU2VsZWN0b3JDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJEcmFnQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVyRHJhZ0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVyR3JvdXBDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdSb3coKTogSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5maWx0ZXJSb3c7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0aGVhZFJvdzogSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50KVxuICAgIHB1YmxpYyBncm91cEFyZWE6IElneEdyaWRHcm91cEJ5QXJlYUNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndGJvZHknLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0Ym9keTogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncGluQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHVibGljIHBpbkNvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndGZvb3QnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0Zm9vdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneFJvd0VkaXRpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcm93RWRpdGluZ091dGxldERpcmVjdGl2ZTogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyB0bXBPdXRsZXRzOiBRdWVyeUxpc3Q8YW55PiA9IG5ldyBRdWVyeUxpc3Q8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RyYWdJbmRpY2F0b3JJY29uQmFzZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkcmFnSW5kaWNhdG9ySWNvbkJhc2U6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRlbXBsYXRlRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93RWRpdEN1c3RvbURpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUZXh0RGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93RWRpdFRleHREaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZXh0VGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgZWRpdCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dFZGl0VGV4dFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RWRpdFRleHRUZW1wbGF0ZSB8fCB0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcy5maXJzdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGVkaXQgdGV4dCB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFJvd0VkaXRUZXh0IGxldC1yb3dDaGFuZ2VzQ291bnQ+XG4gICAgICogQ2hhbmdlczoge3tyb3dDaGFuZ2VzQ291bnR9fVxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnJvd0VkaXRUZXh0VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93RWRpdFRleHRUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZXh0VGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9yb3dFZGl0VGV4dFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFJvd0FkZFRleHREaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93QWRkVGV4dDogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBhZGQgdGV4dCB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93QWRkVGV4dFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93QWRkVGV4dFRlbXBsYXRlIHx8IHRoaXMucm93QWRkVGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGFkZCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93QWRkVGV4dD5cbiAgICAgKiBBZGRpbmcgUm93XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQucm93QWRkVGV4dFRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHJvd0FkZFRleHRUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9yb3dBZGRUZXh0VGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdEFjdGlvbnNEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdEFjdGlvbnNUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBlZGl0IGFjdGlvbnMgdGVtcGxhdGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRBY3Rpb25zVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRBY3Rpb25zVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFZGl0QWN0aW9uc1RlbXBsYXRlIHx8IHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzLmZpcnN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZWRpdCBhY3Rpb25zIHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RWRpdEFjdGlvbnMgbGV0LWVuZFJvd0VkaXQ+XG4gICAgICogPGJ1dHRvbiBpZ3hCdXR0b24gaWd4Um93RWRpdFRhYlN0b3AgKGNsaWNrKT1cImVuZFJvd0VkaXQoZmFsc2UpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICogPGJ1dHRvbiBpZ3hCdXR0b24gaWd4Um93RWRpdFRhYlN0b3AgKGNsaWNrKT1cImVuZFJvd0VkaXQodHJ1ZSlcIj5BcHBseTwvYnV0dG9uPlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnJvd0VkaXRBY3Rpb25zVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93RWRpdEFjdGlvbnNUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRBY3Rpb25zVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9yb3dFZGl0QWN0aW9uc1RlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgcm93IGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSByb3cgY29sbGFwc2UgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgZXhwYW5kIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckV4cGFuZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBoZWFkZXJFeHBhbmRJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGNvbGxhcHNlIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckNvbGxhcHNlSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBleHBhbmQgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZXhjZWwgc3R5bGUgaGVhZGVyIGljb24uXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlIHx8IHRoaXMuZXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBleGNlbCBzdHlsZSBoZWFkZXIgaWNvbi5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4RXhjZWxTdHlsZUhlYWRlckljb24+XG4gICAgICogPGlneC1pY29uPmZpbHRlcl9hbHQ8L2lneC1pY29uPlxuICAgICAqPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBwdWJsaWMgc2V0IGV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2V4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNvcnRBc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHNvcnRBc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIHNvcnRlZCBpbiBhc2Mgb3JkZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgc29ydGluZyBpbmRpY2F0b3Igd2hlbiBjb2x1bW5zIGFyZSBzb3J0ZWQgaW4gYXNjIG9yZGVyLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4U29ydEFzY2VuZGluZ0hlYWRlckljb24+XG4gICAgICogICAgPGlneC1pY29uPmV4cGFuZF9sZXNzPC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgc29ydERlc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIHNvcnRlZCBpbiBkZXNjIG9yZGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjdXN0b20gdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIHNvcnRlZCBpbiBkZXNjIG9yZGVyLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4U29ydERlc2NlbmRpbmdIZWFkZXJJY29uPlxuICAgICAqICAgIDxpZ3gtaWNvbj5leHBhbmRfbW9yZTwvaWd4LWljb24+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBzb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTb3J0SGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBzb3J0SGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgbm90IHNvcnRlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc29ydEhlYWRlckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0SGVhZGVySWNvblRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjdXN0b20gdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIG5vdCBzb3J0ZWQuXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hTb3J0SGVhZGVySWNvbj5cbiAgICAgKiAgICA8aWd4LWljb24+dW5mb2xkX21vcmU8L2lneC1pY29uPlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCIndGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuc29ydEhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBzb3J0SGVhZGVySWNvblRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9zb3J0SGVhZGVySWNvblRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4RHJhZ0luZGljYXRvckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBkcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlKVxuICAgIHB1YmxpYyByb3dFZGl0VGFic0RFRkFVTFQ6IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgcm93RWRpdFRhYnNDVVNUT006IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Jvd0VkaXRpbmdPdmVybGF5JywgeyByZWFkOiBJZ3hUb2dnbGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgcm93RWRpdGluZ092ZXJsYXk6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGhvc3RSb2xlID0gJ2dyaWQnO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hHcmlkVG9vbGJhckNvbXBvbmVudClcbiAgICBwdWJsaWMgdG9vbGJhcjogUXVlcnlMaXN0PElneEdyaWRUb29sYmFyQ29tcG9uZW50PjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4UGFnaW5hdG9yQ29tcG9uZW50KVxuICAgIHByb3RlY3RlZCBwYWdpbmF0aW9uQ29tcG9uZW50czogUXVlcnlMaXN0PElneFBhZ2luYXRvckNvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfb3V0bGV0RGlyZWN0aXZlOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdENvbGxhcHNlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVTRkhlYWRlckljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEVTRkhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3N1bW1hcnlSb3cnLCB7IHJlYWQ6IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSlcbiAgICBwcm90ZWN0ZWQgX3N1bW1hcnlSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4U3VtbWFyeVJvd0NvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdyb3cnKVxuICAgIHByaXZhdGUgX3Jvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3Bpbm5lZFJvdycpXG4gICAgcHJpdmF0ZSBfcGlubmVkUm93TGlzdDogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0Um93RWRpdFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBkZWZhdWx0Um93RWRpdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dD47XG5cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0RpcmVjdGl2ZSwgeyByZWFkOiBJZ3hSb3dEaXJlY3RpdmUgfSlcbiAgICBwcml2YXRlIF9kYXRhUm93TGlzdDogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT47XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBwcml2YXRlIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtZ3JpZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJR3JpZFJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc291cmNlU3RyaW5ncygpOiBJR3JpZFJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIGlmICghdGhpcy5fcmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBDdXJyZW50UmVzb3VyY2VTdHJpbmdzLkdyaWRSZXNTdHJpbmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBmaWx0ZXJpbmcgbG9naWMgb2YgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgaXMgQU5ELlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2ZpbHRlcmluZ0xvZ2ljXT1cImZpbHRlcmluZ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmluZ0xvZ2ljKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyaW5nTG9naWModmFsdWU6IEZpbHRlcmluZ0xvZ2ljKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbKGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSldPVwibW9kZWwuZmlsdGVyaW5nRXhwcmVzc2lvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAodmFsdWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWwuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQsIHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0uZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2godmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gPSBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZS50eXBlID0gRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZS5SZWd1bGFyO1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1BpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVFbXB0eSh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnJlZnJlc2hFeHByZXNzaW9ucygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgKiB0aGlzLmdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBsb2dpYztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuQWR2YW5jZWQ7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkgJiZcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZmlsdGVyaW5nRG9uZS5lbWl0KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBsb2NhbGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG5vdCBzZXQsIHJldHVybnMgYnJvd3NlcidzIGxhbmd1YWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fbG9jYWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZUNoYW5nZS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ01vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmdNb2RlKHZhbDogR3JpZFBhZ2luZ01vZGUpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nTW9kZSA9IHZhbDtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIERlZmluZSBgaWd4LXBhZ2luYXRvcmAgYXMgYSBncmlkIGNoaWxkIGNvbXBvbmVudCBhbmQgcGFnaW5nIHdpbGwgYmUgZW5hYmxlZCwgb3RoZXJ3aXNlIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIHBhZ2luZyBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgc3RhdGUgaXMgZGlzYWJsZWQgKGZhbHNlKS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIG9sZCAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtwYWdpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICpcbiAgICAgKiA8IS0tIG5ldyAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICAgPGlneC1wYWdpbmF0b3I+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2luZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhZ2luZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9wYWdpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgYHBhZ2VgIHByb3BlcnR5IGZyb20gYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0YW5jZSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIHRoZSBjdXJyZW50IHBhZ2UgaW5kZXguXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gb2xkIC0tPlxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3BhZ2VdPVwibW9kZWwucGFnZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICpcbiAgICAgKiA8IS0tIG5ldyAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICAgPGlneC1wYWdpbmF0b3IgWyhwYWdlKV09XCJtb2RlbC5wYWdlXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGJpbmRpbmcuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy5wYWdlIHx8IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgYHBlclBhZ2VgIHByb3BlcnR5IGZyb20gYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0YW5jZSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIHBlciBwYWdlLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IGlzIDE1LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gb2xkIC0tPlxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3BlclBhZ2VdPVwibW9kZWwucGVyUGFnZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICpcbiAgICAgKiA8IS0tIG5ldyAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICAgPGlneC1wYWdpbmF0b3IgWyhwZXJQYWdlKV09XCJtb2RlbC5wZXJQYWdlXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBlclBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy5wZXJQYWdlIHx8IERFRkFVTFRfSVRFTVNfUEVSX1BBR0U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwZXJQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3BlclBhZ2UgPSB2YWw7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgcm93IHNlbGVjdG9ycyBhcmUgaGlkZGVuLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgQnkgZGVmYXVsdCByb3cgc2VsZWN0b3JzIGFyZSBzaG93blxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoaWRlUm93U2VsZWN0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZVJvd1NlbGVjdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhpZGVSb3dTZWxlY3RvcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faGlkZVJvd1NlbGVjdG9ycyA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgcm93cyBjYW4gYmUgbW92ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW3Jvd0RyYWdnYWJsZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RHJhZyAmJiB0aGlzLmhhc1Zpc2libGVDb2x1bW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdHJpZ2dlciBmb3IgdmFsaWRhdG9ycyB1c2VkIHdoZW4gZWRpdGluZyB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCB2YWxpZGF0aW9uVHJpZ2dlcj0nYmx1cic+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWxpZGF0aW9uVHJpZ2dlcjogR3JpZFZhbGlkYXRpb25UcmlnZ2VyID0gJ2NoYW5nZSc7XG5cblxuICAgIHB1YmxpYyBzZXQgcm93RHJhZ2dhYmxlKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yb3dEcmFnID0gdmFsO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IElEIHRoYXQgaXMgYmVpbmcgZHJhZ2dlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHJvdyBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkcmFnUm93SUQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIHJvd3MgYXJlIGVkaXRhYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW3Jvd0VkaXRhYmxlXT1cInRydWVcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiID48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93RWRpdGFibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3JpZFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcm93RWRpdGFibGUgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgcHVibGljIGdldCBob3N0V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aCB8fCB0aGlzLl9ob3N0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBncmlkV2lkdGggPSB0aGlzLmdyaWQud2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3aWR0aCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgaGVhZGVyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogbGV0IGdyaWRIZWFkZXJXaWR0aCA9IHRoaXMuZ3JpZC5oZWFkZXJXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcldpZHRoKCkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIC0gMTc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtyb3dIZWlnaHRdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93SGVpZ2h0ID8gdGhpcy5fcm93SGVpZ2h0IDogdGhpcy5kZWZhdWx0Um93SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93SGVpZ2h0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3Jvd0hlaWdodCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtjb2x1bW5XaWR0aF09XCIxMDBcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uV2lkdGgodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldC9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkTWVzc2FnZV09XCInVGhlIGdyaWQgaXMgZW1wdHknXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZW1wdHlHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5R3JpZE1lc3NhZ2UgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBlbXB0eUdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUdyaWRNZXNzYWdlIHx8IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2VtcHR5R3JpZF9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBncmlkIGlzIGdvaW5nIHRvIHNob3cgYSBsb2FkaW5nIGluZGljYXRvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgaXNMb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0xvYWRpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW5zIHNob3VsZCBiZSBhdXRvLWdlbmVyYXRlZCBvbmNlIGFnYWluIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ3JpZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdG8gYmluZCB0aGUgZ3JpZCB0byByZW1vdGUgZGF0YSBhbmQgaGF2aW5nIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgY29sdW1ucywgdGhpcyBwcm9wZXJ0eSB3b3VsZCBiZSBkaXNhYmxlZCB0byBhdm9pZCByZS1jcmVhdGluZ1xuICAgICAqIGNvbHVtbnMgZWFjaCB0aW1lIGEgbmV3IGRhdGEgaXMgYXNzaWduZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5zaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3VsZEdlbmVyYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzIGFuZCB0aGUgZ3JpZCBpcyBmaWx0ZXJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgfHwgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZW1wdHlGaWx0ZXJlZEdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGluaXRpYWwgcGlubmluZyBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbGxvd3MgdG8gYXBwbHkgcGlubmluZyB0aGUgY29sdW1ucyB0byB0aGUgc3RhcnQgb3IgdGhlIGVuZC5cbiAgICAgKiBOb3RlIHRoYXQgcGlubmluZyB0byBib3RoIHNpZGVzIGF0IGEgdGltZSBpcyBub3QgYWxsb3dlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW3Bpbm5pbmddPVwicGlubmluZ0NvbmZpZ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBpbm5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uaW5nO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHBpbm5pbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9waW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmluZyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93RmlsdGVyaW5nXT1cInRydWVcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhbGxvd0ZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93RmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYWxsb3dGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93QWR2YW5jZWRGaWx0ZXJpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGFsbG93QWR2YW5jZWRGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyIG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlck1vZGVdPVwiJ3F1aWNrRmlsdGVyJ1wiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0J3Mgc2V0IHRvIEZpbHRlck1vZGUucXVpY2tGaWx0ZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlck1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJNb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyTW9kZSh2YWx1ZTogRmlsdGVyTW9kZSkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIEZpbHRlck1vZGUuZXhjZWxTdHlsZUZpbHRlcjpcbiAgICAgICAgICAgIGNhc2UgRmlsdGVyTW9kZS5xdWlja0ZpbHRlcjpcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJNb2RlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3VtbWFyeSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBzdW1tYXJ5UG9zaXRpb249XCJ0b3BcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyBib3R0b20uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcnlQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlQb3NpdGlvbih2YWx1ZTogR3JpZFN1bW1hcnlQb3NpdGlvbikge1xuICAgICAgICB0aGlzLl9zdW1tYXJ5UG9zaXRpb24gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdW1tYXJ5IGNhbGN1bGF0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZT1cInJvb3RMZXZlbE9ubHlcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyByb290QW5kQ2hpbGRMZXZlbHMgd2hpY2ggbWVhbnMgdGhlIHN1bW1hcmllcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGhlIHJvb3QgbGV2ZWwgYW5kIGVhY2ggY2hpbGQgbGV2ZWwuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSh2YWx1ZTogR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSA9IHZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnJlc2V0U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgc3VtbWFyeSByb3cgaXMgdmlzaWJsZSB3aGVuIGdyb3VwQnkvcGFyZW50IHJvdyBpcyBjb2xsYXBzZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dTdW1tYXJ5T25Db2xsYXBzZV09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlIGlzIHNldCB0byAnZmFsc2UnIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN1bW1hcnkgcm93IGlzIG5vdCB2aXNpYmxlXG4gICAgICogd2hlbiB0aGUgZ3JvdXBCeS9wYXJlbnQgcm93IGlzIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd1N1bW1hcnlPbkNvbGxhcHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBzdHJhdGVneSBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlclN0cmF0ZWd5XT1cImZpbHRlclN0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyU3RyYXRlZ3koKTogSUZpbHRlcmluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclN0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyU3RyYXRlZ3koY2xhc3NSZWY6IElGaWx0ZXJpbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLl9maWx0ZXJTdHJhdGVneSA9IGNsYXNzUmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc29ydGluZyBzdHJhdGVneSBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3NvcnRTdHJhdGVneV09XCJzb3J0U3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0U3RyYXRlZ3koKTogSUdyaWRTb3J0aW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZ1N0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc29ydFN0cmF0ZWd5KHZhbHVlOiBJR3JpZFNvcnRpbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLl9zb3J0aW5nU3RyYXRlZ3kgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHNvcnRpbmcgb3B0aW9ucyAtIHNpbmdsZSBvciBtdWx0aXBsZSBzb3J0aW5nLlxuICAgICAqIEFjY2VwdHMgYW4gYElTb3J0aW5nT3B0aW9uc2Agb2JqZWN0IHdpdGggYW55IG9mIHRoZSBgbW9kZWAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IF9zb3J0aW5nT3B0aW9uczogSVNvcnRpbmdPcHRpb25zID0ge1xuICAgICAqICAgICAgbW9kZTogJ3NpbmdsZSdcbiAgICAgKiB9XG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbc29ydGluZ09wdGlvbnNdPVwic29ydGluZ09wdGlvbnNcIj48aWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHNvcnRpbmdPcHRpb25zKHZhbHVlOiBJU29ydGluZ09wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jbGVhclNvcnQoKTtcbiAgICAgICAgdGhpcy5fc29ydGluZ09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NvcnRpbmdPcHRpb25zLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc29ydGluZ09wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nT3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXByZXNlbnRzIHRoZSBzZWxlY3RlZCByb3dzJyBJRHMgKHByaW1hcnkga2V5IG9yIHJvd0RhdGEpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIHByaW1hcnlLZXk9XCJJRFwiIHJvd1NlbGVjdGlvbj1cIm11bHRpcGxlXCIgW3NlbGVjdGVkUm93c109XCJbMCwgMSwgMl1cIj48aWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkUm93cyhyb3dJRHM6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Um93cyhyb3dJRHMgfHwgW10sIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RlZFJvd3MoKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoZWFkZXJHcm91cHNMaXN0ID0gdGhpcy5ncmlkLmhlYWRlckdyb3Vwc0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJHcm91cHNMaXN0KCk6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRIZWFkZXJDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGVhZGVycyA9IHRoaXMuZ3JpZC5oZWFkZXJDZWxsTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckNlbGxMaXN0KCk6IElneEdyaWRIZWFkZXJDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRlckdyb3Vwc0xpc3QubWFwKGhlYWRlckdyb3VwID0+IGhlYWRlckdyb3VwLmhlYWRlcikuZmlsdGVyKGhlYWRlciA9PiBoZWFkZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgYElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpbHRlckNlbGxzID0gdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyQ2VsbExpc3QoKTogSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYWRlckdyb3Vwc0xpc3QubWFwKGdyb3VwID0+IGdyb3VwLmZpbHRlcikuZmlsdGVyKGNlbGwgPT4gY2VsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcmllc1Jvd0xpc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBRdWVyeUxpc3Q8YW55PigpO1xuICAgICAgICBpZiAoIXRoaXMuX3N1bW1hcnlSb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN1bUxpc3QgPSB0aGlzLl9zdW1tYXJ5Um93TGlzdC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IG51bGwpO1xuICAgICAgICByZXMucmVzZXQoc3VtTGlzdCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBJZ3hHcmlkUm93Q29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHJvd0xpc3QgPSB0aGlzLmdyaWQucm93TGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0xpc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPigpO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgckxpc3QgPSB0aGlzLl9yb3dMaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgcmVzLnJlc2V0KHJMaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY3VycmVudGx5IHJlbmRlcmVkIGBJZ3hHcmlkUm93Q29tcG9uZW50YCdzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZGF0YUxpc3QgPSB0aGlzLmdyaWQuZGF0YVJvd0xpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhUm93TGlzdCgpOiBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPigpO1xuICAgICAgICBpZiAoIXRoaXMuX2RhdGFSb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJMaXN0ID0gdGhpcy5fZGF0YVJvd0xpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbCkuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICByZXMucmVzZXQockxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhlYWRlciByb3cgc2VsZWN0b3IgdGVtcGxhdGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGhlYWRTZWxlY3RvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZFNlbGVjdG9yVGVtcGxhdGUgfHwgdGhpcy5oZWFkU2VsZWN0b3JzVGVtcGxhdGVzLmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGhlYWRlciByb3cgc2VsZWN0b3IgdGVtcGxhdGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4SGVhZFNlbGVjdG9yIGxldC1oZWFkQ29udGV4dD5cbiAgICAgKiB7eyBoZWFkQ29udGV4dC5zZWxlY3RlZENvdW50IH19IC8ge3sgaGVhZENvbnRleHQudG90YWxDb3VudCAgfX1cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmhlYWRTZWxlY3RvclRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGhlYWRTZWxlY3RvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2hlYWRTZWxlY3RvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNQaW5uaW5nVG9TdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmluZy5jb2x1bW5zICE9PSBDb2x1bW5QaW5uaW5nUG9zaXRpb24uRW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUm93UGlubmluZ1RvVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uaW5nLnJvd3MgIT09IFJvd1Bpbm5pbmdQb3NpdGlvbi5Cb3R0b207XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IHNlbGVjdG9yIHRlbXBsYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dTZWxlY3RvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneFJvd1NlbGVjdG9yVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3RvclRlbXBsYXRlIHx8IHRoaXMucm93U2VsZWN0b3JzVGVtcGxhdGVzLmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBTZXRzIGEgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgcm93IHNlbGVjdG9ycy5cbiAgICAgICAgICogYGBgaHRtbFxuICAgICAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFJvd1NlbGVjdG9yIGxldC1yb3dDb250ZXh0PlxuICAgICAgICAgKiAgICA8aWd4LWNoZWNrYm94IFtjaGVja2VkXT1cInJvd0NvbnRleHQuc2VsZWN0ZWRcIj48L2lneC1jaGVja2JveD5cbiAgICAgICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgICAgICogdGhpcy5ncmlkLnJvd1NlbGVjdG9yVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgcHVibGljIHNldCByb3dTZWxlY3RvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hSb3dTZWxlY3RvclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0Q3VzdG9tKCk6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdEN1c3RvbURpcmVjdGl2ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzLmZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDb250YWluZXIoKTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdEN1c3RvbSA/IHRoaXMucm93RWRpdEN1c3RvbSA6IHRoaXMuZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIHJvdyBkcmFnIGluZGljYXRvciBpY29uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXN0b21EcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlIHx8IHRoaXMuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZXMuZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSByb3cgZHJhZyBpbmRpY2F0b3IgaWNvbi5cbiAgICAgKmBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneERyYWdJbmRpY2F0b3JJY29uPlxuICAgICAqICAgIDxpZ3gtaWNvbj5leHBhbmRfbGVzczwvaWd4LWljb24+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUodmFsOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpcnN0RWRpdGFibGVDb2x1bW5JbmRleCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZWRpdGFibGUpXG4gICAgICAgICAgICAubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgcmV0dXJuIGluZGV4Lmxlbmd0aCA/IGluZGV4WzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdEVkaXRhYmxlQ29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVkaXRhYmxlKVxuICAgICAgICAgICAgLm1hcChjID0+IGMudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBpbmRleC5sZW5ndGggPyBpbmRleFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUT0RPOiBOYXYgc2VydmljZSBsb2dpYyBkb2Vzbid0IGhhbmRsZSAwIHJlc3VsdHMgZnJvbSB0aGlzIHF1ZXJ5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRhYnMoKTogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRUYWJzQ1VTVE9NLmxlbmd0aCA/IHRoaXMucm93RWRpdFRhYnNDVVNUT00gOiB0aGlzLnJvd0VkaXRUYWJzREVGQVVMVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW0gPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcblxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0gfHwgIU9iamVjdC5rZXlzKGFjdGl2ZUVsZW0pLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbS5yb3cgPCAwID9cbiAgICAgICAgICAgIGAke3RoaXMuaWR9XyR7YWN0aXZlRWxlbS5yb3d9XyR7YWN0aXZlRWxlbS5tY2hDYWNoZS5sZXZlbH1fJHthY3RpdmVFbGVtLmNvbHVtbn1gIDpcbiAgICAgICAgICAgIGAke3RoaXMuaWR9XyR7YWN0aXZlRWxlbS5yb3d9XyR7YWN0aXZlRWxlbS5jb2x1bW59YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJhbm5lckNsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneS5pc1RvcCA/ICdpZ3gtYmFubmVyX19ib3JkZXItdG9wJyA6ICdpZ3gtYmFubmVyX19ib3JkZXItYm90dG9tJztcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtYmFubmVyJyl9ICR7cG9zaXRpb259YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHNvcnRpbmcgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFN1cHBvcnRzIHR3by13YXkgZGF0YSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgWyhzb3J0aW5nRXhwcmVzc2lvbnMpXT1cIm1vZGVsLnNvcnRpbmdFeHByZXNzaW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmdFeHByZXNzaW9ucygpOiBJU29ydGluZ0V4cHJlc3Npb25bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3J0aW5nRXhwcmVzc2lvbnModmFsdWU6IElTb3J0aW5nRXhwcmVzc2lvbltdKSB7XG4gICAgICAgIHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucyA9IGNsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICB0aGlzLnNvcnRpbmdFeHByZXNzaW9uc0NoYW5nZS5lbWl0KHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhMZXZlbEhlYWRlckRlcHRoKCkge1xuICAgICAgICBpZiAodGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiBNYXRoLm1heChhY2MsIGNvbC5yb3dTdGFydCksIDApIDpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IE1hdGgubWF4KGFjYywgY29sLmxldmVsKSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGhpZGRlbiBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGlkZGVuQ29sID0gdGhpcy5ncmlkLmhpZGRlbkNvbHVtbnNDb3VudDtcbiAgICAgKiBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGlkZGVuQ29sdW1uc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkdyb3VwID09PSBmYWxzZSAmJiBjb2wuaGlkZGVuID09PSB0cnVlKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHBpbm5lZCBjb2x1bW5zLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5MYXlvdXQpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBoYXMgYmF0Y2ggZWRpdGluZyBlbmFibGVkLlxuICAgICAqIFdoZW4gYmF0Y2ggZWRpdGluZyBpcyBlbmFibGVkLCBjaGFuZ2VzIGFyZSBub3QgbWFkZSBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgICAqIEluc3RlYWQsIHRoZXkgYXJlIHN0b3JlZCBhcyB0cmFuc2FjdGlvbnMsIHdoaWNoIGNhbiBsYXRlciBiZSBjb21taXR0ZWQgdy8gdGhlIGBjb21taXRgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbYmF0Y2hFZGl0aW5nXT1cInRydWVcIiBbZGF0YV09XCJzb21lRGF0YVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGJhdGNoRWRpdGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JhdGNoRWRpdGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGJhdGNoRWRpdGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5fYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdHJhbnNhY3Rpb25zO1xuICAgICAgICAgICAgdGhpcy5fYmF0Y2hFZGl0aW5nID0gdmFsO1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hUcmFuc2FjdGlvblNlcnZpY2UodmFsKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9UcmFuc2FjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2FjdGlvbnMgc2VydmljZSBmb3IgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICBpZiAodGhpcy5fZGlUcmFuc2FjdGlvbnMgJiYgIXRoaXMuYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlUcmFuc2FjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFJvd1N0YXRlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93U3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5UG9zaXRpb25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpO1xuICAgICAgICBjb25zdCBmb3JtYXRQYXJ0cyA9IGZvcm1hdC5zcGxpdCgnLCcpO1xuICAgICAgICBjb25zdCBpID0gZm9ybWF0UGFydHMuaW5kZXhPZihmb3JtYXRQYXJ0cy5maW5kKGMgPT4gYy5pbmNsdWRlcygnwqQnKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSBpIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgY2VsbCBzZWxlY3Rpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCB0aGUgY2VsbCBzZWxlY3Rpb24gbW9kZSBpcyBtdWx0aXBsZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjZWxsU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2VsbFNlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjZWxsU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NlbGxTZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZTtcbiAgICAgICAgLy8gaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgcm93IHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyAnbm9uZSdcbiAgICAgKiBOb3RlIHRoYXQgaW4gSWd4R3JpZCBhbmQgSWd4SGllcmFyY2hpY2FsR3JpZCAnbXVsdGlwbGVDYXNjYWRlJyBiZWhhdmVzIGxpa2UgJ211bHRpcGxlJ1xuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93U2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNvbHVtbiBzZWxlY3Rpb24gbW9kZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSByb3cgc2VsZWN0aW9uIG1vZGUgaXMgbm9uZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5TZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICAvLyBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBwYWdpbmdTdGF0ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9wYWdpbmdTdGF0ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IHZhbHVlLm1ldGFkYXRhLmNvdW50UmVjb3JkcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnaW5nU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmdTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dFZGl0TWVzc2FnZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNuYWNrYmFyQWN0aW9uVGV4dCA9IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3NuYWNrYmFyX2FkZHJvd19hY3Rpb250ZXh0O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FsY1dpZHRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FsY0hlaWdodCA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdGZvb3RIZWlnaHQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbGFzdFNlYXJjaEluZm86IElTZWFyY2hJbmZvID0ge1xuICAgICAgICBzZWFyY2hUZXh0OiAnJyxcbiAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgIGV4YWN0TWF0Y2g6IGZhbHNlLFxuICAgICAgICBhY3RpdmVNYXRjaEluZGV4OiAwLFxuICAgICAgICBtYXRjaEluZm9DYWNoZTogW11cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uV2lkdGhTZXRCeVVzZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpbm5lZFJlY29yZHM6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5uZWRSZWNvcmRzOiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlbmRlcmVkJCA9IHRoaXMucmVuZGVyZWQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZXNpemVOb3RpZnkgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJvd0FkZGVkTm90aWZpZXIgPSBuZXcgU3ViamVjdDxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByb3dEZWxldGVkTm90aWZpZXIgPSBuZXcgU3ViamVjdDxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBwaXBlVHJpZ2dlck5vdGlmaWVyID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhOiBhbnlbXTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIF9maWx0ZXJlZFBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRVbnBpbm5lZERhdGE7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF90b3RhbFJlY29yZHMgPSAtMTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5zV2l0aE5vU2V0V2lkdGhzID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nUGlwZVRyaWdnZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHN1bW1hcnlQaXBlVHJpZ2dlciA9IDA7XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgRU1QVFlfREFUQSA9IFtdO1xuXG4gICAgcHVibGljIGlzUGl2b3QgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfYmFzZUZvbnRTaXplOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGVyUGFnZSA9IERFRkFVTFRfSVRFTVNfUEVSX1BBR0U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nTW9kZSA9IEdyaWRQYWdpbmdNb2RlLkxvY2FsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2luZ1N0YXRlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hpZGVSb3dTZWxlY3RvcnMgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yb3dEcmFnID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9waW5uZWRDb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3VucGlubmVkQ29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBuZXcgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKEZpbHRlcmluZ0xvZ2ljLkFuZCk7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc29ydGluZ0V4cHJlc3Npb25zOiBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+ID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uSGlkaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29sdW1uUGlubmluZyA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIF9waW5uZWRSZWNvcmRJRHMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hhc1Zpc2libGVDb2x1bW5zO1xuICAgIHByb3RlY3RlZCBfYWxsb3dGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlck1vZGU6IEZpbHRlck1vZGUgPSBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyO1xuXG5cbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIgPSAxMDtcbiAgICBwcm90ZWN0ZWQgX2V4cGFuc2lvblN0YXRlczogTWFwPGFueSwgYm9vbGVhbj4gPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfaGVhZGVyRmVhdHVyZXNXaWR0aCA9IE5hTjtcbiAgICBwcm90ZWN0ZWQgX2luaXQgPSB0cnVlO1xuICAgIHByb3RlY3RlZCBfY2RyUmVxdWVzdFJlcGFpbnQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3VzZXJPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG4gICAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uU2VydmljZTxUcmFuc2FjdGlvbiwgU3RhdGU+O1xuICAgIHByb3RlY3RlZCBfYmF0Y2hFZGl0aW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zb3J0aW5nT3B0aW9uczogSVNvcnRpbmdPcHRpb25zID0geyBtb2RlOiAnbXVsdGlwbGUnIH07XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJTdHJhdGVneTogSUZpbHRlcmluZ1N0cmF0ZWd5ID0gbmV3IEZpbHRlcmluZ1N0cmF0ZWd5KCk7XG4gICAgcHJvdGVjdGVkIF9hdXRvR2VuZXJhdGVkQ29scyA9IFtdO1xuICAgIHByb3RlY3RlZCBfZGF0YVZpZXcgPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgcGFnaW5hdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uQ29tcG9uZW50cz8uZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNjcm9sbFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbE5hdGl2ZVNpemUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yb3dFZGl0YWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2N1cnJlbnRSb3dTdGF0ZTogYW55O1xuICAgIHByaXZhdGUgX2ZpbHRlcmVkU29ydGVkRGF0YSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93U2VsZWN0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX2hlYWRTZWxlY3RvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX3Jvd0VkaXRUZXh0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93QWRkVGV4dFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX3Jvd0VkaXRBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dEcmFnR2hvc3RDb250ZXh0PjtcblxuICAgIHByaXZhdGUgX2NkclJlcXVlc3RzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VTdHJpbmdzO1xuICAgIHByaXZhdGUgX2VtcHR5R3JpZE1lc3NhZ2UgPSBudWxsO1xuICAgIHByaXZhdGUgX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvdmVybGF5SURzID0gW107XG4gICAgcHJpdmF0ZSBfc29ydGluZ1N0cmF0ZWd5OiBJR3JpZFNvcnRpbmdTdHJhdGVneTtcbiAgICBwcml2YXRlIF9waW5uaW5nOiBJUGlubmluZ0NvbmZpZyA9IHsgY29sdW1uczogQ29sdW1uUGlubmluZ1Bvc2l0aW9uLlN0YXJ0IH07XG5cbiAgICBwcml2YXRlIF9ob3N0V2lkdGg7XG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ1Bvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGUsXG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuQ2VudGVyLFxuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuTWlkZGxlXG4gICAgfTtcblxuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nUG9zaXRpb25TZXR0aW5ncyksXG4gICAgfTtcblxuICAgIHByaXZhdGUgY29sdW1uTGlzdERpZmZlcjtcbiAgICBwcml2YXRlIHJvd0xpc3REaWZmZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBzdHJpbmcgfCBudWxsID0gJzEwMCUnO1xuICAgIHByaXZhdGUgX3dpZHRoOiBzdHJpbmcgfCBudWxsID0gJzEwMCUnO1xuICAgIHByaXZhdGUgX3Jvd0hlaWdodDtcbiAgICBwcml2YXRlIF9ob3Jpem9udGFsRm9yT2ZzOiBBcnJheTxJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55Pj4gPSBbXTtcbiAgICBwcml2YXRlIF9tdWx0aVJvd0xheW91dFJvd1NpemUgPSAxO1xuICAgIC8vIENhY2hlc1xuICAgIHByaXZhdGUgX3RvdGFsV2lkdGggPSBOYU47XG4gICAgcHJpdmF0ZSBfcGlubmVkVmlzaWJsZSA9IFtdO1xuICAgIHByaXZhdGUgX3VucGlubmVkVmlzaWJsZSA9IFtdO1xuICAgIHByaXZhdGUgX3Bpbm5lZFdpZHRoID0gTmFOO1xuICAgIHByaXZhdGUgX3VucGlubmVkV2lkdGggPSBOYU47XG4gICAgcHJpdmF0ZSBfdmlzaWJsZUNvbHVtbnMgPSBbXTtcbiAgICBwcml2YXRlIF9jb2x1bW5Hcm91cHMgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX2NvbHVtbldpZHRoOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9zdW1tYXJ5UG9zaXRpb246IEdyaWRTdW1tYXJ5UG9zaXRpb24gPSBHcmlkU3VtbWFyeVBvc2l0aW9uLmJvdHRvbTtcbiAgICBwcml2YXRlIF9zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlOiBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSA9IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLnJvb3RBbmRDaGlsZExldmVscztcbiAgICBwcml2YXRlIF9zaG93U3VtbWFyeU9uQ29sbGFwc2UgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9zdW1tYXJ5Um93SGVpZ2h0ID0gMDtcbiAgICBwcml2YXRlIF9jZWxsU2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZTtcbiAgICBwcml2YXRlIF9yb3dTZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgcHJpdmF0ZSBfc2VsZWN0Um93T25DbGljayA9IHRydWU7XG4gICAgcHJpdmF0ZSBfY29sdW1uU2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lO1xuXG4gICAgcHJpdmF0ZSBsYXN0QWRkZWRSb3dJbmRleDtcbiAgICBwcml2YXRlIF9jdXJyZW5jeVBvc2l0aW9uTGVmdDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgcm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kgPSBuZXcgUm93RWRpdFBvc2l0aW9uU3RyYXRlZ3koe1xuICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBob3Jpem9udGFsU3RhcnRQb2ludDogSG9yaXpvbnRhbEFsaWdubWVudC5MZWZ0LFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgY2xvc2VBbmltYXRpb246IG51bGxcbiAgICB9KTtcblxuICAgIHByaXZhdGUgcm93RWRpdFNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBvdXRsZXQ6IHRoaXMucm93T3V0bGV0RGlyZWN0aXZlLFxuICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5XG4gICAgfTtcblxuICAgIHByaXZhdGUgdHJhbnNhY3Rpb25DaGFuZ2UkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIF9yZW5kZXJlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgRFJBR19TQ1JPTExfREVMVEEgPSAxMDtcbiAgICBwcml2YXRlIF9kYXRhQ2xvbmVTdHJhdGVneTogSURhdGFDbG9uZVN0cmF0ZWd5ID0gbmV3IERlZmF1bHREYXRhQ2xvbmVTdHJhdGVneSgpO1xuICAgIHByaXZhdGUgX2F1dG9TaXplID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc29ydEhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuICAgIHByaXZhdGUgX3NvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcbiAgICBwcml2YXRlIF9zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IG1pbkNvbHVtbldpZHRoKCkge1xuICAgICAgICByZXR1cm4gTUlOSU1VTV9DT0xVTU5fV0lEVEg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgaWQ6IHN0cmluZztcbiAgICBwdWJsaWMgYWJzdHJhY3QgZGF0YTogYW55W10gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGZpbHRlcmVkIGRhdGEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5ncmlkLmZpbHRlcmVkRGF0YTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbHRlcmVkIHNvcnRlZCBkYXRhLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlsdGVyZWRTb3J0ZWREYXRhID0gdGhpcy5ncmlkMS5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJlZFNvcnRlZERhdGEoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dDaGFuZ2VzQ291bnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jcnVkU2VydmljZS5yb3cpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGYgPSAob2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gMDtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4gaXNPYmplY3Qob2JqW2tleV0pID8gY2hhbmdlcyArPSBmKG9ialtrZXldKSA6IGNoYW5nZXMrKyk7XG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlcztcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25zLmdldFN0YXRlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmlkKT8udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFERCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuZmlsdGVyKGMgPT4gYy5maWVsZCkubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd0NoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9ucy5nZXRBZ2dyZWdhdGVkVmFsdWUodGhpcy5jcnVkU2VydmljZS5yb3cuaWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHJvd0NoYW5nZXMgPyBmKHJvd0NoYW5nZXMpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVdpdGhBZGRlZEluVHJhbnNhY3Rpb25Sb3dzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjbG9uZUFycmF5KHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEoKSk7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLnRyYW5zYWN0aW9ucy5nZXRBZ2dyZWdhdGVkQ2hhbmdlcyh0cnVlKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIodCA9PiB0LnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpXG4gICAgICAgICAgICAgICAgLm1hcCh0ID0+IHQubmV3VmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNydWRTZXJ2aWNlLnJvdyAmJiB0aGlzLmNydWRTZXJ2aWNlLnJvdy5nZXRDbGFzc05hbWUoKSA9PT0gSWd4QWRkUm93Lm5hbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UodGhpcy5jcnVkU2VydmljZS5yb3cuaW5kZXgsIDAsIHRoaXMuY3J1ZFNlcnZpY2Uucm93LmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YUxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQgPyB0aGlzLmRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cy5sZW5ndGggOiB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nICYmICh0aGlzLmhhc1plcm9SZXN1bHRGaWx0ZXIgfHwgdGhpcy5oYXNOb0RhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nR3JpZFRlbXBsYXRlID8gdGhpcy5sb2FkaW5nR3JpZFRlbXBsYXRlIDogdGhpcy5sb2FkaW5nR3JpZERlZmF1bHRUZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1plcm9SZXN1bHRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlID8gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA6IHRoaXMuZW1wdHlGaWx0ZXJlZEdyaWRUZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc05vRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgPyB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlIDogdGhpcy5lbXB0eUdyaWREZWZhdWx0VGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0IGhhc1plcm9SZXN1bHRGaWx0ZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRGF0YSAmJiB0aGlzLmZpbHRlcmVkRGF0YS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBoYXNOb0RhdGEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kYXRhIHx8IHRoaXMuZGF0YUxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvdWxkT3ZlcmxheUxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTG9hZGluZyAmJiAhdGhpcy5oYXNOb0RhdGEgJiYgIXRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1NlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUubXVsdGlwbGVcbiAgICAgICAgICAgIHx8IHRoaXMucm93U2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZUNhc2NhZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUm93U2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uICE9PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0NlbGxTZWxlY3RhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jZWxsU2VsZWN0aW9uICE9PSBHcmlkU2VsZWN0aW9uTW9kZS5ub25lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2x1bW5JbkRyYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuY21zLmNvbHVtbjtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHZhbGlkYXRpb246IElneEdyaWRWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIHNlbGVjdGlvblNlcnZpY2U6IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29sUmVzaXppbmdTZXJ2aWNlOiBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfU0VSVklDRV9CQVNFKSBwdWJsaWMgZ3JpZEFQSTogR3JpZFNlcnZpY2VUeXBlLFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25GYWN0b3J5OiBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwdWJsaWMgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIHByb3RlY3RlZCB2aWV3UmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByb3RlY3RlZCBlbnZJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgcHVibGljIG5hdmlnYXRpb246IElneEdyaWROYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByb3RlY3RlZCBvdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBzdW1tYXJ5U2VydmljZTogSWd4R3JpZFN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByb3RlY3RlZCBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zLFxuICAgICAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBsb2NhbGVJZDogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJZ3hHcmlkVHJhbnNhY3Rpb24pIHByb3RlY3RlZCBfZGlUcmFuc2FjdGlvbnM/OiBUcmFuc2FjdGlvblNlcnZpY2U8VHJhbnNhY3Rpb24sIFN0YXRlPlxuICAgICkge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmxvY2FsZSB8fCB0aGlzLmxvY2FsZUlkO1xuICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uRmFjdG9yeS5jcmVhdGUoVFJBTlNBQ1RJT05fVFlQRS5Ob25lKTtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zLmNsb25lU3RyYXRlZ3kgPSB0aGlzLmRhdGFDbG9uZVN0cmF0ZWd5O1xuICAgICAgICB0aGlzLmNkci5kZXRhY2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gICAgcHVibGljIGhpZGVBY3Rpb25TdHJpcCgpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25TdHJpcD8uaGlkZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckZlYXR1cmVzV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEZXRhaWxSZWNvcmQoX3JlYykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0dyb3VwQnlSZWNvcmQoX3JlYykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNHaG9zdFJlY29yZChyZWNvcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLmdob3N0UmVjb3JkICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzQWRkUm93UmVjb3JkKHJlY29yZDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZWNvcmQuYWRkUm93ICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJldHVybnMgdGhlIHJvdyBpbmRleCBvZiBhIHJvdyB0aGF0IHRha2VzIGludG8gYWNjb3VudCB0aGUgZnVsbCB2aWV3IGRhdGEgbGlrZSBwaW5uaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREYXRhVmlld0luZGV4KHJvd0luZGV4LCBwaW5uZWQpIHtcbiAgICAgICAgaWYgKHBpbm5lZCAmJiAhdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCArIHRoaXMudW5waW5uZWREYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBpbm5lZCAmJiB0aGlzLmlzUm93UGlubmluZ1RvVG9wKSB7XG4gICAgICAgICAgICByb3dJbmRleCA9IHJvd0luZGV4ICsgdGhpcy5waW5uZWREYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd0luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0RldGFpbHMoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgZ3JpZCB2aXJ0dWFsaXphdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSW5jbHVkZXMgdGhlIHN0YXJ0IGluZGV4IGFuZCBob3cgbWFueSByZWNvcmRzIGFyZSByZW5kZXJlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncmlkVmlydFN0YXRlID0gdGhpcy5ncmlkMS52aXJ0dWFsaXphdGlvblN0YXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlydHVhbGl6YXRpb25TdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmlydHVhbGl6YXRpb25TdGF0ZShzdGF0ZSkge1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoaWRlT3ZlcmxheXMoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheUlEcy5mb3JFYWNoKG92ZXJsYXlJRCA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZChvdmVybGF5SUQpO1xuXG4gICAgICAgICAgICBpZiAob3ZlcmxheT8udmlzaWJsZSAmJiAhb3ZlcmxheS5jbG9zZUFuaW1hdGlvblBsYXllcj8uaGFzU3RhcnRlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5oaWRlKG92ZXJsYXlJRCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWNvcmQgaXMgcGlubmVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByb3dJbmRleCBJbmRleCBvZiB0aGUgcmVjb3JkIGluIHRoZSBgZGF0YVZpZXdgIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkQnlWaWV3SW5kZXgocm93SW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmICh0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4IDwgdGhpcy5waW5uZWREYXRhVmlldy5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPj0gdGhpcy51bnBpbm5lZERhdGFWaWV3Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByZWNvcmQgaXMgcGlubmVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByb3dJbmRleCBJbmRleCBvZiB0aGUgcmVjb3JkIGluIHRoZSBgZmlsdGVyZWRTb3J0ZWREYXRhYCBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmICh0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4IDwgdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICghdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA+PSB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YS5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWQocmVjKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEluaXRpYWxQaW5uZWRJbmRleChyZWMpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICogUmV0dXJucyB0aGUgcmVjb3JkIGluZGV4IGluIG9yZGVyIG9mIHBpbm5pbmcgYnkgdGhlIHVzZXIuIERvZXMgbm90IGNvbnNpZGVyIHNvcnRpbmcvZmlsdGVyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbml0aWFsUGlubmVkSW5kZXgocmVjKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaWQocmVjKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNQaW5uZWRSZWNvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUmVjb3JkSURzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkUmVjb3Jkc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUmVjb3JkSURzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjcnVkU2VydmljZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5jcnVkU2VydmljZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF9zZXR1cFNlcnZpY2VzKCkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBMaXN0ZW5lcnMoKSB7XG4gICAgICAgIGNvbnN0IGRlc3RydWN0b3IgPSB0YWtlVW50aWw8YW55Pih0aGlzLmRlc3Ryb3kkKTtcbiAgICAgICAgZnJvbUV2ZW50KHRoaXMubmF0aXZlRWxlbWVudCwgJ2ZvY3Vzb3V0JykucGlwZShmaWx0ZXIoKCkgPT4gISF0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jcnVkU2VydmljZS5jZWxsICYmXG4gICAgICAgICAgICAgICAgISF0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSAmJlxuICAgICAgICAgICAgICAgICgoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID49IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93IDwgdGhpcy5kYXRhVmlldy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHx8IChldmVudC50YXJnZXQgPT09IHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudCAmJiB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZS5yb3cgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRmb290Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID09PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkpICYmXG4gICAgICAgICAgICAgICAgISh0aGlzLnJvd0VkaXRhYmxlICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93RWRpdGluZ0Jsb2NrZWQgJiYgdGhpcy5jcnVkU2VydmljZS5yb3dJbkVkaXRNb2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5sYXN0QWN0aXZlTm9kZSA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlID0ge30gYXMgSUFjdGl2ZU5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvd0FkZGVkTm90aWZpZXIucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLnJlZnJlc2hHcmlkU3RhdGUoYXJncykpO1xuICAgICAgICB0aGlzLnJvd0RlbGV0ZWROb3RpZmllci5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZShhcmdzID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuZGVsZXRlT3BlcmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoYXJncyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9UcmFuc2FjdGlvbnMoKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZU5vdGlmeS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSxcbiAgICAgICAgICAgIHRocm90dGxlVGltZSgwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlciwgeyBsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgICAgIGRlc3RydWN0b3JcbiAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCB0cmlnZ2VyIHJlZmxvdyBpZiBlbGVtZW50IGlzIGRldGFjaGVkLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5jb250YWlucyh0aGlzLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXJOb3RpZmllci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucGlwZVRyaWdnZXIrKyk7XG4gICAgICAgIHRoaXMuY29sdW1uTW92aW5nRW5kLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgpID0+IHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSkpO1xuXG4gICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uub3BlbmluZy5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuaW5pdGlhbGl6ZSh0aGlzIGFzIGFueSwgdGhpcy5vdmVybGF5U2VydmljZSwgZXZlbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vcGVuZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKGV2ZW50LmlkKT8uc2V0dGluZ3M7XG5cbiAgICAgICAgICAgIC8vIGRvIG5vdCBoaWRlIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgb3ZlcmxheSBvbiBzY3JvbGxcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50LmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UucXVlcnlCdWlsZGVyLnNldEFkZEJ1dHRvbkZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZG8gbm90IGhpZGUgdGhlIG92ZXJsYXkgaWYgaXQncyBhdHRhY2hlZCB0byBhIHJvd1xuICAgICAgICAgICAgaWYgKHRoaXMucm93RWRpdGluZ092ZXJsYXk/Lm92ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvdmVybGF5U2V0dGluZ3M/Lm91dGxldCA9PT0gdGhpcy5vdXRsZXQgJiYgdGhpcy5vdmVybGF5SURzLmluZGV4T2YoZXZlbnQuaWQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUlEcy5wdXNoKGV2ZW50LmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5jbG9zZWQucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpLCBkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZCA9IHRoaXMub3ZlcmxheUlEcy5pbmRleE9mKGV2ZW50LmlkKTtcbiAgICAgICAgICAgIGlmIChpbmQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnNwbGljZShpbmQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRhdGFDaGFuZ2luZy5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZWNhbGNTaXplID0gdGhpcy5pc1BlcmNlbnRIZWlnaHQgJiZcbiAgICAgICAgICAgICAgICAoIXRoaXMuY2FsY0hlaWdodCB8fCB0aGlzLmNhbGNIZWlnaHQgPT09IHRoaXMuZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5yZW5kZXJlZFJvd0hlaWdodCAqIHRoaXMuX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIpO1xuICAgICAgICAgICAgaWYgKHNob3VsZFJlY2FsY1NpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICAkZXZlbnQuY29udGFpbmVyU2l6ZSA9IHRoaXMuY2FsY0hlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxiYXJWaXNpYmlsaXR5Q2hhbmdlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBjYWxsZWQgdG8gcmVjYWxjIGFsbCB3aWR0aHMgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VzIGFzIGEgcmVzdWx0IG9mXG4gICAgICAgICAgICAvLyB0aGUgdmVydC4gc2Nyb2xsYmFyIHNob3dpbmcvaGlkaW5nXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuY29udGVudFNpemVDaGFuZ2UucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpLCB0aHJvdHRsZVRpbWUoMzApLCBkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlbnNpdHlDaGFuZ2VkLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplID0gdGhpcy5pc1BlcmNlbnRIZWlnaHQgJiYgdGhpcy5jYWxjSGVpZ2h0ICE9PSB0aGlzLmdldERhdGFCYXNlZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3VtbWFyeVJvd0hlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuX3NldHVwU2VydmljZXMoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5yb3dMaXN0RGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gY29tcGFyZSBiYXNlZCBvbiBmaWVsZCwgbm90IG9uIG9iamVjdCByZWYuXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdERpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKGluZGV4LCBjb2w6IENvbHVtblR5cGUpID0+IGNvbC5maWVsZCk7XG4gICAgICAgIHRoaXMuY2FsY1dpZHRoID0gdGhpcy53aWR0aCAmJiB0aGlzLndpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBwYXJzZUludCh0aGlzLndpZHRoLCAxMCkgOiAwO1xuICAgICAgICB0aGlzLnNob3VsZEdlbmVyYXRlID0gdGhpcy5hdXRvR2VuZXJhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENvbHVtbnNDYWNoZXMoKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4gY29sdW1uLnJlc2V0Q2FjaGVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlUm93SUQoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcHJpbWFyeUNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZChjb2wgPT4gY29sLmZpZWxkID09PSB0aGlzLnByaW1hcnlLZXkpO1xuICAgICAgICBjb25zdCBpZFR5cGUgPSB0aGlzLmRhdGEubGVuZ3RoID9cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZURhdGFUeXBlcyh0aGlzLmRhdGFbMF1bdGhpcy5wcmltYXJ5S2V5XSkgOiBwcmltYXJ5Q29sdW1uID8gcHJpbWFyeUNvbHVtbi5kYXRhVHlwZSA6ICdzdHJpbmcnO1xuICAgICAgICByZXR1cm4gaWRUeXBlID09PSAnc3RyaW5nJyA/IHV1aWR2NCgpIDogRkFLRV9ST1dfSUQtLTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Rm9yT2ZDYWNoZSgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RWaXJ0Um93ID0gdGhpcy5kYXRhUm93TGlzdC5maXJzdDtcbiAgICAgICAgaWYgKGZpcnN0VmlydFJvdykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RWaXJ0Um93LnZpcnREaXJSb3cuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0VmlydFJvdy52aXJ0RGlyUm93LmFzc3VtZU1hc3RlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaWx0ZXJlZERhdGEoZGF0YSwgcGlubmVkOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFBpbm5lZERhdGEgPSBkYXRhIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRVbnBpbm5lZCA9IHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gWy4uLiB0aGlzLl9maWx0ZXJlZFBpbm5lZERhdGEsIC4uLmZpbHRlcmVkVW5waW5uZWRdO1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZERhdGEgOiB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgIXBpbm5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRVbnBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDb2x1bW5Db2xsZWN0aW9ucygpIHtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbHVtbnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl91bnBpbm5lZFZpc2libGUubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVkV2lkdGhzKCkge1xuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gTmFOO1xuICAgICAgICB0aGlzLl9waW5uZWRXaWR0aCA9IE5hTjtcbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aCA9IE5hTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCA9IHRydWUpIHtcbiAgICAgICAgaWYgKHJlY2FsY0ZlYXR1cmVXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCA9IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0Rm9yT2ZDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlc2V0Q29sdW1uc0NhY2hlcygpO1xuICAgICAgICB0aGlzLnJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlZFdpZHRocygpO1xuICAgICAgICB0aGlzLmhhc1Zpc2libGVDb2x1bW5zID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9jb2x1bW5Hcm91cHMgPSB0aGlzLl9jb2x1bW5zLnNvbWUoY29sID0+IGNvbC5jb2x1bW5Hcm91cCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMuc29ydEhlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMuc29ydEFzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMudG9vbGJhci5jaGFuZ2VzLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpKTtcbiAgICAgICAgdGhpcy5zZXRVcFBhZ2luYXRvcigpO1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25Db21wb25lbnRzLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFVwUGFnaW5hdG9yKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25TdHJpcCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25TdHJpcC5tZW51T3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3V0bGV0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YVJlYmluZGluZyhldmVudDogSUZvck9mRGF0YUNoYW5naW5nRXZlbnRBcmdzKSB7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5naW5nLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFSZWJvdW5kKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyRHJvcGRvd24oY29sdW1uOiBDb2x1bW5UeXBlLCBvcHRpb25zOiBPdmVybGF5U2V0dGluZ3MpIHtcbiAgICAgICAgb3B0aW9ucy5vdXRsZXQgPSB0aGlzLm91dGxldDtcbiAgICAgICAgaWYgKHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LmluaXRpYWxpemUoY29sdW1uLCB0aGlzLm92ZXJsYXlTZXJ2aWNlKTtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5vdmVybGF5U2VydmljZS5hdHRhY2godGhpcy5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LmVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50Lm92ZXJsYXlDb21wb25lbnRJZCA9IGlkO1xuICAgICAgICAgICAgcmV0dXJuIHsgaWQsIHJlZjogdW5kZWZpbmVkIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5jcmVhdGVDb21wb25lbnRJbnN0YW5jZShJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCk7XG4gICAgICAgIHJlZi5pbnN0YW5jZS5pbml0aWFsaXplKGNvbHVtbiwgdGhpcy5vdmVybGF5U2VydmljZSk7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5vdmVybGF5U2VydmljZS5hdHRhY2gocmVmLmluc3RhbmNlLmVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICByZWYuaW5zdGFuY2Uub3ZlcmxheUNvbXBvbmVudElkID0gaWQ7XG4gICAgICAgIHJldHVybiB7IHJlZiwgaWQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNvbXBvbmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnQ6IENvbXBvbmVudFJlZjxhbnk+ID0gY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwgeyBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmVudkluamVjdG9yLCBlbGVtZW50SW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSApO1xuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGR5bmFtaWNDb21wb25lbnQuaG9zdFZpZXcpO1xuICAgICAgICByZXR1cm4gZHluYW1pY0NvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgc2V0VXBQYWdpbmF0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUNoYW5nZS5waXBlKHRha2VXaGlsZSgoKSA9PiAhIXRoaXMucGFnaW5hdG9yKSwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChwYWdlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQocGFnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdpbmdEb25lLnBpcGUodGFrZVdoaWxlKCgpID0+ICEhdGhpcy5wYWdpbmF0b3IpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFyZ3M6IElQYWdlRXZlbnRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdpbmdEb25lLmVtaXQoeyBwcmV2aW91czogYXJncy5wcmV2aW91cywgY3VycmVudDogYXJncy5jdXJyZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUbygwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wZXJQYWdlQ2hhbmdlLnBpcGUodGFrZVdoaWxlKCgpID0+ICEhdGhpcy5wYWdpbmF0b3IpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHBlclBhZ2U6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyUGFnZUNoYW5nZS5lbWl0KHBlclBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaWx0ZXJlZFNvcnRlZERhdGEoZGF0YSwgcGlubmVkOiBib29sZWFuKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhIHx8IFtdO1xuICAgICAgICBpZiAodGhpcy5waW5uZWRSZWNvcmRzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBpZiAocGlubmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbm5lZFJlY29yZHMgPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YSA9IHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgPyBbLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YSwgLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhXSA6XG4gICAgICAgICAgICAgICAgICAgIFsuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEsIC4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGFdO1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hTZWFyY2godHJ1ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVpbGREYXRhVmlldyhkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldEhvcml6b250YWxWaXJ0dWFsaXphdGlvbigpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZpbHRlciA9IChpdGVtOiBJZ3hSb3dEaXJlY3RpdmUgfCBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50KSA9PiB0aGlzLmlzRGVmaW5lZChpdGVtLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIHRoaXMuX2hvcml6b250YWxGb3JPZnMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9kYXRhUm93TGlzdC5maWx0ZXIoZWxlbWVudEZpbHRlcikubWFwKGl0ZW0gPT4gaXRlbS52aXJ0RGlyUm93KSxcbiAgICAgICAgICAgIC4uLnRoaXMuX3N1bW1hcnlSb3dMaXN0LmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3NldHVwUm93T2JzZXJ2ZXJzKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50RmlsdGVyID0gKGl0ZW06IElneFJvd0RpcmVjdGl2ZSB8IElneFN1bW1hcnlSb3dDb21wb25lbnQpID0+IHRoaXMuaXNEZWZpbmVkKGl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgY29uc3QgZXh0cmFjdEZvck9mcyA9IHBpcGUobWFwKChjb2xsZWN0aW9uOiBhbnlbXSkgPT4gY29sbGVjdGlvbi5maWx0ZXIoZWxlbWVudEZpbHRlcikubWFwKGl0ZW0gPT4gaXRlbS52aXJ0RGlyUm93KSkpO1xuICAgICAgICBjb25zdCByb3dMaXN0T2JzZXJ2ZXIgPSBleHRyYWN0Rm9yT2ZzKHRoaXMuX2RhdGFSb3dMaXN0LmNoYW5nZXMpO1xuICAgICAgICBjb25zdCBzdW1tYXJ5Um93T2JzZXJ2ZXIgPSBleHRyYWN0Rm9yT2ZzKHRoaXMuX3N1bW1hcnlSb3dMaXN0LmNoYW5nZXMpO1xuICAgICAgICByb3dMaXN0T2JzZXJ2ZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0SG9yaXpvbnRhbFZpcnR1YWxpemF0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdW1tYXJ5Um93T2JzZXJ2ZXIucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0SG9yaXpvbnRhbFZpcnR1YWxpemF0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0SG9yaXpvbnRhbFZpcnR1YWxpemF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3pvbmVCZWdvbmVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudmVydGljYWxTY3JvbGxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXI/LmdldFNjcm9sbCgpLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaG9yaXpvbnRhbFNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5zVG9BdXRvc2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyPy5kYXRhQ2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2l6ZU5vdGlmeS5uZXh0KCkpO1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemVOb3RpZnkubmV4dCgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdFBpbm5pbmcoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5faW5pdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5yZWF0dGFjaCgpO1xuICAgICAgICB0aGlzLl9zZXR1cFJvd09ic2VydmVycygpO1xuICAgICAgICB0aGlzLl96b25lQmVnb25lTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgdmVydFNjckRDID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICB2ZXJ0U2NyREMuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wcmV2ZW50Q29udGFpbmVyU2Nyb2xsLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZFJvd0xpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXI/LmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhW3RoaXMubGFzdEFkZGVkUm93SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhyZWMsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBLZWVwIHRoZSBzdHJlYW0gb3BlbiBmb3IgZnV0dXJlIHN1YnNjcmliZXJzXG4gICAgICAgIHRoaXMucmVuZGVyZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSA9IHRoaXMuX3BlclBhZ2UgIT09IERFRkFVTFRfSVRFTVNfUEVSX1BBR0UgPyB0aGlzLl9wZXJQYWdlIDogdGhpcy5wYWdpbmF0b3IucGVyUGFnZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci50b3RhbFJlY29yZHMgPSB0aGlzLnRvdGFsUmVjb3JkcyA/IHRoaXMudG90YWxSZWNvcmRzIDogdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLm92ZXJsYXlTZXR0aW5ncyA9IHsgb3V0bGV0OiB0aGlzLm91dGxldCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uc1RvQXV0b3NpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLnJlbmRlcmVkLm5leHQodHJ1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeUNoYW5nZXMocmVwYWludCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQgPSByZXBhaW50O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIHN1cGVyLm5nRG9DaGVjaygpO1xuICAgICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RSZXBhaW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Tm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0cykge1xuICAgICAgICAgICAgdGhpcy5yZXNldE5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUoKSB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG1wT3V0bGV0cy5mb3JFYWNoKCh0bXBsT3V0bGV0KSA9PiB7XG4gICAgICAgICAgICB0bXBsT3V0bGV0LmNsZWFuQ2FjaGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25DaGFuZ2UkLm5leHQoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuZGV0YWNoKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3ZlcmxheUlEcy5mb3JFYWNoKG92ZXJsYXlJRCA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZChvdmVybGF5SUQpO1xuXG4gICAgICAgICAgICBpZiAob3ZlcmxheSAmJiAhb3ZlcmxheS5kZXRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuZGV0YWNoKG92ZXJsYXlJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPy5nZXRTY3JvbGwoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy52ZXJ0aWNhbFNjcm9sbEhhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXI/LmdldFNjcm9sbCgpPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhvcml6b250YWxTY3JvbGxIYW5kbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRTY3JEQyA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXI/LmRpc3BsYXlDb250YWluZXI7XG4gICAgICAgICAgICB2ZXJ0U2NyREM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMucHJldmVudENvbnRhaW5lclNjcm9sbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHNwZWNpZmllZCBjb2x1bW4ncyB2aXNpYmlsaXR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS50b2dnbGVDb2x1bW5WaXNpYmlsaXR5KHtcbiAgICAgKiAgICAgICBjb2x1bW46IHRoaXMuZ3JpZDEuY29sdW1uc1swXSxcbiAgICAgKiAgICAgICBuZXdWYWx1ZTogdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KGFyZ3M6IElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZEV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBjb2wgPSBhcmdzLmNvbHVtbiA/IHRoaXMuX2NvbHVtbnMuZmluZCgoYykgPT4gYyA9PT0gYXJncy5jb2x1bW4pIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICghY29sKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29sLnRvZ2dsZVZpc2liaWxpdHkoYXJncy5uZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgbGlzdCBvZiBrZXktdmFsdWUgcGFpcnMgW3JvdyBJRCwgZXhwYW5zaW9uIHN0YXRlXS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSW5jbHVkZXMgb25seSBzdGF0ZXMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdCBvbmUuXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJkYXRhXCIgWyhleHBhbnNpb25TdGF0ZXMpXT1cIm1vZGVsLmV4cGFuc2lvblN0YXRlc1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cGFuc2lvblN0YXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuc2lvblN0YXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGV4cGFuc2lvblN0YXRlcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4odmFsdWUpO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlc0NoYW5nZS5lbWl0KHRoaXMuX2V4cGFuc2lvblN0YXRlcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIGFsbCByb3dzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmV4cGFuZEFsbCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRBbGwoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2VzIGFsbCByb3dzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNvbGxhcHNlQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvbGxhcHNlQWxsKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmRzIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5leHBhbmRSb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZFJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGFwc2VzIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jb2xsYXBzZVJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VSb3cocm93SUQ6IGFueSkge1xuICAgICAgICB0aGlzLmdyaWRBUEkuc2V0X3Jvd19leHBhbnNpb25fc3RhdGUocm93SUQsIGZhbHNlKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnRvZ2dsZVJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5ncmlkQVBJLmdldF9yZWNfYnlfaWQocm93SUQpO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyZWMpO1xuICAgICAgICB0aGlzLmdyaWRBUEkuc2V0X3Jvd19leHBhbnNpb25fc3RhdGUocm93SUQsICFzdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREZWZhdWx0RXhwYW5kU3RhdGUoX3JlYzogYW55KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmF0aXZlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBuYXRpdmVFbCA9IHRoaXMuZ3JpZC5uYXRpdmVFbGVtZW50LlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmF0aXZlRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgb3V0bGV0IHVzZWQgdG8gYXR0YWNoIHRoZSBncmlkJ3Mgb3ZlcmxheXMgdG8uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrXG4gICAgICogSWYgc2V0LCByZXR1cm5zIHRoZSBvdXRsZXQgZGVmaW5lZCBvdXRzaWRlIHRoZSBncmlkLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgZ3JpZCdzIGludGVybmFsIG91dGxldCBkaXJlY3RpdmUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IG91dGxldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU91dGxldCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgb3V0bGV0KHZhbDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSkge1xuICAgICAgICB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlID0gdmFsO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgcm93SGVpZ2ggPSB0aGlzLmdyaWQuZGVmYXVsdFJvd0hlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQwO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDUwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRTdW1tYXJ5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb3N5OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMDtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzNjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgJ3MgbWluaW11bSBhbGxvd2VkIHdpZHRoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGludGVybmFsbHkgZm9yIHJlc3RyaWN0aW5nIGhlYWRlciBncm91cCBjb21wb25lbnQgd2lkdGguXG4gICAgICogVGhlIHZhbHVlcyBiZWxvdyBkZXBlbmQgb24gdGhlIGhlYWRlciBjZWxsIGRlZmF1bHQgcmlnaHQvbGVmdCBwYWRkaW5nIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb3N5OlxuICAgICAgICAgICAgICAgIHJldHVybiAzMjtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiA0ODtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBmb3IgdGhlIHBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRQaW5uZWRXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3Bpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bpbm5lZFdpZHRoID0gdGhpcy5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgY29udGFpbmVyIGZvciB0aGUgdW5waW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdW5waW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRVbnBpbm5lZFdpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRXaWR0aCgpIHtcbiAgICAgICAgaWYgKCFpc05hTih0aGlzLl91bnBpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5waW5uZWRXaWR0aCA9IHRoaXMuZ2V0VW5waW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNIb3Jpem9udGFsU2Nyb2xsSGlkZGVuKCkge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy51bnBpbm5lZFdpZHRoIC0gdGhpcy50b3RhbFdpZHRoO1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aCA9PT0gbnVsbCB8fCBkaWZmID49IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSBoZWFkZXIgY2VsbCBpbm5lciB3aWR0aCBmb3IgYXV0by1zaXppbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldEhlYWRlckNlbGxXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IElTaXplSW5mbyB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBjb25zdCBoZWFkZXJXaWR0aCA9IHRoaXMucGxhdGZvcm0uZ2V0Tm9kZVNpemVWaWFSYW5nZShyYW5nZSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlclN0eWxlID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBoZWFkZXJQYWRkaW5nID0gcGFyc2VGbG9hdChoZWFkZXJTdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGhlYWRlclN0eWxlLnBhZGRpbmdSaWdodCkgK1xuICAgICAgICAgICAgcGFyc2VGbG9hdChoZWFkZXJTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtcblxuICAgICAgICAvLyBUYWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGUgaGVhZGVyIGdyb3VwIGVsZW1lbnQsIHNpbmNlIGNvbHVtbiBwaW5uaW5nIGFwcGxpZXMgYm9yZGVycyB0byBpdCBpZiBpdHMgbm90IGEgY29sdW1uR3JvdXAuXG4gICAgICAgIGNvbnN0IGhlYWRlckdyb3VwU3R5bGUgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgY29uc3QgYm9yZGVyU2l6ZSA9IHBhcnNlRmxvYXQoaGVhZGVyR3JvdXBTdHlsZS5ib3JkZXJSaWdodFdpZHRoKSArIHBhcnNlRmxvYXQoaGVhZGVyR3JvdXBTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpO1xuICAgICAgICByZXR1cm4geyB3aWR0aDogTWF0aC5jZWlsKGhlYWRlcldpZHRoKSwgcGFkZGluZzogTWF0aC5jZWlsKGhlYWRlclBhZGRpbmcgKyBib3JkZXJTaXplKSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgY29tYmluZWQgd2lkdGggb2YgdGhlIGNvbHVtbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGVuYWJsZWQgZ3JpZCBmZWF0dXJlcy4gVGhleSBhcmUgZml4ZWQuXG4gICAgICovXG4gICAgcHVibGljIGZlYXR1cmVDb2x1bW5zV2lkdGgoZXhwYW5kZXI/OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4odGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHBsYXRmb3JtVXRpbC5pc0Jyb3dzZXIgY2hlY2tcbiAgICAgICAgICAgIGNvbnN0IHJvd1NlbGVjdEFyZWEgPSB0aGlzLmhlYWRlclNlbGVjdG9yQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyU2VsZWN0b3JDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCByb3dEcmFnQXJlYSA9IHRoaXMucm93RHJhZ2dhYmxlICYmIHRoaXMuaGVhZGVyRHJhZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckRyYWdDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCBncm91cGFibGVBcmVhID0gdGhpcy5oZWFkZXJHcm91cENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckdyb3VwQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZXJXaWR0aCA9IGV4cGFuZGVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPyBleHBhbmRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGggPSByb3dTZWxlY3RBcmVhICsgcm93RHJhZ0FyZWEgKyBncm91cGFibGVBcmVhICsgZXhwYW5kZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyaWVzTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBjb2x1bXMgPSB0aGlzLmdyaWQuY29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwaW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWRWaXNpYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZSA9IHRoaXMuX3Bpbm5lZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRWaXNpYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHBpbm5lZCBgSWd4Um93Q29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRSb3cgPSB0aGlzLmdyaWQucGlubmVkUm93cztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJvd3MoKTogSWd4R3JpZFJvd0NvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJvd0xpc3QudG9BcnJheSgpLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHVucGlubmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHVucGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC51bnBpbm5lZENvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bnBpbm5lZENvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBpZiAodGhpcy5fdW5waW5uZWRWaXNpYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkVmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnBpbm5lZFZpc2libGUgPSB0aGlzLl91bnBpbm5lZENvbHVtbnMuZmlsdGVyKChjb2wpID0+ICFjb2wuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VucGlubmVkVmlzaWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgd2lkdGhgIHRvIGJlIHNldCBvbiBgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50YC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGVhZGVyR3JvdXBXaWR0aChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NvbHVtbkxheW91dHNcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogYCR7TWF0aC5tYXgocGFyc2VGbG9hdChjb2x1bW4uY2FsY1dpZHRoKSwgdGhpcy5kZWZhdWx0SGVhZGVyR3JvdXBNaW5XaWR0aCl9cHhgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGJ5IGZpZWxkIG5hbWUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUNvbCA9IHRoaXMuZ3JpZDEuZ2V0Q29sdW1uQnlOYW1lKFwiSURcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sdW1uQnlOYW1lKG5hbWU6IHN0cmluZyk6IElneENvbHVtbkNvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLmZpZWxkID09PSBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29sdW1uQnlWaXNpYmxlSW5kZXgoaW5kZXg6IG51bWJlcik6IElneENvbHVtbkNvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVDb2x1bW5zLmZpbmQoKGNvbCkgPT5cbiAgICAgICAgICAgICFjb2wuY29sdW1uR3JvdXAgJiYgIWNvbC5jb2x1bW5MYXlvdXQgJiZcbiAgICAgICAgICAgIGNvbC52aXNpYmxlSW5kZXggPT09IGluZGV4XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhdGVzIGFsbCB3aWR0aHMgb2YgY29sdW1ucyB0aGF0IGhhdmUgc2l6ZSBzZXQgdG8gYGF1dG9gLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5yZWNhbGN1bGF0ZUF1dG9TaXplcygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZWNhbGN1bGF0ZUF1dG9TaXplcygpIHtcbiAgICAgICAgLy8gcmVzZXQgYXV0by1zaXplIGFuZCBjYWxjdWxhdGUgaXQgYWdhaW4uXG4gICAgICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCh4ID0+IHguYXV0b1NpemUgPSB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZpc2libGUgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdyaWQudmlzaWJsZUNvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXNpYmxlQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92aXNpYmxlQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGVDb2x1bW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgXG4gICAgICpcbiAgICAgKiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRvdGFsUGFnZXMgPSB0aGlzLmdyaWQudG90YWxQYWdlcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy50b3RhbFBhZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgXG4gICAgICpcbiAgICAgKiBHZXRzIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGZpcnN0IHBhZ2UuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpcnN0UGFnZSA9IHRoaXMuZ3JpZC5pc0ZpcnN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3IuaXNMYXN0UGFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBgbmV4dFBhZ2UoKWAgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogR29lcyB0byB0aGUgbmV4dCBwYWdlLCBpZiB0aGUgZ3JpZCBpcyBub3QgYWxyZWFkeSBhdCB0aGUgbGFzdCBwYWdlLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLm5leHRQYWdlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBwdWJsaWMgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnaW5hdG9yPy5uZXh0UGFnZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGBuZXh0UGFnZSgpYCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBHb2VzIHRvIHRoZSBwcmV2aW91cyBwYWdlLCBpZiB0aGUgZ3JpZCBpcyBub3QgYWxyZWFkeSBhdCB0aGUgZmlyc3QgcGFnZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmdcbiAgICBwdWJsaWMgcHJldmlvdXNQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2luYXRvcj8ucHJldmlvdXNQYWdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE9ubHkgZnVuY3Rpb25zIHdoZW4gcGFnaW5nIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG90YWxSZWNvcmRzID0gdGhpcy5ncmlkLnRvdGFsUmVjb3JkcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdG90YWxSZWNvcmRzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3RhbFJlY29yZHMgPj0gMCA/IHRoaXMuX3RvdGFsUmVjb3JkcyA6IHRoaXMucGFnaW5nU3RhdGU/Lm1ldGFkYXRhLmNvdW50UmVjb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvdGFsUmVjb3Jkcyh0b3RhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0b3RhbCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci50b3RhbFJlY29yZHMgPSB0b3RhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHRvdGFsO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEyLjEuMC4gVXNlIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYFxuICAgICAqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IHBhZ2UuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxhc3RQYWdlID0gdGhpcy5ncmlkLmlzTGFzdFBhZ2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3IuaXNMYXN0UGFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JpZFdpZHRoID0gdGhpcy5ncmlkLnRvdGFsV2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbFdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5fdG90YWxXaWR0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90b3RhbFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRha2Ugb25seSB0b3AgbGV2ZWwgY29sdW1uc1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5sZXZlbCA9PT0gMCAmJiAhY29sLnBpbm5lZCk7XG4gICAgICAgIGxldCB0b3RhbFdpZHRoID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGk7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHBhcnNlSW50KGNvbHNbaV0uY2FsY1dpZHRoLCAxMCkgfHwgMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90b3RhbFdpZHRoID0gdG90YWxXaWR0aDtcbiAgICAgICAgcmV0dXJuIHRvdGFsV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd1Jvd1NlbGVjdG9ycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNSb3dTZWxlY3RhYmxlICYmIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnMgJiYgIXRoaXMuaGlkZVJvd1NlbGVjdG9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93QWRkQnV0dG9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0YWJsZSAmJiB0aGlzLmRhdGFWaWV3Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9jb2x1bW5zLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd0RyYWdJY29ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RHJhZ2dhYmxlICYmIHRoaXMuX2NvbHVtbnMubGVuZ3RoID4gdGhpcy5oaWRkZW5Db2x1bW5zQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ2V0RGF0YVZpZXdJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gaW5kZXg7XG4gICAgICAgIGlmICgoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGF0YVZpZXcubGVuZ3RoKSAmJiB0aGlzLnBhZ2luZ01vZGUgPT09IDEgJiYgdGhpcy5wYWdpbmF0b3IucGFnZSAhPT0gMCkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIHRoaXMucGFnaW5hdG9yLnBlclBhZ2UgKiB0aGlzLnBhZ2luYXRvci5wYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlzUmVtb3RlKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4IC0gdGhpcy5ncmlkQVBJLmdyaWQudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldERhdGFJbmRleChkYXRhVmlld0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgbmV3SW5kZXggPSBkYXRhVmlld0luZGV4O1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuaXNSZW1vdGUpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gZGF0YVZpZXdJbmRleCArIHRoaXMuZ3JpZEFQSS5ncmlkLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgY29sdW1uIGJlZm9yZSBvciBhZnRlciB0aGUgc3BlY2lmaWVkIHRhcmdldCBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLm1vdmVDb2x1bW4oY29sdW1uLCB0YXJnZXQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlQ29sdW1uKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50LCB0YXJnZXQ6IElneENvbHVtbkNvbXBvbmVudCwgcG9zOiBEcm9wUG9zaXRpb24gPSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSB7XG4gICAgICAgIC8vIE0uQS4gTWF5IDExdGgsIDIwMjEgIzk1MDggTWFrZSB0aGUgZXZlbnQgY2FuY2VsYWJsZVxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3MgPSB7IHNvdXJjZTogY29sdW1uLCB0YXJnZXQsIGNhbmNlbDogZmFsc2UgfTtcblxuICAgICAgICB0aGlzLmNvbHVtbk1vdmluZ0VuZC5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4gPT09IHRhcmdldCB8fCAoY29sdW1uLmxldmVsICE9PSB0YXJnZXQubGV2ZWwpIHx8XG4gICAgICAgICAgICAoY29sdW1uLnRvcExldmVsUGFyZW50ICE9PSB0YXJnZXQudG9wTGV2ZWxQYXJlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uLmxldmVsKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3ZlQ2hpbGRDb2x1bW5zKGNvbHVtbi5wYXJlbnQsIGNvbHVtbiwgdGFyZ2V0LCBwb3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGV0IGNvbHVtblBpblN0YXRlQ2hhbmdlZDtcbiAgICAgICAgLy8gcGlubmluZyBhbmQgdW5waW5uaW5nIHdpbGwgd29yayBjb3JyZWN0bHkgZXZlbiB3aXRob3V0IHBhc3NpbmcgaW5kZXhcbiAgICAgICAgLy8gYnV0IGlzIGVhc2llciB0byBjYWxjbHVsYXRlIHRoZSBpbmRleCBoZXJlLCBhbmQgbGF0ZXIgdXNlIGl0IGluIHRoZSBwaW5uaW5nIGV2ZW50IGFyZ3NcbiAgICAgICAgaWYgKHRhcmdldC5waW5uZWQgJiYgIWNvbHVtbi5waW5uZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpbm5lZEluZGV4ID0gdGhpcy5fcGlubmVkQ29sdW1ucy5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBvcyA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCA/IHBpbm5lZEluZGV4ICsgMSA6IHBpbm5lZEluZGV4O1xuICAgICAgICAgICAgY29sdW1uLnBpbihpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5waW5uZWQgJiYgY29sdW1uLnBpbm5lZCkge1xuICAgICAgICAgICAgY29uc3QgdW5waW5uZWRJbmRleCA9IHRoaXMuX3VucGlubmVkQ29sdW1ucy5pbmRleE9mKHRhcmdldCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHBvcyA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCA/IHVucGlubmVkSW5kZXggKyAxIDogdW5waW5uZWRJbmRleDtcbiAgICAgICAgICAgIGNvbHVtbi51bnBpbihpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAodGFyZ2V0LnBpbm5lZCAmJiBjb2x1bW4ucGlubmVkICYmICFjb2x1bW5QaW5TdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MsIHRoaXMuX3Bpbm5lZENvbHVtbnMpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKCF0YXJnZXQucGlubmVkICYmICFjb2x1bW4ucGlubmVkICYmICFjb2x1bW5QaW5TdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MsIHRoaXMuX3VucGlubmVkQ29sdW1ucyk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLl9tb3ZlQ29sdW1ucyhjb2x1bW4sIHRhcmdldCwgcG9zKTtcbiAgICAgICAgdGhpcy5fY29sdW1uc1Jlb3JkZXJlZChjb2x1bW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGBwYWdpbmF0ZSgpYCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBHb2VzIHRvIHRoZSBkZXNpcmVkIHBhZ2UgaW5kZXguXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIG9sZFxuICAgICAqIHRoaXMuZ3JpZDEucGFnaW5hdGUoMSk7XG4gICAgICogLy8gbmV3XG4gICAgICogdGhpcy5wYWdpbmF0b3IxLnBhZ2luYXRlKDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5hdGUodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0b3I/LnBhZ2luYXRlKHZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbiBmb3IgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YC5cbiAgICAgKiBDYWxsaW5nIG1hcmtGb3JDaGVjayBhbHNvIHRyaWdnZXJzIHRoZSBncmlkIHBpcGVzIGV4cGxpY2l0bHksIHJlc3VsdGluZyBpbiBhbGwgdXBkYXRlcyBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogTWF5IGRlZ3JhZGUgcGVyZm9ybWFuY2UgaWYgdXNlZCB3aGVuIG5vdCBuZWVkZWQsIG9yIGlmIG1pc3VzZWQ6XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIERPTidUczpcbiAgICAgKiAvLyBkb24ndCBjYWxsIG1hcmtGb3JDaGVjayBmcm9tIGluc2lkZSBhIGxvb3BcbiAgICAgKiAvLyBkb24ndCBjYWxsIG1hcmtGb3JDaGVjayB3aGVuIGEgcHJpbWl0aXZlIGhhcyBjaGFuZ2VkXG4gICAgICogZ3JpZC5kYXRhLmZvckVhY2gocmVjID0+IHtcbiAgICAgKiAgcmVjID0gbmV3VmFsdWU7XG4gICAgICogIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBET3NcbiAgICAgKiAvLyBjYWxsIG1hcmtGb3JDaGVjayBhZnRlciB1cGRhdGluZyBhIG5lc3RlZCBwcm9wZXJ0eVxuICAgICAqIGdyaWQuZGF0YS5mb3JFYWNoKHJlYyA9PiB7XG4gICAgICogIHJlYy5uZXN0ZWRQcm9wMS5uZXN0ZWRQcm9wMiA9IG5ld1ZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLm1hcmtGb3JDaGVjaygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXJrRm9yQ2hlY2soKSB7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCBhZGRzIHRoZSBkYXRhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEuYWRkUm93KHJlY29yZCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUm93KGRhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBjb21taXQgcGVuZGluZyBzdGF0ZXMgcHJpb3IgdG8gYWRkaW5nIGEgcm93XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdCh0cnVlKTtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmFkZFJvd1RvRGF0YShkYXRhKTtcblxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMucm93QWRkZWROb3RpZmllci5uZXh0KHsgZGF0YTogZGF0YSwgb3duZXI6IHRoaXMsIHByaW1hcnlLZXk6IGRhdGFbdGhpcy5wcmltYXJ5S2V5XSB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHJlY29yZCBieSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhhdCB0aGUgYHByaW1hcnlLZXlgIHByb3BlcnR5IGlzIHNldC5cbiAgICAgKiBUaGUgbWV0aG9kIGFjY2VwdCByb3dTZWxlY3RvciBhcyBhIHBhcmFtZXRlciwgd2hpY2ggaXMgdGhlIHJvd0lELlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEuZGVsZXRlUm93KDApO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVSb3cocm93U2VsZWN0b3I6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLnByaW1hcnlLZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByaW1hcnlLZXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVJvd0J5SWQocm93U2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZGVsZXRlUm93QnlJZChyb3dJZDogYW55KTogYW55IHtcbiAgICAgICAgY29uc3QgYXJncyA9IHtcbiAgICAgICAgICAgIHJvd0lEOiByb3dJZCxcbiAgICAgICAgICAgIHByaW1hcnlLZXk6IHJvd0lkLFxuICAgICAgICAgICAgY2FuY2VsOiBmYWxzZSxcbiAgICAgICAgICAgIHJvd0RhdGE6IHRoaXMuZ2V0Um93RGF0YShyb3dJZCksXG4gICAgICAgICAgICBvbGRWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm93RGVsZXRlLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5ncmlkQVBJLmRlbGV0ZVJvd0J5SWQocm93SWQpO1xuICAgICAgICBpZiAocmVjb3JkICE9PSBudWxsICYmIHJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCByb3dEZWxldGVkRXZlbnRBcmdzOiBJUm93RGF0YUV2ZW50QXJncyA9IHsgZGF0YTogcmVjb3JkLCBvd25lcjogdGhpcywgcHJpbWFyeUtleTogcmVjb3JkW3RoaXMucHJpbWFyeUtleV0gfTtcbiAgICAgICAgICAgIHRoaXMucm93RGVsZXRlZC5lbWl0KHJvd0RlbGV0ZWRFdmVudEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIHJlY29yZCBieSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmVxdWlyZXMgdGhhdCB0aGUgYHByaW1hcnlLZXlgIHByb3BlcnR5IGlzIHNldC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWRXaXRoUEsudXBkYXRlQ2VsbCgnVXBkYXRlZCcsIDEsICdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIHdoaWNoIGlzIHRvIGJlIHNldC5cbiAgICAgKiBAcGFyYW0gcm93U2VsZWN0b3IgY29ycmVzcG9uZHMgdG8gcm93SUQuXG4gICAgICogQHBhcmFtIGNvbHVtbiBjb3JyZXNwb25kcyB0byBjb2x1bW4gZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUNlbGwodmFsdWU6IGFueSwgcm93U2VsZWN0b3I6IGFueSwgY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZWZpbmVkKHRoaXMucHJpbWFyeUtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuX2NvbHVtbnMuZmluZChjID0+IGMuZmllbGQgPT09IGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgLy8gU2ltcGxpZnlcbiAgICAgICAgICAgICAgICBjb25zdCByb3dEYXRhID0gdGhpcy5ncmlkQVBJLmdldFJvd0RhdGEocm93U2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaW5kZXhfaW5fZGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgLy8gSWYgcm93IHBhc3NlZCBpcyBpbnZhbGlkXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0lEOiByb3dTZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uSUQ6IGNvbC5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBuZXcgSWd4Q2VsbChpZCwgaW5kZXgsIGNvbCwgcm93RGF0YVtjb2wuZmllbGRdLCB2YWx1ZSwgcm93RGF0YSwgdGhpcyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy52YWxpZGF0aW9uLmdldEZvcm1Db250cm9sKGNlbGwuaWQucm93SUQsIGNlbGwuY29sdW1uLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnVwZGF0ZV9jZWxsKGNlbGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGBJZ3hHcmlkUm93Q29tcG9uZW50YFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgcm93IGlzIHNwZWNpZmllZCBieVxuICAgICAqIHJvd1NlbGVjdG9yIHBhcmFtZXRlciBhbmQgdGhlIGRhdGEgc291cmNlIHJlY29yZCB3aXRoIHRoZSBwYXNzZWQgdmFsdWUuXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBhcHBseSByZXF1ZXN0ZWQgdXBkYXRlIG9ubHkgaWYgcHJpbWFyeSBrZXkgaXMgc3BlY2lmaWVkIGluIHRoZSBncmlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQudXBkYXRlUm93KHtcbiAgICAgKiAgICAgICBQcm9kdWN0SUQ6IDEsIFByb2R1Y3ROYW1lOiAnU3BlYXJtaW50JywgSW5TdG9jazogdHJ1ZSwgVW5pdHNJblN0b2NrOiAxLCBPcmRlckRhdGU6IG5ldyBEYXRlKCcyMDA1LTAzLTIxJylcbiAgICAgKiAgIH0sIDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZeKAk1xuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kIHRvIHJvd0lEXG4gICAgICovXG4gICAgLy8gVE9ETzogcHJldmVudCBldmVudCBpbnZvY2F0aW9uXG4gICAgcHVibGljIHVwZGF0ZVJvdyh2YWx1ZTogYW55LCByb3dTZWxlY3RvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVmaW5lZCh0aGlzLnByaW1hcnlLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZUNlbGwgPSB0aGlzLmNydWRTZXJ2aWNlLmNlbGw7XG4gICAgICAgICAgICBpZiAoZWRpdGFibGVDZWxsICYmIGVkaXRhYmxlQ2VsbC5pZC5yb3dJRCA9PT0gcm93U2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZENlbGxFZGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3cgPSBuZXcgSWd4RWRpdFJvdyhyb3dTZWxlY3RvciwgLTEsIHRoaXMuZ3JpZEFQSS5nZXRSb3dEYXRhKHJvd1NlbGVjdG9yKSwgdGhpcyBhcyBhbnkpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnVwZGF0ZV9yb3cocm93LCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IGZpeCBmb3IgIzU5MzQgYW5kIHByb2JhYmx5IGJyZWFrIGZvciAjNTc2M1xuICAgICAgICAgICAgLy8gY29uc2lkZXIgYWRkaW5nIG9mIHRoaXJkIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIGluIHVwZGF0ZVJvdy5cbiAgICAgICAgICAgIC8vIElmIGRldmVsb3BlciBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKHRydWUpLCBhbmRcbiAgICAgICAgICAgIC8vIHZpc2UtdmVyc2EgaWYgZGV2ZWxvcGVyIHNldCBpdCB0byBmYWxzZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKGZhbHNlKS5cbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgc2hvdWxkIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcm93IGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIHByaW1hcnkga2V5IGlzIG5vdCBzcGVjaWZpZWQgdGhlIHJvdyBzZWxlY3RvciBtYXRjaCB0aGUgcm93IGRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZGF0YSA9IGdyaWQuZ2V0Um93RGF0YSg5NDc0MSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93RGF0YShyb3dTZWxlY3RvcjogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gcm93U2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfaW5kZXhfaW5fZGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgIHJldHVybiBpbmRleCA8IDAgPyB7fSA6IGRhdGFbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvcnQgYSBzaW5nbGUgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNvcnQgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCdzIGBJZ3hDb2x1bW5Db21wb25lbnRgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcnJheSBvZiBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zb3J0KHsgZmllbGROYW1lOiBuYW1lLCBkaXI6IFNvcnRpbmdEaXJlY3Rpb24uQXNjLCBpZ25vcmVDYXNlOiBmYWxzZSB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc29ydChleHByZXNzaW9uOiBJU29ydGluZ0V4cHJlc3Npb24gfCBBcnJheTxJU29ydGluZ0V4cHJlc3Npb24+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNvcnRpbmdTdGF0ZSA9IGNsb25lQXJyYXkodGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMpO1xuXG4gICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWFjaCBvZiBleHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnByZXBhcmVfc29ydGluZ19leHByZXNzaW9uKFtzb3J0aW5nU3RhdGVdLCBlYWNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb3J0aW5nT3B0aW9ucy5tb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGNvbC5maWVsZCA9PT0gZXhwcmVzc2lvbi5maWVsZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU29ydChjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkucHJlcGFyZV9zb3J0aW5nX2V4cHJlc3Npb24oW3NvcnRpbmdTdGF0ZV0sIGV4cHJlc3Npb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJU29ydGluZ0V2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIHNvcnRpbmdFeHByZXNzaW9uczogc29ydGluZ1N0YXRlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuc29ydGluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5zb3J0X211bHRpcGxlKGV4cHJlc3Npb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnQoZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuc29ydGluZ0RvbmUuZW1pdChleHByZXNzaW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBhIHNpbmdsZSBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBmaWx0ZXIodGVybSkge1xuICAgICAqICAgICAgdGhpcy5ncmlkLmZpbHRlcihcIlByb2R1Y3ROYW1lXCIsIHRlcm0sIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oXCJjb250YWluc1wiKSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWVcbiAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXIobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBjb25kaXRpb25PckV4cHJlc3Npb25UcmVlPzogSUZpbHRlcmluZ09wZXJhdGlvbiB8IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGlnbm9yZUNhc2U/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXIobmFtZSwgdmFsdWUsIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWUsIGlnbm9yZUNhc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgYWxsIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBpbiB0aGUgYElneEdyaWRDb21wb25lbnRgIHdpdGggdGhlIHNhbWUgY29uZGl0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5maWx0ZXJHbG9iYWwoJ3NvbWUnLCBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuY29uZGl0aW9uKCdjb250YWlucycpKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uXG4gICAgICogQHBhcmFtIGlnbm9yZUNhc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyR2xvYmFsKHZhbHVlOiBhbnksIGNvbmRpdGlvbiwgaWdub3JlQ2FzZT8pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlckdsb2JhbCh2YWx1ZSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHN1bW1hcmllcyBmb3IgdGhlIHNwZWNpZmllZCBjb2x1bW4gYW5kIGFwcGxpZXMgeW91ciBjdXN0b21TdW1tYXJ5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiB5b3UgZG8gbm90IHByb3ZpZGUgdGhlIGN1c3RvbVN1bW1hcnksIHRoZW4gdGhlIGRlZmF1bHQgc3VtbWFyeSBmb3IgdGhlIGNvbHVtbiBkYXRhIHR5cGUgd2lsbCBiZSBhcHBsaWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZW5hYmxlU3VtbWFyaWVzKFt7IGZpZWxkTmFtZTogJ1Byb2R1Y3ROYW1lJyB9LCB7IGZpZWxkTmFtZTogJ0lEJyB9XSk7XG4gICAgICogYGBgXG4gICAgICogRW5hYmxlIHN1bW1hcmllcyBmb3IgdGhlIGxpc3RlZCBjb2x1bW5zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZW5hYmxlU3VtbWFyaWVzKCdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByZXN0XG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZVN1bW1hcmllcyguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHJlc3RbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLl9tdWx0aXBsZVN1bW1hcmllcyhyZXN0WzBdLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhyZXN0WzBdLCB0cnVlLCByZXN0WzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgc3VtbWFyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQuZGlzYWJsZVN1bW1hcmllcygnUHJvZHVjdE5hbWUnKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERpc2FibGUgc3VtbWFyaWVzIGZvciB0aGUgbGlzdGVkIGNvbHVtbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5kaXNhYmxlU3VtbWFyaWVzKFt7IGZpZWxkTmFtZTogJ1Byb2R1Y3ROYW1lJyB9XSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVTdW1tYXJpZXMoLi4ucmVzdCkge1xuICAgICAgICBpZiAocmVzdC5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShyZXN0WzBdKSkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZU11bHRpcGxlU3VtbWFyaWVzKHJlc3RbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKHJlc3RbMF0sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIG5hbWUgaXMgcHJvdmlkZWQsIGNsZWFycyB0aGUgZmlsdGVyaW5nIHN0YXRlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPdGhlcndpc2UgY2xlYXJzIHRoZSBmaWx0ZXJpbmcgc3RhdGUgb2YgYWxsIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY2xlYXJGaWx0ZXIoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcihuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5jbGVhckZpbHRlcihuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhcnMgdGhlIHNvcnRpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIG90aGVyd2lzZSBjbGVhcnMgdGhlIHNvcnRpbmcgc3RhdGUgb2YgYWxsIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhclNvcnQoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNvcnQobmFtZT86IHN0cmluZykge1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydGluZ0V4cHJlc3Npb25zID0gW107XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmdyaWRBUEkuZ2V0X2NvbHVtbl9ieV9uYW1lKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX3NvcnQobmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaEdyaWRTdGF0ZShfYXJncz8pIHtcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5UGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFdlIGhhdmUgcmV0dXJuIHZhbHVlcyBoZXJlLiBNb3ZlIHRoZW0gdG8gZXZlbnQgYXJncyA/P1xuXG4gICAgLyoqXG4gICAgICogUGlucyBhIGNvbHVtbiBieSBmaWVsZCBuYW1lLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Db2x1bW4oXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Db2x1bW4oY29sdW1uTmFtZTogc3RyaW5nIHwgSWd4Q29sdW1uQ29tcG9uZW50LCBpbmRleD8pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29sID0gY29sdW1uTmFtZSBpbnN0YW5jZW9mIElneENvbHVtbkNvbXBvbmVudCA/IGNvbHVtbk5hbWUgOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICAgICAgcmV0dXJuIGNvbC5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucGlucyBhIGNvbHVtbiBieSBmaWVsZCBuYW1lLiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpbkNvbHVtbihcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIHVucGluQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgaW5kZXg/KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wudW5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpbiB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucGluUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSByb3cgaW4gdGhlIHBpbm5lZCBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Sb3cocm93SUQ6IGFueSwgaW5kZXg/OiBudW1iZXIsIHJvdz86IFJvd1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKHJvd0lEKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB0aGlzLmdyaWRBUEkuZ2V0X3Bpbl9yb3dfZXZlbnRfYXJncyhyb3dJRCwgaW5kZXgsIHJvdywgdHJ1ZSk7XG4gICAgICAgIHRoaXMucm93UGlubmluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gdHlwZW9mIGV2ZW50QXJncy5pbnNlcnRBdEluZGV4ID09PSAnbnVtYmVyJyA/IGV2ZW50QXJncy5pbnNlcnRBdEluZGV4IDogdGhpcy5fcGlubmVkUmVjb3JkSURzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fcGlubmVkUmVjb3JkSURzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgcm93SUQpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5yb3dQaW5uZWQuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5waW4gdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnVucGluUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpblJvdyhyb3dJRDogYW55LCByb3c/OiBSb3dUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB0aGlzLmdyaWRBUEkuZ2V0X3Bpbl9yb3dfZXZlbnRfYXJncyhyb3dJRCwgbnVsbCwgcm93LCBmYWxzZSk7XG4gICAgICAgIHRoaXMucm93UGlubmluZy5lbWl0KGV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5yb3dQaW5uZWQuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMucGluQ29udGFpbmVyID8gdGhpcy5waW5Db250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgOiAwO1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNQaW5uZWRSZWNvcmRzID8gY29udGFpbmVySGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvdGFsSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxjSGVpZ2h0ID8gdGhpcy5jYWxjSGVpZ2h0ICsgdGhpcy5waW5uZWRSb3dIZWlnaHQgOiB0aGlzLmNhbGNIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhdGVzIGdyaWQgd2lkdGgvaGVpZ2h0IGRpbWVuc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNob3VsZCBiZSBydW4gd2hlbiBjaGFuZ2luZyBET00gZWxlbWVudHMgZGltZW50aW9ucyBtYW51YWxseSB0aGF0IGFmZmVjdCB0aGUgZ3JpZCdzIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnJlZmxvdygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZsb3coKSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFNpemVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyBpbiB0aGUgZ3JpZCBhbmQgc2Nyb2xscyB0byB0aGUgY2VsbCBpZiBpdCBpc24ndCB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmZpbmROZXh0KFwiZmluYW5jaWFsXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIG9wdGlvbmFsbHksIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICogQHBhcmFtIGV4YWN0TWF0Y2ggb3B0aW9uYWxseSwgaWYgdGhlIHRleHQgc2hvdWxkIG1hdGNoIHRoZSBlbnRpcmUgdmFsdWUgIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICovXG4gICAgcHVibGljIGZpbmROZXh0KHRleHQ6IHN0cmluZywgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIGV4YWN0TWF0Y2g/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0ZXh0LCAxLCBjYXNlU2Vuc2l0aXZlLCBleGFjdE1hdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgcHJldmlvdXMgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyBpbiB0aGUgZ3JpZCBhbmQgc2Nyb2xscyB0byB0aGUgY2VsbCBpZiBpdCBpc24ndCB2aXNpYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmZpbmRQcmV2KFwiZmluYW5jaWFsXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIG9wdGlvbmFsbHksIGlmIHRoZSBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAgICogQHBhcmFtIGV4YWN0TWF0Y2ggb3B0aW9uYWxseSwgaWYgdGhlIHRleHQgc2hvdWxkIG1hdGNoIHRoZSBlbnRpcmUgdmFsdWUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZFByZXYodGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRleHQsIC0xLCBjYXNlU2Vuc2l0aXZlLCBleGFjdE1hdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFwcGxpZXMgdGhlIGV4aXN0aW5nIHNlYXJjaC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBob3cgbWFueSB0aW1lcyB0aGUgZ3JpZCBjb250YWlucyB0aGUgbGFzdCBzZWFyY2guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnJlZnJlc2hTZWFyY2goKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdXBkYXRlQWN0aXZlSW5mb1xuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoU2VhcmNoKHVwZGF0ZUFjdGl2ZUluZm8/OiBib29sZWFuLCBlbmRFZGl0ID0gdHJ1ZSk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZE1hdGNoQ2FjaGUoKTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZUFjdGl2ZUluZm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbmZvID0gSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUuZm9yRWFjaCgobWF0Y2gsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmNvbHVtbiA9PT0gYWN0aXZlSW5mby5jb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLnJvdyA9PT0gYWN0aXZlSW5mby5yb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLmluZGV4ID09PSBhY3RpdmVJbmZvLmluZGV4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlTWFwcyhtYXRjaC5tZXRhZGF0YSwgYWN0aXZlSW5mby5tZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZCh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmNhc2VTZW5zaXRpdmUsXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoLFxuICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGVuZEVkaXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCB0aGUgaGlnaGxpZ2h0cyBpbiB0aGUgY2VsbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhclNlYXJjaCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclNlYXJjaCgpIHtcbiAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgICAgICBtYXRjaEluZm9DYWNoZTogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGM6IElneEdyaWRDZWxsQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBzb3J0YWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc29ydGFibGVHcmlkID0gdGhpcy5ncmlkLmhhc1NvcnRhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1NvcnRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wuc29ydGFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgZWRpdGFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGVkaXRhYmxlR3JpZCA9IHRoaXMuZ3JpZC5oYXNFZGl0YWJsZUNvbHVtbnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNFZGl0YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLmVkaXRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIGZpbHRlcmFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpbHRlcmFibGVHcmlkID0gdGhpcy5ncmlkLmhhc0ZpbHRlcmFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRmlsdGVyYWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLmZpbHRlcmFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgc3VtbWFyaXplZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3VtbWFyaXplZEdyaWQgPSB0aGlzLmdyaWQuaGFzU3VtbWFyaXplZENvbHVtbnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNTdW1tYXJpemVkQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc3VtbWFyaXplZENvbHVtbnMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmhhc1N1bW1hcnkgJiYgIWNvbC5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gc3VtbWFyaXplZENvbHVtbnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm9vdFN1bW1hcmllc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1bW1hcnlDYWxjdWxhdGlvbk1vZGUgIT09IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLmNoaWxkTGV2ZWxzT25seTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzVmlzaWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucyA/IHRoaXMuX2NvbHVtbnMuc29tZShjID0+ICFjLmhpZGRlbikgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoYXNWaXNpYmxlQ29sdW1ucyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucyA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIG1vdmVhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFVzZSBgSWd4R3JpZENvbXBvbmVudC5tb3ZpbmdgIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBtb3ZhYmxlR3JpZCA9IHRoaXMuZ3JpZC5oYXNNb3ZhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01vdmFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3Zpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBjb2x1bW4gZ3JvdXBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JvdXBHcmlkID0gdGhpcy5ncmlkLmhhc0NvbHVtbkdyb3VwcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0NvbHVtbkdyb3VwcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbkdyb3VwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBjb2x1bW4gbGF5b3V0cyBmb3IgbXVsdGktcm93IGxheW91dCBkZWZpbml0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGF5b3V0R3JpZCA9IHRoaXMuZ3JpZC5oYXNDb2x1bW5MYXlvdXRzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uTGF5b3V0cygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBtdWx0aVJvd0xheW91dFJvd1NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdWx0aVJvd0xheW91dFJvd1NpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgcm93QmFzZWRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZW5ndGggKiB0aGlzLnJvd0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBpc1BlcmNlbnRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggJiYgdGhpcy53aWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1BlcmNlbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQgJiYgdGhpcy5faGVpZ2h0LmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLmRhdGFMZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogTWF0aC5taW4odGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcixcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yID8gTWF0aC5taW4oYWxsSXRlbXMsIHRoaXMucGFnaW5hdG9yLnBlclBhZ2UpIDogYWxsSXRlbXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVGhlIHJvd0hlaWdodCBpbnB1dCBpcyBib3VuZCB0byBtaW4taGVpZ2h0IGNzcyBwcm9wIG9mIHJvd3MgdGhhdCBhZGRzIGEgMXB4IGJvcmRlciBpbiBhbGwgY2FzZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlbmRlcmVkUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodCArIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG91dGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgPyB0aGlzLmNhbGNXaWR0aCArIHRoaXMuc2Nyb2xsU2l6ZSA6IHRoaXMuY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgdmlzaWJsZSBjb250ZW50IGhlaWdodCB0aGF0IGluY2x1ZGVzIGhlYWRlciArIHRib2R5ICsgZm9vdGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWaXNpYmxlQ29udGVudEhlaWdodCgpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgKyB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5oYXNTdW1tYXJpemVkQ29sdW1ucykge1xuICAgICAgICAgICAgaGVpZ2h0ICs9IHRoaXMudGZvb3QubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQb3NzaWJsZUNvbHVtbldpZHRoKGJhc2VXaWR0aDogbnVtYmVyID0gbnVsbCkge1xuICAgICAgICBsZXQgY29tcHV0ZWRXaWR0aDtcbiAgICAgICAgaWYgKGJhc2VXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IGJhc2VXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSB0aGlzLmNhbGNXaWR0aCB8fFxuICAgICAgICAgICAgICAgIHBhcnNlSW50KHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyksIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXB1dGVkV2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ29sdW1uIGxheW91dHMgcmVsYXRlZFxuICAgICAgICBsZXQgdmlzaWJsZUNvbHMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uQmxvY2tzID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29uc3QgY29sc1BlckJsb2NrID0gY29sdW1uQmxvY2tzLm1hcChibG9jayA9PiBibG9jay5nZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyhibG9jay5jaGlsZHJlbikpO1xuICAgICAgICBjb25zdCBjb21iaW5lZEJsb2Nrc1NpemUgPSBjb2xzUGVyQmxvY2sucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIGl0ZW0ubGVuZ3RoLCAwKTtcbiAgICAgICAgY29sc1BlckJsb2NrLmZvckVhY2goYmxvY2tDb2xzID0+IHZpc2libGVDb2xzID0gdmlzaWJsZUNvbHMuY29uY2F0KGJsb2NrQ29scykpO1xuICAgICAgICAvL1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNXaXRoU2V0V2lkdGhzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHZpc2libGVDb2xzLmZpbHRlcihjID0+IGMud2lkdGhTZXRCeVVzZXIpIDpcbiAgICAgICAgICAgIHZpc2libGVDaGlsZENvbHVtbnMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlcik7XG5cbiAgICAgICAgY29uc3QgY29sdW1uc1RvU2l6ZSA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICBjb21iaW5lZEJsb2Nrc1NpemUgLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGggOlxuICAgICAgICAgICAgdmlzaWJsZUNoaWxkQ29sdW1ucy5sZW5ndGggLSBjb2x1bW5zV2l0aFNldFdpZHRocy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHN1bUV4aXN0aW5nV2lkdGhzID0gY29sdW1uc1dpdGhTZXRXaWR0aHNcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xXaWR0aCA9IGN1cnIud2lkdGg7XG4gICAgICAgICAgICAgICAgbGV0IHdpZHRoVmFsdWUgPSBwYXJzZUludChjb2xXaWR0aCwgMTApO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTih3aWR0aFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlID0gTUlOSU1VTV9DT0xVTU5fV0lEVEg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJXaWR0aCA9IGNvbFdpZHRoICYmIHR5cGVvZiBjb2xXaWR0aCA9PT0gJ3N0cmluZycgJiYgY29sV2lkdGguaW5kZXhPZignJScpICE9PSAtMSA/XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVmFsdWUgLyAxMDAgKiBjb21wdXRlZFdpZHRoIDpcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnJXaWR0aDtcbiAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgIC8vIFdoZW4gYWxsIGNvbHVtbnMgYXJlIGhpZGRlbiwgcmV0dXJuIDBweCB3aWR0aFxuICAgICAgICBpZiAoIXN1bUV4aXN0aW5nV2lkdGhzICYmICFjb2x1bW5zVG9TaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gJzBweCc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IE1hdGguZmxvb3IoIU51bWJlci5pc0Zpbml0ZShzdW1FeGlzdGluZ1dpZHRocykgP1xuICAgICAgICAgICAgTWF0aC5tYXgoY29tcHV0ZWRXaWR0aCAvIGNvbHVtbnNUb1NpemUsIHRoaXMubWluQ29sdW1uV2lkdGgpIDpcbiAgICAgICAgICAgIE1hdGgubWF4KChjb21wdXRlZFdpZHRoIC0gc3VtRXhpc3RpbmdXaWR0aHMpIC8gY29sdW1uc1RvU2l6ZSwgdGhpcy5taW5Db2x1bW5XaWR0aCkpO1xuXG4gICAgICAgIHJldHVybiBjb2x1bW5XaWR0aCArICdweCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVmVydGljYWxTY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNTY3JvbGxhYmxlID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lciA/IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuaXNTY3JvbGxhYmxlKCkgOiBmYWxzZTtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuY2FsY1dpZHRoICYmIHRoaXMuZGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldy5sZW5ndGggPiAwICYmIGlzU2Nyb2xsYWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjYWxjdWxhdGVkIHdpZHRoIG9mIHRoZSBwaW5uZWQgYXJlYS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZFdpZHRoID0gdGhpcy5ncmlkLmdldFBpbm5lZFdpZHRoKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRha2VIaWRkZW4gSWYgd2Ugc2hvdWxkIHRha2UgaW50byBhY2NvdW50IHRoZSBoaWRkZW4gY29sdW1ucyBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICovXG4gICAgcHVibGljIGdldFBpbm5lZFdpZHRoKHRha2VIaWRkZW4gPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmYyA9IHRha2VIaWRkZW4gPyB0aGlzLl9waW5uZWRDb2x1bW5zIDogdGhpcy5waW5uZWRDb2x1bW5zO1xuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgZmMpIHtcbiAgICAgICAgICAgIGlmIChjb2wubGV2ZWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdW0gKz0gcGFyc2VJbnQoY29sLmNhbGNXaWR0aCwgMTApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzUGlubmluZ1RvU3RhcnQpIHtcbiAgICAgICAgICAgIHN1bSArPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDb2x1bW5Hcm91cGVkKF9maWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUT0RPOiBSRU1PVkVcbiAgICAgKi9cbiAgICBwdWJsaWMgb25IZWFkZXJTZWxlY3RvckNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyUm93U2VsZWN0aW9uKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RBbGxSb3dzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkU2VsZWN0b3JCYXNlQXJpYUxhYmVsKCkge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSA/ICdEZXNlbGVjdCBhbGwgZmlsdGVyZWQnIDogJ1NlbGVjdCBhbGwgZmlsdGVyZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpID8gJ0Rlc2VsZWN0IGFsbCcgOiAnU2VsZWN0IGFsbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxSb3dzQ291bnRBZnRlckZpbHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hbGxEYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCBwaW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgcGlubmVkRGF0YVZpZXcgPSB0aGlzLmdyaWQucGlubmVkRGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWREYXRhVmlldygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5lZFJlY29yZHMgPyB0aGlzLnBpbm5lZFJlY29yZHMgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZCB1bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBwaW5uZWREYXRhVmlldyA9IHRoaXMuZ3JpZC5waW5uZWREYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMgPyB0aGlzLnVucGlubmVkUmVjb3JkcyA6IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXI/LmlneEZvck9mIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZC9waW5uZWQvdW5waW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgZGF0YVZpZXcgPSB0aGlzLmdyaWQuZGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIGNsaWNraW5nIG92ZXIgYSByb3cgc2hvdWxkIHNlbGVjdC9kZXNlbGVjdCBpdFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byB0cnVlXG4gICAgICogQHBhcmFtIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2VsZWN0Um93T25DbGljaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdFJvd09uQ2xpY2s7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3RSb3dPbkNsaWNrKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Um93T25DbGljayA9IGVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCByb3dzIGJ5IElELlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdFJvd3MoWzEsMiw1XSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEc1xuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdFJvd3Mocm93SURzOiBhbnlbXSwgY2xlYXJDdXJyZW50U2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcywgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc3BlY2lmaWVkIHJvd3MgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RSb3dzKFsxLDIsNV0pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgYWxsIHJvd3NcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpZiBmaWx0ZXJpbmcgaXMgaW4gcGxhY2UsIHNlbGVjdEFsbFJvd3MoKSBhbmQgZGVzZWxlY3RBbGxSb3dzKCkgc2VsZWN0L2Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCByb3dzLlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHBhcmFtZXRlciBvbmx5RmlsdGVyRGF0YSB0byBmYWxzZSB0aGF0IHdpbGwgc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0QWxsUm93cygpO1xuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKGZhbHNlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb25seUZpbHRlckRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhID8gdGhpcy5maWx0ZXJlZERhdGEgOiB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRydWUpO1xuICAgICAgICBjb25zdCByb3dJRHMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0Um93SURzKGRhdGEpLmZpbHRlcihySUQgPT4gIXRoaXMuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihySUQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIGFsbCByb3dzXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaWYgZmlsdGVyaW5nIGlzIGluIHBsYWNlLCBzZWxlY3RBbGxSb3dzKCkgYW5kIGRlc2VsZWN0QWxsUm93cygpIHNlbGVjdC9kZXNlbGVjdCBhbGwgZmlsdGVyZWQgcm93cy5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSBwYXJhbWV0ZXIgb25seUZpbHRlckRhdGEgdG8gZmFsc2UgdGhhdCB3aWxsIGRlc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxSb3dzKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9ubHlGaWx0ZXJEYXRhXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgaWYgKG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RSb3dzKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRSb3dJRHModGhpcy5maWx0ZXJlZERhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCB0aGUgc2VsZWN0ZWQgY2VsbHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyQ2VsbFNlbGVjdGlvbigpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckNlbGxTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ1Njcm9sbChkZWx0YTogeyBsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLmdldFNjcm9sbCgpO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBkZWx0YTtcblxuICAgICAgICBob3Jpem9udGFsLnNjcm9sbExlZnQgKz0gbGVmdCAqIHRoaXMuRFJBR19TQ1JPTExfREVMVEE7XG4gICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCArPSB0b3AgKiB0aGlzLkRSQUdfU0NST0xMX0RFTFRBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGVmaW5lZChhcmc6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYXJnICE9PSB1bmRlZmluZWQgJiYgYXJnICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCByYW5nZShzKSBvZiBjZWxscyBiZXR3ZWVuIGNlcnRhaW4gcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0UmFuZ2UoYXJnOiBHcmlkU2VsZWN0aW9uUmFuZ2UgfCBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2VsbFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYXJnLmZvckVhY2gocmFuZ2UgPT4gdGhpcy5zZXRTZWxlY3Rpb24ocmFuZ2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uVG9WaXNpYmxlSW5kZXgoZmllbGQ6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCkudmlzaWJsZUluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGVjdGlvbihyYW5nZTogR3JpZFNlbGVjdGlvblJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHsgcm93OiByYW5nZS5yb3dTdGFydCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtblN0YXJ0KSB9O1xuICAgICAgICBjb25zdCBlbmROb2RlID0geyByb3c6IHJhbmdlLnJvd0VuZCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtbkVuZCkgfTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlLm5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSYW5nZShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFkZFJhbmdlTWV0YShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmluaXRQb2ludGVyU3RhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZXMgaW4gdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkUmFuZ2VzKCk6IEdyaWRTZWxlY3Rpb25SYW5nZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5yYW5nZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGNlbGwgc2VsZWN0aW9uIGluIHRoZSBmb3JtIG9mIGBbeyBjb2x1bW4uZmllbGQ6IGNlbGwudmFsdWUgfSwgLi4uXWAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBmb3JtYXR0ZXJzYCBpcyBlbmFibGVkLCB0aGUgY2VsbCB2YWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBieSBpdHMgcmVzcGVjdGl2ZSBjb2x1bW4gZm9ybWF0dGVyIChpZiBhbnkpLlxuICAgICAqIElmIGBoZWFkZXJzYCBpcyBlbmFibGVkLCBpdCB3aWxsIHVzZSB0aGUgY29sdW1uIGhlYWRlciAoaWYgYW55KSBpbnN0ZWFkIG9mIHRoZSBjb2x1bW4gZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkRGF0YShmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgc2VsZWN0ZWQgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogUmV0dXJucyBhbiBhcnJheSB3aXRoIHNlbGVjdGVkIGNvbHVtbnNcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5ncmlkLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZENvbHVtbnMoKTogQ29sdW1uVHlwZVtdIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICByZXR1cm4gZmllbGRzLm1hcChmaWVsZCA9PiB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZCkpLmZpbHRlcihmaWVsZCA9PiBmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKiBAcGFyYW0gY2xlYXJDdXJyZW50U2VsZWN0aW9uIGlmIHRydWUgY2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgQ29sdW1uVHlwZVtdLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBmaWVsZFRvU2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvU2VsZWN0ID0gY29sdW1ucyBhcyBzdHJpbmdbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChjb2x1bW5zIGFzIENvbHVtblR5cGVbXSkuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjb2wuYWxsQ2hpbGRyZW4uZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApLm1hcChjID0+IGMuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFRvU2VsZWN0ID0gWy4uLmZpZWxkVG9TZWxlY3QsIC4uLmNoaWxkcmVuXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFRvU2VsZWN0LnB1c2goY29sLmZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoZmllbGRUb1NlbGVjdCwgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMgYnkgZmllbGQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RDb2x1bW5zKFsnSUQnLCdOYW1lJ10pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5zXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0Q29sdW1ucyhjb2x1bW5zOiBzdHJpbmdbXSB8IENvbHVtblR5cGVbXSkge1xuICAgICAgICBsZXQgZmllbGRUb0Rlc2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgQ29sdW1uVHlwZVtdKS5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbC5hbGxDaGlsZHJlbi5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdCA9IFsuLi5maWVsZFRvRGVzZWxlY3QsIC4uLmNoaWxkcmVuXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QucHVzaChjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZFRvRGVzZWxlY3QpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgYWxsIGNvbHVtbnNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdEFsbENvbHVtbnMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RBbGxDb2x1bW5zKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJBbGxTZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxDb2x1bW5zKCkge1xuICAgICAgICB0aGlzLnNlbGVjdENvbHVtbnModGhpcy5fY29sdW1ucy5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY3VycmVudCBjb2x1bW5zIHNlbGVjdGlvbiBpbiB0aGUgZm9ybSBvZiBgW3sgY29sdW1uLmZpZWxkOiBjZWxsLnZhbHVlIH0sIC4uLl1gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgZm9ybWF0dGVyc2AgaXMgZW5hYmxlZCwgdGhlIGNlbGwgdmFsdWUgd2lsbCBiZSBmb3JtYXR0ZWQgYnkgaXRzIHJlc3BlY3RpdmUgY29sdW1uIGZvcm1hdHRlciAoaWYgYW55KS5cbiAgICAgKiBJZiBgaGVhZGVyc2AgaXMgZW5hYmxlZCwgaXQgd2lsbCB1c2UgdGhlIGNvbHVtbiBoZWFkZXIgKGlmIGFueSkgaW5zdGVhZCBvZiB0aGUgY29sdW1uIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZENvbHVtbnNEYXRhKGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhID8gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEgOiB0aGlzLmRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhRnJvbUNvbHVtbnNTZWxlY3Rpb24oc291cmNlLCBmb3JtYXR0ZXJzLCBoZWFkZXJzKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBjb21iaW5lU2VsZWN0ZWRDZWxsQW5kQ29sdW1uRGF0YShjb2x1bW5EYXRhOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMsIGNvbHVtbkRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHByZXZlbnRDb250YWluZXJTY3JvbGwgPSAoZXZ0KSA9PiB7XG4gICAgICAgIGlmIChldnQudGFyZ2V0LnNjcm9sbFRvcCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5hZGRTY3JvbGxUb3AoZXZ0LnRhcmdldC5zY3JvbGxUb3ApO1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldnQudGFyZ2V0LnNjcm9sbExlZnQgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLnNjcm9sbFBvc2l0aW9uICs9IGV2dC50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIGV2dC50YXJnZXQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5SGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBldmVudFBhdGhFbGVtZW50cyA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpLm1hcChlbCA9PiBlbC50YWdOYW1lPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKGV2ZW50UGF0aEVsZW1lbnRzLmluY2x1ZGVzKCdpZ3gtZ3JpZC1maWx0ZXJpbmctcm93JykgfHxcbiAgICAgICAgICAgIGV2ZW50UGF0aEVsZW1lbnRzLmluY2x1ZGVzKCdpZ3gtZ3JpZC1maWx0ZXJpbmctY2VsbCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLmdyaWRBUEkuZ3JpZC5zZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zRGF0YSh0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgIGxldCBzZWxlY3RlZERhdGE7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnY29weScpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWREYXRhKHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycywgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgIGlmIChldmVudC5jb2RlID09PSAnS2V5QycgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuY3VycmVudFRhcmdldC5jbGFzc05hbWUgPT09ICdpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlcicpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBzZWxlY3RlZERhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmNvbWJpbmVTZWxlY3RlZENlbGxBbmRDb2x1bW5EYXRhKGNvbHVtbkRhdGEsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBjb2x1bW5EYXRhO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQocmVzdWx0KS50aGVuKCkuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGUpKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5jbGlwYm9hcmRPcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5jcnVkU2VydmljZS5jZWxsSW5FZGl0TW9kZSB8fCBldmVudC50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhLCBrZXlzPykge1xuICAgICAgICBjb25zdCBldiA9IHsgZGF0YSwgY2FuY2VsOiBmYWxzZSB9IGFzIElHcmlkQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgIHRoaXMuZ3JpZENvcHkuZW1pdChldik7XG5cbiAgICAgICAgaWYgKGV2LmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgQ2hhclNlcGFyYXRlZFZhbHVlRGF0YShldi5kYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuc2VwYXJhdG9yKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGtleXMgPyB0cmFuc2Zvcm1lci5wcmVwYXJlRGF0YShrZXlzKSA6IHRyYW5zZm9ybWVyLnByZXBhcmVEYXRhKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcocmVzdWx0LmluZGV4T2YoJ1xcbicpICsgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgJiYgT2JqZWN0LnZhbHVlcyhkYXRhWzBdKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCAtMik7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8qIE5lY2Vzc2FyeSBmb3IgdGhlIGhpZWFyYWNoaWNhbCBjYXNlIGJ1dCB3aWxsIHByb2JhYmx5IGhhdmUgdG9cbiAgICAgICAgICAgY2hhbmdlIGhvdyBnZXRTZWxlY3RlZERhdGEgaXMgcHJvcGFnYXRlZCBpbiB0aGUgaGllYXJhY2hpY2FsIGdyaWRcbiAgICAgICAgKi9cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93U25hY2tiYXJGb3IoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmFkZFJvd1NuYWNrYmFyLmFjdGlvblRleHQgPSBpbmRleCA9PT0gLTEgPyAnJyA6IHRoaXMuc25hY2tiYXJBY3Rpb25UZXh0O1xuICAgICAgICB0aGlzLmxhc3RBZGRlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIub3BlbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byBhIHBvc2l0aW9uIGluIHRoZSBncmlkIGJhc2VkIG9uIHByb3ZpZGVkIGByb3dpbmRleGAgYW5kIGB2aXNpYmxlQ29sdW1uSW5kZXhgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHNvIGNhbiBleGVjdXRlIGEgY3VzdG9tIGxvZ2ljIG92ZXIgdGhlIHRhcmdldCBlbGVtZW50LFxuICAgICAqIHRocm91Z2ggYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgeyB0YXJnZXRUeXBlOiBHcmlkS2V5ZG93blRhcmdldFR5cGUsIHRhcmdldDogT2JqZWN0IH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgdGhpcy5ncmlkLm5hdmlnYXRlVG8oMTAsIDMsIChhcmdzKSA9PiB7IGFyZ3MudGFyZ2V0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlVG8ocm93SW5kZXg6IG51bWJlciwgdmlzaWJsZUNvbEluZGV4ID0gLTEsIGNiOiAoYXJnczogYW55KSA9PiB2b2lkID0gbnVsbCkge1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCA/PyB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChyb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPiB0b3RhbEl0ZW1zIHx8ICh2aXNpYmxlQ29sSW5kZXggIT09IC0xXG4gICAgICAgICAgICAmJiB0aGlzLl9jb2x1bW5zLm1hcChjb2wgPT4gY29sLnZpc2libGVJbmRleCkuaW5kZXhPZih2aXNpYmxlQ29sSW5kZXgpID09PSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zbGljZShyb3dJbmRleCwgcm93SW5kZXggKyAxKS5maW5kKHJlYyA9PiByZWMuZXhwcmVzc2lvbiB8fCByZWMuY2hpbGRHcmlkc0RhdGEpKSB7XG4gICAgICAgICAgICB2aXNpYmxlQ29sSW5kZXggPSAtMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IHJvdyBpcyBwaW5uZWQgbm8gbmVlZCB0byBzY3JvbGwgYXMgd2VsbC5cbiAgICAgICAgY29uc3Qgc2hvdWxkU2Nyb2xsVmVydGljYWxseSA9IHRoaXMubmF2aWdhdGlvbi5zaG91bGRQZXJmb3JtVmVydGljYWxTY3JvbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbEhvcml6b250YWxseSA9IHRoaXMubmF2aWdhdGlvbi5zaG91bGRQZXJmb3JtSG9yaXpvbnRhbFNjcm9sbCh2aXNpYmxlQ29sSW5kZXgsIHJvd0luZGV4KTtcbiAgICAgICAgaWYgKHNob3VsZFNjcm9sbFZlcnRpY2FsbHkpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtVmVydGljYWxTY3JvbGxUb0NlbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsVG9DZWxsKHZpc2libGVDb2xJbmRleCwgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFNjcm9sbEhvcml6b250YWxseSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsVG9DZWxsKHZpc2libGVDb2xJbmRleCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTY3JvbGxWZXJ0aWNhbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtVmVydGljYWxTY3JvbGxUb0NlbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgSUNlbGxQb3NpdGlvbmAgd2hpY2ggZGVmaW5lcyB0aGUgbmV4dCBjZWxsLFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwb3NpdGlvbiwgdGhhdCBtYXRjaCBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogWW91IGNhbiBwYXNzIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgdGhpcmQgcGFyYW1ldGVyIG9mIGBnZXRQcmV2aW91c0NlbGxgIG1ldGhvZC5cbiAgICAgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWNjZXB0cyBJZ3hDb2x1bW5Db21wb25lbnQgYXMgYSBwYXJhbVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBuZXh0RWRpdGFibGVDZWxsUG9zaXRpb24gPSB0aGlzLmdyaWQuZ2V0TmV4dENlbGwoMCwgMywgKGNvbHVtbikgPT4gY29sdW1uLmVkaXRhYmxlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmV4dENlbGwoY3VyclJvd0luZGV4OiBudW1iZXIsIGN1clZpc2libGVDb2xJbmRleDogbnVtYmVyLFxuICAgICAgICBjYWxsYmFjazogKElneENvbHVtbkNvbXBvbmVudCkgPT4gYm9vbGVhbiA9IG51bGwpOiBJQ2VsbFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwICYmIGNvbC52aXNpYmxlSW5kZXggPj0gMCk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3SW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGN1cnJSb3dJbmRleCk7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUG9zaXRpb24oZGF0YVZpZXdJbmRleCwgY3VyVmlzaWJsZUNvbEluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xJbmRleGVzID0gY2FsbGJhY2sgPyBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjYWxsYmFjayhjb2wpKS5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSAtIGIpIDpcbiAgICAgICAgICAgIGNvbHVtbnMubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgY29uc3QgbmV4dENlbGxJbmRleCA9IGNvbEluZGV4ZXMuZmluZChpbmRleCA9PiBpbmRleCA+IGN1clZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNsaWNlKGRhdGFWaWV3SW5kZXgsIGRhdGFWaWV3SW5kZXggKyAxKVxuICAgICAgICAgICAgLmZpbmQocmVjID0+ICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEpICYmIG5leHRDZWxsSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBuZXh0Q2VsbEluZGV4IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4KVxuICAgICAgICAgICAgaWYgKGNvbEluZGV4ZXMubGVuZ3RoID09PSAwIHx8IG5leHRJbmRleCA9PT0gY3VyclJvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IG5leHRJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjb2xJbmRleGVzWzBdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBJQ2VsbFBvc2l0aW9uYCB3aGljaCBkZWZpbmVzIHRoZSBwcmV2aW91cyBjZWxsLFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwb3NpdGlvbiwgdGhhdCBtYXRjaCBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogWW91IGNhbiBwYXNzIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgdGhpcmQgcGFyYW1ldGVyIG9mIGBnZXRQcmV2aW91c0NlbGxgIG1ldGhvZC5cbiAgICAgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWNjZXB0cyBJZ3hDb2x1bW5Db21wb25lbnQgYXMgYSBwYXJhbVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBwcmV2aW91c0VkaXRhYmxlQ2VsbFBvc2l0aW9uID0gdGhpcy5ncmlkLmdldFByZXZpb3VzQ2VsbCgwLCAzLCAoY29sdW1uKSA9PiBjb2x1bW4uZWRpdGFibGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQcmV2aW91c0NlbGwoY3VyclJvd0luZGV4OiBudW1iZXIsIGN1clZpc2libGVDb2xJbmRleDogbnVtYmVyLFxuICAgICAgICBjYWxsYmFjazogKElneENvbHVtbkNvbXBvbmVudCkgPT4gYm9vbGVhbiA9IG51bGwpOiBJQ2VsbFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwICYmIGNvbC52aXNpYmxlSW5kZXggPj0gMCk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3SW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGN1cnJSb3dJbmRleCk7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUG9zaXRpb24oZGF0YVZpZXdJbmRleCwgY3VyVmlzaWJsZUNvbEluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xJbmRleGVzID0gY2FsbGJhY2sgPyBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjYWxsYmFjayhjb2wpKS5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYiAtIGEpIDpcbiAgICAgICAgICAgIGNvbHVtbnMubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgICAgICAgY29uc3QgcHJldkNlbGxJbmRleCA9IGNvbEluZGV4ZXMuZmluZChpbmRleCA9PiBpbmRleCA8IGN1clZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNsaWNlKGRhdGFWaWV3SW5kZXgsIGRhdGFWaWV3SW5kZXggKyAxKVxuICAgICAgICAgICAgLmZpbmQocmVjID0+ICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEpICYmIHByZXZDZWxsSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBwcmV2Q2VsbEluZGV4IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2SW5kZXggPSB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChjb2xJbmRleGVzLmxlbmd0aCA9PT0gMCB8fCBwcmV2SW5kZXggPT09IGN1cnJSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBwcmV2SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY29sSW5kZXhlc1swXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmRSb3dFZGl0VGFiU3RvcChjb21taXQgPSB0cnVlLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGNhbmNlbGVkID0gdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGNvbW1pdCwgZXZlbnQpO1xuXG4gICAgICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gdGhpcy5ncmlkQVBJLmdyaWQubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICBpZiAoYWN0aXZlQ2VsbCAmJiBhY3RpdmVDZWxsLnJvdyAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tDb2x1bW5DaGFuZ2VzKGluZGV4LCBjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbC5maWVsZCArIGNvbC5fY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeHBhbmRlZEdyb3VwKF9ncm91cDogSUdyb3VwQnlSZWNvcmQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIFRPRE86IE1PVkUgdG8gQ1JVRFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUm93T3ZlcmxheShpZCkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KGlkLCB0aGlzLnJvd0xpc3QubGVuZ3RoIDw9IE1JTl9ST1dfRURJVElOR19DT1VOVF9USFJFU0hPTEQpO1xuXG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkub3Blbih0aGlzLnJvd0VkaXRTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMucm93RWRpdGluZ1doZWVsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZVJvd0VkaXRpbmdPdmVybGF5KCkge1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLnJvd0VkaXRpbmdXaGVlbEhhbmRsZXIpO1xuICAgICAgICB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LmlzVG9wSW5pdGlhbFBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlUm93RWRpdGluZ092ZXJsYXkoc2hvdykge1xuICAgICAgICBjb25zdCByb3dTdHlsZSA9IHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5zdHlsZTtcbiAgICAgICAgaWYgKHNob3cpIHtcbiAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3c6IFJvd1R5cGUpIHtcbiAgICAgICAgaWYgKHJvdyAmJiAhdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1N0eWxlID0gdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnBhcmVudEVsZW1lbnQuc3R5bGU7XG4gICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkocm93LmtleSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWNoZWRWaWV3TG9hZGVkKGFyZ3M6IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0hvcml6b250YWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgY29uc3QgdG1wbElkID0gYXJncy5jb250ZXh0LnRlbXBsYXRlSUQudHlwZTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYXJncy5jb250ZXh0LmluZGV4O1xuICAgICAgICAgICAgYXJncy52aWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdG1wbElkID09PSAnZGF0YVJvdycgPyB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19ieV9pbmRleChpbmRleCkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlSb3cgPSB0bXBsSWQgPT09ICdzdW1tYXJ5Um93JyA/IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maW5kKChzcikgPT4gc3IuZGF0YVJvd0luZGV4ID09PSBpbmRleCkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChyb3cgJiYgcm93IGluc3RhbmNlb2YgSWd4Um93RGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVWaXJ0U3RhdGUocm93KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnlSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdG9yZVZpcnRTdGF0ZShzdW1tYXJ5Um93KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgZGlhbG9nLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuQWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cob3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gb3ZlcmxheVNldHRpbmdzID8gb3ZlcmxheVNldHRpbmdzIDogdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3M7XG4gICAgICAgIGlmICghdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KS5yb290R3JpZCA/ICh0aGlzIGFzIGFueSkucm9vdEdyaWQubmF0aXZlRWxlbWVudCA6IHRoaXMubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3V0bGV0O1xuXG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9IHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKFxuICAgICAgICAgICAgICAgIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIHRoaXMudmlld1JlZixcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLnNob3codGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcGx5Q2hhbmdlcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZUFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nKGFwcGx5Q2hhbmdlczogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICAgICAgY29uc3QgYWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cgPSBhZHZhbmNlZEZpbHRlcmluZ092ZXJsYXkuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuXG4gICAgICAgICAgICBpZiAoYXBwbHlDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cuYXBwbHlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZy5jbG9zZURpYWxvZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RW1wdHlSZWNvcmRPYmplY3RGb3IoaW5Sb3c6IFJvd1R5cGUpIHtcbiAgICAgICAgY29uc3Qgcm93ID0geyAuLi5pblJvdz8uZGF0YSB9O1xuICAgICAgICBPYmplY3Qua2V5cyhyb3cpLmZvckVhY2goa2V5ID0+IHJvd1trZXldID0gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlUm93SUQoKTtcbiAgICAgICAgcm93W3RoaXMucHJpbWFyeUtleV0gPSBpZDtcbiAgICAgICAgcmV0dXJuIHsgcm93SUQ6IGlkLCBkYXRhOiByb3csIHJlY29yZFJlZjogcm93IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzSG9yaXpvbnRhbFNjcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxXaWR0aCAtIHRoaXMudW5waW5uZWRXaWR0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdW1tYXJ5Um93KHJvd0RhdGEpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJvd0RhdGEgJiYgcm93RGF0YS5zdW1tYXJpZXMgJiYgKHJvd0RhdGEuc3VtbWFyaWVzIGluc3RhbmNlb2YgTWFwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0cmlnZ2VyUGlwZXMoKSB7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcm93RWRpdGluZ1doZWVsSGFuZGxlcihldmVudDogV2hlZWxFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxOZXh0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFByZXYoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VW5waW5uZWRJbmRleEJ5SWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5waW5uZWRSZWNvcmRzLmZpbmRJbmRleCh4ID0+IHhbdGhpcy5wcmltYXJ5S2V5XSA9PT0gaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHRoZSByb3cgdHJhbnNhY3Rpb25zIG9uIHRoZSBjdXJyZW50IHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGNvbW1pdCA9PT0gdHJ1ZWAsIHBhc3NlcyB0aGVtIGZyb20gdGhlIHBlbmRpbmcgc3RhdGUgdG8gdGhlIGRhdGEgKG9yIHRyYW5zYWN0aW9uIHNlcnZpY2UpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiBpZ3hCdXR0b24gKGNsaWNrKT1cImdyaWQuZW5kRWRpdCh0cnVlKVwiPkNvbW1pdCBSb3c8L2J1dHRvbj5cbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29tbWl0XG4gICAgICovXG4gICAgLy8gVE9ETzogRmFjYWRlIGZvciBjcnVkIHNlcnZpY2UgcmVmYWN0b3JpbmcuIFRvIGJlIHJlbW92ZWRcbiAgICAvLyBUT0RPOiBkbyBub3QgcmVtb3ZlIHRoaXMsIGFzIGl0IGlzIHVzZWQgaW4gcm93RWRpdFRlbXBsYXRlLCBidXQgbWFyayBpcyBhcyBpbnRlcm5hbCBhbmQgaGlkZGVuXG4gICAgcHVibGljIGVuZEVkaXQoY29tbWl0ID0gdHJ1ZSwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoY29tbWl0LCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW50ZXJzIGFkZCBtb2RlIGJ5IHNwYXduaW5nIHRoZSBVSSB1bmRlciB0aGUgc3BlY2lmaWVkIHJvdyBieSByb3dJRC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbnVsbCBpcyBwYXNzZWQgYXMgcm93SUQsIHRoZSByb3cgYWRkaW5nIFVJIGlzIHNwYXduZWQgYXMgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3XG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTcGF3bmluZyB0aGUgVUkgdG8gYWRkIGEgY2hpbGQgZm9yIGEgcmVjb3JkIG9ubHkgd29ya3MgaWYgeW91IHByb3ZpZGUgYSByb3dJRFxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SWQoJ0FMRktJJyk7XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJZCgnQUxGS0knLCB0cnVlKTtcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUlkKG51bGwpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCAtIFRoZSByb3dJRCB0byBzcGF3biB0aGUgYWRkIHJvdyBVSSBmb3IsIG9yIG51bGwgdG8gc3Bhd24gaXQgYXMgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3XG4gICAgICogQHBhcmFtIGFzQ2hpbGQgLSBXaGV0aGVyIHRoZSByZWNvcmQgc2hvdWxkIGJlIGFkZGVkIGFzIGEgY2hpbGQuIE9ubHkgYXBwbGljYWJsZSB0byBpZ3hUcmVlR3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYmVnaW5BZGRSb3dCeUlkKHJvd0lEOiBhbnksIGFzQ2hpbGQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGxldCBpbmRleCA9IHJvd0lEO1xuICAgICAgICBpZiAocm93SUQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGFzQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSByZWNvcmQgY2Fubm90IGJlIGFkZGVkIGFzIGEgY2hpbGQgdG8gYW4gdW5zcGVjaWZpZWQgcmVjb3JkLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSByZWNvcmQgd2l0aCB0aGF0IFBLXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuZ3JpZEFQSS5nZXRfcmVjX2luZGV4X2J5X2lkKHJvd0lELCB0aGlzLmRhdGFWaWV3KTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHJvdyB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgd2FzIGZvdW5kLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZFJvd0ZvckluZGV4KGluZGV4LCBhc0NoaWxkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2FkZFJvd0ZvckluZGV4KGluZGV4OiBudW1iZXIsIGFzQ2hpbGQ/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYmVnaW5BZGRSb3dGb3JJbmRleChpbmRleCwgYXNDaGlsZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIHZhbGlkIC0gd29uJ3Qgc3VwcG9ydCBhbnl0aGluZyBvdXRzaWRlIHRoZSBkYXRhIHZpZXdcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZSB2aWV3IHBvcnRcbiAgICAgICAgICAgIGlmICgoaW5kZXggPCB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleCB8fFxuICAgICAgICAgICAgICAgIGluZGV4ID49IHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4ICsgdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLmNodW5rU2l6ZSkgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5pc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuY2h1bmtMb2FkXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgoaW5kZXgsIGFzQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgoaW5kZXgsIGFzQ2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgcm93IHdpdGggdGhlIHNwZWNpZmllZCBQSyBvciBpbmRleCBpcyBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IGRhdGEgdmlldy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVudGVycyBhZGQgbW9kZSBieSBzcGF3bmluZyB0aGUgVUkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQWNjZXB0ZWQgdmFsdWVzIGZvciBpbmRleCBhcmUgaW50ZWdlcnMgZnJvbSAwIHRvIHRoaXMuZ3JpZC5kYXRhVmlldy5sZW5ndGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUluZGV4KDApO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCB0byBzcGF3biB0aGUgVUkgYXQuIEFjY2VwdHMgaW50ZWdlcnMgZnJvbSAwIHRvIHRoaXMuZ3JpZC5kYXRhVmlldy5sZW5ndGhcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVnaW5BZGRSb3dCeUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iZWdpbkFkZFJvd0J5SWQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZFJvd0ZvckluZGV4KGluZGV4IC0gMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2ZW50SGVhZGVyU2Nyb2xsKGFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MudGFyZ2V0LnNjcm9sbExlZnQgIT09IDApIHtcbiAgICAgICAgICAgICh0aGlzLm5hdmlnYXRpb24gYXMgYW55KS5mb3JPZkRpcigpLmdldFNjcm9sbCgpLnNjcm9sbExlZnQgPSBhcmdzLnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgYXJncy50YXJnZXQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYmVnaW5BZGRSb3dGb3JJbmRleChpbmRleDogbnVtYmVyLCBhc0NoaWxkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgLy8gVE9ETyBpcyByb3cgZnJvbSByb3dMaXN0IHN1aXRhYmxlIGZvciBlbnRlckFkZFJvd01vZGVcbiAgICAgICAgY29uc3Qgcm93ID0gaW5kZXggPT0gbnVsbCA/XG4gICAgICAgICAgICBudWxsIDogdGhpcy5yb3dMaXN0LmZpbmQociA9PiByLmluZGV4ID09PSBpbmRleCk7XG4gICAgICAgIGlmIChyb3cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbnRlckFkZFJvd01vZGUocm93LCBhc0NoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcm93IHdpdGggdGhlIHNwZWNpZmllZCBQSyBvciBpbmRleCB3YXMgZm91bmQuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3dpdGNoVHJhbnNhY3Rpb25TZXJ2aWNlKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uRmFjdG9yeS5jcmVhdGUoVFJBTlNBQ1RJT05fVFlQRS5CYXNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25GYWN0b3J5LmNyZWF0ZShUUkFOU0FDVElPTl9UWVBFLk5vbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YUNsb25lU3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gdGhpcy5kYXRhQ2xvbmVTdHJhdGVneTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdWJzY3JpYmVUb1RyYW5zYWN0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQubmV4dCgpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5vblN0YXRlVXBkYXRlLnBpcGUodGFrZVVudGlsKG1lcmdlKHRoaXMuZGVzdHJveSQsIHRoaXMudHJhbnNhY3Rpb25DaGFuZ2UkKSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMudHJhbnNhY3Rpb25TdGF0dXNVcGRhdGUuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlKGV2ZW50OiBTdGF0ZVVwZGF0ZUV2ZW50KSB7XG4gICAgICAgIGxldCBhY3Rpb25zOiBBY3Rpb248VHJhbnNhY3Rpb24+W10gPSBbXTtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5SRURPKSB7XG4gICAgICAgICAgICBhY3Rpb25zID0gZXZlbnQuYWN0aW9ucyA/IGV2ZW50LmFjdGlvbnMuZmlsdGVyKHggPT4geC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuREVMRVRFKSA6IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5VTkRPKSB7XG4gICAgICAgICAgICBhY3Rpb25zID0gZXZlbnQuYWN0aW9ucyA/IGV2ZW50LmFjdGlvbnMuZmlsdGVyKHggPT4geC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKSA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzUm93U2VsZWN0ZWQoYWN0aW9uLnRyYW5zYWN0aW9uLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RSb3coYWN0aW9uLnRyYW5zYWN0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5SRURPIHx8IGV2ZW50Lm9yaWdpbiA9PT0gVHJhbnNhY3Rpb25FdmVudE9yaWdpbi5VTkRPKSB7XG4gICAgICAgICAgICBldmVudC5hY3Rpb25zLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlVQREFURSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRWYWx1ZSh4LnRyYW5zYWN0aW9uLmlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uLnVwZGF0ZSh4LnRyYW5zYWN0aW9uLmlkLCB2YWx1ZSA/PyB4LnJlY29yZFJlZik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUgfHwgeC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHgudHJhbnNhY3Rpb24uaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi5jcmVhdGUoeC50cmFuc2FjdGlvbi5pZCwgdmFsdWUgPz8geC5yZWNvcmRSZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uLnVwZGF0ZSh4LnRyYW5zYWN0aW9uLmlkLCB2YWx1ZSA/PyB4LnJlY29yZFJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24ubWFya0FzVG91Y2hlZCh4LnRyYW5zYWN0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi5jbGVhcih4LnRyYW5zYWN0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJIZWFkZXJDQlN0YXRlKCk7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIHdyaXRlVG9EYXRhKHJvd0luZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgbWVyZ2VPYmplY3RzKHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEoKVtyb3dJbmRleF0sIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3RvcmVWaXJ0U3RhdGUocm93KSB7XG4gICAgICAgIC8vIGNoZWNrIHZpcnR1YWxpemF0aW9uIHN0YXRlIG9mIGRhdGEgcmVjb3JkIGFkZGVkIGZyb20gY2FjaGVcbiAgICAgICAgLy8gaW4gY2FzZSBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQgLSB1cGRhdGUgaXQuXG4gICAgICAgIGNvbnN0IHJvd0Zvck9mID0gcm93LnZpcnREaXJSb3c7XG4gICAgICAgIGNvbnN0IGdyaWRTY3JMZWZ0ID0gcm93Rm9yT2YuZ2V0U2Nyb2xsKCkuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgbGVmdCA9IC1wYXJzZUludChyb3dGb3JPZi5kYy5pbnN0YW5jZS5fdmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCwgMTApO1xuICAgICAgICBjb25zdCBhY3R1YWxTY3JvbGxMZWZ0ID0gbGVmdCArIHJvd0Zvck9mLmdldENvbHVtblNjcm9sbExlZnQocm93Rm9yT2Yuc3RhdGUuc3RhcnRJbmRleCk7XG4gICAgICAgIGlmIChncmlkU2NyTGVmdCAhPT0gYWN0dWFsU2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgcm93Rm9yT2Yub25IU2Nyb2xsKGdyaWRTY3JMZWZ0KTtcbiAgICAgICAgICAgIHJvd0Zvck9mLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hhbmdlUm93RWRpdGluZ092ZXJsYXlTdGF0ZU9uU2Nyb2xsKHJvdzogUm93VHlwZSkge1xuICAgICAgICBpZiAoIXRoaXMucm93RWRpdGFibGUgfHwgIXRoaXMucm93RWRpdGluZ092ZXJsYXkgfHwgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRhdGEgYW5kL29yIGlzTG9hZGluZyBpbnB1dCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG92ZXJsYXkgY2FuIGJlXG4gICAgICogaGlkZGVuL3Nob3duIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNob3VsZE92ZXJsYXlMb2FkaW5nXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV2YWx1YXRlTG9hZGluZ1N0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRPdmVybGF5TG9hZGluZykge1xuICAgICAgICAgICAgLy8gYSBuZXcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd25cbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgIG91dGxldDogdGhpcy5sb2FkaW5nT3V0bGV0LFxuICAgICAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5KClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdPdmVybGF5Lm9wZW4ob3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ092ZXJsYXkuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGdyaWQgd2lkdGggaS5lLiB0aGlzLmNhbGNXaWR0aFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkV2lkdGgoKSB7XG4gICAgICAgIGxldCB3aWR0aDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRXaWR0aCkge1xuICAgICAgICAgICAgLyogd2lkdGggaW4gJSovXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyk7XG4gICAgICAgICAgICB3aWR0aCA9IGNvbXB1dGVkLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBwYXJzZUludChjb21wdXRlZCwgMTApIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF3aWR0aCAmJiB0aGlzLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAodGhpcy53aWR0aCA9PT0gbnVsbCB8fCAhd2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5nZXRDb2x1bW5XaWR0aFN1bSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSAmJiB0aGlzLndpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8IHdpZHRoID09PSBudWxsKSAmJiB3aWR0aCAhPT0gdGhpcy5jYWxjV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVyaXZlUG9zc2libGVXaWR0aCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGNvbHVtbnMgZGVmYXVsdFdpZHRoIHByb3BlcnR5XG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZXJpdmVQb3NzaWJsZVdpZHRoKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sdW1uV2lkdGhTZXRCeVVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbldpZHRoID0gdGhpcy53aWR0aCAhPT0gbnVsbCA/IHRoaXMuZ2V0UG9zc2libGVDb2x1bW5XaWR0aCgpIDogdGhpcy5taW5Db2x1bW5XaWR0aCArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiBwYXJzZUludCh0aGlzLl9jb2x1bW5XaWR0aCwgMTApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGhDb21iaW5lZCA9IHBhcnNlSW50KHRoaXMuX2NvbHVtbldpZHRoLCAxMCkgKiAoY29sdW1uLmNvbEVuZCA/IGNvbHVtbi5jb2xFbmQgLSBjb2x1bW4uY29sU3RhcnQgOiAxKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gY29sdW1uV2lkdGhDb21iaW5lZCArICdweCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEQuSy4gTWFyY2ggMjl0aCwgMjAyMSAjOTE0NSBDb25zaWRlciBtaW4vbWF4IHdpZHRoIHdoZW4gc2V0dGluZyBkZWZhdWx0V2lkdGggcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gdGhpcy5nZXRFeHRyZW11bUJhc2VkQ29sV2lkdGgoY29sdW1uKTtcbiAgICAgICAgICAgICAgICBjb2x1bW4ucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEV4dHJlbXVtQmFzZWRDb2xXaWR0aChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuX2NvbHVtbldpZHRoO1xuICAgICAgICBpZiAod2lkdGggJiYgdHlwZW9mIHdpZHRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcod2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbldpZHRoID0gd2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IGNvbHVtbi5taW5XaWR0aFB4IDogY29sdW1uLm1pbldpZHRoUGVyY2VudDtcbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSB3aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gY29sdW1uLm1heFdpZHRoUHggOiBjb2x1bW4ubWF4V2lkdGhQZXJjZW50O1xuICAgICAgICBpZiAoY29sdW1uLmhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbldpZHRoID4gcGFyc2VGbG9hdCh3aWR0aCkpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKGNvbHVtbi5taW5XaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4V2lkdGggPCBwYXJzZUZsb2F0KHdpZHRoKSkge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcoY29sdW1uLm1heFdpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIG5vIHB4IG9yICUgYXJlIGRlZmluZWQgaW4gbWF4V2lkdGgvbWluV2lkdGggY29uc2lkZXIgaXQgcHhcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgJiYgd2lkdGguaW5kZXhPZigncHgnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHdpZHRoICs9ICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNldE5vdGlmeUNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RSZXBhaW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlc29sdmVPdXRsZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlID8gdGhpcy5fdXNlck91dGxldERpcmVjdGl2ZSA6IHRoaXMuX291dGxldERpcmVjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbnMgaW4gdGhlIG1haW4gY29sdW1uTGlzdCBhbmQgX2NvbHVtbnMgY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tb3ZlQ29sdW1ucyhmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IG9yZGVyZWRMaXN0ID0gdGhpcy5fcGlubmVkQ29sdW1ucy5jb25jYXQodGhpcy5fdW5waW5uZWRDb2x1bW5zKTtcbiAgICAgICAgY29uc3QgbGlzdCA9IG9yZGVyZWRMaXN0O1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBsaXN0KTtcbiAgICAgICAgY29uc3QgbmV3TGlzdCA9IHRoaXMuX3Jlc2V0Q29sdW1uTGlzdChsaXN0KTtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKG5ld0xpc3QpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGludGVybmFsIGNvbHVtbidzIGNvbGxlY3Rpb24uXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVDb2x1bW5zKG5ld0NvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdKSB7XG4gICAgICAgIC8vIHVwZGF0ZSBpbnRlcm5hbCBjb2xsZWN0aW9ucyB0byByZXRhaW4gb3JkZXIuXG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMgPSBuZXdDb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLnBpbm5lZCk7XG4gICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucyA9IG5ld0NvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zID0gbmV3Q29sdW1ucztcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlc2V0Q29sdW1uTGlzdChsaXN0Pykge1xuICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgIGxpc3QgPSB0aGlzLl9jb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdMaXN0ID0gW107XG4gICAgICAgIGxpc3QuZmlsdGVyKGMgPT4gYy5sZXZlbCA9PT0gMCkuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIG5ld0xpc3QucHVzaChwKTtcbiAgICAgICAgICAgIGlmIChwLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ld0xpc3QuY29uY2F0KHAuYWxsQ2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlcnMgY29sdW1ucyBpbnNpZGUgdGhlIHBhc3NlZCBjb2x1bW4gY29sbGVjdGlvbi5cbiAgICAgKiBXaGVuIHJlb3JkZXJpbmcgY29sdW1uIGdyb3VwIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBmbGF0dGVuZWQuXG4gICAgICogSW4gYWxsIG90aGVyIGNhc2VzLCB0aGUgY29sdW1ucyBjb2xsZWN0aW9uIGlzIGZsYXR0ZW5lZCwgdGhpcyBpcyB3aHkgYWRpdHRpb25hbCBjYWxjdWxhdGlvbnMgb24gdGhlIGRyb3BJbmRleCBhcmUgZG9uZS5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jlb3JkZXJDb2x1bW5zKGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zaXRpb246IERyb3BQb3NpdGlvbiwgY29sdW1uQ29sbGVjdGlvbjogYW55W10sXG4gICAgICAgIGluR3JvdXAgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBmcm9tSW5kZXggPSBjb2x1bW5Db2xsZWN0aW9uLmluZGV4T2YoZnJvbSk7XG4gICAgICAgIGNvbnN0IGNoaWxkQ29sdW1uc0NvdW50ID0gaW5Hcm91cCA/IDEgOiBmcm9tLmFsbENoaWxkcmVuLmxlbmd0aCArIDE7XG4gICAgICAgIGNvbHVtbkNvbGxlY3Rpb24uc3BsaWNlKGZyb21JbmRleCwgY2hpbGRDb2x1bW5zQ291bnQpO1xuICAgICAgICBsZXQgZHJvcEluZGV4ID0gY29sdW1uQ29sbGVjdGlvbi5pbmRleE9mKHRvKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSB7XG4gICAgICAgICAgICBkcm9wSW5kZXgrKztcbiAgICAgICAgICAgIGlmICghaW5Hcm91cCAmJiB0by5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGRyb3BJbmRleCArPSB0by5hbGxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1uQ29sbGVjdGlvbi5zcGxpY2UoZHJvcEluZGV4LCAwLCBmcm9tKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGNvbHVtbiBncm91cCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbW92ZUNoaWxkQ29sdW1ucyhwYXJlbnQ6IElneENvbHVtbkNvbXBvbmVudCwgZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBwYXJlbnQuY2hpbGRyZW4udG9BcnJheSgpO1xuICAgICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhmcm9tLCB0bywgcG9zLCBidWZmZXIsIHRydWUpO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucmVzZXQoYnVmZmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZXR1cENvbHVtbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9HZW5lcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvZ2VuZXJhdGVDb2x1bW5zKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5nZXRDb2x1bW5MaXN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRDb2x1bW5zKHRoaXMuX2NvbHVtbnMsIChjb2w6IElneENvbHVtbkNvbXBvbmVudCkgPT4gdGhpcy5jb2x1bW5Jbml0LmVtaXQoY29sKSk7XG4gICAgICAgIHRoaXMuY29sdW1uTGlzdERpZmZlci5kaWZmKHRoaXMuY29sdW1uTGlzdCk7XG5cbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0LmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZWQoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRDb2x1bW5MaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRlbGV0ZVJvd0Zyb21EYXRhKHJvd0lEOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgLy8gIGlmIHRoZXJlIGlzIGEgcm93IChpbmRleCAhPT0gMCkgZGVsZXRlIGl0XG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBhIHJvdyBpbiBBREQgb3IgVVBEQVRFIHN0YXRlIGNoYW5nZSBpdCdzIHN0YXRlIHRvIERFTEVURVxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IHsgaWQ6IHJvd0lELCB0eXBlOiBUcmFuc2FjdGlvblR5cGUuREVMRVRFLCBuZXdWYWx1ZTogbnVsbCB9O1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLmFkZCh0cmFuc2FjdGlvbiwgdGhpcy5kYXRhW2luZGV4XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGU6IFN0YXRlID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0U3RhdGUocm93SUQpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuYWRkKHsgaWQ6IHJvd0lELCB0eXBlOiBUcmFuc2FjdGlvblR5cGUuREVMRVRFLCBuZXdWYWx1ZTogbnVsbCB9LCBzdGF0ZSAmJiBzdGF0ZS5yZWNvcmRSZWYpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAhdGhpcy5kYXRhIHx8ICh0aGlzLmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcikgP1xuICAgICAgICAgICAgMCA6IHRoaXMuZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25QaW5uZWRSb3dzQ2hhbmdlZChjaGFuZ2U6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50Pikge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5yb3dMaXN0RGlmZmVyLmRpZmYoY2hhbmdlKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25Db2x1bW5zQ2hhbmdlZChjaGFuZ2U6IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLmNvbHVtbkxpc3REaWZmZXIuZGlmZihjaGFuZ2UpO1xuXG4gICAgICAgIGlmICh0aGlzLmF1dG9HZW5lcmF0ZSAmJiB0aGlzLl9jb2x1bW5zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJbiBJdnkgaWYgdGhlcmUgYXJlIG5lc3RlZCBjb25kaXRpb25hbCB0ZW1wbGF0ZXMgdGhlIGNvbnRlbnQgY2hpbGRyZW4gYXJlIHJlLWV2YWx1YXRlZFxuICAgICAgICAgICAgLy8gaGVuY2UgYXV0b2dlbmVyYXRlZCBjb2x1bW5zIGFyZSBjbGVhcmVkIGFuZCBuZWVkIHRvIGJlIHJlc2V0LlxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZGlmZi5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneENvbHVtbkNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5pdGVtLnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zLnB1c2gocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucy5wdXNoKHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpLCAoY29sOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHRoaXMuY29sdW1uSW5pdC5lbWl0KGNvbCkpO1xuXG4gICAgICAgICAgICBkaWZmLmZvckVhY2hSZW1vdmVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxJZ3hDb2x1bW5Db21wb25lbnQgfCBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NvbHVtbkdyb3VwID0gcmVjb3JkLml0ZW0gaW5zdGFuY2VvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgR3JvdXBpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX2dyb3VwYnkocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIEZpbHRlcmluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJfZmlsdGVyKHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBmaWx0ZXIgcm93XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbi5maWVsZCA9PT0gcmVjb3JkLml0ZW0uZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBTb3J0aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5jbGVhcl9zb3J0KHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgY29sdW1uIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoW3JlY29yZC5pdGVtLmZpZWxkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcblxuICAgICAgICAgICAgaWYgKGFkZGVkIHx8IHJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBvbkNvbHVtbnNDaGFuZ2VkYCBjYW4gYmUgZXhlY3V0ZWQgbWlkd2F5IGEgY3VycmVudCBkZXRlY3RDaGFuZ2UgY3ljbGUgYW5kIG1hcmtGb3JDaGVjayB3aWxsIGJlIGlnbm9yZWQgdGhlbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3YWl0IGZvciB0aGUgY3VycmVudCBjeWNsZSB0byBlbmQgc28gd2UgY2FuIHRyaWdnZXIgYSBuZXcgb25lIGFuZCBuZ0RvQ2hlY2sgdG8gZmlyZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkU2l6ZXMocmVjYWxjRmVhdHVyZVdpZHRoID0gdHJ1ZSkge1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETzogKFIuSy4pIFRoaXMgbGF5ZXJlZCBsYXNhZ25lIHNob3VsZCBiZSByZWZhY3RvcmVkXG4gICAgICAgICAgICBBU0FQLiBUaGUgcmVhc29uIEkgaGF2ZSB0byByZXNldCB0aGUgY2FjaGVzIHNvIG1hbnkgdGltZXMgaXMgYmVjYXVzZVxuICAgICAgICAgICAgYWZ0ZXIgdGVhY2ggYGRldGVjdENoYW5nZXNgIGNhbGwgdGhleSBhcmUgZmlsbGVkIHdpdGggaW52YWxpZFxuICAgICAgICAgICAgc3RhdGUuIE9mIGNvdXJzZSBhbGwgb2YgdGhpcyBoYXBwZW5zIG1pZHdheSB0aHJvdWdoIHRoZSBncmlkXG4gICAgICAgICAgICBzaXppbmcgcHJvY2VzcyB3aGljaCBvZiBjb3Vyc2UsIHVzZXMgdmFsdWVzIGZyb20gdGhlIGNhY2hlcywgdGh1cyByZXN1bHRpbmdcbiAgICAgICAgICAgIGluIGEgYnJva2VuIGxheW91dC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheSh0aGlzLmNydWRTZXJ2aWNlLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LnJlc2V0Q2hpcHNBcmVhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIC8vIGluIGNhc2Ugc2Nyb2xsYmFyIGhhcyBhcHBlYXJlZCByZWNhbGMgdG8gc2l6ZSBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChoYXNTY3JvbGwgIT09IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy56b25lLmlzU3RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVdpZHRoSG9zdEJpbmRpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5zVG9BdXRvc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGNHcmlkSGVhZFJvdygpIHtcbiAgICAgICAgaWYgKHRoaXMubWF4TGV2ZWxIZWFkZXJEZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZUZvbnRTaXplID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKSk7XG4gICAgICAgICAgICBjb25zdCBoYXNGaWx0ZXJSb3cgPSB0aGlzLl9hbGxvd0ZpbHRlcmluZyAmJiB0aGlzLl9maWx0ZXJNb2RlID09PSBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyO1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9ICh0aGlzLm1heExldmVsSGVhZGVyRGVwdGggKyAxICsgKGhhc0ZpbHRlclJvdyA/IDEgOiAwKSkgKiB0aGlzLmRlZmF1bHRSb3dIZWlnaHQgLyB0aGlzLl9iYXNlRm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gYCR7bWluU2l6ZX1yZW1gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNldHMgVEJPRFkgaGVpZ2h0IGkuZS4gdGhpcy5jYWxjSGVpZ2h0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUdyaWRIZWlnaHQoKSB7XG4gICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG5cbiAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID0gdGhpcy5fY2FsY3VsYXRlR3JpZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGlubmVkUm93SGVpZ2h0ICYmIHRoaXMuY2FsY0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0IC09IHRoaXMucGlubmVkUm93SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRHcm91cEFyZWFIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRDb21wdXRlZEhlaWdodChlbGVtKSB7XG4gICAgICAgIHJldHVybiBlbGVtLm9mZnNldEhlaWdodCA/IHBhcnNlRmxvYXQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpKSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9vdGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1bW1hcnlSb3dIZWlnaHQgfHwgdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRmb290Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRoZWFkUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZ2V0Q29tcHV0ZWRIZWlnaHQodGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgcmV0dXJuICghdGhpcy5hbGxvd0ZpbHRlcmluZyB8fCAodGhpcy5hbGxvd0ZpbHRlcmluZyAmJiB0aGlzLmZpbHRlck1vZGUgIT09IEZpbHRlck1vZGUucXVpY2tGaWx0ZXIpKSA/XG4gICAgICAgICAgICBoZWlnaHQgLSB0aGlzLmdldEZpbHRlckNlbGxIZWlnaHQoKSA6XG4gICAgICAgICAgICBoZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRUb29sYmFySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGxldCB0b29sYmFySGVpZ2h0ID0gMDtcbiAgICAgICAgaWYgKHRoaXMudG9vbGJhci5maXJzdCkge1xuICAgICAgICAgICAgdG9vbGJhckhlaWdodCA9IHRoaXMuZ2V0Q29tcHV0ZWRIZWlnaHQodGhpcy50b29sYmFyLmZpcnN0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b29sYmFySGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UGFnaW5nRm9vdGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGxldCBwYWdpbmdIZWlnaHQgPSAwO1xuICAgICAgICBpZiAodGhpcy5mb290ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZ2V0Q29tcHV0ZWRIZWlnaHQodGhpcy5mb290ZXIubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBwYWdpbmdIZWlnaHQgPSB0aGlzLmZvb3Rlci5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkID9cbiAgICAgICAgICAgICAgICBoZWlnaHQgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdpbmdIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRGaWx0ZXJDZWxsSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGhlYWRlckdyb3VwTmF0aXZlRWwgPSAodGhpcy5oZWFkZXJHcm91cHNMaXN0Lmxlbmd0aCAhPT0gMCkgP1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJHcm91cHNMaXN0WzBdLm5hdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgICAgICBjb25zdCBmaWx0ZXJDZWxsTmF0aXZlRWwgPSAoaGVhZGVyR3JvdXBOYXRpdmVFbCkgP1xuICAgICAgICAgICAgaGVhZGVyR3JvdXBOYXRpdmVFbC5xdWVyeVNlbGVjdG9yKCdpZ3gtZ3JpZC1maWx0ZXJpbmctY2VsbCcpIGFzIEhUTUxFbGVtZW50IDogbnVsbDtcbiAgICAgICAgcmV0dXJuIChmaWx0ZXJDZWxsTmF0aXZlRWwpID8gZmlsdGVyQ2VsbE5hdGl2ZUVsLm9mZnNldEhlaWdodCA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY2FsY3VsYXRlR3JpZEJvZHlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLl9oZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdHVhbFRoZWFkUm93ID0gdGhpcy5nZXRUaGVhZFJvd0hlaWdodCgpO1xuICAgICAgICBjb25zdCBmb290ZXJIZWlnaHQgPSB0aGlzLmdldEZvb3RlckhlaWdodCgpO1xuICAgICAgICBjb25zdCB0b29sYmFySGVpZ2h0ID0gdGhpcy5nZXRUb29sYmFySGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHBhZ2luZ0hlaWdodCA9IHRoaXMuZ2V0UGFnaW5nRm9vdGVySGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IGdyb3VwQXJlYUhlaWdodCA9IHRoaXMuZ2V0R3JvdXBBcmVhSGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHNjckhlaWdodCA9IHRoaXMuZ2V0Q29tcHV0ZWRIZWlnaHQodGhpcy5zY3IubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkSGVpZ2h0ID0gdG9vbGJhckhlaWdodCArIGFjdHVhbFRoZWFkUm93ICtcbiAgICAgICAgICAgIGZvb3RlckhlaWdodCArIHBhZ2luZ0hlaWdodCArIGdyb3VwQXJlYUhlaWdodCArXG4gICAgICAgICAgICBzY3JIZWlnaHQ7XG5cbiAgICAgICAgbGV0IGdyaWRIZWlnaHQgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUGVyY2VudEhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKTtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9TaXplID0gdGhpcy5fc2hvdWxkQXV0b1NpemUocmVuZGVyZWRIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKGF1dG9TaXplIHx8IGNvbXB1dGVkLmluZGV4T2YoJyUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5SGVpZ2h0ID0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvZHlIZWlnaHQgPiAwID8gYm9keUhlaWdodCA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncmlkSGVpZ2h0ID0gcGFyc2VGbG9hdChjb21wdXRlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBncmlkSGVpZ2h0ID0gcGFyc2VJbnQodGhpcy5faGVpZ2h0LCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnMoZ3JpZEhlaWdodCAtIHJlbmRlcmVkSGVpZ2h0KTtcblxuICAgICAgICBpZiAoTWF0aC5yb3VuZChoZWlnaHQpID09PSAwIHx8IGlzTmFOKGdyaWRIZWlnaHQpKSB7XG4gICAgICAgICAgICBjb25zdCBib2R5SGVpZ2h0ID0gdGhpcy5kZWZhdWx0VGFyZ2V0Qm9keUhlaWdodDtcbiAgICAgICAgICAgIHJldHVybiBib2R5SGVpZ2h0ID4gMCA/IGJvZHlIZWlnaHQgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWlnaHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrQ29udGFpbmVyU2l6ZUNoYW5nZSgpIHtcbiAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50IHx8ICh0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBhcyBhbnkpLmhvc3Q7XG4gICAgICAgIGNvbnN0IG9yaWdIZWlnaHQgPSBwYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXR1cm4gb3JpZ0hlaWdodCAhPT0gaGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfc2hvdWxkQXV0b1NpemUocmVuZGVyZWRIZWlnaHQpIHtcbiAgICAgICAgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCB8fCAodGhpcy5uYXRpdmVFbGVtZW50LmdldFJvb3ROb2RlKCkgYXMgYW55KS5ob3N0O1xuICAgICAgICBsZXQgcmVzID0gIXBhcmVudEVsZW1lbnQgfHxcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ID09PSAwIHx8XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCA9PT0gcmVuZGVyZWRIZWlnaHQ7XG4gICAgICAgIGlmICgoIXRoaXMucGxhdGZvcm0uaXNDaHJvbWl1bSAmJiAhdGhpcy5wbGF0Zm9ybS5pc0ZpcmVmb3gpIHx8IHRoaXMuX2F1dG9TaXplKSB7XG4gICAgICAgICAgICAvLyBJZiBncmlkIGNhdXNlcyB0aGUgcGFyZW50IGNvbnRhaW5lciB0byBleHRlbmQgKGZvciBleGFtcGxlIHdoZW4gY29udGFpbmVyIGlzIGZsZXgpXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWx3YXlzIGF1dG8tc2l6ZSBzaW5jZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbnRhaW5lciB3aWxsIGNvbnRpbnVvdXNseSBjaGFuZ2UgYXMgdGhlIGdyaWQgcmVuZGVycyBlbGVtZW50cy5cbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplID0gZmFsc2U7XG4gICAgICAgICAgICByZXMgPSB0aGlzLmNoZWNrQ29udGFpbmVyU2l6ZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgdW5waW5uZWQgYXJlYVxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRVbnBpbm5lZFdpZHRoKHRha2VIaWRkZW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLmlzUGVyY2VudFdpZHRoID9cbiAgICAgICAgICAgIHRoaXMuY2FsY1dpZHRoIDpcbiAgICAgICAgICAgIHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSB8fCBwYXJzZUludCh0aGlzLmhvc3RXaWR0aCwgMTApIHx8IHRoaXMuY2FsY1dpZHRoO1xuICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpICYmICF0aGlzLmlzUGVyY2VudFdpZHRoKSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUGlubmluZ1RvU3RhcnQpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdpZHRoIC0gdGhpcy5nZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJpZXMoZmllbGROYW1lOiBzdHJpbmcsIGhhc1N1bW1hcnk6IGJvb2xlYW4sIHN1bW1hcnlPcGVyYW5kPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUoZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgY29sdW1uLmhhc1N1bW1hcnkgPSBoYXNTdW1tYXJ5O1xuICAgICAgICAgICAgaWYgKHN1bW1hcnlPcGVyYW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdFN1bW1hcmllc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXRyaWdnZXJSb290UGlwZSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2x1bW4uc3VtbWFyaWVzID0gc3VtbWFyeU9wZXJhbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tdWx0aXBsZVN1bW1hcmllcyhleHByZXNzaW9uczogSVN1bW1hcnlFeHByZXNzaW9uW10sIGhhc1N1bW1hcnk6IGJvb2xlYW4pIHtcbiAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKGVsZW1lbnQuZmllbGROYW1lLCBoYXNTdW1tYXJ5LCBlbGVtZW50LmN1c3RvbVN1bW1hcnkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZU11bHRpcGxlU3VtbWFyaWVzKGV4cHJlc3Npb25zKSB7XG4gICAgICAgIGV4cHJlc3Npb25zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNvbHVtbiAmJiBjb2x1bW4uZmllbGROYW1lID8gY29sdW1uLmZpZWxkTmFtZSA6IGNvbHVtbjtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhjb2x1bW5OYW1lLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZURhdGFUeXBlcyhyZWMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLk51bWJlcjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVjID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVjID09PSAnb2JqZWN0JyAmJiByZWMgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlYyA9PT0gJ3N0cmluZycgJiYgKC9cXC4oZ2lmfGpwZT9nfHRpZmY/fHBuZ3x3ZWJwfGJtcCkkL2kpLnRlc3QocmVjKSkge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5JbWFnZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLlN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGF1dG9nZW5lcmF0ZUNvbHVtbnMoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2RhdGEoKTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcblxuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGNyZWF0ZUNvbXBvbmVudChJZ3hDb2x1bW5Db21wb25lbnQsIHsgZW52aXJvbm1lbnRJbmplY3RvcjogIHRoaXMuZW52SW5qZWN0b3IsIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3Rvcn0pO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZpZWxkID0gZmllbGQ7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZGF0YVR5cGUgPSB0aGlzLnJlc29sdmVEYXRhVHlwZXMoZGF0YVswXVtmaWVsZF0pO1xuICAgICAgICAgICAgcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaChyZWYuaW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMgPSBjb2x1bW5zO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucyhjb2x1bW5zKTtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3VsZEdlbmVyYXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhRmllbGRzKGRhdGE6IGFueVtdKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YSAmJiBkYXRhLmxlbmd0aCAhPT0gMCA/IGRhdGFbMF0gOiBbXSlcbiAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+ICF0aGlzLmF1dG9HZW5lcmF0ZUV4Y2x1ZGUuaW5jbHVkZXMoa2V5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0Q29sdW1ucyhjb2xsZWN0aW9uOiBJZ3hDb2x1bW5Db21wb25lbnRbXSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkdyb3VwcyA9IGNvbGxlY3Rpb24uc29tZShjb2wgPT4gY29sLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgLy8gU2V0IG92ZXJhbGwgcm93IGxheW91dCBzaXplXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uTGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFNpemUgPSBjb2wuY2hpbGRyZW4gP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlZHVjZSgoYWNjLCB2YWwpID0+IE1hdGgubWF4KHZhbC5yb3dTdGFydCArIHZhbC5ncmlkUm93U3BhbiAtIDEsIGFjYyksIDEpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IE1hdGgubWF4KGxheW91dFNpemUsIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiB0aGlzLmhhc0NvbHVtbkdyb3Vwcykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb25maWd1cmF0aW9uIC0gbXVsdGktcm93IGFuZCBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICAvLyByZW1vdmUgY29sdW1uIGdyb3Vwc1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTGF5b3V0Q29sdW1ucyA9IGNvbGxlY3Rpb24uZmlsdGVyKChjb2wpID0+IGNvbC5jb2x1bW5MYXlvdXQgfHwgY29sLmNvbHVtbkxheW91dENoaWxkKTtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBjb2x1bW5MYXlvdXRDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgICAgICBjb2xsZWN0aW9uLmZvckVhY2goKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlciA/IHRoaXMuX2NvbHVtbldpZHRoIDogY29sdW1uLmRlZmF1bHRXaWR0aCA/IGNvbHVtbi5kZWZhdWx0V2lkdGggOiAnJztcblxuICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgY2IoY29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW4ucG9wdWxhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlaW5pdFBpblN0YXRlcygpIHtcbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMucGlubmVkKS5zb3J0KChhLCBiKSA9PiB0aGlzLl9waW5uZWRDb2x1bW5zLmluZGV4T2YoYSkgLSB0aGlzLl9waW5uZWRDb2x1bW5zLmluZGV4T2YoYikpO1xuICAgICAgICB0aGlzLl91bnBpbm5lZENvbHVtbnMgPSB0aGlzLmhhc0NvbHVtbkdyb3VwcyA/IHRoaXMuX2NvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpIDpcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuX3VucGlubmVkQ29sdW1ucy5pbmRleE9mKGEpIC0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YoYikpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UsIGNvbHVtbkRhdGE/OiBhbnlbXSk6IGFueVtdIHtcbiAgICAgICAgbGV0IGNvbHVtbnNBcnJheTogSWd4Q29sdW1uQ29tcG9uZW50W107XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YSA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25Db2xsZWN0aW9uID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBrZXlzQW5kRGF0YSA9IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWd4LWhpZXJhcmNoaWNhbC1ncmlkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwYW5zaW9uUm93SW5kZXhlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5leHBhbnNpb25TdGF0ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yZWNfaW5kZXhfYnlfaWQoa2V5LCB0aGlzLmRhdGFWaWV3KTtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uUm93SW5kZXhlcy5wdXNoKHJvd0luZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbi5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBhbnNpb25Sb3dJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbi5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkS2V5ID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnRyYWN0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRLZXkgPiBOdW1iZXIocm93KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmFjdCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGVjdGlvbi5zZXQodXBkYXRlZEtleSAtIHN1YnRyYWN0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnRyYWN0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5zaW9uUm93SW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUVsLnJvdyA+IE51bWJlcihyb3cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJhY3QrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUVsLnJvdyAtPSBzdWJ0cmFjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBpc1JlbW90ZSA9IHRvdGFsSXRlbXMgJiYgdG90YWxJdGVtcyA+IHRoaXMuZGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICBsZXQgc2VsZWN0aW9uTWFwO1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lneC1oaWVyYXJjaGljYWwtZ3JpZCcgJiYgc2VsZWN0aW9uQ29sbGVjdGlvbi5zaXplID4gMCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwID0gaXNSZW1vdGUgPyBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pIDpcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAgPSBpc1JlbW90ZSA/IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbikgOlxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbikuZmlsdGVyKCh0dXBsZSkgPT4gdHVwbGVbMF0gPCBzb3VyY2UubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbGxTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLnNpbmdsZSAmJiBhY3RpdmVFbCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwLnB1c2goW2FjdGl2ZUVsLnJvdywgbmV3IFNldDxudW1iZXI+KCkuYWRkKGFjdGl2ZUVsLmNvbHVtbildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbGxTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmUgJiYgYWN0aXZlRWwpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5wdXNoKFthY3RpdmVFbC5yb3csIG5ldyBTZXQ8bnVtYmVyPigpLmFkZChhY3RpdmVFbC5jb2x1bW4pXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICAgICAgc2VsZWN0ZWREYXRhID0gY29sdW1uRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgZm9yIChsZXQgW3Jvdywgc2V0XSBvZiBzZWxlY3Rpb25NYXApIHtcbiAgICAgICAgICAgIHJvdyA9IHRoaXMucGFnaW5hdG9yICYmICh0aGlzLnBhZ2luZ01vZGUgPT09IEdyaWRQYWdpbmdNb2RlLkxvY2FsICYmIHNvdXJjZSA9PT0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEpID8gcm93ICsgKHRoaXMucGFnaW5hdG9yLnBlclBhZ2UgKiB0aGlzLnBhZ2luYXRvci5wYWdlKSA6IHJvdztcbiAgICAgICAgICAgIHJvdyA9IGlzUmVtb3RlID8gcm93IC0gdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXggOiByb3c7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZVtyb3ddIHx8IHNvdXJjZVtyb3ddLmRldGFpbHNEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBBcnJheS5mcm9tKHNldCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVhY2ggb2YgdGVtcCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbnNBcnJheSA9IHRoaXMuZ2V0U2VsZWN0YWJsZUNvbHVtbnNBdChlYWNoKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJyYXkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9ICF0aGlzLmlzUGl2b3QgJiYgaGVhZGVycyA/IGNvbC5oZWFkZXIgfHwgY29sLmZpZWxkIDogY29sLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHNvdXJjZVtyb3ddLmdob3N0UmVjb3JkID8gc291cmNlW3Jvd10ucmVjb3JkUmVmIDogc291cmNlW3Jvd107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXNQaXZvdCA/IHJvd0RhdGEuYWdncmVnYXRpb25WYWx1ZXMuZ2V0KGNvbC5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZU5lc3RlZFBhdGgocm93RGF0YSwgY29sLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcih2YWx1ZSwgcm93RGF0YSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IHJlY29yZFtrZXldLnRvU3RyaW5nKCkuY29uY2F0KCdyZWNvcmRSb3ctJyArIHJvdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhjb2x1bW5EYXRhWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGM6IGFueSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93TnVtYmVyID0gK2Muc3BsaXQoJ3JlY29yZFJvdy0nKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjLnNwbGl0KCdyZWNvcmRSb3ctJylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRPYmogPSBPYmplY3QuYXNzaWduKHNlbGVjdGVkRGF0YVtyb3dOdW1iZXJdLCByZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW3Jvd051bWJlcl0gPSBtZXJnZWRPYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGEucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKHNlbGVjdGVkRGF0YSk7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKGtleXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXNBbmREYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRTZWxlY3RhYmxlQ29sdW1uc0F0KGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVMYXlvdXRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5jb2x1bW5MYXlvdXQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgY29sTGF5b3V0ID0gdmlzaWJsZUxheW91dENvbHVtbnNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIGNvbExheW91dCA/IGNvbExheW91dC5jaGlsZHJlbi50b0FycmF5KCkgOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXApXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFt2aXNpYmxlQ29sdW1uc1tpbmRleF1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGF1dG9TaXplQ29sdW1uc0luVmlldygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHZTdGF0ZSA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLnN0YXRlO1xuICAgICAgICBsZXQgY29sUmVzaXplZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB1bnBpbm5lZEluVmlldyA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLmlneEdyaWRGb3JPZi5zbGljZSh2U3RhdGUuc3RhcnRJbmRleCwgdlN0YXRlLnN0YXJ0SW5kZXggKyB2U3RhdGUuY2h1bmtTaXplKS5mbGF0TWFwKHggPT4geC5jb2x1bW5Hcm91cCA/IHguYWxsQ2hpbGRyZW4gOiB4KTtcbiAgICAgICAgY29uc3QgY29sdW1uc0luVmlldyA9IHRoaXMucGlubmVkQ29sdW1ucy5jb25jYXQodW5waW5uZWRJblZpZXcpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zSW5WaWV3KSB7XG4gICAgICAgICAgICBpZiAoIWNvbC5hdXRvU2l6ZSAmJiBjb2wuaGVhZGVyQ2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzQ29udGVudFdpZHRocyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChjb2wuX2NlbGxzLmxlbmd0aCAhPT0gdGhpcy5yb3dMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCh4ID0+IHguY2RyLmRldGVjdENoYW5nZXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdGhpcy5fZGF0YVJvd0xpc3QubWFwKHggPT4geC5jZWxscy5maW5kKGMgPT4gYy5jb2x1bW4gPT09IGNvbCkpO1xuICAgICAgICAgICAgICAgIGNlbGxzLmZvckVhY2goKGNlbGwpID0+IGNlbGxzQ29udGVudFdpZHRocy5wdXNoKGNlbGw/Lm5hdGl2ZUVsZW1lbnQ/Lm9mZnNldFdpZHRoIHx8IDApKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5jZWxsc0NvbnRlbnRXaWR0aHMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2VsbHMgbm90IGluIERPTSB5ZXQuLi5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuaGVhZGVyQ2VsbExpc3QuZmluZCh4ID0+IHguY29sdW1uID09PSBjb2wpO1xuICAgICAgICAgICAgICAgIGNlbGxzQ29udGVudFdpZHRocy5wdXNoKGhlYWRlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKTtcbiAgICAgICAgICAgICAgICBsZXQgbWF4U2l6ZSA9IE1hdGguY2VpbChNYXRoLm1heCguLi5jZWxsc0NvbnRlbnRXaWR0aHMpKSArIDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5tYXhXaWR0aCAmJiBtYXhTaXplID4gY29sLm1heFdpZHRoUHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IGNvbC5tYXhXaWR0aFB4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4U2l6ZSA8IGNvbC5taW5XaWR0aFB4KSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFNpemUgPSBjb2wubWluV2lkdGhQeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sLmF1dG9TaXplID0gbWF4U2l6ZTtcbiAgICAgICAgICAgICAgICBjb2wucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgICAgICAgICBjb2xSZXNpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sUmVzaXplZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlZFdpZHRocygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3REYXRhRnJvbUNvbHVtbnNTZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpOiBhbnlbXSB7XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRhID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2Ygc291cmNlKSB7XG4gICAgICAgICAgICBzZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVycyA/IGNvbC5oZWFkZXIgfHwgY29sLmZpZWxkIDogY29sLmZpZWxkO1xuICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcihkYXRhW2NvbC5maWVsZF0sIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgIDogZGF0YVtjb2wuZmllbGRdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YS5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaW5pdFBpbm5pbmcoKSB7XG4gICAgICAgIGNvbnN0IHBpbm5lZENvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgdW5waW5uZWRDb2x1bW5zID0gW107XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICAvLyBXaGVuIGEgY29sdW1uIGlzIGEgZ3JvdXAgb3IgaXMgaW5zaWRlIGEgZ3JvdXAsIHBpbiBhbGwgcmVsYXRlZC5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGNvbC5wYXJlbnQucGlubmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBjb2wuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5waW5uZWQgPSB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGV4Y2VlZCB1bnBpbm5lZCBhcmVhIG1pbiB3aWR0aCBhbmQgZ2V0IHBpbm5lZCBhbmQgdW5waW5uZWQgY29sIGNvbGxlY3Rpb25zLlxuICAgICAgICAvLyBXZSB0YWtlIGludG8gYWNjb3VudCB0b3AgbGV2ZWwgY29sdW1ucyAodG9wIGxldmVsIGdyb3VwcyBhbmQgbm9uIGdyb3VwcykuXG4gICAgICAgIC8vIElmIHRvcCBsZXZlbCBpcyB1bnBpbm5lZCB0aGUgcGlubmluZyBoYW5kbGVzIGFsbCBjaGlsZHJlbiB0byBiZSB1bnBpbm5lZCBhcyB3ZWxsLlxuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIHBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucGlubmVkICYmIGNvbHVtbi5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnRvcExldmVsUGFyZW50LnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucGlubmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHVucGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1bnBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXNzaWduIHRoZSBhcHBsaWNhYmxlIGNvbGxlY3Rpb25zLlxuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gcGlubmVkQ29sdW1ucztcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gdW5waW5uZWRDb2x1bW5zO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvKHJvdzogYW55IHwgbnVtYmVyLCBjb2x1bW46IGFueSB8IG51bWJlciwgaW5Db2xsZWN0aW9uID0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEpOiB2b2lkIHtcbiAgICAgICAgbGV0IGRlbGF5U2Nyb2xsaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yICYmIHR5cGVvZiAocm93KSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gaW5Db2xsZWN0aW9uLmluZGV4T2Yocm93KTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKHJvd0luZGV4IC8gdGhpcy5wYWdpbmF0b3IucGVyUGFnZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRvci5wYWdlICE9PSBwYWdlKSB7XG4gICAgICAgICAgICAgICAgZGVsYXlTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlbGF5U2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRhdGFDaGFuZ2VkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERpcmVjdGl2ZSh0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgKHJvdykgPT09ICdudW1iZXInID8gcm93IDogdGhpcy51bnBpbm5lZERhdGFWaWV3LmluZGV4T2Yocm93KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIsXG4gICAgICAgICAgICAgICAgdHlwZW9mIChyb3cpID09PSAnbnVtYmVyJyA/IHJvdyA6IHRoaXMudW5waW5uZWREYXRhVmlldy5pbmRleE9mKHJvdykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY3JvbGxUb0hvcml6b250YWxseShjb2x1bW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsVG9Ib3Jpem9udGFsbHkoY29sdW1uOiBhbnkgfCBudW1iZXIpIHtcbiAgICAgICAgbGV0IGNvbHVtbkluZGV4ID0gdHlwZW9mIGNvbHVtbiA9PT0gJ251bWJlcicgPyBjb2x1bW4gOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW4pLnZpc2libGVJbmRleDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUm93ID0gdGhpcy5yb3dMaXN0LmZpbmQociA9PiAhIXIudmlydERpclJvdyk7XG4gICAgICAgIGNvbnN0IHZpcnREaXIgPSBzY3JvbGxSb3cgPyBzY3JvbGxSb3cudmlydERpclJvdyA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzUGlubmluZ1RvU3RhcnQgJiYgdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID49IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCAtPSB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsRGlyZWN0aXZlKGRpcmVjdGl2ZTogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4sIGdvYWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZS5zY3JvbGxUbyhnb2FsKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Q29sdW1uV2lkdGhTdW0oKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvbFN1bSA9IDA7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoeCA9PiB4LmNvbHVtbkxheW91dCkgOiB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcih4ID0+ICF4LmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb2xTdW0gKz0gcGFyc2VJbnQoKGl0ZW0uY2FsY1dpZHRoIHx8IGl0ZW0uZGVmYXVsdFdpZHRoKSwgMTApIHx8IHRoaXMubWluQ29sdW1uV2lkdGg7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNvbFN1bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBjb2xTdW0gKz0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIHJldHVybiBjb2xTdW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZ5IGNoYW5nZXMsIHJlc2V0IGNhY2hlIGFuZCBwb3B1bGF0ZVZpc2libGVJbmRleGVzLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2NvbHVtbnNSZW9yZGVyZWQoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpLmZvckVhY2goeCA9PiB4LnBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWZ0ZXIgcmVvcmRlcmluZyBpcyBkb25lIHJlc2V0IGNhY2hlZCBjb2x1bW4gY29sbGVjdGlvbnMuXG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5Db2xsZWN0aW9ucygpO1xuICAgICAgICBjb2x1bW4ucmVzZXRDYWNoZXMoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYnVpbGREYXRhVmlldyhfZGF0YTogYW55W10pIHtcbiAgICAgICAgdGhpcy5fZGF0YVZpZXcgPSB0aGlzLmlzUm93UGlubmluZ1RvVG9wID9cbiAgICAgICAgICAgIFsuLi50aGlzLnBpbm5lZERhdGFWaWV3LCAuLi50aGlzLnVucGlubmVkRGF0YVZpZXddIDpcbiAgICAgICAgICAgIFsuLi50aGlzLnVucGlubmVkRGF0YVZpZXcsIC4uLnRoaXMucGlubmVkRGF0YVZpZXddO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FwcGx5V2lkdGhIb3N0QmluZGluZygpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5fd2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRXaWR0aCA9IHRoaXMuY2FsY1dpZHRoO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aCArPSB0aGlzLnNjcm9sbFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aWR0aCA9IGN1cnJlbnRXaWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faG9zdFdpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2ZXJ0aWNhbFNjcm9sbEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5vblNjcm9sbChldmVudCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVRyYW5zaXRpb25zID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jaHVua0xvYWQuZW1pdCh0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbCh0aGlzLmNydWRTZXJ2aWNlLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmhpZGVPdmVybGF5cygpO1xuICAgICAgICB0aGlzLmFjdGlvblN0cmlwPy5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvblN0cmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0cmlwLmNvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgZGlyZWN0aW9uOiAndmVydGljYWwnLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbjogdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQb3NpdGlvblxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdyaWRTY3JvbGwuZW1pdChhcmdzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaG9yaXpvbnRhbFNjcm9sbEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGV2ZW50LnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lci5vbkhTY3JvbGwoc2Nyb2xsTGVmdCk7XG4gICAgICAgIHRoaXMuX2hvcml6b250YWxGb3JPZnMuZm9yRWFjaCh2Zm9yID0+IHZmb3Iub25IU2Nyb2xsKHNjcm9sbExlZnQpKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50VmlydERpci5jaHVua0xvYWQuZW1pdCh0aGlzLmhlYWRlckNvbnRhaW5lci5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYoIXRoaXMubmF2aWdhdGlvbi5pc0NvbHVtbkZ1bGx5VmlzaWJsZSh0aGlzLm5hdmlnYXRpb24ubGFzdENvbHVtbkluZGV4KSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlT3ZlcmxheXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzOiBJR3JpZFNjcm9sbEV2ZW50QXJncyA9IHsgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCcsIGV2ZW50LCBzY3JvbGxQb3NpdGlvbjogdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb24gfTtcbiAgICAgICAgdGhpcy5ncmlkU2Nyb2xsLmVtaXQoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCA9IC0xLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3cgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmZpbmQociA9PiByLmluZGV4ID09PSByb3dJbmRleCk7XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5nZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJvdyA9IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maWx0ZXIocyA9PiBzLmluZGV4ICE9PSAwKS5jb25jYXQodGhpcy5yb3dMaXN0LnRvQXJyYXkoKSkuZmluZChyID0+IHIuaW5kZXggPT09IHJvd0luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JBcmdzID0gdGhpcy5nZXROYXZpZ2F0aW9uQXJndW1lbnRzKHJvdywgdmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY2IoY2JBcmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3SW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KHJvd0luZGV4KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdLmRldGFpbHNEYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnNldEFjdGl2ZU5vZGUoeyByb3c6IHJvd0luZGV4IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBjYihhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpIHtcbiAgICAgICAgbGV0IHRhcmdldFR5cGU6IEdyaWRLZXlkb3duVGFyZ2V0VHlwZTsgbGV0IHRhcmdldDtcbiAgICAgICAgc3dpdGNoIChyb3cubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lneC1ncmlkLWdyb3VwYnktcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2dyb3VwUm93JztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSByb3c7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpZ3gtZ3JpZC1zdW1tYXJ5LXJvdyc6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdzdW1tYXJ5Q2VsbCc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdmlzaWJsZUNvbEluZGV4ICE9PSAtMSA/XG4gICAgICAgICAgICAgICAgICAgIHJvdy5zdW1tYXJ5Q2VsbHMuZmluZChjID0+IGMudmlzaWJsZUNvbHVtbkluZGV4ID09PSB2aXNpYmxlQ29sSW5kZXgpIDogcm93LnN1bW1hcnlDZWxscy5maXJzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lneC1jaGlsZC1ncmlkLXJvdyc6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdoaWVyYXJjaGljYWxSb3cnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvdztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdkYXRhQ2VsbCc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdmlzaWJsZUNvbEluZGV4ICE9PSAtMSA/IHJvdy5jZWxscy5maW5kKGMgPT4gYy52aXNpYmxlQ29sdW1uSW5kZXggPT09IHZpc2libGVDb2xJbmRleCkgOiByb3cuY2VsbHMuZmlyc3Q7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VHlwZSwgdGFyZ2V0IH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROZXh0RGF0YVJvd0luZGV4KGN1cnJlbnRSb3dJbmRleCwgcHJldmlvdXMgPSBmYWxzZSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkSW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGN1cnJlbnRSb3dJbmRleCk7XG4gICAgICAgIGlmIChjdXJyZW50Um93SW5kZXggPCAwIHx8IChjdXJyZW50Um93SW5kZXggPT09IDAgJiYgcHJldmlvdXMpIHx8IChyZXNvbHZlZEluZGV4ID49IHRoaXMuZGF0YVZpZXcubGVuZ3RoIC0gMSAmJiAhcHJldmlvdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJvd0luZGV4O1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgbmV4dC9wcmV2IHJlY29yZCB0aGF0IGlzIGVkaXRhYmxlLlxuICAgICAgICBjb25zdCBuZXh0Um93SW5kZXggPSBwcmV2aW91cyA/IHRoaXMuZmluZFByZXZFZGl0YWJsZURhdGFSb3dJbmRleChjdXJyZW50Um93SW5kZXgpIDpcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuZmluZEluZGV4KChyZWMsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgIGluZGV4ID4gcmVzb2x2ZWRJbmRleCAmJiB0aGlzLmlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChpbmRleCkpO1xuICAgICAgICBjb25zdCBuZXh0RGF0YUluZGV4ID0gdGhpcy5nZXREYXRhSW5kZXgobmV4dFJvd0luZGV4KTtcbiAgICAgICAgcmV0dXJuIG5leHREYXRhSW5kZXggIT09IC0xID8gbmV4dERhdGFJbmRleCA6IGN1cnJlbnRSb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBlZGl0YWJsZSByb3cgaW5kZXggb3IgLTEgaWYgbm8gc3VjaCByb3cgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3VycmVudEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlZGl0YWJsZSByZWNvcmQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kUHJldkVkaXRhYmxlRGF0YVJvd0luZGV4KGN1cnJlbnRJbmRleCk6IG51bWJlciB7XG4gICAgICAgIGxldCBpID0gdGhpcy5kYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkSW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGN1cnJlbnRJbmRleCk7XG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIGlmIChpIDwgcmVzb2x2ZWRJbmRleCAmJiB0aGlzLmlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHJlY29yZCBhdCB0aGUgc3BlY2lmaWVkIGRhdGEgdmlldyBpbmRleCBpcyBhIGFuIGVkaXRhYmxlIGRhdGEgcmVjb3JkLlxuICAgICAqIElmIHJlY29yZCBpcyBncm91cCByZWMsIHN1bW1hcnkgcmVjLCBjaGlsZCByZWMsIGdob3N0IHJlYy4gZXRjLiBpdCBpcyBub3QgZWRpdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVZpZXdJbmRleCBUaGUgaW5kZXggb2YgdGhhdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlldy5cbiAgICAgKlxuICAgICAqL1xuICAgIC8vIFRPRE86IENvbnNpZGVyIG1vdmluZyBpdCBpbnRvIENSVURcbiAgICBwcml2YXRlIGlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZGF0YVZpZXdbZGF0YVZpZXdJbmRleF07XG4gICAgICAgIHJldHVybiAhcmVjLmV4cHJlc3Npb24gJiYgIXJlYy5zdW1tYXJpZXMgJiYgIXJlYy5jaGlsZEdyaWRzRGF0YSAmJiAhcmVjLmRldGFpbHNEYXRhICYmXG4gICAgICAgICAgICAhdGhpcy5pc0dob3N0UmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSByZWNvcmQgYXQgdGhlIHNwZWNpZmllZCBkYXRhIHZpZXcgaW5kZXggaXMgYSBnaG9zdC5cbiAgICAgKiBJZiByZWNvcmQgaXMgcGlubmVkIGJ1dCBpcyBub3QgaW4gcGlubmVkIGFyZWEgdGhlbiBpdCBpcyBhIGdob3N0IHJlY29yZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhVmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGF0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNHaG9zdFJlY29yZEF0SW5kZXgoZGF0YVZpZXdJbmRleCkge1xuICAgICAgICBjb25zdCBpc1Bpbm5lZCA9IHRoaXMuaXNSZWNvcmRQaW5uZWQodGhpcy5kYXRhVmlld1tkYXRhVmlld0luZGV4XSk7XG4gICAgICAgIGNvbnN0IGlzSW5QaW5uZWRBcmVhID0gdGhpcy5pc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KGRhdGFWaWV3SW5kZXgpO1xuICAgICAgICByZXR1cm4gaXNQaW5uZWQgJiYgIWlzSW5QaW5uZWRBcmVhO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZFBvc2l0aW9uKHJvd0luZGV4LCBjb2xJbmRleCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cCAmJiBjb2wudmlzaWJsZUluZGV4ID49IDAgJiYgIWNvbC5oaWRkZW4pLmxlbmd0aDtcbiAgICAgICAgaWYgKHJvd3MgPCAxIHx8IGNvbHMgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvd0luZGV4ID4gLTEgJiYgcm93SW5kZXggPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAmJlxuICAgICAgICAgICAgY29sSW5kZXggPiAtIDEgJiYgY29sSW5kZXggPD0gTWF0aC5tYXgoLi4udGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kKHRleHQ6IHN0cmluZywgaW5jcmVtZW50OiBudW1iZXIsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbiwgc2Nyb2xsPzogYm9vbGVhbiwgZW5kRWRpdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZEVkaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZVJlc29sdmVkID0gY2FzZVNlbnNpdGl2ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaFJlc29sdmVkID0gZXhhY3RNYXRjaCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbGV0IHJlYnVpbGRDYWNoZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQgIT09IHRleHQgfHxcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSAhPT0gY2FzZVNlbnNpdGl2ZVJlc29sdmVkIHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2ggIT09IGV4YWN0TWF0Y2hSZXNvbHZlZCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hUZXh0OiB0ZXh0LFxuICAgICAgICAgICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZVJlc29sdmVkLFxuICAgICAgICAgICAgICAgIGV4YWN0TWF0Y2g6IGV4YWN0TWF0Y2hSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBtYXRjaEluZm9DYWNoZTogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJlYnVpbGRDYWNoZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggKz0gaW5jcmVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlYnVpbGRDYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5yb3dMaXN0LmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyb3cuY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGM6IElneEdyaWRDZWxsQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmhpZ2hsaWdodFRleHQodGV4dCwgY2FzZVNlbnNpdGl2ZVJlc29sdmVkLCBleGFjdE1hdGNoUmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkTWF0Y2hDYWNoZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA+PSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5mbyA9IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGVbdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8gPSB7IC4uLnRoaXMubGFzdFNlYXJjaEluZm8gfTtcblxuICAgICAgICAgICAgaWYgKHNjcm9sbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKG1hdGNoSW5mby5yb3csIG1hdGNoSW5mby5jb2x1bW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLnNldEFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBtYXRjaEluZm8uY29sdW1uLFxuICAgICAgICAgICAgICAgIHJvdzogbWF0Y2hJbmZvLnJvdyxcbiAgICAgICAgICAgICAgICBpbmRleDogbWF0Y2hJbmZvLmluZGV4LFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBtYXRjaEluZm8ubWV0YWRhdGEsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgSWd4VGV4dEhpZ2hsaWdodERpcmVjdGl2ZS5jbGVhckFjdGl2ZUhpZ2hsaWdodCh0aGlzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYnVpbGRNYXRjaENhY2hlKCkge1xuICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlID0gW107XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IHRoaXMubGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IHRoaXMubGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaDtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IGNhc2VTZW5zaXRpdmUgPyB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQgOiB0aGlzLmxhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICBjb25zdCBjb2x1bW5JdGVtcyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5jb2x1bW5Hcm91cCkuc29ydCgoYzEsIGMyKSA9PiBjMS52aXNpYmxlSW5kZXggLSBjMi52aXNpYmxlSW5kZXgpO1xuICAgICAgICBkYXRhLmZvckVhY2goKGRhdGFSb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICBjb2x1bW5JdGVtcy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlwZUFyZ3MgPSB0aGlzLmdldENvbHVtbkJ5TmFtZShjLmZpZWxkKS5waXBlQXJncztcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGMuZm9ybWF0dGVyID8gYy5mb3JtYXR0ZXIocmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCksIGRhdGFSb3cpIDpcbiAgICAgICAgICAgICAgICAgICAgYy5kYXRhVHlwZSA9PT0gJ251bWJlcicgPyBmb3JtYXROdW1iZXIocmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCksIHRoaXMubG9jYWxlLCBwaXBlQXJncy5kaWdpdHNJbmZvKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmRhdGFUeXBlID09PSAnZGF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZvcm1hdERhdGUocmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCksIHBpcGVBcmdzLmZvcm1hdCwgdGhpcy5sb2NhbGUsIHBpcGVBcmdzLnRpbWV6b25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZU5lc3RlZFBhdGgoZGF0YVJvdywgYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgYy5zZWFyY2hhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hWYWx1ZSA9IGNhc2VTZW5zaXRpdmUgPyBTdHJpbmcodmFsdWUpIDogU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoVmFsdWUgPT09IHNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KCdwaW5uZWQnLCB0aGlzLmlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZGF0YVJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2NjdXJlbmNlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEluZGV4ID0gc2VhcmNoVmFsdWUuaW5kZXhPZihzZWFyY2hUZXh0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoJ3Bpbm5lZCcsIHRoaXMuaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBkYXRhUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGMuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBvY2N1cmVuY2VJbmRleCsrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbHVlID0gc2VhcmNoVmFsdWUuc3Vic3RyaW5nKHNlYXJjaEluZGV4ICsgc2VhcmNoVGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0gc2VhcmNoVmFsdWUuaW5kZXhPZihzZWFyY2hUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBYm91dCB0byBNb3ZlIHRvIENSVURcbiAgICBwcml2YXRlIGNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KHJvd0lEOiBhbnksIHVzZU91dGVyID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHNldHRpbmdzID0gdGhpcy5yb3dFZGl0U2V0dGluZ3M7XG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMucm93RWRpdGluZ092ZXJsYXkub3ZlcmxheUlkKTtcbiAgICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzID0gb3ZlcmxheS5zZXR0aW5ncztcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5vdXRsZXQgPSB1c2VPdXRlciA/IHRoaXMucGFyZW50Um93T3V0bGV0RGlyZWN0aXZlIDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmU7XG4gICAgICAgIHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuc2V0dGluZ3MuY29udGFpbmVyID0gdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBwaW5uZWQgPSB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCkgIT09IC0xO1xuICAgICAgICBjb25zdCB0YXJnZXRSb3cgPSAhcGlubmVkID9cbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2tleShyb3dJRCkgYXMgSWd4Um93RGlyZWN0aXZlXG4gICAgICAgICAgICA6IHRoaXMucGlubmVkUm93cy5maW5kKHggPT4geC5rZXkgPT09IHJvd0lEKSBhcyBJZ3hSb3dEaXJlY3RpdmU7XG4gICAgICAgIGlmICghdGFyZ2V0Um93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3MudGFyZ2V0ID0gdGFyZ2V0Um93LmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nT3ZlcmxheSh0cnVlKTtcbiAgICB9XG59XG4iXX0=
7040
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFNSCxZQUFZLEVBQ1osZUFBZSxFQUNmLGVBQWUsRUFDZixTQUFTLEVBRVQsVUFBVSxFQUVWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFFTixLQUFLLEVBR0wsU0FBUyxFQUlULFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUVmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTywwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLG1EQUFtRCxDQUFDO0FBRXpHLE9BQU8s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QkFEaEMsS0FBSztnQkEwQksscUJBQXFCO3NCQUQvQixLQUFLO2dCQW1CSyxjQUFjO3NCQUR4QixLQUFLO2dCQWtCSyxZQUFZO3NCQUR0QixLQUFLO2dCQXVCSyxjQUFjO3NCQUR4QixLQUFLO2dCQXFCSyxZQUFZO3NCQUR0QixLQUFLO2dCQXFHSyxvQkFBb0I7c0JBRDlCLEtBQUs7Z0JBMENLLG1CQUFtQjtzQkFEN0IsS0FBSztnQkEyREsseUJBQXlCO3NCQURuQyxLQUFLO2dCQTZFSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBc0RLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBcURLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBc0JLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBc0JLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBK2dCQyxlQUFlO3NCQURyQixZQUFZO3VCQUFDLFlBQVk7Z0JBd3NCZixlQUFlO3NCQUR6QixLQUFLO2dCQW1ISyxNQUFNO3NCQURoQixLQUFLO2dCQWdWSyxZQUFZO3NCQUR0QixLQUFLO2dCQTBsQ0ssZ0JBQWdCO3NCQUQxQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQsIGZvcm1hdE51bWJlciwgZ2V0TG9jYWxlTnVtYmVyRm9ybWF0LCBOdW1iZXJGb3JtYXRTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBcHBsaWNhdGlvblJlZixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnRSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBjcmVhdGVDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBMT0NBTEVfSUQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXREYXRlLCByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgJ2lnbml0ZXVpLXRyaWFsLXdhdGVybWFyayc7XG5pbXBvcnQgeyBTdWJqZWN0LCBwaXBlLCBmcm9tRXZlbnQsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBmaXJzdCwgZmlsdGVyLCB0aHJvdHRsZVRpbWUsIG1hcCwgc2hhcmVSZXBsYXksIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lQXJyYXksIG1lcmdlT2JqZWN0cywgY29tcGFyZU1hcHMsIHJlc29sdmVOZXN0ZWRQYXRoLCBpc09iamVjdCwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncywgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90ZXh0LWhpZ2hsaWdodC90ZXh0LWhpZ2hsaWdodC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSVN1bW1hcnlFeHByZXNzaW9uIH0gZnJvbSAnLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5JztcbmltcG9ydCB7IFJvd0VkaXRQb3NpdGlvblN0cmF0ZWd5LCBJUGlubmluZ0NvbmZpZyB9IGZyb20gJy4vZ3JpZC5jb21tb24nO1xuaW1wb3J0IHsgSWd4R3JpZFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXIvZ3JpZC10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dEaXJlY3RpdmUgfSBmcm9tICcuL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgSWd4VG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy90b2dnbGUvdG9nZ2xlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSwgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZVxufSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb25zLXRyZWUnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ09wZXJhdGlvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctY29uZGl0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblR5cGUsIFRyYW5zYWN0aW9uU2VydmljZSwgU3RhdGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7XG4gICAgSWd4Um93QWRkVGV4dERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdFRleHREaXJlY3RpdmUsXG4gICAgSWd4Um93RWRpdEFjdGlvbnNEaXJlY3RpdmVcbn0gZnJvbSAnLi9ncmlkLnJvd0VkaXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEdyaWROYXZpZ2F0aW9uU2VydmljZSwgSUFjdGl2ZU5vZGUgfSBmcm9tICcuL2dyaWQtbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSwgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuL2ZpbHRlcmluZy9ncmlkLWZpbHRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXYXRjaENoYW5nZXMgfSBmcm9tICcuL3dhdGNoLWNoYW5nZXMnO1xuaW1wb3J0IHsgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJR3JpZFJlc291cmNlU3RyaW5ncyB9IGZyb20gJy4uL2NvcmUvaTE4bi9ncmlkLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UgfSBmcm9tICcuL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hTdW1tYXJ5Um93Q29tcG9uZW50IH0gZnJvbSAnLi9zdW1tYXJpZXMvc3VtbWFyeS1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4RWRpdFJvdywgSWd4Q2VsbCwgSWd4QWRkUm93IH0gZnJvbSAnLi9jb21tb24vY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzLCBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGVtcGxhdGUtb3V0bGV0L3RlbXBsYXRlX291dGxldC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2V4Y2VsLXN0eWxlLXNlYXJjaC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQgfSBmcm9tICcuL3Jlc2l6aW5nL3Jlc2l6ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoYXJTZXBhcmF0ZWRWYWx1ZURhdGEgfSBmcm9tICcuLi9zZXJ2aWNlcy9jc3YvY2hhci1zZXBhcmF0ZWQtdmFsdWUtZGF0YSc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UgfSBmcm9tICcuL3Jlc2l6aW5nL3Jlc2l6aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyaW5nU3RyYXRlZ3ksIElGaWx0ZXJpbmdTdHJhdGVneSB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHtcbiAgICBJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCBJZ3hIZWFkZXJFeHBhbmRJbmRpY2F0b3JEaXJlY3RpdmUsXG4gICAgSWd4SGVhZGVyQ29sbGFwc2VJbmRpY2F0b3JEaXJlY3RpdmUsIElneEV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlLCBJZ3hTb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZSxcbiAgICBJZ3hTb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmUsIElneFNvcnRIZWFkZXJJY29uRGlyZWN0aXZlXG59IGZyb20gJy4vZ3JpZC9ncmlkLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHtcbiAgICBHcmlkS2V5ZG93blRhcmdldFR5cGUsXG4gICAgR3JpZFNlbGVjdGlvbk1vZGUsXG4gICAgR3JpZFN1bW1hcnlQb3NpdGlvbixcbiAgICBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSxcbiAgICBGaWx0ZXJNb2RlLFxuICAgIENvbHVtblBpbm5pbmdQb3NpdGlvbixcbiAgICBSb3dQaW5uaW5nUG9zaXRpb24sXG4gICAgR3JpZFBhZ2luZ01vZGUsXG4gICAgR3JpZFZhbGlkYXRpb25UcmlnZ2VyXG59IGZyb20gJy4vY29tbW9uL2VudW1zJztcbmltcG9ydCB7XG4gICAgSUdyaWRDZWxsRXZlbnRBcmdzLFxuICAgIElSb3dTZWxlY3Rpb25FdmVudEFyZ3MsXG4gICAgSVBpbkNvbHVtbkV2ZW50QXJncyxcbiAgICBJR3JpZEVkaXRFdmVudEFyZ3MsXG4gICAgSVJvd0RhdGFFdmVudEFyZ3MsXG4gICAgSUNvbHVtblJlc2l6ZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3MsXG4gICAgSUNvbHVtbk1vdmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkS2V5ZG93bkV2ZW50QXJncyxcbiAgICBJUm93RHJhZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElSb3dEcmFnRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkQ2xpcGJvYXJkRXZlbnQsXG4gICAgSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzLFxuICAgIElTZWFyY2hJbmZvLFxuICAgIElDZWxsUG9zaXRpb24sXG4gICAgSVJvd1RvZ2dsZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Sb3dFdmVudEFyZ3MsXG4gICAgSUdyaWRTY3JvbGxFdmVudEFyZ3MsXG4gICAgSUdyaWRFZGl0RG9uZUV2ZW50QXJncyxcbiAgICBJQWN0aXZlTm9kZUNoYW5nZUV2ZW50QXJncyxcbiAgICBJU29ydGluZ0V2ZW50QXJncyxcbiAgICBJRmlsdGVyaW5nRXZlbnRBcmdzLFxuICAgIElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZEV2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5naW5nRXZlbnRBcmdzLFxuICAgIElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJnc1xufSBmcm9tICcuL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IHsgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9hZHZhbmNlZC1maWx0ZXJpbmcvYWR2YW5jZWQtZmlsdGVyaW5nLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBDb2x1bW5UeXBlLFxuICAgIEdyaWRTZXJ2aWNlVHlwZSxcbiAgICBHcmlkVHlwZSxcbiAgICBJR3JpZEZvcm1Hcm91cENyZWF0ZWRFdmVudEFyZ3MsXG4gICAgSUdyaWRWYWxpZGF0aW9uU3RhdHVzRXZlbnRBcmdzLFxuICAgIElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRSb3dEcmFnR2hvc3RDb250ZXh0LFxuICAgIElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkUm93RWRpdFRleHRUZW1wbGF0ZUNvbnRleHQsXG4gICAgSWd4R3JpZFJvd1RlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkVGVtcGxhdGVDb250ZXh0LFxuICAgIElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hSb3dTZWxlY3RvclRlbXBsYXRlQ29udGV4dCxcbiAgICBJR1hfR1JJRF9TRVJWSUNFX0JBU0UsXG4gICAgSVNpemVJbmZvLFxuICAgIFJvd1R5cGVcbn0gZnJvbSAnLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcFBvc2l0aW9uIH0gZnJvbSAnLi9tb3ZpbmcvbW92aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4SGVhZFNlbGVjdG9yRGlyZWN0aXZlLCBJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZSB9IGZyb20gJy4vc2VsZWN0aW9uL3Jvdy1zZWxlY3RvcnMnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29sdW1uR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hSb3dEcmFnR2hvc3REaXJlY3RpdmUsIElneERyYWdJbmRpY2F0b3JJY29uRGlyZWN0aXZlIH0gZnJvbSAnLi9yb3ctZHJhZy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4U25hY2tiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zbmFja2Jhci9zbmFja2Jhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBJZ3hBY3Rpb25TdHJpcENvbXBvbmVudCB9IGZyb20gJy4uL2FjdGlvbi1zdHJpcC9hY3Rpb24tc3RyaXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRSb3dDb21wb25lbnQgfSBmcm9tICcuL2dyaWQvZ3JpZC1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IElQYWdlRXZlbnRBcmdzIH0gZnJvbSAnLi4vcGFnaW5hdG9yL3BhZ2luYXRvci1pbnRlcmZhY2VzJztcbmltcG9ydCB7IElneFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXItcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkR3JvdXBCeUFyZWFDb21wb25lbnQgfSBmcm9tICcuL2dyb3VwaW5nL2dyaWQtZ3JvdXAtYnktYXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4RmxhdFRyYW5zYWN0aW9uRmFjdG9yeSwgVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uLWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBJU29ydGluZ09wdGlvbnMgfSBmcm9tICcuL2NvbHVtbnMvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBHcmlkU2VsZWN0aW9uUmFuZ2UsIElneEdyaWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFZlcnRpY2FsQWxpZ25tZW50LCBIb3Jpem9udGFsQWxpZ25tZW50LCBQb3NpdGlvblNldHRpbmdzLCBPdmVybGF5U2V0dGluZ3MgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS9wb3NpdGlvbi9jb25uZWN0ZWQtcG9zaXRpb25pbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgQ29udGFpbmVyUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24vY29udGFpbmVyLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbC9hYnNvbHV0ZS1zY3JvbGwtc3RyYXRlZ3knO1xuaW1wb3J0IHsgQWN0aW9uLCBTdGF0ZVVwZGF0ZUV2ZW50LCBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgSVNvcnRpbmdFeHByZXNzaW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSUdyaWRTb3J0aW5nU3RyYXRlZ3kgfSBmcm9tICcuL2NvbW1vbi9zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2V4Y2VsLXN0eWxlL2dyaWQuZXhjZWwtc3R5bGUtZmlsdGVyaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IH0gZnJvbSAnLi9maWx0ZXJpbmcvYmFzZS9ncmlkLWZpbHRlcmluZy1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IERlZmF1bHREYXRhQ2xvbmVTdHJhdGVneSwgSURhdGFDbG9uZVN0cmF0ZWd5IH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtY2xvbmUtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZENlbGxDb21wb25lbnQgfSBmcm9tICcuL2NlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4vZ3JpZC9ncmlkLXZhbGlkYXRpb24uc2VydmljZSc7XG5cbmxldCBGQUtFX1JPV19JRCA9IC0xO1xuY29uc3QgREVGQVVMVF9JVEVNU19QRVJfUEFHRSA9IDE1O1xuY29uc3QgTUlOSU1VTV9DT0xVTU5fV0lEVEggPSAxMzY7XG4vLyBCeSBkZWZhdWx0IHJvdyBlZGl0aW5nIG92ZXJsYXkgb3V0bGV0IGlzIGluc2lkZSBncmlkIGJvZHkgc28gdGhhdCBvdmVybGF5IGlzIGhpZGRlbiBiZWxvdyBncmlkIGhlYWRlciB3aGVuIHNjcm9sbGluZy5cbi8vIEluIGNhc2VzIHdoZW4gZ3JpZCBoYXMgMS0yIHJvd3MgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIGluIGdyaWQgYm9keSBhbmQgcm93IGVkaXRpbmcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd24gYWJvdmUgaGVhZGVyLlxuLy8gRGVmYXVsdCByb3cgZWRpdGluZyBvdmVybGF5IGhlaWdodCBpcyBoaWdoZXIgdGhlbiByb3cgaGVpZ2h0IHRoYXQgaXMgd2h5IHRoZSBjYXNlIGlzIHZhbGlkIGFsc28gZm9yIHJvdyB3aXRoIDIgcm93cy5cbi8vIE1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gaXMgbm90IHBvc3NpYmxlLCBjYXVzZSByb3cgZWRpdGluZyBvdmVybGF5IGlzIHN0aWxsIG5vdCBzaG93biBhbmQgd2UgZG9uJ3Qga25vdyBpdHMgaGVpZ2h0LFxuLy8gYnV0IGluIHRoZSBzYW1lIHRpbWUgd2UgbmVlZCB0byBzZXQgcm93IGVkaXRpbmcgb3ZlcmxheSBvdXRsZXQgYmVmb3JlIG9wZW5pbmcgdGhlIG92ZXJsYXkgaXRzZWxmLlxuY29uc3QgTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCA9IDI7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElneEdyaWRCYXNlRGlyZWN0aXZlIGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIGltcGxlbWVudHMgR3JpZFR5cGUsXG4gICAgT25Jbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkaXNwbGF5IHRpbWUgZm9yIHRoZSByb3cgYWRkaW5nIHNuYWNrYmFyIG5vdGlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyA2MDAwbXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc25hY2tiYXJEaXNwbGF5VGltZSA9IDYwMDA7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0byBhdXRvLWdlbmVyYXRlIHRoZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gV2hlbiBzZXQgdG8gdHJ1ZSwgaXQgd2lsbCBvdmVycmlkZSBhbGwgY29sdW1ucyBkZWNsYXJlZCB0aHJvdWdoIGNvZGUgb3IgaW4gbWFya3VwLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvR2VuZXJhdGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGNvbGxlY3Rpb25cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBjb2xsZWN0aW9uIGlzIG9ubHkgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGNoYW5naW5nIGl0IHdpbGwgbm90IGNhdXNlIGFueSBjaGFuZ2VzIGluIHRoZSBnZW5lcmF0ZWQgY29sdW1ucyBhdCBydW50aW1lXG4gICAgICogdW5sZXNzIHRoZSBncmlkIGlzIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkLiBUbyBtb2RpZnkgdGhlIGNvbHVtbnMgdmlzaWJsZSBpbiB0aGUgVUkgYXQgcnVudGltZSwgcGxlYXNlIHVzZSB0aGVpclxuICAgICAqIFtoaWRkZW5dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvZG9jcy90eXBlc2NyaXB0L2xhdGVzdC9jbGFzc2VzL0lneENvbHVtbkNvbXBvbmVudC5odG1sI2hpZGRlbikgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIGRhdGE9W0RhdGFdIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVFeGNsdWRlXT1cIlsnUHJvZHVjdE5hbWUnLCAnQ291bnQnXVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IERhdGEgPSBbeyAnSWQnOiAnMScsICdQcm9kdWN0TmFtZSc6ICduYW1lMScsICdEZXNjcmlwdGlvbic6ICdkZXNjcmlwdGlvbjEnLCAnQ291bnQnOiA1IH1dXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXV0b0dlbmVyYXRlRXhjbHVkZTogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgY29sdW1ucyBtb3ZpbmcgaXMgZW5hYmxlZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vdmluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHdoZW4gZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkVGVtcGxhdGVdPVwibXlUZW1wbGF0ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZW1wdHlHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIGZvciBhZGRpbmcgcm93IFVJIHdoZW4gZ3JpZCBpcyBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFthZGRSb3dFbXB0eVRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZFJvd0VtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHdoZW4gbG9hZGluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbaWRdPVwiJ2lneC1ncmlkLTEnXCIgW2RhdGFdPVwiRGF0YVwiIFtsb2FkaW5nR3JpZFRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxvYWRpbmdHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0L1NldCBJZ3hTdW1tYXJ5Um93IGhlaWdodFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBzdW1tYXJ5Um93SGVpZ2h0KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVJvd0hlaWdodCA9IHZhbHVlIHwgMDtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5zdW1tYXJ5SGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5yZWZsb3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VtbWFyeVJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5oYXNTdW1tYXJpemVkQ29sdW1ucyAmJiB0aGlzLnJvb3RTdW1tYXJpZXNFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeVJvd0hlaWdodCB8fCB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNhbGNNYXhTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNDb2x1bW5zVG9BdXRvc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuc29tZSh4ID0+IHgud2lkdGggPT09ICdmaXQtY29udGVudCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGF0YSBjbG9uZSBzdHJhdGVneSBvZiB0aGUgZ3JpZCB3aGVuIGluIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2RhdGFDbG9uZVN0cmF0ZWd5XT1cImN1c3RvbUNsb25lU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBkYXRhQ2xvbmVTdHJhdGVneSgpOiBJRGF0YUNsb25lU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUNsb25lU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkYXRhQ2xvbmVTdHJhdGVneShzdHJhdGVneTogSURhdGFDbG9uZVN0cmF0ZWd5KSB7XG4gICAgICAgIGlmIChzdHJhdGVneSkge1xuICAgICAgICAgICAgdGhpcy5fZGF0YUNsb25lU3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgY29weSBiZWhhdmlvciBvZiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjbGlwYm9hcmRPcHRpb25zID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgY29weSBiZWhhdmlvclxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluY2x1ZGUgdGhlIGNvbHVtbnMgaGVhZGVycyBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlIZWFkZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbHkgdGhlIGNvbHVtbnMgZm9ybWF0dGVycyAoaWYgYW55KSBvbiB0aGUgZGF0YSBpbiB0aGUgY2xpcGJvYXJkIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIGNvcHlGb3JtYXR0ZXJzOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNlcGFyYXRvciB1c2VkIGZvciBmb3JtYXR0aW5nIHRoZSBjb3B5IG91dHB1dC4gRGVmYXVsdHMgdG8gYFxcdGAuXG4gICAgICAgICAqL1xuICAgICAgICBzZXBhcmF0b3I6ICdcXHQnXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUgb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggZmlsdGVyaW5nIHdhcyBwZXJmb3JtZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UpPVwiZmlsdGVyaW5nRXhwclRyZWVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgIChhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSk9XCJhZHZhbmNlZEZpbHRlcmluZ0V4cHJUcmVlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBncmlkIGlzIHNjcm9sbGVkIGhvcml6b250YWxseS92ZXJ0aWNhbGx5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiXG4gICAgICogICAgICAgICAgICAgIChncmlkU2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBncmlkU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFNjcm9sbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYCBjb21wb25lbnQgaW5zdGVhZFxuICAgICAqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgY3VycmVudCBwYWdlIGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgICogICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYCBjb21wb25lbnQgaW5zdGVhZFxuICAgICAqXG4gICAgICogRW1pdHRlZCB3aGVuIGBwZXJQYWdlYCBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ3JpZCBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHBlclBhZ2VDaGFuZ2UpPVwib25QZXJQYWdlQ2hhbmdlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgb25QZXJQYWdlQ2hhbmdlKHBlclBhZ2U6IG51bWJlcikge1xuICAgICAqICAgdGhpcy5wZXJQYWdlID0gcGVyUGFnZTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBlclBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMi4wLiBXZSBzdWdnZXN0IHVzaW5nIGByb3dDbGFzc2VzYCBwcm9wZXJ0eSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN0eWxpbmcgY2xhc3NlcyBhcHBsaWVkIHRvIGFsbCBldmVuIGBJZ3hHcmlkUm93Q29tcG9uZW50YHMgaW4gdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2V2ZW5Sb3dDU1NdPVwiJ2lneC1ncmlkLS1teS1ldmVuLWNsYXNzJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZXZlblJvd0NTUyA9ICdpZ3gtZ3JpZF9fdHItLWV2ZW4nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4yLjAuIFdlIHN1Z2dlc3QgdXNpbmcgYHJvd0NsYXNzZXNgIHByb3BlcnR5IGluc3RlYWRcbiAgICAgKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3R5bGluZyBjbGFzc2VzIGFwcGxpZWQgdG8gYWxsIG9kZCBgSWd4R3JpZFJvd0NvbXBvbmVudGBzIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtldmVuUm93Q1NTXT1cIidpZ3gtZ3JpZC0tbXktb2RkLWNsYXNzJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb2RkUm93Q1NTID0gJ2lneC1ncmlkX190ci0tb2RkJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjb25kaXRpb25hbCBjbGFzcyBzZWxlY3RvciB0byB0aGUgZ3JpZCdzIHJvdyBlbGVtZW50LlxuICAgICAqIEFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwsIGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzLFxuICAgICAqIHdoZXJlIHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIENTUyBjbGFzcyBhbmQgdGhlIHZhbHVlIGlzXG4gICAgICogZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYm9vbGVhbiwgb3IgYm9vbGVhbiwgbGlrZSBzbzpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY2FsbGJhY2sgPSAocm93OiBSb3dUeXBlKSA9PiB7IHJldHVybiByb3cuc2VsZWN0ZWQgPiA2OyB9XG4gICAgICogcm93Q2xhc3NlcyA9IHsgJ2NsYXNzTmFtZScgOiB0aGlzLmNhbGxiYWNrIH07XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3Jvd0NsYXNzZXNdID0gXCJyb3dDbGFzc2VzXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dDbGFzc2VzOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNvbmRpdGlvbmFsIHN0eWxlIHByb3BlcnRpZXMgb24gdGhlIGdyaWQgcm93IGVsZW1lbnQuXG4gICAgICogSXQgYWNjZXB0cyBhbiBvYmplY3QgbGl0ZXJhbCB3aGVyZSB0aGUga2V5cyBhcmVcbiAgICAgKiB0aGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdGhlIHZhbHVlIGlzIGFuIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBzdHlsZXMgPSB7XG4gICAgICogIGJhY2tncm91bmQ6ICd5ZWxsb3cnLFxuICAgICAqICBjb2xvcjogKHJvdzogUm93VHlwZSkgPT4gcm93LnNlbGVjdGVkIDogJ3JlZCc6ICd3aGl0ZSdcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3Jvd1N0eWxlc109XCJzdHlsZXNcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd1N0eWxlcyA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcmltYXJ5S2V5OiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSB1bmlxdWUgdmFsdWVzIHN0cmF0ZWd5IHVzZWQgYnkgdGhlIEV4Y2VsIFN0eWxlIEZpbHRlcmluZ1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyBhIGNhbGxiYWNrIGZvciBsb2FkaW5nIHVuaXF1ZSBjb2x1bW4gdmFsdWVzIG9uIGRlbWFuZC5cbiAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIHByb3ZpZGVkLCB0aGUgdW5pcXVlIHZhbHVlcyBpdCBnZW5lcmF0ZXMgd2lsbCBiZSB1c2VkIGJ5IHRoZSBFeGNlbCBTdHlsZSBGaWx0ZXJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidleGNlbFN0eWxlRmlsdGVyJ1wiIFt1bmlxdWVDb2x1bW5WYWx1ZXNTdHJhdGVneV09XCJjb2x1bW5WYWx1ZXNTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3k6IChjb2x1bW46IENvbHVtblR5cGUsXG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgZG9uZTogKHZhbHVlczogYW55W10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB7IHJlYWQ6IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2soJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZm9ybUdyb3VwIGlzIGNyZWF0ZWQgb24gZWRpdCBvZiByb3cvY2VsbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAoZm9ybUdyb3VwQ3JlYXRlZCk9XCJmb3JtR3JvdXBDcmVhdGVkKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmb3JtR3JvdXBDcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEZvcm1Hcm91cENyZWF0ZWRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZ3JpZCdzIHZhbGlkYXRpb24gc3RhdHVzIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHZhbGlkYXRpb25TdGF0dXNDaGFuZ2UpPVwidmFsaWRhdGlvblN0YXR1c0NoYW5nZSgkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsaWRhdGlvblN0YXR1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRWYWxpZGF0aW9uU3RhdHVzRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChzZWxlY3RlZCk9XCJvbkNlbGxTZWxlY3QoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiAgRW1pdHRlZCB3aGVuIGBJZ3hHcmlkUm93Q29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAocm93U2VsZWN0aW9uQ2hhbmdpbmcpPVwicm93U2VsZWN0aW9uQ2hhbmdpbmcoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1NlbGVjdGlvbkNoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93U2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogIEVtaXR0ZWQgd2hlbiBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAoY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcpPVwiY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblNlbGVjdGlvbkNoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgYElneENvbHVtbkNvbXBvbmVudGAgaXMgcGlubmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjb2x1bW4gbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBwaW5uZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBpbmRleCB0aGF0IHRoZSBjb2x1bW4gaXMgaW5zZXJ0ZWQgYXQgbWF5IGJlIGNoYW5nZWQgdGhyb3VnaCB0aGUgYGluc2VydEF0SW5kZXhgIHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBjb2x1bW5QaW5uaW5nKGV2ZW50KSB7XG4gICAgICogICAgIGlmIChldmVudC5jb2x1bW4uZmllbGQgPT09IFwiTmFtZVwiKSB7XG4gICAgICogICAgICAgZXZlbnQuaW5zZXJ0QXRJbmRleCA9IDA7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGVudGVycyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdEVudGVyKT1cImVkaXRTdGFydCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXRFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgZXhpdHMgZWRpdCBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXRFeGl0KT1cImVkaXRFeGl0KCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdEV4aXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBoYXMgYmVlbiBlZGl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEV2ZW50IGlzIGZpcmVkIGFmdGVyIGVkaXRpbmcgaXMgY29tcGxldGVkLCB3aGVuIHRoZSBjZWxsIGlzIGV4aXRpbmcgZWRpdCBtb2RlLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdCk9XCJlZGl0RG9uZSgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY2VsbCBoYXMgYmVlbiBlZGl0ZWQgYW5kIGVkaXRpbmcgaGFzIGJlZW4gY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBleGl0aW5nIGVkaXQgbW9kZSBmb3IgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93IGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdCh0cnVlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyByb3dzIGR1cmluZyBlZGl0IG1vZGUsIHNlbGVjdGluZyBhbiB1bi1lZGl0YWJsZSBjZWxsIGluIHRoZSBlZGl0ZWQgcm93LFxuICAgICAqIHBlcmZvcm1pbmcgcGFnaW5nIG9wZXJhdGlvbiwgY29sdW1uIHJlc2l6aW5nLCBwaW5uaW5nLCBtb3Zpbmcgb3IgaGl0dGluZyBgRG9uZWBcbiAgICAgKiBidXR0b24gaW5zaWRlIG9mIHRoZSByb3dFZGl0aW5nT3ZlcmxheSwgb3IgaGl0dGluZyB0aGUgYEVudGVyYCBrZXkgd2hpbGUgZWRpdGluZyBhIGNlbGwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdERvbmUpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcm93IGVkaXRpbmcgaXMgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXRzIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KGZhbHNlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyBoaXR0aW5nIGBFc2NgIGtleSBkdXJpbmcgY2VsbCBlZGl0aW5nIGFuZCB3aGVuIGNsaWNrIG9uIHRoZSBgQ2FuY2VsYCBidXR0b25cbiAgICAgKiBpbiB0aGUgcm93IGVkaXRpbmcgb3ZlcmxheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbHVtbiBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtbkluaXQpPVwiaW5pdENvbHVtbnMoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbkluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHNvcnRpbmcgZXhwcmVzc2lvbnMgYXJlIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElTb3J0aW5nRXZlbnRBcmdzYCBvYmplY3QuIGBzb3J0aW5nRXhwcmVzc2lvbnNgIGtleSBob2xkcyB0aGUgc29ydGluZyBleHByZXNzaW9ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKHNvcnRpbmcpPVwic29ydGluZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHNvcnRpbmcgaXMgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChzb3J0aW5nRG9uZSk9XCJzb3J0aW5nRG9uZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc29ydGluZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbiB8IElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJRmlsdGVyaW5nRXZlbnRBcmdzYCBvYmplY3QuIGBmaWx0ZXJpbmdFeHByZXNzaW9uc2Aga2V5IGhvbGRzIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBjb2x1bW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChmaWx0ZXJpbmcpPVwiZmlsdGVyaW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgVUkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyB0cmVlIG9mIHRoZSBjb2x1bW4gZm9yIHdoaWNoIGZpbHRlcmluZyB3YXMgcGVyZm9ybWVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZmlsdGVyaW5nRG9uZSk9XCJmaWx0ZXJpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBmaWx0ZXJpbmdEb25lID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBFbWl0dGVkIGFmdGVyIHBhZ2luZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBvYmplY3QgY29uc2lzdGluZyBvZiB0aGUgcHJldmlvdXMgYW5kIG5leHQgcGFnZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChwYWdpbmdEb25lKT1cInBhZ2luZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhZ2luZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElQYWdlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZvciB0aGUgbmV3IGBJZ3hHcmlkUm93Q29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dBZGRlZCk9XCJyb3dBZGRlZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGRlbGV0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElSb3dEYXRhRXZlbnRBcmdzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dEZWxldGVkKT1cInJvd0RlbGV0ZWQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1taXRlZCB3aGVuIGRlbGV0aW5nIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogUmV0dXJucyBhbiBgSUdyaWRFZGl0RXZlbnRBcmdzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dEZWxldGUpPVwicm93RGVsZXRlKCRldmVudClcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQganVzdCBiZWZvcmUgdGhlIG5ld2x5IGFkZGVkIHJvdyBpcyBjb21taXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIFJldHVybnMgYW4gYElHcmlkRWRpdEV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93QWRkKT1cInJvd0FkZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNvbHVtbiBpcyByZXNpemVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QncyBvbGQgYW5kIG5ldyB3aWR0aC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtblJlc2l6ZWQpPVwicmVzaXppbmcoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5SZXNpemVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIHJpZ2h0IGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAgb2JqZWN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbnRleHRNZW51KT1cImNvbnRleHRNZW51KCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb250ZXh0TWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBpcyBkb3VibGUgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChkb3VibGVDbGljayk9XCJkYmxDbGljaygkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZG91YmxlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIGNvbHVtbiB2aXNpYmlsaXR5IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFyZ3M6IHsgY29sdW1uOiBhbnksIG5ld1ZhbHVlOiBib29sZWFuIH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2luZyk9XCJ2aXNpYmlsaXR5Q2hhbmdpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblZpc2liaWxpdHlDaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY29sdW1uIHZpc2liaWxpdHkgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQXJnczogeyBjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgbmV3VmFsdWU6IGJvb2xlYW4gfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAoY29sdW1uVmlzaWJpbGl0eUNoYW5nZWQpPVwidmlzaWJpbGl0eUNoYW5nZWQoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblZpc2liaWxpdHlDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY29sdW1uIG1vdmluZyBzdGFydHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIG1vdmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtbk1vdmluZ1N0YXJ0KT1cIm1vdmluZ1N0YXJ0KCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbk1vdmluZ1N0YXJ0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBkdXJpbmcgdGhlIGNvbHVtbiBtb3Zpbmcgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3RzLiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIChjb2x1bW5Nb3ZpbmcpPVwibW92aW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY29sdW1uIG1vdmluZyBlbmRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3RzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAoY29sdW1uTW92aW5nRW5kKT1cIm1vdmluZ0VuZHMoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbk1vdmluZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbk1vdmluZ0VuZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBrZXlkb3duIGlzIHRyaWdnZXJlZCBvdmVyIGVsZW1lbnQgaW5zaWRlIGdyaWQncyBib2R5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIG9ubHkgaWYgdGhlIGtleSBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQgaW4gdGhlIGdyaWQuXG4gICAgICogUmV0dXJuIHRoZSB0YXJnZXQgdHlwZSwgdGFyZ2V0IG9iamVjdCBhbmQgdGhlIG9yaWdpbmFsIGV2ZW50LiBUaGlzIGV2ZW50IGlzIGNhbmNlbGFibGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAoZ3JpZEtleWRvd24pPVwiY3VzdG9tS2V5ZG93bigkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZ3JpZEtleWRvd24gPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkS2V5ZG93bkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBzdGFydCBkcmFnZ2luZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJuIHRoZSBkcmFnZ2VkIHJvdy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RHJhZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RHJhZ1N0YXJ0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRyb3BwaW5nIGEgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm4gdGhlIGRyb3BwZWQgcm93LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RHJhZ0VuZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvcHkgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGaXJlZCBvbmx5IGlmIGNvcHkgYmVoYXZpb3IgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBbYGNsaXBib2FyZE9wdGlvbnNgXXtAbGluayBJZ3hHcmlkQmFzZURpcmVjdGl2ZSNjbGlwYm9hcmRPcHRpb25zfS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZ3JpZENvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2xpcGJvYXJkRXZlbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBleHBhbnNpb25TdGF0ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE1hcDxhbnksIGJvb2xlYW4+PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBleHBhbmRlZCBzdGF0ZSBvZiBhIHJvdyBnZXRzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKHJvd1RvZ2dsZSk9XCJyb3dUb2dnbGUoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1RvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1RvZ2dsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGlubmVkIHN0YXRlIG9mIGEgcm93IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKHJvd1Bpbm5pbmcpPVwicm93UGluKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dQaW5uaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluUm93RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBwaW5uZWQgc3RhdGUgb2YgYSByb3cgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJlbXBsb3llZURhdGFcIiAocm93UGlubmVkKT1cInJvd1BpbigkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93UGlubmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluUm93RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1taXRlZCB3aGVuIHRoZSBhY3RpdmUgbm9kZSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChhY3RpdmVOb2RlQ2hhbmdlKT1cImFjdGl2ZU5vZGVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFjdGl2ZU5vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElBY3RpdmVOb2RlQ2hhbmdlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc29ydGluZyBpcyBwZXJmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChzb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UpPVwic29ydGluZ0V4cHJDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHNvcnRpbmdFeHByZXNzaW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFeHByZXNzaW9uW10+KCk7XG5cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhbiBleHBvcnQgcHJvY2VzcyBpcyBpbml0aWF0ZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0b29sYmFyRXhwb3J0aW5nKGV2ZW50OiBJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3Mpe1xuICAgICAqICAgICBjb25zdCB0b29sYmFyRXhwb3J0aW5nID0gZXZlbnQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB0b29sYmFyRXhwb3J0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKiBFbmQgb2YgdG9vbGJhciByZWxhdGVkIGRlZmluaXRpb25zICovXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbWFraW5nIGEgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSYW5nZSBzZWxlY3Rpb24gY2FuIGJlIG1hZGUgZWl0aGVyIHRocm91Z2ggZHJhZyBzZWxlY3Rpb24gb3IgdGhyb3VnaCBrZXlib2FyZCBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJhbmdlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRTZWxlY3Rpb25SYW5nZT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIGFmdGVyIHRoZSBuZ0FmdGVyVmlld0luaXQgaG9vay4gQXQgdGhpcyBwb2ludCB0aGUgZ3JpZCBleGlzdHMgaW4gdGhlIERPTSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW5kZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGxvY2FsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHRoZSBncmlkJ3MgZGF0YSB2aWV3IGlzIGNoYW5nZWQgYmVjYXVzZSBvZiBhIGRhdGEgb3BlcmF0aW9uLCByZWJpbmRpbmcsIGV0Yy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGRhdGFDaGFuZ2luZyk9J2hhbmRsZURhdGFDaGFuZ2luZ0V2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRhdGFDaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUZvck9mRGF0YUNoYW5naW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciB0aGUgZ3JpZCdzIGRhdGEgdmlldyBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YgYSBkYXRhIG9wZXJhdGlvbiwgcmViaW5kaW5nLCBldGMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChkYXRhQ2hhbmdlZCk9J2hhbmRsZURhdGFDaGFuZ2VkRXZlbnQoKSc+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZGF0YUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneFNuYWNrYmFyQ29tcG9uZW50KVxuICAgIHB1YmxpYyBhZGRSb3dTbmFja2JhcjogSWd4U25hY2tiYXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQpXG4gICAgcHVibGljIHJlc2l6ZUxpbmU6IElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsb2FkaW5nT3ZlcmxheScsIHsgcmVhZDogSWd4VG9nZ2xlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ092ZXJsYXk6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBsb2FkaW5nT3V0bGV0OiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneENvbHVtbkNvbXBvbmVudCwgeyByZWFkOiBJZ3hDb2x1bW5Db21wb25lbnQsIGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIGNvbHVtbkxpc3Q6IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+ID0gbmV3IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KCk7XG5cbiAgICBAQ29udGVudENoaWxkKElneEFjdGlvblN0cmlwQ29tcG9uZW50KVxuICAgIHB1YmxpYyBhY3Rpb25TdHJpcDogSWd4QWN0aW9uU3RyaXBDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEEgdGVtcGxhdGUgcmVmZXJlbmNlIGZvciB0aGUgdGVtcGxhdGUgd2hlbiB0aGUgZmlsdGVyZWQgZ3JpZCBpcyBlbXB0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogY29uc3QgZW1wdHlUZW1wYWx0ZSA9IHRoaXMuZ3JpZC5lbXB0eUdyaWRUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdlbXB0eUZpbHRlcmVkR3JpZCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBlbXB0eUZpbHRlcmVkR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSByZWZlcmVuY2UgZm9yIHRoZSB0ZW1wbGF0ZSB3aGVuIHRoZSBncmlkIGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBlbXB0eVRlbXBhbHRlID0gdGhpcy5ncmlkLmVtcHR5R3JpZFRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFbXB0eUdyaWQnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZW1wdHlHcmlkRGVmYXVsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0TG9hZGluZ0dyaWQnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ0dyaWREZWZhdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicsIHsgcmVhZDogSWd4R3JpZEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcGFyZW50VmlydERpcjogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBoZWFkU2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIHJvd1NlbGVjdG9yc1RlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneFJvd1NlbGVjdG9yVGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dEcmFnR2hvc3REaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBkcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RHJhZ0dob3N0Q29udGV4dD4+O1xuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdXNlZCBmb3Igcm93IGRyYWcgZ2hvc3QuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUgfHwgdGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZXMuZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIHJvdyBkcmFnIGdob3N0LlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RHJhZ0dob3N0PlxuICAgICAqICAgIDxpZ3gtaWNvbj5tZW51PC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RHJhZ0dob3N0Q29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndmVydGljYWxTY3JvbGxDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndmVydGljYWxTY3JvbGxIb2xkZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHZlcnRpY2FsU2Nyb2xsOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc2NyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgc2NyOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnaGVhZFNlbGVjdG9yQmFzZVRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlclNlbGVjdG9yQmFzZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdmb290ZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwdWJsaWMgZm9vdGVyOiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIGdldCBoZWFkZXJDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJGb3JPZjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlclNlbGVjdG9yQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVyU2VsZWN0b3JDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXJEcmFnQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVyRHJhZ0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdz8uaGVhZGVyR3JvdXBDb250YWluZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdSb3coKTogSWd4R3JpZEZpbHRlcmluZ1Jvd0NvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5maWx0ZXJSb3c7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0aGVhZFJvdzogSWd4R3JpZEhlYWRlclJvd0NvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50KVxuICAgIHB1YmxpYyBncm91cEFyZWE6IElneEdyaWRHcm91cEJ5QXJlYUNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndGJvZHknLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0Ym9keTogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncGluQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgcHVibGljIHBpbkNvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndGZvb3QnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB0Zm9vdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneFJvd0VkaXRpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcm93RWRpdGluZ091dGxldERpcmVjdGl2ZTogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUZW1wbGF0ZU91dGxldERpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyB0bXBPdXRsZXRzOiBRdWVyeUxpc3Q8YW55PiA9IG5ldyBRdWVyeUxpc3Q8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RyYWdJbmRpY2F0b3JJY29uQmFzZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkcmFnSW5kaWNhdG9ySWNvbkJhc2U6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRlbXBsYXRlRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93RWRpdEN1c3RvbURpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUZXh0RGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSwgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93RWRpdFRleHREaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZXh0VGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgZWRpdCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dFZGl0VGV4dFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RWRpdFRleHRUZW1wbGF0ZSB8fCB0aGlzLnJvd0VkaXRUZXh0RGlyZWN0aXZlcy5maXJzdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGVkaXQgdGV4dCB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFJvd0VkaXRUZXh0IGxldC1yb3dDaGFuZ2VzQ291bnQ+XG4gICAgICogQ2hhbmdlczoge3tyb3dDaGFuZ2VzQ291bnR9fVxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnJvd0VkaXRUZXh0VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93RWRpdFRleHRUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZXh0VGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9yb3dFZGl0VGV4dFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFJvd0FkZFRleHREaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgcm93QWRkVGV4dDogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBhZGQgdGV4dCB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93QWRkVGV4dFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93QWRkVGV4dFRlbXBsYXRlIHx8IHRoaXMucm93QWRkVGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGFkZCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93QWRkVGV4dD5cbiAgICAgKiBBZGRpbmcgUm93XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQucm93QWRkVGV4dFRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHJvd0FkZFRleHRUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9yb3dBZGRUZXh0VGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdEFjdGlvbnNEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IGZhbHNlLCByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdEFjdGlvbnNUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBlZGl0IGFjdGlvbnMgdGVtcGxhdGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRBY3Rpb25zVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRBY3Rpb25zVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFZGl0QWN0aW9uc1RlbXBsYXRlIHx8IHRoaXMucm93RWRpdEFjdGlvbnNEaXJlY3RpdmVzLmZpcnN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZWRpdCBhY3Rpb25zIHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RWRpdEFjdGlvbnMgbGV0LWVuZFJvd0VkaXQ+XG4gICAgICogPGJ1dHRvbiBpZ3hCdXR0b24gaWd4Um93RWRpdFRhYlN0b3AgKGNsaWNrKT1cImVuZFJvd0VkaXQoZmFsc2UpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICogPGJ1dHRvbiBpZ3hCdXR0b24gaWd4Um93RWRpdFRhYlN0b3AgKGNsaWNrKT1cImVuZFJvd0VkaXQodHJ1ZSlcIj5BcHBseTwvYnV0dG9uPlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnJvd0VkaXRBY3Rpb25zVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93RWRpdEFjdGlvbnNUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRBY3Rpb25zVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9yb3dFZGl0QWN0aW9uc1RlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgcm93IGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hSb3dFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSByb3cgY29sbGFwc2UgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgZXhwYW5kIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckV4cGFuZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBoZWFkZXJFeHBhbmRJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGNvbGxhcHNlIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckNvbGxhcHNlSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBleHBhbmQgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZXhjZWwgc3R5bGUgaGVhZGVyIGljb24uXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlIHx8IHRoaXMuZXhjZWxTdHlsZUhlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBleGNlbCBzdHlsZSBoZWFkZXIgaWNvbi5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4RXhjZWxTdHlsZUhlYWRlckljb24+XG4gICAgICogPGlneC1pY29uPmZpbHRlcl9hbHQ8L2lneC1pY29uPlxuICAgICAqPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBwdWJsaWMgc2V0IGV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2V4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNvcnRBc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHNvcnRBc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIHNvcnRlZCBpbiBhc2Mgb3JkZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgc29ydGluZyBpbmRpY2F0b3Igd2hlbiBjb2x1bW5zIGFyZSBzb3J0ZWQgaW4gYXNjIG9yZGVyLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4U29ydEFzY2VuZGluZ0hlYWRlckljb24+XG4gICAgICogICAgPGlneC1pY29uPmV4cGFuZF9sZXNzPC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgc29ydERlc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIHNvcnRlZCBpbiBkZXNjIG9yZGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjdXN0b20gdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIHNvcnRlZCBpbiBkZXNjIG9yZGVyLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4U29ydERlc2NlbmRpbmdIZWFkZXJJY29uPlxuICAgICAqICAgIDxpZ3gtaWNvbj5leHBhbmRfbW9yZTwvaWd4LWljb24+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBzb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTb3J0SGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBzb3J0SGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgbm90IHNvcnRlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc29ydEhlYWRlckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0SGVhZGVySWNvblRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjdXN0b20gdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIGhlYWRlciBzb3J0aW5nIGluZGljYXRvciB3aGVuIGNvbHVtbnMgYXJlIG5vdCBzb3J0ZWQuXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hTb3J0SGVhZGVySWNvbj5cbiAgICAgKiAgICA8aWd4LWljb24+dW5mb2xkX21vcmU8L2lneC1pY29uPlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCIndGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuc29ydEhlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBzb3J0SGVhZGVySWNvblRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9zb3J0SGVhZGVySWNvblRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4RHJhZ0luZGljYXRvckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHB1YmxpYyBkcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlKVxuICAgIHB1YmxpYyByb3dFZGl0VGFic0RFRkFVTFQ6IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgcm93RWRpdFRhYnNDVVNUT006IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Jvd0VkaXRpbmdPdmVybGF5JywgeyByZWFkOiBJZ3hUb2dnbGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgcm93RWRpdGluZ092ZXJsYXk6IElneFRvZ2dsZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGhvc3RSb2xlID0gJ2dyaWQnO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hHcmlkVG9vbGJhckNvbXBvbmVudClcbiAgICBwdWJsaWMgdG9vbGJhcjogUXVlcnlMaXN0PElneEdyaWRUb29sYmFyQ29tcG9uZW50PjtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4UGFnaW5hdG9yQ29tcG9uZW50KVxuICAgIHByb3RlY3RlZCBwYWdpbmF0aW9uQ29tcG9uZW50czogUXVlcnlMaXN0PElneFBhZ2luYXRvckNvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfb3V0bGV0RGlyZWN0aXZlOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdENvbGxhcHNlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVTRkhlYWRlckljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEVTRkhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3N1bW1hcnlSb3cnLCB7IHJlYWQ6IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSlcbiAgICBwcm90ZWN0ZWQgX3N1bW1hcnlSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4U3VtbWFyeVJvd0NvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdyb3cnKVxuICAgIHByaXZhdGUgX3Jvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3Bpbm5lZFJvdycpXG4gICAgcHJpdmF0ZSBfcGlubmVkUm93TGlzdDogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0Um93RWRpdFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBkZWZhdWx0Um93RWRpdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dD47XG5cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0RpcmVjdGl2ZSwgeyByZWFkOiBJZ3hSb3dEaXJlY3RpdmUgfSlcbiAgICBwcml2YXRlIF9kYXRhUm93TGlzdDogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT47XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBwcml2YXRlIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKCdpZ3gtZ3JpZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJR3JpZFJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc291cmNlU3RyaW5ncygpOiBJR3JpZFJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIGlmICghdGhpcy5fcmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBDdXJyZW50UmVzb3VyY2VTdHJpbmdzLkdyaWRSZXNTdHJpbmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBmaWx0ZXJpbmcgbG9naWMgb2YgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgaXMgQU5ELlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgW2ZpbHRlcmluZ0xvZ2ljXT1cImZpbHRlcmluZ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmluZ0xvZ2ljKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyaW5nTG9naWModmFsdWU6IEZpbHRlcmluZ0xvZ2ljKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5vcGVyYXRvciA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIHN0YXRlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbKGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSldPVwibW9kZWwuZmlsdGVyaW5nRXhwcmVzc2lvbnNcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAodmFsdWUgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWwuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQsIHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0uZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3RXhwcmVzc2lvbnNUcmVlLmZpbHRlcmluZ09wZXJhbmRzLnB1c2godmFsLmZpbHRlcmluZ09wZXJhbmRzW2luZGV4XSBhcyBJRmlsdGVyaW5nRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gPSBuZXdFeHByZXNzaW9uc1RyZWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZS50eXBlID0gRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlVHlwZS5SZWd1bGFyO1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1BpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZS5lbWl0KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVFbXB0eSh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLnJlZnJlc2hFeHByZXNzaW9ucygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHRoaXMuZ3JpZC5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAgKiB0aGlzLmdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBsb2dpYztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuQWR2YW5jZWQ7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkgJiZcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZmlsdGVyaW5nRG9uZS5lbWl0KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBsb2NhbGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG5vdCBzZXQsIHJldHVybnMgYnJvd3NlcidzIGxhbmd1YWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fbG9jYWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZUNoYW5nZS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ01vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmdNb2RlKHZhbDogR3JpZFBhZ2luZ01vZGUpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nTW9kZSA9IHZhbDtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIERlZmluZSBgaWd4LXBhZ2luYXRvcmAgYXMgYSBncmlkIGNoaWxkIGNvbXBvbmVudCBhbmQgcGFnaW5nIHdpbGwgYmUgZW5hYmxlZCwgb3RoZXJ3aXNlIGRpc2FibGVkLlxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIHBhZ2luZyBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRlZmF1bHQgc3RhdGUgaXMgZGlzYWJsZWQgKGZhbHNlKS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIG9sZCAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtwYWdpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICpcbiAgICAgKiA8IS0tIG5ldyAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICAgPGlneC1wYWdpbmF0b3I+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2luZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhZ2luZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9wYWdpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgYHBhZ2VgIHByb3BlcnR5IGZyb20gYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0YW5jZSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogR2V0cy9TZXRzIHRoZSBjdXJyZW50IHBhZ2UgaW5kZXguXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gb2xkIC0tPlxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3BhZ2VdPVwibW9kZWwucGFnZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICpcbiAgICAgKiA8IS0tIG5ldyAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICAgPGlneC1wYWdpbmF0b3IgWyhwYWdlKV09XCJtb2RlbC5wYWdlXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGJpbmRpbmcuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy5wYWdlIHx8IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgYHBlclBhZ2VgIHByb3BlcnR5IGZyb20gYGlneC1wYWdpbmF0b3JgIGNvbXBvbmVudCBpbnN0YW5jZSBpbnN0ZWFkXG4gICAgICpcbiAgICAgKiBHZXRzL1NldHMgdGhlIG51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIHBlciBwYWdlLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IGlzIDE1LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gb2xkIC0tPlxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3BlclBhZ2VdPVwibW9kZWwucGVyUGFnZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICpcbiAgICAgKiA8IS0tIG5ldyAtLT5cbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPlxuICAgICAqICAgPGlneC1wYWdpbmF0b3IgWyhwZXJQYWdlKV09XCJtb2RlbC5wZXJQYWdlXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBlclBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy5wZXJQYWdlIHx8IERFRkFVTFRfSVRFTVNfUEVSX1BBR0U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwZXJQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3BlclBhZ2UgPSB2YWw7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgcm93IHNlbGVjdG9ycyBhcmUgaGlkZGVuLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgQnkgZGVmYXVsdCByb3cgc2VsZWN0b3JzIGFyZSBzaG93blxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoaWRlUm93U2VsZWN0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZVJvd1NlbGVjdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhpZGVSb3dTZWxlY3RvcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faGlkZVJvd1NlbGVjdG9ycyA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgcm93cyBjYW4gYmUgbW92ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW3Jvd0RyYWdnYWJsZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93RHJhZyAmJiB0aGlzLmhhc1Zpc2libGVDb2x1bW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgdHJpZ2dlciBmb3IgdmFsaWRhdG9ycyB1c2VkIHdoZW4gZWRpdGluZyB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCB2YWxpZGF0aW9uVHJpZ2dlcj0nYmx1cic+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWxpZGF0aW9uVHJpZ2dlcjogR3JpZFZhbGlkYXRpb25UcmlnZ2VyID0gJ2NoYW5nZSc7XG5cblxuICAgIHB1YmxpYyBzZXQgcm93RHJhZ2dhYmxlKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yb3dEcmFnID0gdmFsO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IElEIHRoYXQgaXMgYmVpbmcgZHJhZ2dlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHJvdyBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkcmFnUm93SUQgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgdGhlIHJvd3MgYXJlIGVkaXRhYmxlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW3Jvd0VkaXRhYmxlXT1cInRydWVcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiID48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93RWRpdGFibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3JpZFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcm93RWRpdGFibGUgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgcHVibGljIGdldCBob3N0V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aCB8fCB0aGlzLl9ob3N0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBncmlkV2lkdGggPSB0aGlzLmdyaWQud2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3aWR0aCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgaGVhZGVyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogbGV0IGdyaWRIZWFkZXJXaWR0aCA9IHRoaXMuZ3JpZC5oZWFkZXJXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcldpZHRoKCkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIC0gMTc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtyb3dIZWlnaHRdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm93SGVpZ2h0ID8gdGhpcy5fcm93SGVpZ2h0IDogdGhpcy5kZWZhdWx0Um93SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93SGVpZ2h0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3Jvd0hlaWdodCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtjb2x1bW5XaWR0aF09XCIxMDBcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sdW1uV2lkdGgodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldC9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbZW1wdHlHcmlkTWVzc2FnZV09XCInVGhlIGdyaWQgaXMgZW1wdHknXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZW1wdHlHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5R3JpZE1lc3NhZ2UgPSB2YWx1ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBlbXB0eUdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUdyaWRNZXNzYWdlIHx8IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX2VtcHR5R3JpZF9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBncmlkIGlzIGdvaW5nIHRvIHNob3cgYSBsb2FkaW5nIGluZGljYXRvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2lzTG9hZGluZ109XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgaXNMb2FkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0xvYWRpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0xvYWRpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW5zIHNob3VsZCBiZSBhdXRvLWdlbmVyYXRlZCBvbmNlIGFnYWluIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ3JpZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdG8gYmluZCB0aGUgZ3JpZCB0byByZW1vdGUgZGF0YSBhbmQgaGF2aW5nIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgY29sdW1ucywgdGhpcyBwcm9wZXJ0eSB3b3VsZCBiZSBkaXNhYmxlZCB0byBhdm9pZCByZS1jcmVhdGluZ1xuICAgICAqIGNvbHVtbnMgZWFjaCB0aW1lIGEgbmV3IGRhdGEgaXMgYXNzaWduZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5zaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3VsZEdlbmVyYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzIGFuZCB0aGUgZ3JpZCBpcyBmaWx0ZXJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgfHwgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZW1wdHlGaWx0ZXJlZEdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGluaXRpYWwgcGlubmluZyBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbGxvd3MgdG8gYXBwbHkgcGlubmluZyB0aGUgY29sdW1ucyB0byB0aGUgc3RhcnQgb3IgdGhlIGVuZC5cbiAgICAgKiBOb3RlIHRoYXQgcGlubmluZyB0byBib3RoIHNpZGVzIGF0IGEgdGltZSBpcyBub3QgYWxsb3dlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW3Bpbm5pbmddPVwicGlubmluZ0NvbmZpZ1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBpbm5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uaW5nO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHBpbm5pbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9waW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmluZyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93RmlsdGVyaW5nXT1cInRydWVcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBhbGxvd0ZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93RmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYWxsb3dGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93QWR2YW5jZWRGaWx0ZXJpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGFsbG93QWR2YW5jZWRGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyIG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlck1vZGVdPVwiJ3F1aWNrRmlsdGVyJ1wiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0J3Mgc2V0IHRvIEZpbHRlck1vZGUucXVpY2tGaWx0ZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZpbHRlck1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJNb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyTW9kZSh2YWx1ZTogRmlsdGVyTW9kZSkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIEZpbHRlck1vZGUuZXhjZWxTdHlsZUZpbHRlcjpcbiAgICAgICAgICAgIGNhc2UgRmlsdGVyTW9kZS5xdWlja0ZpbHRlcjpcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJNb2RlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3VtbWFyeSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBzdW1tYXJ5UG9zaXRpb249XCJ0b3BcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyBib3R0b20uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcnlQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlQb3NpdGlvbih2YWx1ZTogR3JpZFN1bW1hcnlQb3NpdGlvbikge1xuICAgICAgICB0aGlzLl9zdW1tYXJ5UG9zaXRpb24gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzdW1tYXJ5IGNhbGN1bGF0aW9uIG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZT1cInJvb3RMZXZlbE9ubHlcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyByb290QW5kQ2hpbGRMZXZlbHMgd2hpY2ggbWVhbnMgdGhlIHN1bW1hcmllcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGhlIHJvb3QgbGV2ZWwgYW5kIGVhY2ggY2hpbGQgbGV2ZWwuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSh2YWx1ZTogR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSA9IHZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnJlc2V0U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgc3VtbWFyeSByb3cgaXMgdmlzaWJsZSB3aGVuIGdyb3VwQnkvcGFyZW50IHJvdyBpcyBjb2xsYXBzZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3Nob3dTdW1tYXJ5T25Db2xsYXBzZV09XCJ0cnVlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlIGlzIHNldCB0byAnZmFsc2UnIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN1bW1hcnkgcm93IGlzIG5vdCB2aXNpYmxlXG4gICAgICogd2hlbiB0aGUgZ3JvdXBCeS9wYXJlbnQgcm93IGlzIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd1N1bW1hcnlPbkNvbGxhcHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBzdHJhdGVneSBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2ZpbHRlclN0cmF0ZWd5XT1cImZpbHRlclN0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyU3RyYXRlZ3koKTogSUZpbHRlcmluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlclN0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyU3RyYXRlZ3koY2xhc3NSZWY6IElGaWx0ZXJpbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLl9maWx0ZXJTdHJhdGVneSA9IGNsYXNzUmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc29ydGluZyBzdHJhdGVneSBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW3NvcnRTdHJhdGVneV09XCJzb3J0U3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0U3RyYXRlZ3koKTogSUdyaWRTb3J0aW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZ1N0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc29ydFN0cmF0ZWd5KHZhbHVlOiBJR3JpZFNvcnRpbmdTdHJhdGVneSkge1xuICAgICAgICB0aGlzLl9zb3J0aW5nU3RyYXRlZ3kgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHNvcnRpbmcgb3B0aW9ucyAtIHNpbmdsZSBvciBtdWx0aXBsZSBzb3J0aW5nLlxuICAgICAqIEFjY2VwdHMgYW4gYElTb3J0aW5nT3B0aW9uc2Agb2JqZWN0IHdpdGggYW55IG9mIHRoZSBgbW9kZWAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IF9zb3J0aW5nT3B0aW9uczogSVNvcnRpbmdPcHRpb25zID0ge1xuICAgICAqICAgICAgbW9kZTogJ3NpbmdsZSdcbiAgICAgKiB9XG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbc29ydGluZ09wdGlvbnNdPVwic29ydGluZ09wdGlvbnNcIj48aWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHNvcnRpbmdPcHRpb25zKHZhbHVlOiBJU29ydGluZ09wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jbGVhclNvcnQoKTtcbiAgICAgICAgdGhpcy5fc29ydGluZ09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NvcnRpbmdPcHRpb25zLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3J0aW5nT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdPcHRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcHJlc2VudHMgdGhlIHNlbGVjdGVkIHJvd3MnIElEcyAocHJpbWFyeSBrZXkgb3Igcm93RGF0YSlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgcHJpbWFyeUtleT1cIklEXCIgcm93U2VsZWN0aW9uPVwibXVsdGlwbGVcIiBbc2VsZWN0ZWRSb3dzXT1cIlswLCAxLCAyXVwiPjxpZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyB8fCBbXSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFJvd3MoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkUm93cygpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCBgSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGhlYWRlckdyb3Vwc0xpc3QgPSB0aGlzLmdyaWQuaGVhZGVyR3JvdXBzTGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3Vwc0xpc3QoKTogSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVhZFJvdy5ncm91cHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCBgSWd4R3JpZEhlYWRlckNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoZWFkZXJzID0gdGhpcy5ncmlkLmhlYWRlckNlbGxMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2VsbExpc3QoKTogSWd4R3JpZEhlYWRlckNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5tYXAoaGVhZGVyR3JvdXAgPT4gaGVhZGVyR3JvdXAuaGVhZGVyKS5maWx0ZXIoaGVhZGVyID0+IGhlYWRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFsbCBgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlsdGVyQ2VsbHMgPSB0aGlzLmdyaWQuZmlsdGVyQ2VsbExpc3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJDZWxsTGlzdCgpOiBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5tYXAoZ3JvdXAgPT4gZ3JvdXAuZmlsdGVyKS5maWx0ZXIoY2VsbCA9PiBjZWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyaWVzUm93TGlzdCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxhbnk+KCk7XG4gICAgICAgIGlmICghdGhpcy5fc3VtbWFyeVJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3VtTGlzdCA9IHRoaXMuX3N1bW1hcnlSb3dMaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbCk7XG4gICAgICAgIHJlcy5yZXNldChzdW1MaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYElneEdyaWRSb3dDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgcm93TGlzdCA9IHRoaXMuZ3JpZC5yb3dMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93TGlzdCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxJZ3hSb3dEaXJlY3RpdmU+KCk7XG4gICAgICAgIGlmICghdGhpcy5fcm93TGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByTGlzdCA9IHRoaXMuX3Jvd0xpc3RcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IG51bGwpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICByZXMucmVzZXQockxpc3QpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBjdXJyZW50bHkgcmVuZGVyZWQgYElneEdyaWRSb3dDb21wb25lbnRgJ3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBkYXRhTGlzdCA9IHRoaXMuZ3JpZC5kYXRhUm93TGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFSb3dMaXN0KCk6IFF1ZXJ5TGlzdDxJZ3hSb3dEaXJlY3RpdmU+IHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxJZ3hSb3dEaXJlY3RpdmU+KCk7XG4gICAgICAgIGlmICghdGhpcy5fZGF0YVJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgckxpc3QgPSB0aGlzLl9kYXRhUm93TGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIHJlcy5yZXNldChyTGlzdCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGVhZGVyIHJvdyBzZWxlY3RvciB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVhZFNlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkU2VsZWN0b3JUZW1wbGF0ZSB8fCB0aGlzLmhlYWRTZWxlY3RvcnNUZW1wbGF0ZXMuZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGVhZGVyIHJvdyBzZWxlY3RvciB0ZW1wbGF0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hIZWFkU2VsZWN0b3IgbGV0LWhlYWRDb250ZXh0PlxuICAgICAqIHt7IGhlYWRDb250ZXh0LnNlbGVjdGVkQ291bnQgfX0gLyB7eyBoZWFkQ29udGV4dC50b3RhbENvdW50ICB9fVxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCIndGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuaGVhZFNlbGVjdG9yVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgaGVhZFNlbGVjdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5faGVhZFNlbGVjdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Bpbm5pbmdUb1N0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uaW5nLmNvbHVtbnMgIT09IENvbHVtblBpbm5pbmdQb3NpdGlvbi5FbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSb3dQaW5uaW5nVG9Ub3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5pbmcucm93cyAhPT0gUm93UGlubmluZ1Bvc2l0aW9uLkJvdHRvbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgc2VsZWN0b3IgdGVtcGxhdGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdG9yVGVtcGxhdGUgfHwgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXMuZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgICAqIFNldHMgYSBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSByb3cgc2VsZWN0b3JzLlxuICAgICAgICAgKiBgYGBodG1sXG4gICAgICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93U2VsZWN0b3IgbGV0LXJvd0NvbnRleHQ+XG4gICAgICAgICAqICAgIDxpZ3gtY2hlY2tib3ggW2NoZWNrZWRdPVwicm93Q29udGV4dC5zZWxlY3RlZFwiPjwvaWd4LWNoZWNrYm94PlxuICAgICAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAgICAgKiB0aGlzLmdyaWQucm93U2VsZWN0b3JUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHJvd1NlbGVjdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneFJvd1NlbGVjdG9yVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9yb3dTZWxlY3RvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdGluZ091dGxldERpcmVjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFyZW50Um93T3V0bGV0RGlyZWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRsZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDdXN0b20oKTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgaWYgKHRoaXMucm93RWRpdEN1c3RvbURpcmVjdGl2ZXMgJiYgdGhpcy5yb3dFZGl0Q3VzdG9tRGlyZWN0aXZlcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdEN1c3RvbURpcmVjdGl2ZXMuZmlyc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93RWRpdENvbnRhaW5lcigpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0Q3VzdG9tID8gdGhpcy5yb3dFZGl0Q3VzdG9tIDogdGhpcy5kZWZhdWx0Um93RWRpdFRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgcm93IGRyYWcgaW5kaWNhdG9yIGljb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgfHwgdGhpcy5kcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlcy5maXJzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY3VzdG9tIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIHJvdyBkcmFnIGluZGljYXRvciBpY29uLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4RHJhZ0luZGljYXRvckljb24+XG4gICAgICogICAgPGlneC1pY29uPmV4cGFuZF9sZXNzPC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSh2YWw6IFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fY3VzdG9tRHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlyc3RFZGl0YWJsZUNvbHVtbkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lZGl0YWJsZSlcbiAgICAgICAgICAgIC5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICByZXR1cm4gaW5kZXgubGVuZ3RoID8gaW5kZXhbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBsYXN0RWRpdGFibGVDb2x1bW5JbmRleCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZWRpdGFibGUpXG4gICAgICAgICAgICAubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgPiBiID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIGluZGV4Lmxlbmd0aCA/IGluZGV4WzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIFRPRE86IE5hdiBzZXJ2aWNlIGxvZ2ljIGRvZXNuJ3QgaGFuZGxlIDAgcmVzdWx0cyBmcm9tIHRoaXMgcXVlcnlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0VGFicygpOiBRdWVyeUxpc3Q8SWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdFRhYnNDVVNUT00ubGVuZ3RoID8gdGhpcy5yb3dFZGl0VGFic0NVU1RPTSA6IHRoaXMucm93RWRpdFRhYnNERUZBVUxUO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aXZlRGVzY2VuZGFudCgpIHtcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbSA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuXG4gICAgICAgIGlmICghYWN0aXZlRWxlbSB8fCAhT2JqZWN0LmtleXMoYWN0aXZlRWxlbSkubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY3RpdmVFbGVtLnJvdyA8IDAgP1xuICAgICAgICAgICAgYCR7dGhpcy5pZH1fJHthY3RpdmVFbGVtLnJvd31fJHthY3RpdmVFbGVtLm1jaENhY2hlLmxldmVsfV8ke2FjdGl2ZUVsZW0uY29sdW1ufWAgOlxuICAgICAgICAgICAgYCR7dGhpcy5pZH1fJHthY3RpdmVFbGVtLnJvd31fJHthY3RpdmVFbGVtLmNvbHVtbn1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmFubmVyQ2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LmlzVG9wID8gJ2lneC1iYW5uZXJfX2JvcmRlci10b3AnIDogJ2lneC1iYW5uZXJfX2JvcmRlci1ib3R0b20nO1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5nZXRDb21wb25lbnREZW5zaXR5Q2xhc3MoJ2lneC1iYW5uZXInKX0gJHtwb3NpdGlvbn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc29ydGluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBkYXRhIGJpbmRpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbKHNvcnRpbmdFeHByZXNzaW9ucyldPVwibW9kZWwuc29ydGluZ0V4cHJlc3Npb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc29ydGluZ0V4cHJlc3Npb25zKCk6IElTb3J0aW5nRXhwcmVzc2lvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNvcnRpbmdFeHByZXNzaW9ucyh2YWx1ZTogSVNvcnRpbmdFeHByZXNzaW9uW10pIHtcbiAgICAgICAgdGhpcy5fc29ydGluZ0V4cHJlc3Npb25zID0gY2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlLmVtaXQodGhpcy5fc29ydGluZ0V4cHJlc3Npb25zKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heExldmVsSGVhZGVyRGVwdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhMZXZlbEhlYWRlckRlcHRoID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhMZXZlbEhlYWRlckRlcHRoID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IE1hdGgubWF4KGFjYywgY29sLnJvd1N0YXJ0KSwgMCkgOlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMucmVkdWNlKChhY2MsIGNvbCkgPT4gTWF0aC5tYXgoYWNjLCBjb2wubGV2ZWwpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgaGlkZGVuIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBoaWRkZW5Db2wgPSB0aGlzLmdyaWQuaGlkZGVuQ29sdW1uc0NvdW50O1xuICAgICAqIGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoaWRkZW5Db2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wuY29sdW1uR3JvdXAgPT09IGZhbHNlICYmIGNvbC5oaWRkZW4gPT09IHRydWUpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcGlubmVkIGNvbHVtbnMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5lZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkxheW91dCkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBncmlkIGhhcyBiYXRjaCBlZGl0aW5nIGVuYWJsZWQuXG4gICAgICogV2hlbiBiYXRjaCBlZGl0aW5nIGlzIGVuYWJsZWQsIGNoYW5nZXMgYXJlIG5vdCBtYWRlIGRpcmVjdGx5IHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEuXG4gICAgICogSW5zdGVhZCwgdGhleSBhcmUgc3RvcmVkIGFzIHRyYW5zYWN0aW9ucywgd2hpY2ggY2FuIGxhdGVyIGJlIGNvbW1pdHRlZCB3LyB0aGUgYGNvbW1pdGAgbWV0aG9kLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtiYXRjaEVkaXRpbmddPVwidHJ1ZVwiIFtkYXRhXT1cInNvbWVEYXRhXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYmF0Y2hFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmF0Y2hFZGl0aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYmF0Y2hFZGl0aW5nKHZhbDogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsICE9PSB0aGlzLl9iYXRjaEVkaXRpbmcpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90cmFuc2FjdGlvbnM7XG4gICAgICAgICAgICB0aGlzLl9iYXRjaEVkaXRpbmcgPSB2YWw7XG4gICAgICAgICAgICB0aGlzLnN3aXRjaFRyYW5zYWN0aW9uU2VydmljZSh2YWwpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1RyYW5zYWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRyYW5zYWN0aW9ucyBzZXJ2aWNlIGZvciB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYW5zYWN0aW9ucygpOiBUcmFuc2FjdGlvblNlcnZpY2U8VHJhbnNhY3Rpb24sIFN0YXRlPiB7XG4gICAgICAgIGlmICh0aGlzLl9kaVRyYW5zYWN0aW9ucyAmJiAhdGhpcy5iYXRjaEVkaXRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaVRyYW5zYWN0aW9ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50Um93U3RhdGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVuY3lQb3NpdGlvbkxlZnQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW5jeVBvc2l0aW9uTGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlLCBOdW1iZXJGb3JtYXRTdHlsZS5DdXJyZW5jeSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdFBhcnRzID0gZm9ybWF0LnNwbGl0KCcsJyk7XG4gICAgICAgIGNvbnN0IGkgPSBmb3JtYXRQYXJ0cy5pbmRleE9mKGZvcm1hdFBhcnRzLmZpbmQoYyA9PiBjLmluY2x1ZGVzKCfCpCcpKSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW5jeVBvc2l0aW9uTGVmdCA9IGkgPCAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBjZWxsIHNlbGVjdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBjZWxsIHNlbGVjdGlvbiBtb2RlIGlzIG11bHRpcGxlXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNlbGxTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jZWxsU2VsZWN0aW9uTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNlbGxTZWxlY3Rpb24oc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fY2VsbFNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICAvLyBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyByb3cgc2VsZWN0aW9uIG1vZGVcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCB0aGUgcm93IHNlbGVjdGlvbiBtb2RlIGlzICdub25lJ1xuICAgICAqIE5vdGUgdGhhdCBpbiBJZ3hHcmlkIGFuZCBJZ3hIaWVyYXJjaGljYWxHcmlkICdtdWx0aXBsZUNhc2NhZGUnIGJlaGF2ZXMgbGlrZSAnbXVsdGlwbGUnXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dTZWxlY3Rpb24oc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGU7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRSb3dzKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgY29sdW1uIHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyBub25lXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGNvbHVtblNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb2x1bW5TZWxlY3Rpb24oc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uU2VsZWN0aW9uTW9kZSA9IHNlbGVjdGlvbk1vZGU7XG4gICAgICAgIC8vIGlmICh0aGlzLmdyaWRBUEkuZ3JpZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJBbGxTZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHBhZ2luZ1N0YXRlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luZ1N0YXRlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvciAmJiAhdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gdmFsdWUubWV0YWRhdGEuY291bnRSZWNvcmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdpbmdTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ1N0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJvd0VkaXRNZXNzYWdlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc25hY2tiYXJBY3Rpb25UZXh0ID0gdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2FjdGlvbnRleHQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWxjV2lkdGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWxjSGVpZ2h0ID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0Zm9vdEhlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVRyYW5zaXRpb25zID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBsYXN0U2VhcmNoSW5mbzogSVNlYXJjaEluZm8gPSB7XG4gICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgZXhhY3RNYXRjaDogZmFsc2UsXG4gICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgIG1hdGNoSW5mb0NhY2hlOiBbXVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5XaWR0aFNldEJ5VXNlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGlubmVkUmVjb3JkczogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbm5lZFJlY29yZHM6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVuZGVyZWQkID0gdGhpcy5yZW5kZXJlZC5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSkpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlc2l6ZU5vdGlmeSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcm93QWRkZWROb3RpZmllciA9IG5ldyBTdWJqZWN0PElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJvd0RlbGV0ZWROb3RpZmllciA9IG5ldyBTdWJqZWN0PElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHBpcGVUcmlnZ2VyTm90aWZpZXIgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIF9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIF9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YTogYW55W107XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgX2ZpbHRlcmVkUGlubmVkRGF0YTogYW55W107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIF9maWx0ZXJlZFVucGlubmVkRGF0YTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfZGVzdHJveWVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3RvdGFsUmVjb3JkcyA9IC0xO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbHVtbnNXaXRoTm9TZXRXaWR0aHMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpcGVUcmlnZ2VyID0gMDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdQaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3VtbWFyeVBpcGVUcmlnZ2VyID0gMDtcblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBFTVBUWV9EQVRBID0gW107XG5cbiAgICBwdWJsaWMgaXNQaXZvdCA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIF9iYXNlRm9udFNpemU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9wZXJQYWdlID0gREVGQVVMVF9JVEVNU19QRVJfUEFHRTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9wYWdpbmcgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9wYWdpbmdNb2RlID0gR3JpZFBhZ2luZ01vZGUuTG9jYWw7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5nU3RhdGU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGlkZVJvd1NlbGVjdG9ycyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Jvd0RyYWcgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Bpbm5lZENvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfdW5waW5uZWRDb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kKTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zb3J0aW5nRXhwcmVzc2lvbnM6IEFycmF5PElTb3J0aW5nRXhwcmVzc2lvbj4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tYXhMZXZlbEhlYWRlckRlcHRoID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb2x1bW5IaWRpbmcgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb2x1bW5QaW5uaW5nID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX3Bpbm5lZFJlY29yZElEcyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgcHJvdGVjdGVkIF9hbGxvd0ZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYWxsb3dBZHZhbmNlZEZpbHRlcmluZyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyTW9kZTogRmlsdGVyTW9kZSA9IEZpbHRlck1vZGUucXVpY2tGaWx0ZXI7XG5cblxuICAgIHByb3RlY3RlZCBfZGVmYXVsdFRhcmdldFJlY29yZE51bWJlciA9IDEwO1xuICAgIHByb3RlY3RlZCBfZXhwYW5zaW9uU3RhdGVzOiBNYXA8YW55LCBib29sZWFuPiA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdEV4cGFuZFN0YXRlID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9oZWFkZXJGZWF0dXJlc1dpZHRoID0gTmFOO1xuICAgIHByb3RlY3RlZCBfaW5pdCA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9jZHJSZXF1ZXN0UmVwYWludCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfdXNlck91dGxldERpcmVjdGl2ZTogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcbiAgICBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT47XG4gICAgcHJvdGVjdGVkIF9iYXRjaEVkaXRpbmcgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3NvcnRpbmdPcHRpb25zOiBJU29ydGluZ09wdGlvbnMgPSB7IG1vZGU6ICdtdWx0aXBsZScgfTtcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlclN0cmF0ZWd5OiBJRmlsdGVyaW5nU3RyYXRlZ3kgPSBuZXcgRmlsdGVyaW5nU3RyYXRlZ3koKTtcbiAgICBwcm90ZWN0ZWQgX2F1dG9HZW5lcmF0ZWRDb2xzID0gW107XG4gICAgcHJvdGVjdGVkIF9kYXRhVmlldyA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBwYWdpbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb25Db21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2Nyb2xsU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsTmF0aXZlU2l6ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jvd0VkaXRhYmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY3VycmVudFJvd1N0YXRlOiBhbnk7XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWRTb3J0ZWREYXRhID0gbnVsbDtcbiAgICBwcml2YXRlIF9maWx0ZXJlZERhdGEgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY3VzdG9tRHJhZ0luZGljYXRvckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PjtcbiAgICBwcml2YXRlIF9leGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PjtcbiAgICBwcml2YXRlIF9yb3dTZWxlY3RvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hSb3dTZWxlY3RvclRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfaGVhZFNlbGVjdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93RWRpdFRleHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZXh0VGVtcGxhdGVDb250ZXh0PjtcbiAgICBwcml2YXRlIF9yb3dBZGRUZXh0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93RWRpdEFjdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRBY3Rpb25zVGVtcGxhdGVDb250ZXh0PjtcbiAgICBwcml2YXRlIF9kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0RyYWdHaG9zdENvbnRleHQ+O1xuXG4gICAgcHJpdmF0ZSBfY2RyUmVxdWVzdHMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3M7XG4gICAgcHJpdmF0ZSBfZW1wdHlHcmlkTWVzc2FnZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlID0gbnVsbDtcbiAgICBwcml2YXRlIF9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgICBwcml2YXRlIG92ZXJsYXlJRHMgPSBbXTtcbiAgICBwcml2YXRlIF9zb3J0aW5nU3RyYXRlZ3k6IElHcmlkU29ydGluZ1N0cmF0ZWd5O1xuICAgIHByaXZhdGUgX3Bpbm5pbmc6IElQaW5uaW5nQ29uZmlnID0geyBjb2x1bW5zOiBDb2x1bW5QaW5uaW5nUG9zaXRpb24uU3RhcnQgfTtcblxuICAgIHByaXZhdGUgX2hvc3RXaWR0aDtcbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nUG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdQb3NpdGlvblNldHRpbmdzKSxcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjb2x1bW5MaXN0RGlmZmVyO1xuICAgIHByaXZhdGUgcm93TGlzdERpZmZlcjtcbiAgICBwcml2YXRlIF9oZWlnaHQ6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfcm93SGVpZ2h0O1xuICAgIHByaXZhdGUgX2hvcml6b250YWxGb3JPZnM6IEFycmF5PElneEdyaWRGb3JPZkRpcmVjdGl2ZTxhbnk+PiA9IFtdO1xuICAgIHByaXZhdGUgX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IDE7XG4gICAgLy8gQ2FjaGVzXG4gICAgcHJpdmF0ZSBfdG90YWxXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF9waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfcGlubmVkV2lkdGggPSBOYU47XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF92aXNpYmxlQ29sdW1ucyA9IFtdO1xuICAgIHByaXZhdGUgX2NvbHVtbkdyb3VwcyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfY29sdW1uV2lkdGg6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3N1bW1hcnlQb3NpdGlvbjogR3JpZFN1bW1hcnlQb3NpdGlvbiA9IEdyaWRTdW1tYXJ5UG9zaXRpb24uYm90dG9tO1xuICAgIHByaXZhdGUgX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlID0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUucm9vdEFuZENoaWxkTGV2ZWxzO1xuICAgIHByaXZhdGUgX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N1bW1hcnlSb3dIZWlnaHQgPSAwO1xuICAgIHByaXZhdGUgX2NlbGxTZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlO1xuICAgIHByaXZhdGUgX3Jvd1NlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICBwcml2YXRlIF9zZWxlY3RSb3dPbkNsaWNrID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG5cbiAgICBwcml2YXRlIGxhc3RBZGRlZFJvd0luZGV4O1xuICAgIHByaXZhdGUgX2N1cnJlbmN5UG9zaXRpb25MZWZ0OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneSA9IG5ldyBSb3dFZGl0UG9zaXRpb25TdHJhdGVneSh7XG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogbnVsbFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG91dGxldDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3lcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbkNoYW5nZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX3JlbmRlcmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBEUkFHX1NDUk9MTF9ERUxUQSA9IDEwO1xuICAgIHByaXZhdGUgX2RhdGFDbG9uZVN0cmF0ZWd5OiBJRGF0YUNsb25lU3RyYXRlZ3kgPSBuZXcgRGVmYXVsdERhdGFDbG9uZVN0cmF0ZWd5KCk7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9zb3J0SGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuICAgIHByaXZhdGUgX3NvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgbWluQ29sdW1uV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyBhYnN0cmFjdCBkYXRhOiBhbnlbXSB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aGUgZmlsdGVyZWQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBmaWx0ZXJlZERhdGEgPSB0aGlzLmdyaWQuZmlsdGVyZWREYXRhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyZWREYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZmlsdGVyZWQgc29ydGVkIGRhdGEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBmaWx0ZXJlZFNvcnRlZERhdGEgPSB0aGlzLmdyaWQxLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkU29ydGVkRGF0YSgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0NoYW5nZXNDb3VudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNydWRTZXJ2aWNlLnJvdykge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZiA9IChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSAwO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiBpc09iamVjdChvYmpba2V5XSkgPyBjaGFuZ2VzICs9IGYob2JqW2tleV0pIDogY2hhbmdlcysrKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZ2V0U3RhdGUodGhpcy5jcnVkU2VydmljZS5yb3cuaWQpPy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maWx0ZXIoYyA9PiBjLmZpZWxkKS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93Q2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRWYWx1ZSh0aGlzLmNydWRTZXJ2aWNlLnJvdy5pZCwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gcm93Q2hhbmdlcyA/IGYocm93Q2hhbmdlcykgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhV2l0aEFkZGVkSW5UcmFuc2FjdGlvblJvd3MoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNsb25lQXJyYXkodGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSgpKTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRDaGFuZ2VzKHRydWUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcih0ID0+IHQudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFERClcbiAgICAgICAgICAgICAgICAubWFwKHQgPT4gdC5uZXdWYWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3J1ZFNlcnZpY2Uucm93ICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93LmdldENsYXNzTmFtZSgpID09PSBJZ3hBZGRSb3cubmFtZSkge1xuICAgICAgICAgICAgcmVzdWx0LnNwbGljZSh0aGlzLmNydWRTZXJ2aWNlLnJvdy5pbmRleCwgMCwgdGhpcy5jcnVkU2VydmljZS5yb3cuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCA/IHRoaXMuZGF0YVdpdGhBZGRlZEluVHJhbnNhY3Rpb25Sb3dzLmxlbmd0aCA6IHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgJiYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlciB8fCB0aGlzLmhhc05vRGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgPyB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgOiB0aGlzLmxvYWRpbmdHcmlkRGVmYXVsdFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgPyB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlIDogdGhpcy5lbXB0eUZpbHRlcmVkR3JpZFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzTm9EYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA/IHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgOiB0aGlzLmVtcHR5R3JpZERlZmF1bHRUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaGFzWmVyb1Jlc3VsdEZpbHRlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0IGhhc05vRGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhTGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG91bGRPdmVybGF5TG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nICYmICF0aGlzLmhhc05vRGF0YSAmJiAhdGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZVxuICAgICAgICAgICAgfHwgdGhpcy5yb3dTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlQ2FzY2FkZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSb3dTZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ2VsbFNlbGVjdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkluRHJhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5jbXMuY29sdW1uO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgdmFsaWRhdGlvbjogSWd4R3JpZFZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgc2VsZWN0aW9uU2VydmljZTogSWd4R3JpZFNlbGVjdGlvblNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjb2xSZXNpemluZ1NlcnZpY2U6IElneENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgQEluamVjdChJR1hfR1JJRF9TRVJWSUNFX0JBU0UpIHB1YmxpYyBncmlkQVBJOiBHcmlkU2VydmljZVR5cGUsXG4gICAgICAgIHByb3RlY3RlZCB0cmFuc2FjdGlvbkZhY3Rvcnk6IElneEZsYXRUcmFuc2FjdGlvbkZhY3RvcnksXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHB1YmxpYyBkb2N1bWVudDogYW55LFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJvdGVjdGVkIGVudkluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBwdWJsaWMgbmF2aWdhdGlvbjogSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZmlsdGVyaW5nU2VydmljZTogSWd4RmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgcHVibGljIHN1bW1hcnlTZXJ2aWNlOiBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIGxvY2FsZUlkOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KElneEdyaWRUcmFuc2FjdGlvbikgcHJvdGVjdGVkIF9kaVRyYW5zYWN0aW9ucz86IFRyYW5zYWN0aW9uU2VydmljZTxUcmFuc2FjdGlvbiwgU3RhdGU+XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlIHx8IHRoaXMubG9jYWxlSWQ7XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25GYWN0b3J5LmNyZWF0ZShUUkFOU0FDVElPTl9UWVBFLk5vbmUpO1xuICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMuY2xvbmVTdHJhdGVneSA9IHRoaXMuZGF0YUNsb25lU3RyYXRlZ3k7XG4gICAgICAgIHRoaXMuY2RyLmRldGFjaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgICBwdWJsaWMgaGlkZUFjdGlvblN0cmlwKCkge1xuICAgICAgICB0aGlzLmFjdGlvblN0cmlwPy5oaWRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyRmVhdHVyZXNXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0RldGFpbFJlY29yZChfcmVjKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzR3JvdXBCeVJlY29yZChfcmVjKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0dob3N0UmVjb3JkKHJlY29yZDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZWNvcmQuZ2hvc3RSZWNvcmQgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNBZGRSb3dSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5hZGRSb3cgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmV0dXJucyB0aGUgcm93IGluZGV4IG9mIGEgcm93IHRoYXQgdGFrZXMgaW50byBhY2NvdW50IHRoZSBmdWxsIHZpZXcgZGF0YSBsaWtlIHBpbm5pbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldERhdGFWaWV3SW5kZXgocm93SW5kZXgsIHBpbm5lZCkge1xuICAgICAgICBpZiAocGlubmVkICYmICF0aGlzLmlzUm93UGlubmluZ1RvVG9wKSB7XG4gICAgICAgICAgICByb3dJbmRleCA9IHJvd0luZGV4ICsgdGhpcy51bnBpbm5lZERhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmICghcGlubmVkICYmIHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3ApIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyB0aGlzLnBpbm5lZERhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93SW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRGV0YWlscygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSBncmlkIHZpcnR1YWxpemF0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJbmNsdWRlcyB0aGUgc3RhcnQgaW5kZXggYW5kIGhvdyBtYW55IHJlY29yZHMgYXJlIHJlbmRlcmVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyaWRWaXJ0U3RhdGUgPSB0aGlzLmdyaWQxLnZpcnR1YWxpemF0aW9uU3RhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXJ0dWFsaXphdGlvblN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHNldCB2aXJ0dWFsaXphdGlvblN0YXRlKHN0YXRlKSB7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhpZGVPdmVybGF5cygpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5SURzLmZvckVhY2gob3ZlcmxheUlEID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKG92ZXJsYXlJRCk7XG5cbiAgICAgICAgICAgIGlmIChvdmVybGF5Py52aXNpYmxlICYmICFvdmVybGF5LmNsb3NlQW5pbWF0aW9uUGxheWVyPy5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmhpZGUob3ZlcmxheUlEKTtcblxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY29yZCBpcyBwaW5uZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvd0luZGV4IEluZGV4IG9mIHRoZSByZWNvcmQgaW4gdGhlIGBkYXRhVmlld2AgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWRCeVZpZXdJbmRleChyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgKHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPCB0aGlzLnBpbm5lZERhdGFWaWV3Lmxlbmd0aCkgfHxcbiAgICAgICAgICAgICghdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA+PSB0aGlzLnVucGlubmVkRGF0YVZpZXcubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlY29yZCBpcyBwaW5uZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJvd0luZGV4IEluZGV4IG9mIHRoZSByZWNvcmQgaW4gdGhlIGBmaWx0ZXJlZFNvcnRlZERhdGFgIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1Bpbm5lZFJlY29yZHMgJiYgKHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPCB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGEubGVuZ3RoKSB8fFxuICAgICAgICAgICAgKCF0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4ID49IHRoaXMuX2ZpbHRlcmVkU29ydGVkVW5waW5uZWREYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZChyZWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5pdGlhbFBpbm5lZEluZGV4KHJlYykgIT09IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBSZXR1cm5zIHRoZSByZWNvcmQgaW5kZXggaW4gb3JkZXIgb2YgcGlubmluZyBieSB0aGUgdXNlci4gRG9lcyBub3QgY29uc2lkZXIgc29ydGluZy9maWx0ZXJpbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldEluaXRpYWxQaW5uZWRJbmRleChyZWMpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pZChyZWMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2YoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1Bpbm5lZFJlY29yZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSZWNvcmRzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNydWRTZXJ2aWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmNydWRTZXJ2aWNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3NldHVwU2VydmljZXMoKSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgICAgICB0aGlzLnZhbGlkYXRpb24uZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgICAgICB0aGlzLm5hdmlnYXRpb24uZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF9zZXR1cExpc3RlbmVycygpIHtcbiAgICAgICAgY29uc3QgZGVzdHJ1Y3RvciA9IHRha2VVbnRpbDxhbnk+KHRoaXMuZGVzdHJveSQpO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy5uYXRpdmVFbGVtZW50LCAnZm9jdXNvdXQnKS5waXBlKGZpbHRlcigoKSA9PiAhIXRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlKSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNydWRTZXJ2aWNlLmNlbGwgJiZcbiAgICAgICAgICAgICAgICAhIXRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlICYmXG4gICAgICAgICAgICAgICAgKChldmVudC50YXJnZXQgPT09IHRoaXMudGJvZHkubmF0aXZlRWxlbWVudCAmJiB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZS5yb3cgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZS5yb3cgPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHx8IChldmVudC50YXJnZXQgPT09IHRoaXMudGZvb3QubmF0aXZlRWxlbWVudCAmJiB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZS5yb3cgPT09IHRoaXMuZGF0YVZpZXcubGVuZ3RoKSkgJiZcbiAgICAgICAgICAgICAgICAhKHRoaXMucm93RWRpdGFibGUgJiYgdGhpcy5jcnVkU2VydmljZS5yb3dFZGl0aW5nQmxvY2tlZCAmJiB0aGlzLmNydWRTZXJ2aWNlLnJvd0luRWRpdE1vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmxhc3RBY3RpdmVOb2RlID0gdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgPSB7fSBhcyBJQWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm93QWRkZWROb3RpZmllci5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZShhcmdzID0+IHRoaXMucmVmcmVzaEdyaWRTdGF0ZShhcmdzKSk7XG4gICAgICAgIHRoaXMucm93RGVsZXRlZE5vdGlmaWVyLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKGFyZ3MgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5kZWxldGVPcGVyYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZShhcmdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1RyYW5zYWN0aW9ucygpO1xuXG4gICAgICAgIHRoaXMucmVzaXplTm90aWZ5LnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpLFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgZGVzdHJ1Y3RvclxuICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHRyaWdnZXIgcmVmbG93IGlmIGVsZW1lbnQgaXMgZGV0YWNoZWQuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvY3VtZW50LmNvbnRhaW5zKHRoaXMubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlck5vdGlmaWVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5waXBlVHJpZ2dlcisrKTtcbiAgICAgICAgdGhpcy5jb2x1bW5Nb3ZpbmdFbmQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZXZlbnQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0aWFsaXplKHRoaXMgYXMgYW55LCB0aGlzLm92ZXJsYXlTZXJ2aWNlLCBldmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9wZW5lZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5ncyA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQoZXZlbnQuaWQpPy5zZXR0aW5ncztcblxuICAgICAgICAgICAgLy8gZG8gbm90IGhpZGUgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBvdmVybGF5IG9uIHNjcm9sbFxuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZXZlbnQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5sYXN0QWN0aXZlTm9kZSA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5xdWVyeUJ1aWxkZXIuc2V0QWRkQnV0dG9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkbyBub3QgaGlkZSB0aGUgb3ZlcmxheSBpZiBpdCdzIGF0dGFjaGVkIHRvIGEgcm93XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0aW5nT3ZlcmxheT8ub3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG92ZXJsYXlTZXR0aW5ncz8ub3V0bGV0ID09PSB0aGlzLm91dGxldCAmJiB0aGlzLm92ZXJsYXlJRHMuaW5kZXhPZihldmVudC5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnB1c2goZXZlbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5vdmVybGF5SURzLmluZGV4T2YoZXZlbnQuaWQpO1xuICAgICAgICAgICAgaWYgKGluZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlJRHMuc3BsaWNlKGluZCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5naW5nLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY2FsY1NpemUgPSB0aGlzLmlzUGVyY2VudEhlaWdodCAmJlxuICAgICAgICAgICAgICAgICghdGhpcy5jYWxjSGVpZ2h0IHx8IHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID09PSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcik7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVjYWxjU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICAgICAgICAgICRldmVudC5jb250YWluZXJTaXplID0gdGhpcy5jYWxjSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGNhbGxlZCB0byByZWNhbGMgYWxsIHdpZHRocyB0aGF0IG1heSBoYXZlIGNoYW5nZXMgYXMgYSByZXN1bHQgb2ZcbiAgICAgICAgICAgIC8vIHRoZSB2ZXJ0LiBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jb250ZW50U2l6ZUNoYW5nZS5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIHRocm90dGxlVGltZSgzMCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVuc2l0eUNoYW5nZWQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemUgPSB0aGlzLmlzUGVyY2VudEhlaWdodCAmJiB0aGlzLmNhbGNIZWlnaHQgIT09IHRoaXMuZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdW1tYXJ5Um93SGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5zdW1tYXJ5SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBTZXJ2aWNlcygpO1xuICAgICAgICB0aGlzLl9zZXR1cExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnJvd0xpc3REaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBjb21wYXJlIGJhc2VkIG9uIGZpZWxkLCBub3Qgb24gb2JqZWN0IHJlZi5cbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0RGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSgoaW5kZXgsIGNvbDogQ29sdW1uVHlwZSkgPT4gY29sLmZpZWxkKTtcbiAgICAgICAgdGhpcy5jYWxjV2lkdGggPSB0aGlzLndpZHRoICYmIHRoaXMud2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSA6IDA7XG4gICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSB0aGlzLmF1dG9HZW5lcmF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q29sdW1uc0NhY2hlcygpIHtcbiAgICAgICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiBjb2x1bW4ucmVzZXRDYWNoZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVSb3dJRCgpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgICAgICBjb25zdCBwcmltYXJ5Q29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKGNvbCA9PiBjb2wuZmllbGQgPT09IHRoaXMucHJpbWFyeUtleSk7XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IHRoaXMuZGF0YS5sZW5ndGggP1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKHRoaXMuZGF0YVswXVt0aGlzLnByaW1hcnlLZXldKSA6IHByaW1hcnlDb2x1bW4gPyBwcmltYXJ5Q29sdW1uLmRhdGFUeXBlIDogJ3N0cmluZyc7XG4gICAgICAgIHJldHVybiBpZFR5cGUgPT09ICdzdHJpbmcnID8gdXVpZHY0KCkgOiBGQUtFX1JPV19JRC0tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRGb3JPZkNhY2hlKCkge1xuICAgICAgICBjb25zdCBmaXJzdFZpcnRSb3cgPSB0aGlzLmRhdGFSb3dMaXN0LmZpcnN0O1xuICAgICAgICBpZiAoZmlyc3RWaXJ0Um93KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2RyUmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFZpcnRSb3cudmlydERpclJvdy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyc3RWaXJ0Um93LnZpcnREaXJSb3cuYXNzdW1lTWFzdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcmVkRGF0YShkYXRhLCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiBwaW5uZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkUGlubmVkRGF0YSA9IGRhdGEgfHwgW107XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFVucGlubmVkID0gdGhpcy5fZmlsdGVyZWRVbnBpbm5lZERhdGEgfHwgW107XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBbLi4uIHRoaXMuX2ZpbHRlcmVkUGlubmVkRGF0YSwgLi4uZmlsdGVyZWRVbnBpbm5lZF07XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEubGVuZ3RoID4gMCA/IGZpbHRlcmVkRGF0YSA6IHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAhcGlubmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJlZERhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENvbHVtbkNvbGxlY3Rpb25zKCkge1xuICAgICAgICB0aGlzLl92aXNpYmxlQ29sdW1ucy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9waW5uZWRWaXNpYmxlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3VucGlubmVkVmlzaWJsZS5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDYWNoZWRXaWR0aHMoKSB7XG4gICAgICAgIHRoaXMuX3VucGlubmVkV2lkdGggPSBOYU47XG4gICAgICAgIHRoaXMuX3Bpbm5lZFdpZHRoID0gTmFOO1xuICAgICAgICB0aGlzLl90b3RhbFdpZHRoID0gTmFOO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDYWNoZXMocmVjYWxjRmVhdHVyZVdpZHRoID0gdHJ1ZSkge1xuICAgICAgICBpZiAocmVjYWxjRmVhdHVyZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoID0gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRGb3JPZkNhY2hlKCk7XG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5zQ2FjaGVzKCk7XG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5Db2xsZWN0aW9ucygpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVkV2lkdGhzKCk7XG4gICAgICAgIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NvbHVtbkdyb3VwcyA9IHRoaXMuX2NvbHVtbnMuc29tZShjb2wgPT4gY29sLmNvbHVtbkdyb3VwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc29ydEhlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0SGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5zb3J0SGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydEFzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy5zb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy50b29sYmFyLmNoYW5nZXMucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSkpO1xuICAgICAgICB0aGlzLnNldFVwUGFnaW5hdG9yKCk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkNvbXBvbmVudHMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXBQYWdpbmF0b3IoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmFjdGlvblN0cmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblN0cmlwLm1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRhUmViaW5kaW5nKGV2ZW50OiBJRm9yT2ZEYXRhQ2hhbmdpbmdFdmVudEFyZ3MpIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdpbmcuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YVJlYm91bmQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICB0aGlzLmRhdGFDaGFuZ2VkLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBjcmVhdGVGaWx0ZXJEcm9wZG93bihjb2x1bW46IENvbHVtblR5cGUsIG9wdGlvbnM6IE92ZXJsYXlTZXR0aW5ncykge1xuICAgICAgICBvcHRpb25zLm91dGxldCA9IHRoaXMub3V0bGV0O1xuICAgICAgICBpZiAodGhpcy5leGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQuaW5pdGlhbGl6ZShjb2x1bW4sIHRoaXMub3ZlcmxheVNlcnZpY2UpO1xuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmF0dGFjaCh0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQuZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQub3ZlcmxheUNvbXBvbmVudElkID0gaWQ7XG4gICAgICAgICAgICByZXR1cm4geyBpZCwgcmVmOiB1bmRlZmluZWQgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWYgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50KTtcbiAgICAgICAgcmVmLmluc3RhbmNlLmluaXRpYWxpemUoY29sdW1uLCB0aGlzLm92ZXJsYXlTZXJ2aWNlKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmF0dGFjaChyZWYuaW5zdGFuY2UuZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIHJlZi5pbnN0YW5jZS5vdmVybGF5Q29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHsgcmVmLCBpZCB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY29tcG9uZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZHluYW1pY0NvbXBvbmVudDogQ29tcG9uZW50UmVmPGFueT4gPSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7IGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3RvciB9ICk7XG4gICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoZHluYW1pY0NvbXBvbmVudC5ob3N0Vmlldyk7XG4gICAgICAgIHJldHVybiBkeW5hbWljQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBzZXRVcFBhZ2luYXRvcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlQ2hhbmdlLnBpcGUodGFrZVdoaWxlKCgpID0+ICEhdGhpcy5wYWdpbmF0b3IpLCBmaWx0ZXIoKCkgPT4gIXRoaXMuX2luaXQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHBhZ2U6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdChwYWdlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2luZ0RvbmUucGlwZSh0YWtlV2hpbGUoKCkgPT4gISF0aGlzLnBhZ2luYXRvciksIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoYXJnczogSVBhZ2VFdmVudEFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luZ0RvbmUuZW1pdCh7IHByZXZpb3VzOiBhcmdzLnByZXZpb3VzLCBjdXJyZW50OiBhcmdzLmN1cnJlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBlclBhZ2VDaGFuZ2UucGlwZSh0YWtlV2hpbGUoKCkgPT4gISF0aGlzLnBhZ2luYXRvciksIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocGVyUGFnZTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJQYWdlQ2hhbmdlLmVtaXQocGVyUGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcmVkU29ydGVkRGF0YShkYXRhLCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgZGF0YSA9IGRhdGEgfHwgW107XG4gICAgICAgIGlmICh0aGlzLnBpbm5lZFJlY29yZHNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGlmIChwaW5uZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMucGlubmVkUmVjb3JkcyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhID0gdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCA/IFsuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhLCAuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGFdIDpcbiAgICAgICAgICAgICAgICAgICAgWy4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSwgLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YV07XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWlsZERhdGFWaWV3KGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0SG9yaXpvbnRhbFZpcnR1YWxpemF0aW9uKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50RmlsdGVyID0gKGl0ZW06IElneFJvd0RpcmVjdGl2ZSB8IElneFN1bW1hcnlSb3dDb21wb25lbnQpID0+IHRoaXMuaXNEZWZpbmVkKGl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGFSb3dMaXN0LmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpLFxuICAgICAgICAgICAgLi4udGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdylcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBSb3dPYnNlcnZlcnMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGaWx0ZXIgPSAoaXRlbTogSWd4Um93RGlyZWN0aXZlIHwgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCkgPT4gdGhpcy5pc0RlZmluZWQoaXRlbS5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBleHRyYWN0Rm9yT2ZzID0gcGlwZShtYXAoKGNvbGxlY3Rpb246IGFueVtdKSA9PiBjb2xsZWN0aW9uLmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpKSk7XG4gICAgICAgIGNvbnN0IHJvd0xpc3RPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fZGF0YVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlSb3dPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fc3VtbWFyeVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIHJvd0xpc3RPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1bW1hcnlSb3dPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfem9uZUJlZ29uZUxpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy52ZXJ0aWNhbFNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lcj8uZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXI/LmRhdGFDaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVzaXplTm90aWZ5Lm5leHQoKSk7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZhYmxlKHRoaXMubmF0aXZlRWxlbWVudCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2l6ZU5vdGlmeS5uZXh0KCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0UGlubmluZygpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcygpO1xuICAgICAgICB0aGlzLl9pbml0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLnJlYXR0YWNoKCk7XG4gICAgICAgIHRoaXMuX3NldHVwUm93T2JzZXJ2ZXJzKCk7XG4gICAgICAgIHRoaXMuX3pvbmVCZWdvbmVMaXN0ZW5lcnMoKTtcblxuICAgICAgICBjb25zdCB2ZXJ0U2NyREMgPSB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRpc3BsYXlDb250YWluZXI7XG4gICAgICAgIHZlcnRTY3JEQy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnByZXZlbnRDb250YWluZXJTY3JvbGwuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5fcGlubmVkUm93TGlzdC5jaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25QaW5uZWRSb3dzQ2hhbmdlZChjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhcj8uY2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVjID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGFbdGhpcy5sYXN0QWRkZWRSb3dJbmRleF07XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvKHJlYywgMCk7XG4gICAgICAgICAgICB0aGlzLmFkZFJvd1NuYWNrYmFyLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEtlZXAgdGhlIHN0cmVhbSBvcGVuIGZvciBmdXR1cmUgc3Vic2NyaWJlcnNcbiAgICAgICAgdGhpcy5yZW5kZXJlZCQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wZXJQYWdlID0gdGhpcy5fcGVyUGFnZSAhPT0gREVGQVVMVF9JVEVNU19QRVJfUEFHRSA/IHRoaXMuX3BlclBhZ2UgOiB0aGlzLnBhZ2luYXRvci5wZXJQYWdlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IHRoaXMudG90YWxSZWNvcmRzID8gdGhpcy50b3RhbFJlY29yZHMgOiB0aGlzLnBhZ2luYXRvci50b3RhbFJlY29yZHM7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3Iub3ZlcmxheVNldHRpbmdzID0geyBvdXRsZXQ6IHRoaXMub3V0bGV0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5zVG9BdXRvc2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1NpemVDb2x1bW5zSW5WaWV3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMucmVuZGVyZWQubmV4dCh0cnVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbm90aWZ5Q2hhbmdlcyhyZXBhaW50ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdHMgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jZHJSZXF1ZXN0UmVwYWludCA9IHJlcGFpbnQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG5nRG9DaGVjaygpIHtcbiAgICAgICAgc3VwZXIubmdEb0NoZWNrKCk7XG4gICAgICAgIGlmICh0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXROb3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcygpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Tm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50bXBPdXRsZXRzLmZvckVhY2goKHRtcGxPdXRsZXQpID0+IHtcbiAgICAgICAgICAgIHRtcGxPdXRsZXQuY2xlYW5DYWNoZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQubmV4dCgpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdmVybGF5SURzLmZvckVhY2gob3ZlcmxheUlEID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKG92ZXJsYXlJRCk7XG5cbiAgICAgICAgICAgIGlmIChvdmVybGF5ICYmICFvdmVybGF5LmRldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5kZXRhY2gob3ZlcmxheUlEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXI/LmdldFNjcm9sbCgpPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnZlcnRpY2FsU2Nyb2xsSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lcj8uZ2V0U2Nyb2xsKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaG9yaXpvbnRhbFNjcm9sbEhhbmRsZXIpO1xuICAgICAgICAgICAgY29uc3QgdmVydFNjckRDID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uZGlzcGxheUNvbnRhaW5lcjtcbiAgICAgICAgICAgIHZlcnRTY3JEQz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wcmV2ZW50Q29udGFpbmVyU2Nyb2xsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgc3BlY2lmaWVkIGNvbHVtbidzIHZpc2liaWxpdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnRvZ2dsZUNvbHVtblZpc2liaWxpdHkoe1xuICAgICAqICAgICAgIGNvbHVtbjogdGhpcy5ncmlkMS5jb2x1bW5zWzBdLFxuICAgICAqICAgICAgIG5ld1ZhbHVlOiB0cnVlXG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNvbHVtblZpc2liaWxpdHkoYXJnczogSUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGFyZ3MuY29sdW1uID8gdGhpcy5fY29sdW1ucy5maW5kKChjKSA9PiBjID09PSBhcmdzLmNvbHVtbikgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKCFjb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb2wudG9nZ2xlVmlzaWJpbGl0eShhcmdzLm5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSBsaXN0IG9mIGtleS12YWx1ZSBwYWlycyBbcm93IElELCBleHBhbnNpb24gc3RhdGVdLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJbmNsdWRlcyBvbmx5IHN0YXRlcyB0aGF0IGRpZmZlciBmcm9tIHRoZSBkZWZhdWx0IG9uZS5cbiAgICAgKiBTdXBwb3J0cyB0d28td2F5IGJpbmRpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImRhdGFcIiBbKGV4cGFuc2lvblN0YXRlcyldPVwibW9kZWwuZXhwYW5zaW9uU3RhdGVzXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZXhwYW5zaW9uU3RhdGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5zaW9uU3RhdGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZXhwYW5zaW9uU3RhdGVzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPih2YWx1ZSk7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzQ2hhbmdlLmVtaXQodGhpcy5fZXhwYW5zaW9uU3RhdGVzKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZXhwYW5kQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZEFsbCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGFuZFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY29sbGFwc2VBbGwoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VBbGwoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmV4cGFuZFJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLnNldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJvd0lELCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNvbGxhcHNlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZVJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgZmFsc2UpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudG9nZ2xlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3cocm93SUQ6IGFueSkge1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19ieV9pZChyb3dJRCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJlYyk7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgIXN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldERlZmF1bHRFeHBhbmRTdGF0ZShfcmVjOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5hdGl2ZUVsID0gdGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBvdXRsZXQgdXNlZCB0byBhdHRhY2ggdGhlIGdyaWQncyBvdmVybGF5cyB0by5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBJZiBzZXQsIHJldHVybnMgdGhlIG91dGxldCBkZWZpbmVkIG91dHNpZGUgdGhlIGdyaWQuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBncmlkJ3MgaW50ZXJuYWwgb3V0bGV0IGRpcmVjdGl2ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgb3V0bGV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3V0bGV0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvdXRsZXQodmFsOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgPSB2YWw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dIZWlnaCA9IHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29zeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gNDA7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gNTA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFN1bW1hcnlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMwO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAyNDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM2O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAncyBtaW5pbXVtIGFsbG93ZWQgd2lkdGguXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFVzZWQgaW50ZXJuYWxseSBmb3IgcmVzdHJpY3RpbmcgaGVhZGVyIGdyb3VwIGNvbXBvbmVudCB3aWR0aC5cbiAgICAgKiBUaGUgdmFsdWVzIGJlbG93IGRlcGVuZCBvbiB0aGUgaGVhZGVyIGNlbGwgZGVmYXVsdCByaWdodC9sZWZ0IHBhZGRpbmcgdmFsdWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmRpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgICAgICBjYXNlIERpc3BsYXlEZW5zaXR5LmNvc3k6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgICAgY2FzZSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiAyNDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQ4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgY29udGFpbmVyIGZvciB0aGUgcGlubmVkIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZFdpZHRoID0gdGhpcy5ncmlkLmdldFBpbm5lZFdpZHRoO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkV2lkdGgoKSB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5fcGlubmVkV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmVkV2lkdGggPSB0aGlzLmdldFBpbm5lZFdpZHRoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHdpZHRoIG9mIHRoZSBjb250YWluZXIgZm9yIHRoZSB1bnBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB1bnBpbm5lZFdpZHRoID0gdGhpcy5ncmlkLmdldFVucGlubmVkV2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB1bnBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3VucGlubmVkV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gdGhpcy5nZXRVbnBpbm5lZFdpZHRoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0hvcml6b250YWxTY3JvbGxIaWRkZW4oKSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnVucGlubmVkV2lkdGggLSB0aGlzLnRvdGFsV2lkdGg7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoID09PSBudWxsIHx8IGRpZmYgPj0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIEdldHMgdGhlIGhlYWRlciBjZWxsIGlubmVyIHdpZHRoIGZvciBhdXRvLXNpemluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGVhZGVyQ2VsbFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSVNpemVJbmZvIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcldpZHRoID0gdGhpcy5wbGF0Zm9ybS5nZXROb2RlU2l6ZVZpYVJhbmdlKHJhbmdlLFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVyU3R5bGUgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGhlYWRlclBhZGRpbmcgPSBwYXJzZUZsb2F0KGhlYWRlclN0eWxlLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoaGVhZGVyU3R5bGUucGFkZGluZ1JpZ2h0KSArXG4gICAgICAgICAgICBwYXJzZUZsb2F0KGhlYWRlclN0eWxlLmJvcmRlclJpZ2h0V2lkdGgpO1xuXG4gICAgICAgIC8vIFRha2UgaW50byBjb25zaWRlcmF0aW9uIHRoZSBoZWFkZXIgZ3JvdXAgZWxlbWVudCwgc2luY2UgY29sdW1uIHBpbm5pbmcgYXBwbGllcyBib3JkZXJzIHRvIGl0IGlmIGl0cyBub3QgYSBjb2x1bW5Hcm91cC5cbiAgICAgICAgY29uc3QgaGVhZGVyR3JvdXBTdHlsZSA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBib3JkZXJTaXplID0gcGFyc2VGbG9hdChoZWFkZXJHcm91cFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgpICsgcGFyc2VGbG9hdChoZWFkZXJHcm91cFN0eWxlLmJvcmRlckxlZnRXaWR0aCk7XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiBNYXRoLmNlaWwoaGVhZGVyV2lkdGgpLCBwYWRkaW5nOiBNYXRoLmNlaWwoaGVhZGVyUGFkZGluZyArIGJvcmRlclNpemUpIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSBjb21iaW5lZCB3aWR0aCBvZiB0aGUgY29sdW1ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgZW5hYmxlZCBncmlkIGZlYXR1cmVzLiBUaGV5IGFyZSBmaXhlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmVhdHVyZUNvbHVtbnNXaWR0aChleHBhbmRlcj86IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTih0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogcGxhdGZvcm1VdGlsLmlzQnJvd3NlciBjaGVja1xuICAgICAgICAgICAgY29uc3Qgcm93U2VsZWN0QXJlYSA9IHRoaXMuaGVhZGVyU2VsZWN0b3JDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3RvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0RyYWdBcmVhID0gdGhpcy5yb3dEcmFnZ2FibGUgJiYgdGhpcy5oZWFkZXJEcmFnQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRHJhZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwYWJsZUFyZWEgPSB0aGlzLmhlYWRlckdyb3VwQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyR3JvdXBDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRlcldpZHRoID0gZXhwYW5kZXI/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA/IGV4cGFuZGVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCA9IHJvd1NlbGVjdEFyZWEgKyByb3dEcmFnQXJlYSArIGdyb3VwYWJsZUFyZWEgKyBleHBhbmRlcldpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJGZWF0dXJlc1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXNNYXJnaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGNvbHVtcyA9IHRoaXMuZ3JpZC5jb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGhlIHBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRDb2x1bW5zID0gdGhpcy5ncmlkLnBpbm5lZENvbHVtbnMuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZFZpc2libGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkVmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uZWRWaXNpYmxlID0gdGhpcy5fcGlubmVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuaGlkZGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFZpc2libGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiB0aGUgcGlubmVkIGBJZ3hSb3dDb21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZFJvdyA9IHRoaXMuZ3JpZC5waW5uZWRSb3dzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkUm93cygpOiBJZ3hHcmlkUm93Q29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkUm93TGlzdC50b0FycmF5KCkuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdW5waW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdW5waW5uZWRDb2x1bW5zID0gdGhpcy5ncmlkLnVucGlubmVkQ29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl91bnBpbm5lZFZpc2libGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRWaXNpYmxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VucGlubmVkVmlzaWJsZSA9IHRoaXMuX3VucGlubmVkQ29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gIWNvbC5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRWaXNpYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB3aWR0aGAgdG8gYmUgc2V0IG9uIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIZWFkZXJHcm91cFdpZHRoKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQ29sdW1uTGF5b3V0c1xuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiBgJHtNYXRoLm1heChwYXJzZUZsb2F0KGNvbHVtbi5jYWxjV2lkdGgpLCB0aGlzLmRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoKX1weGA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgYnkgZmllbGQgbmFtZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q29sID0gdGhpcy5ncmlkMS5nZXRDb2x1bW5CeU5hbWUoXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb2x1bW5CeU5hbWUobmFtZTogc3RyaW5nKTogSWd4Q29sdW1uQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wuZmllbGQgPT09IG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb2x1bW5CeVZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogSWd4Q29sdW1uQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnMuZmluZCgoY29sKSA9PlxuICAgICAgICAgICAgIWNvbC5jb2x1bW5Hcm91cCAmJiAhY29sLmNvbHVtbkxheW91dCAmJlxuICAgICAgICAgICAgY29sLnZpc2libGVJbmRleCA9PT0gaW5kZXhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNhbGN1bGF0ZXMgYWxsIHdpZHRocyBvZiBjb2x1bW5zIHRoYXQgaGF2ZSBzaXplIHNldCB0byBgYXV0b2AuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnJlY2FsY3VsYXRlQXV0b1NpemVzKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHJlY2FsY3VsYXRlQXV0b1NpemVzKCkge1xuICAgICAgICAvLyByZXNldCBhdXRvLXNpemUgYW5kIGNhbGN1bGF0ZSBpdCBhZ2Fpbi5cbiAgICAgICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKHggPT4geC5hdXRvU2l6ZSA9IHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NpemVDb2x1bW5zSW5WaWV3KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdmlzaWJsZSBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMuZ3JpZC52aXNpYmxlQ29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpc2libGVDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3Zpc2libGVDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGVDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Zpc2libGVDb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoYyA9PiAhYy5oaWRkZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcy5cbiAgICAgKlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG90YWxQYWdlcyA9IHRoaXMuZ3JpZC50b3RhbFBhZ2VzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3I/LnRvdGFsUGFnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmBcbiAgICAgKlxuICAgICAqIEdldHMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZS5cbiAgICAgKlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlyc3RQYWdlID0gdGhpcy5ncmlkLmlzRmlyc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRvci5pc0xhc3RQYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGBuZXh0UGFnZSgpYCBleHBvc2VkIGJ5IHRoZSBgaWd4LXBhZ2luYXRvcmAgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2UsIGlmIHRoZSBncmlkIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IHBhZ2UuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEubmV4dFBhZ2UoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHB1YmxpYyBuZXh0UGFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0b3I/Lm5leHRQYWdlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgYG5leHRQYWdlKClgIGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEdvZXMgdG8gdGhlIHByZXZpb3VzIHBhZ2UsIGlmIHRoZSBncmlkIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBmaXJzdCBwYWdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFnaW5hdG9yPy5wcmV2aW91c1BhZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogT25seSBmdW5jdGlvbnMgd2hlbiBwYWdpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b3RhbFJlY29yZHMgPSB0aGlzLmdyaWQudG90YWxSZWNvcmRzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b3RhbFJlY29yZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcyA+PSAwID8gdGhpcy5fdG90YWxSZWNvcmRzIDogdGhpcy5wYWdpbmdTdGF0ZT8ubWV0YWRhdGEuY291bnRSZWNvcmRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRvdGFsID49IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IHRvdGFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdG90YWxSZWNvcmRzID0gdG90YWw7XG4gICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTIuMS4wLiBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgZXhwb3NlZCBieSB0aGUgYGlneC1wYWdpbmF0b3JgXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3QgcGFnZS5cbiAgICAgKlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGFzdFBhZ2UgPSB0aGlzLmdyaWQuaXNMYXN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRvci5pc0xhc3RQYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRvdGFsIHdpZHRoIG9mIHRoZSBgSWd4R3JpZENvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncmlkV2lkdGggPSB0aGlzLmdyaWQudG90YWxXaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFpc05hTih0aGlzLl90b3RhbFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGFrZSBvbmx5IHRvcCBsZXZlbCBjb2x1bW5zXG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmxldmVsID09PSAwICYmICFjb2wucGlubmVkKTtcbiAgICAgICAgbGV0IHRvdGFsV2lkdGggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoaTsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gcGFyc2VJbnQoY29sc1tpXS5jYWxjV2lkdGgsIDEwKSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RvdGFsV2lkdGggPSB0b3RhbFdpZHRoO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93Um93U2VsZWN0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1Jvd1NlbGVjdGFibGUgJiYgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucyAmJiAhdGhpcy5oaWRlUm93U2VsZWN0b3JzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dBZGRCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRhYmxlICYmIHRoaXMuZGF0YVZpZXcubGVuZ3RoID09PSAwICYmIHRoaXMuX2NvbHVtbnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG93RHJhZ0ljb25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dEcmFnZ2FibGUgJiYgdGhpcy5fY29sdW1ucy5sZW5ndGggPiB0aGlzLmhpZGRlbkNvbHVtbnNDb3VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9nZXREYXRhVmlld0luZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgbmV3SW5kZXggPSBpbmRleDtcbiAgICAgICAgaWYgKChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5kYXRhVmlldy5sZW5ndGgpICYmIHRoaXMucGFnaW5nTW9kZSA9PT0gMSAmJiB0aGlzLnBhZ2luYXRvci5wYWdlICE9PSAwKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4IC0gdGhpcy5wYWdpbmF0b3IucGVyUGFnZSAqIHRoaXMucGFnaW5hdG9yLnBhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkQVBJLmdyaWQudmVydGljYWxTY3JvbGxDb250YWluZXIuaXNSZW1vdGUpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggLSB0aGlzLmdyaWRBUEkuZ3JpZC52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RGF0YUluZGV4KGRhdGFWaWV3SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBuZXdJbmRleCA9IGRhdGFWaWV3SW5kZXg7XG4gICAgICAgIGlmICh0aGlzLmdyaWRBUEkuZ3JpZC52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5pc1JlbW90ZSkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBkYXRhVmlld0luZGV4ICsgdGhpcy5ncmlkQVBJLmdyaWQudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFjZXMgYSBjb2x1bW4gYmVmb3JlIG9yIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGNvbHVtbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQubW92ZUNvbHVtbihjb2x1bW4sIHRhcmdldCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG1vdmVDb2x1bW4oY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRhcmdldDogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbiA9IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQpIHtcbiAgICAgICAgLy8gTS5BLiBNYXkgMTF0aCwgMjAyMSAjOTUwOCBNYWtlIHRoZSBldmVudCBjYW5jZWxhYmxlXG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUNvbHVtbk1vdmluZ0VuZEV2ZW50QXJncyA9IHsgc291cmNlOiBjb2x1bW4sIHRhcmdldCwgY2FuY2VsOiBmYWxzZSB9O1xuXG4gICAgICAgIHRoaXMuY29sdW1uTW92aW5nRW5kLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbiA9PT0gdGFyZ2V0IHx8IChjb2x1bW4ubGV2ZWwgIT09IHRhcmdldC5sZXZlbCkgfHxcbiAgICAgICAgICAgIChjb2x1bW4udG9wTGV2ZWxQYXJlbnQgIT09IHRhcmdldC50b3BMZXZlbFBhcmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW4ubGV2ZWwpIHtcbiAgICAgICAgICAgIHRoaXMuX21vdmVDaGlsZENvbHVtbnMoY29sdW1uLnBhcmVudCwgY29sdW1uLCB0YXJnZXQsIHBvcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZXQgY29sdW1uUGluU3RhdGVDaGFuZ2VkO1xuICAgICAgICAvLyBwaW5uaW5nIGFuZCB1bnBpbm5pbmcgd2lsbCB3b3JrIGNvcnJlY3RseSBldmVuIHdpdGhvdXQgcGFzc2luZyBpbmRleFxuICAgICAgICAvLyBidXQgaXMgZWFzaWVyIHRvIGNhbGNsdWxhdGUgdGhlIGluZGV4IGhlcmUsIGFuZCBsYXRlciB1c2UgaXQgaW4gdGhlIHBpbm5pbmcgZXZlbnQgYXJnc1xuICAgICAgICBpZiAodGFyZ2V0LnBpbm5lZCAmJiAhY29sdW1uLnBpbm5lZCkge1xuICAgICAgICAgICAgY29uc3QgcGlubmVkSW5kZXggPSB0aGlzLl9waW5uZWRDb2x1bW5zLmluZGV4T2YodGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gcGlubmVkSW5kZXggKyAxIDogcGlubmVkSW5kZXg7XG4gICAgICAgICAgICBjb2x1bW4ucGluKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGFyZ2V0LnBpbm5lZCAmJiBjb2x1bW4ucGlubmVkKSB7XG4gICAgICAgICAgICBjb25zdCB1bnBpbm5lZEluZGV4ID0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YodGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcG9zID09PSBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0ID8gdW5waW5uZWRJbmRleCArIDEgOiB1bnBpbm5lZEluZGV4O1xuICAgICAgICAgICAgY29sdW1uLnVucGluKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmICh0YXJnZXQucGlubmVkICYmIGNvbHVtbi5waW5uZWQgJiYgIWNvbHVtblBpblN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAvLyAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcywgdGhpcy5fcGlubmVkQ29sdW1ucyk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBpZiAoIXRhcmdldC5waW5uZWQgJiYgIWNvbHVtbi5waW5uZWQgJiYgIWNvbHVtblBpblN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAvLyAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcywgdGhpcy5fdW5waW5uZWRDb2x1bW5zKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuX21vdmVDb2x1bW5zKGNvbHVtbiwgdGFyZ2V0LCBwb3MpO1xuICAgICAgICB0aGlzLl9jb2x1bW5zUmVvcmRlcmVkKGNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAxMi4xLjAuIFVzZSB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgYHBhZ2luYXRlKClgIGV4cG9zZWQgYnkgdGhlIGBpZ3gtcGFnaW5hdG9yYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEdvZXMgdG8gdGhlIGRlc2lyZWQgcGFnZSBpbmRleC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gb2xkXG4gICAgICogdGhpcy5ncmlkMS5wYWdpbmF0ZSgxKTtcbiAgICAgKiAvLyBuZXdcbiAgICAgKiB0aGlzLnBhZ2luYXRvcjEucGFnaW5hdGUoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbFxuICAgICAqL1xuICAgIHB1YmxpYyBwYWdpbmF0ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2luYXRvcj8ucGFnaW5hdGUodmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIGZvciB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqIENhbGxpbmcgbWFya0ZvckNoZWNrIGFsc28gdHJpZ2dlcnMgdGhlIGdyaWQgcGlwZXMgZXhwbGljaXRseSwgcmVzdWx0aW5nIGluIGFsbCB1cGRhdGVzIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBNYXkgZGVncmFkZSBwZXJmb3JtYW5jZSBpZiB1c2VkIHdoZW4gbm90IG5lZWRlZCwgb3IgaWYgbWlzdXNlZDpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gRE9OJ1RzOlxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIGZyb20gaW5zaWRlIGEgbG9vcFxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIHdoZW4gYSBwcmltaXRpdmUgaGFzIGNoYW5nZWRcbiAgICAgKiBncmlkLmRhdGEuZm9yRWFjaChyZWMgPT4ge1xuICAgICAqICByZWMgPSBuZXdWYWx1ZTtcbiAgICAgKiAgZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIERPc1xuICAgICAqIC8vIGNhbGwgbWFya0ZvckNoZWNrIGFmdGVyIHVwZGF0aW5nIGEgbmVzdGVkIHByb3BlcnR5XG4gICAgICogZ3JpZC5kYXRhLmZvckVhY2gocmVjID0+IHtcbiAgICAgKiAgcmVjLm5lc3RlZFByb3AxLm5lc3RlZFByb3AyID0gbmV3VmFsdWU7XG4gICAgICogfSk7XG4gICAgICogZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG1hcmtGb3JDaGVjaygpIHtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIGFkZHMgdGhlIGRhdGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGRhdGEgc291cmNlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5hZGRSb3cocmVjb3JkKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRSb3coZGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIGNvbW1pdCBwZW5kaW5nIHN0YXRlcyBwcmlvciB0byBhZGRpbmcgYSByb3dcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KHRydWUpO1xuICAgICAgICB0aGlzLmdyaWRBUEkuYWRkUm93VG9EYXRhKGRhdGEpO1xuXG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5yb3dBZGRlZE5vdGlmaWVyLm5leHQoeyBkYXRhOiBkYXRhLCBvd25lcjogdGhpcywgcHJpbWFyeUtleTogZGF0YVt0aGlzLnByaW1hcnlLZXldIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIFRoZSBtZXRob2QgYWNjZXB0IHJvd1NlbGVjdG9yIGFzIGEgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgcm93SUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5kZWxldGVSb3coMCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVJvdyhyb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucHJpbWFyeUtleSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlUm93QnlJZChyb3dTZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBkZWxldGVSb3dCeUlkKHJvd0lkOiBhbnkpOiBhbnkge1xuICAgICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICAgICAgcm93SUQ6IHJvd0lkLFxuICAgICAgICAgICAgcHJpbWFyeUtleTogcm93SWQsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlLFxuICAgICAgICAgICAgcm93RGF0YTogdGhpcy5nZXRSb3dEYXRhKHJvd0lkKSxcbiAgICAgICAgICAgIG9sZFZhbHVlOiBudWxsLFxuICAgICAgICAgICAgb3duZXI6IHRoaXNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yb3dEZWxldGUuZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmdyaWRBUEkuZGVsZXRlUm93QnlJZChyb3dJZCk7XG4gICAgICAgIGlmIChyZWNvcmQgIT09IG51bGwgJiYgcmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0RlbGV0ZWRFdmVudEFyZ3M6IElSb3dEYXRhRXZlbnRBcmdzID0geyBkYXRhOiByZWNvcmQsIG93bmVyOiB0aGlzLCBwcmltYXJ5S2V5OiByZWNvcmRbdGhpcy5wcmltYXJ5S2V5XSB9O1xuICAgICAgICAgICAgdGhpcy5yb3dEZWxldGVkLmVtaXQocm93RGVsZXRlZEV2ZW50QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZFdpdGhQSy51cGRhdGVDZWxsKCdVcGRhdGVkJywgMSwgJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgd2hpY2ggaXMgdG8gYmUgc2V0LlxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kcyB0byByb3dJRC5cbiAgICAgKiBAcGFyYW0gY29sdW1uIGNvcnJlc3BvbmRzIHRvIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlQ2VsbCh2YWx1ZTogYW55LCByb3dTZWxlY3RvcjogYW55LCBjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQodGhpcy5wcmltYXJ5S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5fY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW1wbGlmeVxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0Um93RGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pbmRleF9pbl9kYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAvLyBJZiByb3cgcGFzc2VkIGlzIGludmFsaWRcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SUQ6IHJvd1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JRDogY29sLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG5ldyBJZ3hDZWxsKGlkLCBpbmRleCwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0sIHZhbHVlLCByb3dEYXRhLCB0aGlzIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLnZhbGlkYXRpb24uZ2V0Rm9ybUNvbnRyb2woY2VsbC5pZC5yb3dJRCwgY2VsbC5jb2x1bW4uZmllbGQpO1xuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkudXBkYXRlX2NlbGwoY2VsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgYElneEdyaWRSb3dDb21wb25lbnRgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSByb3cgaXMgc3BlY2lmaWVkIGJ5XG4gICAgICogcm93U2VsZWN0b3IgcGFyYW1ldGVyIGFuZCB0aGUgZGF0YSBzb3VyY2UgcmVjb3JkIHdpdGggdGhlIHBhc3NlZCB2YWx1ZS5cbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFwcGx5IHJlcXVlc3RlZCB1cGRhdGUgb25seSBpZiBwcmltYXJ5IGtleSBpcyBzcGVjaWZpZWQgaW4gdGhlIGdyaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC51cGRhdGVSb3coe1xuICAgICAqICAgICAgIFByb2R1Y3RJRDogMSwgUHJvZHVjdE5hbWU6ICdTcGVhcm1pbnQnLCBJblN0b2NrOiB0cnVlLCBVbml0c0luU3RvY2s6IDEsIE9yZGVyRGF0ZTogbmV3IERhdGUoJzIwMDUtMDMtMjEnKVxuICAgICAqICAgfSwgMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVl4oCTXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBwcmV2ZW50IGV2ZW50IGludm9jYXRpb25cbiAgICBwdWJsaWMgdXBkYXRlUm93KHZhbHVlOiBhbnksIHJvd1NlbGVjdG9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEZWZpbmVkKHRoaXMucHJpbWFyeUtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlQ2VsbCA9IHRoaXMuY3J1ZFNlcnZpY2UuY2VsbDtcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZUNlbGwgJiYgZWRpdGFibGVDZWxsLmlkLnJvd0lEID09PSByb3dTZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kQ2VsbEVkaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IG5ldyBJZ3hFZGl0Um93KHJvd1NlbGVjdG9yLCAtMSwgdGhpcy5ncmlkQVBJLmdldFJvd0RhdGEocm93U2VsZWN0b3IpLCB0aGlzIGFzIGFueSk7XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkudXBkYXRlX3Jvdyhyb3csIHZhbHVlKTtcblxuICAgICAgICAgICAgLy8gVE9ETzogZml4IGZvciAjNTkzNCBhbmQgcHJvYmFibHkgYnJlYWsgZm9yICM1NzYzXG4gICAgICAgICAgICAvLyBjb25zaWRlciBhZGRpbmcgb2YgdGhpcmQgb3B0aW9uYWwgYm9vbGVhbiBwYXJhbWV0ZXIgaW4gdXBkYXRlUm93LlxuICAgICAgICAgICAgLy8gSWYgZGV2ZWxvcGVyIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlIHdlIHNob3VsZCBjYWxsIG5vdGlmeUNoYW5nZXModHJ1ZSksIGFuZFxuICAgICAgICAgICAgLy8gdmlzZS12ZXJzYSBpZiBkZXZlbG9wZXIgc2V0IGl0IHRvIGZhbHNlIHdlIHNob3VsZCBjYWxsIG5vdGlmeUNoYW5nZXMoZmFsc2UpLlxuICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBzaG91bGQgZGVmYXVsdCB0byBmYWxzZVxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSByb3cgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiB0aGUgcHJpbWFyeSBrZXkgaXMgbm90IHNwZWNpZmllZCB0aGUgcm93IHNlbGVjdG9yIG1hdGNoIHRoZSByb3cgZGF0YS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBkYXRhID0gZ3JpZC5nZXRSb3dEYXRhKDk0NzQxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93U2VsZWN0b3IgY29ycmVzcG9uZCB0byByb3dJRFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb3dEYXRhKHJvd1NlbGVjdG9yOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dTZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSh0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pbmRleF9pbl9kYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHt9IDogZGF0YVtpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydCBhIHNpbmdsZSBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU29ydCB0aGUgYElneEdyaWRDb21wb25lbnRgJ3MgYElneENvbHVtbkNvbXBvbmVudGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFycmF5IG9mIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNvcnQoeyBmaWVsZE5hbWU6IG5hbWUsIGRpcjogU29ydGluZ0RpcmVjdGlvbi5Bc2MsIGlnbm9yZUNhc2U6IGZhbHNlIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzb3J0KGV4cHJlc3Npb246IElTb3J0aW5nRXhwcmVzc2lvbiB8IEFycmF5PElTb3J0aW5nRXhwcmVzc2lvbj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc29ydGluZ1N0YXRlID0gY2xvbmVBcnJheSh0aGlzLnNvcnRpbmdFeHByZXNzaW9ucyk7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlYWNoIG9mIGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkucHJlcGFyZV9zb3J0aW5nX2V4cHJlc3Npb24oW3NvcnRpbmdTdGF0ZV0sIGVhY2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvcnRpbmdPcHRpb25zLm1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sLmZpZWxkID09PSBleHByZXNzaW9uLmZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTb3J0KGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5wcmVwYXJlX3NvcnRpbmdfZXhwcmVzc2lvbihbc29ydGluZ1N0YXRlXSwgZXhwcmVzc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElTb3J0aW5nRXZlbnRBcmdzID0geyBvd25lcjogdGhpcywgc29ydGluZ0V4cHJlc3Npb25zOiBzb3J0aW5nU3RhdGUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5zb3J0aW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnRfbXVsdGlwbGUoZXhwcmVzc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkuc29ydChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5zb3J0aW5nRG9uZS5lbWl0KGV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGEgc2luZ2xlIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGZpbHRlcih0ZXJtKSB7XG4gICAgICogICAgICB0aGlzLmdyaWQuZmlsdGVyKFwiUHJvZHVjdE5hbWVcIiwgdGVybSwgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihcImNvbnRhaW5zXCIpKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZVxuICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcihuYW1lLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSwgaWdub3JlQ2FzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBhbGwgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGluIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgd2l0aCB0aGUgc2FtZSBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmZpbHRlckdsb2JhbCgnc29tZScsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oJ2NvbnRhaW5zJykpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyR2xvYmFsKHZhbHVlLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc3VtbWFyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgYXBwbGllcyB5b3VyIGN1c3RvbVN1bW1hcnkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSB0aGUgY3VzdG9tU3VtbWFyeSwgdGhlbiB0aGUgZGVmYXVsdCBzdW1tYXJ5IGZvciB0aGUgY29sdW1uIGRhdGEgdHlwZSB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH0sIHsgZmllbGROYW1lOiAnSUQnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKiBFbmFibGUgc3VtbWFyaWVzIGZvciB0aGUgbGlzdGVkIGNvbHVtbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU3VtbWFyaWVzKC4uLnJlc3QpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkocmVzdFswXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlU3VtbWFyaWVzKHJlc3RbMF0sIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKHJlc3RbMF0sIHRydWUsIHJlc3RbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5kaXNhYmxlU3VtbWFyaWVzKCdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBsaXN0ZWQgY29sdW1ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmRpc2FibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVN1bW1hcmllcyguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHJlc3RbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMocmVzdFswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMocmVzdFswXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmFtZSBpcyBwcm92aWRlZCwgY2xlYXJzIHRoZSBmaWx0ZXJpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcmluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhckZpbHRlcigpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIG5hbWUgaXMgcHJvdmlkZWQsIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogb3RoZXJ3aXNlIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU29ydCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU29ydChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfc29ydChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoR3JpZFN0YXRlKF9hcmdzPykge1xuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlQaXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogV2UgaGF2ZSByZXR1cm4gdmFsdWVzIGhlcmUuIE1vdmUgdGhlbSB0byBldmVudCBhcmdzID8/XG5cbiAgICAvKipcbiAgICAgKiBQaW5zIGEgY29sdW1uIGJ5IGZpZWxkIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpbkNvbHVtbihcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIHBpbkNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcgfCBJZ3hDb2x1bW5Db21wb25lbnQsIGluZGV4Pyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb2wgPSBjb2x1bW5OYW1lIGluc3RhbmNlb2YgSWd4Q29sdW1uQ29tcG9uZW50ID8gY29sdW1uTmFtZSA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgICAgICByZXR1cm4gY29sLnBpbihpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5waW5zIGEgY29sdW1uIGJ5IGZpZWxkIG5hbWUuIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucGluQ29sdW1uKFwiSURcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5Db2x1bW4oY29sdW1uTmFtZTogc3RyaW5nIHwgSWd4Q29sdW1uQ29tcG9uZW50LCBpbmRleD8pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29sID0gY29sdW1uTmFtZSBpbnN0YW5jZW9mIElneENvbHVtbkNvbXBvbmVudCA/IGNvbHVtbk5hbWUgOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgICAgICAgcmV0dXJuIGNvbC51bnBpbihpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGluIHRoZSByb3cgYnkgaXRzIGlkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJRCBpcyBlaXRoZXIgdGhlIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Sb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIHJvdyBpbiB0aGUgcGlubmVkIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHBpblJvdyhyb3dJRDogYW55LCBpbmRleD86IG51bWJlciwgcm93PzogUm93VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fcGlubmVkUmVjb3JkSURzLmluZGV4T2Yocm93SUQpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMuZ3JpZEFQSS5nZXRfcGluX3Jvd19ldmVudF9hcmdzKHJvd0lELCBpbmRleCwgcm93LCB0cnVlKTtcbiAgICAgICAgdGhpcy5yb3dQaW5uaW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSB0eXBlb2YgZXZlbnRBcmdzLmluc2VydEF0SW5kZXggPT09ICdudW1iZXInID8gZXZlbnRBcmdzLmluc2VydEF0SW5kZXggOiB0aGlzLl9waW5uZWRSZWNvcmRJRHMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9waW5uZWRSZWNvcmRJRHMuc3BsaWNlKGluc2VydEluZGV4LCAwLCByb3dJRCk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnJvd1Bpbm5lZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnBpbiB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudW5waW5Sb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIHVucGluUm93KHJvd0lEOiBhbnksIHJvdz86IFJvd1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMuZ3JpZEFQSS5nZXRfcGluX3Jvd19ldmVudF9hcmdzKHJvd0lELCBudWxsLCByb3csIGZhbHNlKTtcbiAgICAgICAgdGhpcy5yb3dQaW5uaW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcGlubmVkUmVjb3JkSURzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnJvd1Bpbm5lZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5waW5Db250YWluZXIgPyB0aGlzLnBpbkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA6IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1Bpbm5lZFJlY29yZHMgPyBjb250YWluZXJIZWlnaHQgOiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG90YWxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGNIZWlnaHQgPyB0aGlzLmNhbGNIZWlnaHQgKyB0aGlzLnBpbm5lZFJvd0hlaWdodCA6IHRoaXMuY2FsY0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNhbGN1bGF0ZXMgZ3JpZCB3aWR0aC9oZWlnaHQgZGltZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2hvdWxkIGJlIHJ1biB3aGVuIGNoYW5naW5nIERPTSBlbGVtZW50cyBkaW1lbnRpb25zIG1hbnVhbGx5IHRoYXQgYWZmZWN0IHRoZSBncmlkJ3Mgc2l6ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVmbG93KCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHJlZmxvdygpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIGluIHRoZSBncmlkIGFuZCBzY3JvbGxzIHRvIHRoZSBjZWxsIGlmIGl0IGlzbid0IHZpc2libGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZmluZE5leHQoXCJmaW5hbmNpYWxcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgb3B0aW9uYWxseSwgaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaCBvcHRpb25hbGx5LCBpZiB0aGUgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGVudGlyZSB2YWx1ZSAgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZE5leHQodGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRleHQsIDEsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBwcmV2aW91cyBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIGluIHRoZSBncmlkIGFuZCBzY3JvbGxzIHRvIHRoZSBjZWxsIGlmIGl0IGlzbid0IHZpc2libGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZmluZFByZXYoXCJmaW5hbmNpYWxcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgb3B0aW9uYWxseSwgaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaCBvcHRpb25hbGx5LCBpZiB0aGUgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGVudGlyZSB2YWx1ZSAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kUHJldih0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmQodGV4dCwgLTEsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYXBwbGllcyB0aGUgZXhpc3Rpbmcgc2VhcmNoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBsYXN0IHNlYXJjaC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVmcmVzaFNlYXJjaCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB1cGRhdGVBY3RpdmVJbmZvXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hTZWFyY2godXBkYXRlQWN0aXZlSW5mbz86IGJvb2xlYW4sIGVuZEVkaXQgPSB0cnVlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkTWF0Y2hDYWNoZSgpO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlQWN0aXZlSW5mbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUluZm8gPSBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmhpZ2hsaWdodEdyb3Vwc01hcC5nZXQodGhpcy5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5mb3JFYWNoKChtYXRjaCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2guY29sdW1uID09PSBhY3RpdmVJbmZvLmNvbHVtbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2gucm93ID09PSBhY3RpdmVJbmZvLnJvdyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2guaW5kZXggPT09IGFjdGl2ZUluZm8uaW5kZXggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVNYXBzKG1hdGNoLm1ldGFkYXRhLCBhY3RpdmVJbmZvLm1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRoaXMubGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dCxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZW5kRWRpdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRoZSBoaWdobGlnaHRzIGluIHRoZSBjZWxsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU2VhcmNoKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU2VhcmNoKCkge1xuICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvID0ge1xuICAgICAgICAgICAgc2VhcmNoVGV4dDogJycsXG4gICAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgIGV4YWN0TWF0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgYWN0aXZlTWF0Y2hJbmRleDogMCxcbiAgICAgICAgICAgIG1hdGNoSW5mb0NhY2hlOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucm93TGlzdC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgIGlmIChyb3cuY2VsbHMpIHtcbiAgICAgICAgICAgICAgICByb3cuY2VsbHMuZm9yRWFjaCgoYzogSWd4R3JpZENlbGxDb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYy5jbGVhckhpZ2hsaWdodCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIHNvcnRhYmxlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzb3J0YWJsZUdyaWQgPSB0aGlzLmdyaWQuaGFzU29ydGFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzU29ydGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5zb3J0YWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBlZGl0YWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZWRpdGFibGVHcmlkID0gdGhpcy5ncmlkLmhhc0VkaXRhYmxlQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc0VkaXRhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wuZWRpdGFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgZmlsdGVyYWJsZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlsdGVyYWJsZUdyaWQgPSB0aGlzLmdyaWQuaGFzRmlsdGVyYWJsZUNvbHVtbnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNGaWx0ZXJhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wuZmlsdGVyYWJsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgYElneEdyaWRDb21wb25lbnRgIGhhcyBzdW1tYXJpemVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzdW1tYXJpemVkR3JpZCA9IHRoaXMuZ3JpZC5oYXNTdW1tYXJpemVkQ29sdW1ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcml6ZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzdW1tYXJpemVkQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuaGFzU3VtbWFyeSAmJiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiBzdW1tYXJpemVkQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290U3VtbWFyaWVzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSAhPT0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUuY2hpbGRMZXZlbHNPbmx5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNWaXNpYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zID8gdGhpcy5fY29sdW1ucy5zb21lKGMgPT4gIWMuaGlkZGVuKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDb2x1bW5zKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBoYXMgbW92ZWFibGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogVXNlIGBJZ3hHcmlkQ29tcG9uZW50Lm1vdmluZ2AgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG1vdmFibGVHcmlkID0gdGhpcy5ncmlkLmhhc01vdmFibGVDb2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzTW92YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIGNvbHVtbiBncm91cHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBncm91cEdyaWQgPSB0aGlzLmdyaWQuaGFzQ29sdW1uR3JvdXBzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uR3JvdXBzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uR3JvdXBzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgaGFzIGNvbHVtbiBsYXlvdXRzIGZvciBtdWx0aS1yb3cgbGF5b3V0IGRlZmluaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXlvdXRHcmlkID0gdGhpcy5ncmlkLmhhc0NvbHVtbkxheW91dHM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb2x1bW5MYXlvdXRzKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9jb2x1bW5zLnNvbWUoY29sID0+IGNvbC5jb2x1bW5MYXlvdXQpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG11bHRpUm93TGF5b3V0Um93U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCByb3dCYXNlZEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUxlbmd0aCAqIHRoaXMucm93SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGlzUGVyY2VudFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aCAmJiB0aGlzLndpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGVyY2VudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodCAmJiB0aGlzLl9oZWlnaHQuaW5kZXhPZignJScpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBkZWZhdWx0VGFyZ2V0Qm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHRoaXMuZGF0YUxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZWRSb3dIZWlnaHQgKiBNYXRoLm1pbih0aGlzLl9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyLFxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IgPyBNYXRoLm1pbihhbGxJdGVtcywgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSkgOiBhbGxJdGVtcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUaGUgcm93SGVpZ2h0IGlucHV0IGlzIGJvdW5kIHRvIG1pbi1oZWlnaHQgY3NzIHByb3Agb2Ygcm93cyB0aGF0IGFkZHMgYSAxcHggYm9yZGVyIGluIGFsbCBjYXNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVuZGVyZWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93SGVpZ2h0ICsgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3V0ZXJXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSA/IHRoaXMuY2FsY1dpZHRoICsgdGhpcy5zY3JvbGxTaXplIDogdGhpcy5jYWxjV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgaGVpZ2h0IHRoYXQgaW5jbHVkZXMgaGVhZGVyICsgdGJvZHkgKyBmb290ZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldFZpc2libGVDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCArIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmhhc1N1bW1hcml6ZWRDb2x1bW5zKSB7XG4gICAgICAgICAgICBoZWlnaHQgKz0gdGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldFBvc3NpYmxlQ29sdW1uV2lkdGgoYmFzZVdpZHRoOiBudW1iZXIgPSBudWxsKSB7XG4gICAgICAgIGxldCBjb21wdXRlZFdpZHRoO1xuICAgICAgICBpZiAoYmFzZVdpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wdXRlZFdpZHRoID0gYmFzZVdpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IHRoaXMuY2FsY1dpZHRoIHx8XG4gICAgICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcHV0ZWRXaWR0aCAtPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcblxuICAgICAgICBjb25zdCB2aXNpYmxlQ2hpbGRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCk7XG5cblxuICAgICAgICAvLyBDb2x1bW4gbGF5b3V0cyByZWxhdGVkXG4gICAgICAgIGxldCB2aXNpYmxlQ29scyA9IFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5CbG9ja3MgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuY29sdW1uR3JvdXApO1xuICAgICAgICBjb25zdCBjb2xzUGVyQmxvY2sgPSBjb2x1bW5CbG9ja3MubWFwKGJsb2NrID0+IGJsb2NrLmdldEluaXRpYWxDaGlsZENvbHVtblNpemVzKGJsb2NrLmNoaWxkcmVuKSk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQmxvY2tzU2l6ZSA9IGNvbHNQZXJCbG9jay5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjICsgaXRlbS5sZW5ndGgsIDApO1xuICAgICAgICBjb2xzUGVyQmxvY2suZm9yRWFjaChibG9ja0NvbHMgPT4gdmlzaWJsZUNvbHMgPSB2aXNpYmxlQ29scy5jb25jYXQoYmxvY2tDb2xzKSk7XG4gICAgICAgIC8vXG5cbiAgICAgICAgY29uc3QgY29sdW1uc1dpdGhTZXRXaWR0aHMgPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgdmlzaWJsZUNvbHMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlcikgOlxuICAgICAgICAgICAgdmlzaWJsZUNoaWxkQ29sdW1ucy5maWx0ZXIoYyA9PiBjLndpZHRoU2V0QnlVc2VyKTtcblxuICAgICAgICBjb25zdCBjb2x1bW5zVG9TaXplID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIGNvbWJpbmVkQmxvY2tzU2l6ZSAtIGNvbHVtbnNXaXRoU2V0V2lkdGhzLmxlbmd0aCA6XG4gICAgICAgICAgICB2aXNpYmxlQ2hpbGRDb2x1bW5zLmxlbmd0aCAtIGNvbHVtbnNXaXRoU2V0V2lkdGhzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc3VtRXhpc3RpbmdXaWR0aHMgPSBjb2x1bW5zV2l0aFNldFdpZHRoc1xuICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gY3Vyci53aWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgd2lkdGhWYWx1ZSA9IHBhcnNlSW50KGNvbFdpZHRoLCAxMCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHdpZHRoVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVmFsdWUgPSBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycldpZHRoID0gY29sV2lkdGggJiYgdHlwZW9mIGNvbFdpZHRoID09PSAnc3RyaW5nJyAmJiBjb2xXaWR0aC5pbmRleE9mKCclJykgIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgd2lkdGhWYWx1ZSAvIDEwMCAqIGNvbXB1dGVkV2lkdGggOlxuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3VycldpZHRoO1xuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiBhbGwgY29sdW1ucyBhcmUgaGlkZGVuLCByZXR1cm4gMHB4IHdpZHRoXG4gICAgICAgIGlmICghc3VtRXhpc3RpbmdXaWR0aHMgJiYgIWNvbHVtbnNUb1NpemUpIHtcbiAgICAgICAgICAgIHJldHVybiAnMHB4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5mbG9vcighTnVtYmVyLmlzRmluaXRlKHN1bUV4aXN0aW5nV2lkdGhzKSA/XG4gICAgICAgICAgICBNYXRoLm1heChjb21wdXRlZFdpZHRoIC8gY29sdW1uc1RvU2l6ZSwgdGhpcy5taW5Db2x1bW5XaWR0aCkgOlxuICAgICAgICAgICAgTWF0aC5tYXgoKGNvbXB1dGVkV2lkdGggLSBzdW1FeGlzdGluZ1dpZHRocykgLyBjb2x1bW5zVG9TaXplLCB0aGlzLm1pbkNvbHVtbldpZHRoKSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbHVtbldpZHRoICsgJ3B4JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNWZXJ0aWNhbFNjcm9sbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1Njcm9sbGFibGUgPSB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyID8gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5pc1Njcm9sbGFibGUoKSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gISEodGhpcy5jYWxjV2lkdGggJiYgdGhpcy5kYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3Lmxlbmd0aCA+IDAgJiYgaXNTY3JvbGxhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGNhbGN1bGF0ZWQgd2lkdGggb2YgdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkV2lkdGggPSB0aGlzLmdyaWQuZ2V0UGlubmVkV2lkdGgoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGFrZUhpZGRlbiBJZiB3ZSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgdGhlIGhpZGRlbiBjb2x1bW5zIGluIHRoZSBwaW5uZWQgYXJlYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGlubmVkV2lkdGgodGFrZUhpZGRlbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZjID0gdGFrZUhpZGRlbiA/IHRoaXMuX3Bpbm5lZENvbHVtbnMgOiB0aGlzLnBpbm5lZENvbHVtbnM7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBmYykge1xuICAgICAgICAgICAgaWYgKGNvbC5sZXZlbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN1bSArPSBwYXJzZUludChjb2wuY2FsY1dpZHRoLCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNQaW5uaW5nVG9TdGFydCkge1xuICAgICAgICAgICAgc3VtICs9IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbHVtbkdyb3VwZWQoX2ZpZWxkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIFRPRE86IFJFTU9WRVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkhlYWRlclNlbGVjdG9yQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJSb3dTZWxlY3Rpb24oZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEFsbFJvd3MoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRTZWxlY3RvckJhc2VBcmlhTGFiZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpID8gJ0Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCcgOiAnU2VsZWN0IGFsbCBmaWx0ZXJlZCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkgPyAnRGVzZWxlY3QgYWxsJyA6ICdTZWxlY3QgYWxsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbFJvd3NDb3VudEFmdGVyRmlsdGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFsbERhdGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHRyYW5zZm9ybWVkIHBhZ2VkL2ZpbHRlcmVkL3NvcnRlZC9ncm91cGVkIHBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBwaW5uZWREYXRhVmlldyA9IHRoaXMuZ3JpZC5waW5uZWREYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZERhdGFWaWV3KCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmVkUmVjb3JkcyA/IHRoaXMucGlubmVkUmVjb3JkcyA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY3VycmVudGx5IHRyYW5zZm9ybWVkIHBhZ2VkL2ZpbHRlcmVkL3NvcnRlZC9ncm91cGVkIHVucGlubmVkIHJvdyBkYXRhLCBkaXNwbGF5ZWQgaW4gdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgICAgIGNvbnN0IHBpbm5lZERhdGFWaWV3ID0gdGhpcy5ncmlkLnBpbm5lZERhdGFWaWV3O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWREYXRhVmlldygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVucGlubmVkUmVjb3JkcyA/IHRoaXMudW5waW5uZWRSZWNvcmRzIDogdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uaWd4Rm9yT2YgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHRyYW5zZm9ybWVkIHBhZ2VkL2ZpbHRlcmVkL3NvcnRlZC9ncm91cGVkL3Bpbm5lZC91bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBkYXRhVmlldyA9IHRoaXMuZ3JpZC5kYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFWaWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgY2xpY2tpbmcgb3ZlciBhIHJvdyBzaG91bGQgc2VsZWN0L2Rlc2VsZWN0IGl0XG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIHRydWVcbiAgICAgKiBAcGFyYW0gZW5hYmxlZDogYm9vbGVhblxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzZWxlY3RSb3dPbkNsaWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0Um93T25DbGljaztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlbGVjdFJvd09uQ2xpY2soZW5hYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zZWxlY3RSb3dPbkNsaWNrID0gZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3Qgc3BlY2lmaWVkIHJvd3MgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0Um93cyhbMSwyLDVdLCB0cnVlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SURzXG4gICAgICogQHBhcmFtIGNsZWFyQ3VycmVudFNlbGVjdGlvbiBpZiB0cnVlIGNsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0Um93cyhyb3dJRHM6IGFueVtdLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSb3dzV2l0aE5vRXZlbnQocm93SURzLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBzcGVjaWZpZWQgcm93cyBieSBJRC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdFJvd3MoWzEsMiw1XSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEc1xuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdFJvd3Mocm93SURzOiBhbnlbXSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RSb3dzV2l0aE5vRXZlbnQocm93SURzKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyBhbGwgcm93c1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGlmIGZpbHRlcmluZyBpcyBpbiBwbGFjZSwgc2VsZWN0QWxsUm93cygpIGFuZCBkZXNlbGVjdEFsbFJvd3MoKSBzZWxlY3QvZGVzZWxlY3QgYWxsIGZpbHRlcmVkIHJvd3MuXG4gICAgICogSWYgeW91IHNldCB0aGUgcGFyYW1ldGVyIG9ubHlGaWx0ZXJEYXRhIHRvIGZhbHNlIHRoYXQgd2lsbCBzZWxlY3QgYWxsIHJvd3MgaW4gdGhlIGdyaWQgZXhlcHQgZGVsZXRlZCByb3dzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKCk7XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdEFsbFJvd3MoZmFsc2UpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvbmx5RmlsdGVyRGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxSb3dzKG9ubHlGaWx0ZXJEYXRhID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gb25seUZpbHRlckRhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEgPyB0aGlzLmZpbHRlcmVkRGF0YSA6IHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJvd0lEcyA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRSb3dJRHMoZGF0YSkuZmlsdGVyKHJJRCA9PiAhdGhpcy5ncmlkQVBJLnJvd19kZWxldGVkX3RyYW5zYWN0aW9uKHJJRCkpO1xuICAgICAgICB0aGlzLnNlbGVjdFJvd3Mocm93SURzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgYWxsIHJvd3NcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpZiBmaWx0ZXJpbmcgaXMgaW4gcGxhY2UsIHNlbGVjdEFsbFJvd3MoKSBhbmQgZGVzZWxlY3RBbGxSb3dzKCkgc2VsZWN0L2Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCByb3dzLlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHBhcmFtZXRlciBvbmx5RmlsdGVyRGF0YSB0byBmYWxzZSB0aGF0IHdpbGwgZGVzZWxlY3QgYWxsIHJvd3MgaW4gdGhlIGdyaWQgZXhlcHQgZGVsZXRlZCByb3dzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdEFsbFJvd3MoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb25seUZpbHRlckRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RBbGxSb3dzKG9ubHlGaWx0ZXJEYXRhID0gdHJ1ZSkge1xuICAgICAgICBpZiAob25seUZpbHRlckRhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEgJiYgdGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdFJvd3ModGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFJvd0lEcyh0aGlzLmZpbHRlcmVkRGF0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRSb3dzKCk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IHRoZSBzZWxlY3RlZCBjZWxscy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY2xlYXJDZWxsU2VsZWN0aW9uKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyQ2VsbFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkcmFnU2Nyb2xsKGRlbHRhOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gdGhpcy5oZWFkZXJDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5nZXRTY3JvbGwoKTtcbiAgICAgICAgY29uc3QgeyBsZWZ0LCB0b3AgfSA9IGRlbHRhO1xuXG4gICAgICAgIGhvcml6b250YWwuc2Nyb2xsTGVmdCArPSBsZWZ0ICogdGhpcy5EUkFHX1NDUk9MTF9ERUxUQTtcbiAgICAgICAgdmVydGljYWwuc2Nyb2xsVG9wICs9IHRvcCAqIHRoaXMuRFJBR19TQ1JPTExfREVMVEE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEZWZpbmVkKGFyZzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhcmcgIT09IHVuZGVmaW5lZCAmJiBhcmcgIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHJhbmdlKHMpIG9mIGNlbGxzIGJldHdlZW4gY2VydGFpbiByb3dzIGFuZCBjb2x1bW5zIG9mIHRoZSBncmlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RSYW5nZShhcmc6IEdyaWRTZWxlY3Rpb25SYW5nZSB8IEdyaWRTZWxlY3Rpb25SYW5nZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNEZWZpbmVkKGFyZykpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBhcmcuZm9yRWFjaChyYW5nZSA9PiB0aGlzLnNldFNlbGVjdGlvbihyYW5nZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5Ub1Zpc2libGVJbmRleChmaWVsZDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zO1xuICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aXNpYmxlQ29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQgPT09IGZpZWxkKS52aXNpYmxlSW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZWN0aW9uKHJhbmdlOiBHcmlkU2VsZWN0aW9uUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0geyByb3c6IHJhbmdlLnJvd1N0YXJ0LCBjb2x1bW46IHRoaXMuY29sdW1uVG9WaXNpYmxlSW5kZXgocmFuZ2UuY29sdW1uU3RhcnQpIH07XG4gICAgICAgIGNvbnN0IGVuZE5vZGUgPSB7IHJvdzogcmFuZ2Uucm93RW5kLCBjb2x1bW46IHRoaXMuY29sdW1uVG9WaXNpYmxlSW5kZXgocmFuZ2UuY29sdW1uRW5kKSB9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5wb2ludGVyU3RhdGUubm9kZSA9IHN0YXJ0Tm9kZTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdFJhbmdlKGVuZE5vZGUsIHRoaXMuc2VsZWN0aW9uU2VydmljZS5wb2ludGVyU3RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYWRkUmFuZ2VNZXRhKGVuZE5vZGUsIHRoaXMuc2VsZWN0aW9uU2VydmljZS5wb2ludGVyU3RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuaW5pdFBvaW50ZXJTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJhbmdlcyBpbiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRSYW5nZXMoKTogR3JpZFNlbGVjdGlvblJhbmdlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnJhbmdlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgY2VsbCBzZWxlY3Rpb24gaW4gdGhlIGZvcm0gb2YgYFt7IGNvbHVtbi5maWVsZDogY2VsbC52YWx1ZSB9LCAuLi5dYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGZvcm1hdHRlcnNgIGlzIGVuYWJsZWQsIHRoZSBjZWxsIHZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IGl0cyByZXNwZWN0aXZlIGNvbHVtbiBmb3JtYXR0ZXIgKGlmIGFueSkuXG4gICAgICogSWYgYGhlYWRlcnNgIGlzIGVuYWJsZWQsIGl0IHdpbGwgdXNlIHRoZSBjb2x1bW4gaGVhZGVyIChpZiBhbnkpIGluc3RlYWQgb2YgdGhlIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWREYXRhKGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlLCBmb3JtYXR0ZXJzLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBzZWxlY3RlZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggc2VsZWN0ZWQgY29sdW1uc1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLmdyaWQuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkQ29sdW1ucygpOiBDb2x1bW5UeXBlW10ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIHJldHVybiBmaWVsZHMubWFwKGZpZWxkID0+IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKSkuZmlsdGVyKGZpZWxkID0+IGZpZWxkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0Q29sdW1ucyhbJ0lEJywnTmFtZSddLCB0cnVlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uc1xuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnMoY29sdW1uczogc3RyaW5nW10gfCBDb2x1bW5UeXBlW10sIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGZpZWxkVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY29sdW1uc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgQ29sdW1uVHlwZVtdKS5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbC5hbGxDaGlsZHJlbi5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBbLi4uZmllbGRUb1NlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QucHVzaChjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZFRvU2VsZWN0LCBjbGVhckN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucyBieSBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgQ29sdW1uVHlwZVtdKSB7XG4gICAgICAgIGxldCBmaWVsZFRvRGVzZWxlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY29sdW1uc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdCA9IGNvbHVtbnMgYXMgc3RyaW5nW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoY29sdW1ucyBhcyBDb2x1bW5UeXBlW10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb0Rlc2VsZWN0ID0gWy4uLmZpZWxkVG9EZXNlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9EZXNlbGVjdCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGFsbCBjb2x1bW5zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1ucyh0aGlzLl9jb2x1bW5zLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGNvbHVtbnMgc2VsZWN0aW9uIGluIHRoZSBmb3JtIG9mIGBbeyBjb2x1bW4uZmllbGQ6IGNlbGwudmFsdWUgfSwgLi4uXWAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBmb3JtYXR0ZXJzYCBpcyBlbmFibGVkLCB0aGUgY2VsbCB2YWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBieSBpdHMgcmVzcGVjdGl2ZSBjb2x1bW4gZm9ybWF0dGVyIChpZiBhbnkpLlxuICAgICAqIElmIGBoZWFkZXJzYCBpcyBlbmFibGVkLCBpdCB3aWxsIHVzZSB0aGUgY29sdW1uIGhlYWRlciAoaWYgYW55KSBpbnN0ZWFkIG9mIHRoZSBjb2x1bW4gZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29sdW1uc0RhdGEoZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEgPyB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSA6IHRoaXMuZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tQ29sdW1uc1NlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMpO1xuICAgIH1cblxuXG4gICAgcHVibGljIGNvbWJpbmVTZWxlY3RlZENlbGxBbmRDb2x1bW5EYXRhKGNvbHVtbkRhdGE6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycywgY29sdW1uRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmVudENvbnRhaW5lclNjcm9sbCA9IChldnQpID0+IHtcbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmFkZFNjcm9sbFRvcChldnQudGFyZ2V0LnNjcm9sbFRvcCk7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2dC50YXJnZXQuc2Nyb2xsTGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb24gKz0gZXZ0LnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvcHlIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50UGF0aEVsZW1lbnRzID0gZXZlbnQuY29tcG9zZWRQYXRoKCkubWFwKGVsID0+IGVsLnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoZXZlbnRQYXRoRWxlbWVudHMuaW5jbHVkZXMoJ2lneC1ncmlkLWZpbHRlcmluZy1yb3cnKSB8fFxuICAgICAgICAgICAgZXZlbnRQYXRoRWxlbWVudHMuaW5jbHVkZXMoJ2lneC1ncmlkLWZpbHRlcmluZy1jZWxsJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuZ3JpZEFQSS5ncmlkLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBjb25zdCBjb2x1bW5EYXRhID0gdGhpcy5nZXRTZWxlY3RlZENvbHVtbnNEYXRhKHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycywgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb3B5Jykge1xuICAgICAgICAgICAgc2VsZWN0ZWREYXRhID0gdGhpcy5nZXRTZWxlY3RlZERhdGEodGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgIGxldCByZXN1bHQ7XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdLZXlDJyAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5jdXJyZW50VGFyZ2V0LmNsYXNzTmFtZSA9PT0gJ2lneC1ncmlkLXRoZWFkX193cmFwcGVyJykge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIHNlbGVjdGVkRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGFbMF0sIGRhdGFbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChyZXN1bHQpLnRoZW4oKS5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuZW5hYmxlZCB8fCB0aGlzLmNydWRTZXJ2aWNlLmNlbGxJbkVkaXRNb2RlIHx8IGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5jb21iaW5lU2VsZWN0ZWRDZWxsQW5kQ29sdW1uRGF0YShjb2x1bW5EYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGFbMF0sIGRhdGFbMV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZWN0ZWREYXRhO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGEsIGtleXM/KSB7XG4gICAgICAgIGNvbnN0IGV2ID0geyBkYXRhLCBjYW5jZWw6IGZhbHNlIH0gYXMgSUdyaWRDbGlwYm9hcmRFdmVudDtcbiAgICAgICAgdGhpcy5ncmlkQ29weS5lbWl0KGV2KTtcblxuICAgICAgICBpZiAoZXYuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhKGV2LmRhdGEsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5zZXBhcmF0b3IpO1xuICAgICAgICBsZXQgcmVzdWx0ID0ga2V5cyA/IHRyYW5zZm9ybWVyLnByZXBhcmVEYXRhKGtleXMpIDogdHJhbnNmb3JtZXIucHJlcGFyZURhdGEoKTtcblxuICAgICAgICBpZiAoIXRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQuaW5kZXhPZignXFxuJykgKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCAmJiBPYmplY3QudmFsdWVzKGRhdGFbMF0pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLyogTmVjZXNzYXJ5IGZvciB0aGUgaGllYXJhY2hpY2FsIGNhc2UgYnV0IHdpbGwgcHJvYmFibHkgaGF2ZSB0b1xuICAgICAgICAgICBjaGFuZ2UgaG93IGdldFNlbGVjdGVkRGF0YSBpcyBwcm9wYWdhdGVkIGluIHRoZSBoaWVhcmFjaGljYWwgZ3JpZFxuICAgICAgICAqL1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNob3dTbmFja2JhckZvcihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIuYWN0aW9uVGV4dCA9IGluZGV4ID09PSAtMSA/ICcnIDogdGhpcy5zbmFja2JhckFjdGlvblRleHQ7XG4gICAgICAgIHRoaXMubGFzdEFkZGVkUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGVzIHRvIGEgcG9zaXRpb24gaW4gdGhlIGdyaWQgYmFzZWQgb24gcHJvdmlkZWQgYHJvd2luZGV4YCBhbmQgYHZpc2libGVDb2x1bW5JbmRleGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsc28gY2FuIGV4ZWN1dGUgYSBjdXN0b20gbG9naWMgb3ZlciB0aGUgdGFyZ2V0IGVsZW1lbnQsXG4gICAgICogdGhyb3VnaCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB7IHRhcmdldFR5cGU6IEdyaWRLZXlkb3duVGFyZ2V0VHlwZSwgdGFyZ2V0OiBPYmplY3QgfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICB0aGlzLmdyaWQubmF2aWdhdGVUbygxMCwgMywgKGFyZ3MpID0+IHsgYXJncy50YXJnZXQubmF0aXZlRWxlbWVudC5mb2N1cygpOyB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVUbyhyb3dJbmRleDogbnVtYmVyLCB2aXNpYmxlQ29sSW5kZXggPSAtMSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSAodGhpcyBhcyBhbnkpLnRvdGFsSXRlbUNvdW50ID8/IHRoaXMuZGF0YVZpZXcubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKHJvd0luZGV4IDwgMCB8fCByb3dJbmRleCA+IHRvdGFsSXRlbXMgfHwgKHZpc2libGVDb2xJbmRleCAhPT0gLTFcbiAgICAgICAgICAgICYmIHRoaXMuX2NvbHVtbnMubWFwKGNvbCA9PiBjb2wudmlzaWJsZUluZGV4KS5pbmRleE9mKHZpc2libGVDb2xJbmRleCkgPT09IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNsaWNlKHJvd0luZGV4LCByb3dJbmRleCArIDEpLmZpbmQocmVjID0+IHJlYy5leHByZXNzaW9uIHx8IHJlYy5jaGlsZEdyaWRzRGF0YSkpIHtcbiAgICAgICAgICAgIHZpc2libGVDb2xJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSB0YXJnZXQgcm93IGlzIHBpbm5lZCBubyBuZWVkIHRvIHNjcm9sbCBhcyB3ZWxsLlxuICAgICAgICBjb25zdCBzaG91bGRTY3JvbGxWZXJ0aWNhbGx5ID0gdGhpcy5uYXZpZ2F0aW9uLnNob3VsZFBlcmZvcm1WZXJ0aWNhbFNjcm9sbChyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgY29uc3Qgc2hvdWxkU2Nyb2xsSG9yaXpvbnRhbGx5ID0gdGhpcy5uYXZpZ2F0aW9uLnNob3VsZFBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsKHZpc2libGVDb2xJbmRleCwgcm93SW5kZXgpO1xuICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsVmVydGljYWxseSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1WZXJ0aWNhbFNjcm9sbFRvQ2VsbChyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNjcm9sbEhvcml6b250YWxseSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybUhvcml6b250YWxTY3JvbGxUb0NlbGwodmlzaWJsZUNvbEluZGV4LCAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkU2Nyb2xsSG9yaXpvbnRhbGx5KSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybUhvcml6b250YWxTY3JvbGxUb0NlbGwodmlzaWJsZUNvbEluZGV4LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNjcm9sbFZlcnRpY2FsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1WZXJ0aWNhbFNjcm9sbFRvQ2VsbChyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBJQ2VsbFBvc2l0aW9uYCB3aGljaCBkZWZpbmVzIHRoZSBuZXh0IGNlbGwsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGF0IG1hdGNoIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgY2FuIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYSB0aGlyZCBwYXJhbWV0ZXIgb2YgYGdldFByZXZpb3VzQ2VsbGAgbWV0aG9kLlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhY2NlcHRzIElneENvbHVtbkNvbXBvbmVudCBhcyBhIHBhcmFtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IG5leHRFZGl0YWJsZUNlbGxQb3NpdGlvbiA9IHRoaXMuZ3JpZC5nZXROZXh0Q2VsbCgwLCAzLCAoY29sdW1uKSA9PiBjb2x1bW4uZWRpdGFibGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROZXh0Q2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXdJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoY3VyclJvd0luZGV4KTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQb3NpdGlvbihkYXRhVmlld0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ZXMgPSBjYWxsYmFjayA/IGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNhbGxiYWNrKGNvbCkpLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYikgOlxuICAgICAgICAgICAgY29sdW1ucy5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBjb25zdCBuZXh0Q2VsbEluZGV4ID0gY29sSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4ID4gY3VyVmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2UoZGF0YVZpZXdJbmRleCwgZGF0YVZpZXdJbmRleCArIDEpXG4gICAgICAgICAgICAuZmluZChyZWMgPT4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSkgJiYgbmV4dENlbGxJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IG5leHRDZWxsSW5kZXggfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgpXG4gICAgICAgICAgICBpZiAoY29sSW5kZXhlcy5sZW5ndGggPT09IDAgfHwgbmV4dEluZGV4ID09PSBjdXJyUm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogbmV4dEluZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGNvbEluZGV4ZXNbMF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYElDZWxsUG9zaXRpb25gIHdoaWNoIGRlZmluZXMgdGhlIHByZXZpb3VzIGNlbGwsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGF0IG1hdGNoIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgY2FuIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYSB0aGlyZCBwYXJhbWV0ZXIgb2YgYGdldFByZXZpb3VzQ2VsbGAgbWV0aG9kLlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhY2NlcHRzIElneENvbHVtbkNvbXBvbmVudCBhcyBhIHBhcmFtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IHByZXZpb3VzRWRpdGFibGVDZWxsUG9zaXRpb24gPSB0aGlzLmdyaWQuZ2V0UHJldmlvdXNDZWxsKDAsIDMsIChjb2x1bW4pID0+IGNvbHVtbi5lZGl0YWJsZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFByZXZpb3VzQ2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXdJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoY3VyclJvd0luZGV4KTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQb3NpdGlvbihkYXRhVmlld0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ZXMgPSBjYWxsYmFjayA/IGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNhbGxiYWNrKGNvbCkpLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBiIC0gYSkgOlxuICAgICAgICAgICAgY29sdW1ucy5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBjb25zdCBwcmV2Q2VsbEluZGV4ID0gY29sSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4IDwgY3VyVmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2UoZGF0YVZpZXdJbmRleCwgZGF0YVZpZXdJbmRleCArIDEpXG4gICAgICAgICAgICAuZmluZChyZWMgPT4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSkgJiYgcHJldkNlbGxJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IHByZXZDZWxsSW5kZXggfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZJbmRleCA9IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbEluZGV4ZXMubGVuZ3RoID09PSAwIHx8IHByZXZJbmRleCA9PT0gY3VyclJvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IHByZXZJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjb2xJbmRleGVzWzBdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZFJvd0VkaXRUYWJTdG9wKGNvbW1pdCA9IHRydWUsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgY2FuY2VsZWQgPSB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoY29tbWl0LCBldmVudCk7XG5cbiAgICAgICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSB0aGlzLmdyaWRBUEkuZ3JpZC5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGU7XG4gICAgICAgIGlmIChhY3RpdmVDZWxsICYmIGFjdGl2ZUNlbGwucm93ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFja0NvbHVtbkNoYW5nZXMoaW5kZXgsIGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmZpZWxkICsgY29sLl9jYWxjV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cGFuZGVkR3JvdXAoX2dyb3VwOiBJR3JvdXBCeVJlY29yZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVE9ETzogTU9WRSB0byBDUlVEXG4gICAgICovXG4gICAgcHVibGljIG9wZW5Sb3dPdmVybGF5KGlkKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkoaWQsIHRoaXMucm93TGlzdC5sZW5ndGggPD0gTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCk7XG5cbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5vcGVuKHRoaXMucm93RWRpdFNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5yb3dFZGl0aW5nV2hlZWxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlUm93RWRpdGluZ092ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMucm93RWRpdGluZ1doZWVsSGFuZGxlcik7XG4gICAgICAgIHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3BJbml0aWFsUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNsb3NlKCk7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShzaG93KSB7XG4gICAgICAgIGNvbnN0IHJvd1N0eWxlID0gdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnN0eWxlO1xuICAgICAgICBpZiAoc2hvdykge1xuICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwb3NpdGlvblJvd0VkaXRpbmdPdmVybGF5KHJvdzogUm93VHlwZSkge1xuICAgICAgICBpZiAocm93ICYmICF0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgY29uc3Qgcm93U3R5bGUgPSB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZTtcbiAgICAgICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmVSb3dFZGl0aW5nT3ZlcmxheShyb3cua2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhY2hlZFZpZXdMb2FkZWQoYXJnczogSUNhY2hlZFZpZXdMb2FkZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSG9yaXpvbnRhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICBjb25zdCB0bXBsSWQgPSBhcmdzLmNvbnRleHQudGVtcGxhdGVJRC50eXBlO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBhcmdzLmNvbnRleHQuaW5kZXg7XG4gICAgICAgICAgICBhcmdzLnZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0bXBsSWQgPT09ICdkYXRhUm93JyA/IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2luZGV4KGluZGV4KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVJvdyA9IHRtcGxJZCA9PT0gJ3N1bW1hcnlSb3cnID8gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbmQoKHNyKSA9PiBzci5kYXRhUm93SW5kZXggPT09IGluZGV4KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHJvdyAmJiByb3cgaW5zdGFuY2VvZiBJZ3hSb3dEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdG9yZVZpcnRTdGF0ZShyb3cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VtbWFyeVJvdykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN0b3JlVmlydFN0YXRlKHN1bW1hcnlSb3cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBkaWFsb2cuXG4gICAgICovXG4gICAgcHVibGljIG9wZW5BZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhvdmVybGF5U2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBvdmVybGF5U2V0dGluZ3MgPyBvdmVybGF5U2V0dGluZ3MgOiB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncztcbiAgICAgICAgaWYgKCF0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLnJvb3RHcmlkID8gKHRoaXMgYXMgYW55KS5yb290R3JpZC5uYXRpdmVFbGVtZW50IDogdGhpcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG5cbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID0gdGhpcy5vdmVybGF5U2VydmljZS5hdHRhY2goXG4gICAgICAgICAgICAgICAgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3UmVmLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uuc2hvdyh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXBwbHlDaGFuZ2VzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlQWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2coYXBwbHlDaGFuZ2VzOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgY29uc3QgYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyA9IGFkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQ7XG5cbiAgICAgICAgICAgIGlmIChhcHBseUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZy5hcHBseUNoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFbXB0eVJlY29yZE9iamVjdEZvcihpblJvdzogUm93VHlwZSkge1xuICAgICAgICBjb25zdCByb3cgPSB7IC4uLmluUm93Py5kYXRhIH07XG4gICAgICAgIE9iamVjdC5rZXlzKHJvdykuZm9yRWFjaChrZXkgPT4gcm93W2tleV0gPSB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVSb3dJRCgpO1xuICAgICAgICByb3dbdGhpcy5wcmltYXJ5S2V5XSA9IGlkO1xuICAgICAgICByZXR1cm4geyByb3dJRDogaWQsIGRhdGE6IHJvdywgcmVjb3JkUmVmOiByb3cgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNIb3Jpem9udGFsU2Nyb2xsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3RhbFdpZHRoIC0gdGhpcy51bnBpbm5lZFdpZHRoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1N1bW1hcnlSb3cocm93RGF0YSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcm93RGF0YSAmJiByb3dEYXRhLnN1bW1hcmllcyAmJiAocm93RGF0YS5zdW1tYXJpZXMgaW5zdGFuY2VvZiBNYXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRyaWdnZXJQaXBlcygpIHtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByb3dFZGl0aW5nV2hlZWxIYW5kbGVyKGV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbE5leHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsUHJldigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRVbnBpbm5lZEluZGV4QnlJZChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMuZmluZEluZGV4KHggPT4geFt0aGlzLnByaW1hcnlLZXldID09PSBpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluaXNoZXMgdGhlIHJvdyB0cmFuc2FjdGlvbnMgb24gdGhlIGN1cnJlbnQgcm93LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgY29tbWl0ID09PSB0cnVlYCwgcGFzc2VzIHRoZW0gZnJvbSB0aGUgcGVuZGluZyBzdGF0ZSB0byB0aGUgZGF0YSAob3IgdHJhbnNhY3Rpb24gc2VydmljZSlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8YnV0dG9uIGlneEJ1dHRvbiAoY2xpY2spPVwiZ3JpZC5lbmRFZGl0KHRydWUpXCI+Q29tbWl0IFJvdzwvYnV0dG9uPlxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb21taXRcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBGYWNhZGUgZm9yIGNydWQgc2VydmljZSByZWZhY3RvcmluZy4gVG8gYmUgcmVtb3ZlZFxuICAgIC8vIFRPRE86IGRvIG5vdCByZW1vdmUgdGhpcywgYXMgaXQgaXMgdXNlZCBpbiByb3dFZGl0VGVtcGxhdGUsIGJ1dCBtYXJrIGlzIGFzIGludGVybmFsIGFuZCBoaWRkZW5cbiAgICBwdWJsaWMgZW5kRWRpdChjb21taXQgPSB0cnVlLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChjb21taXQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnRlcnMgYWRkIG1vZGUgYnkgc3Bhd25pbmcgdGhlIFVJIHVuZGVyIHRoZSBzcGVjaWZpZWQgcm93IGJ5IHJvd0lELlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBudWxsIGlzIHBhc3NlZCBhcyByb3dJRCwgdGhlIHJvdyBhZGRpbmcgVUkgaXMgc3Bhd25lZCBhcyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXdcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNwYXduaW5nIHRoZSBVSSB0byBhZGQgYSBjaGlsZCBmb3IgYSByZWNvcmQgb25seSB3b3JrcyBpZiB5b3UgcHJvdmlkZSBhIHJvd0lEXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJZCgnQUxGS0knKTtcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUlkKCdBTEZLSScsIHRydWUpO1xuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SWQobnVsbCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIC0gVGhlIHJvd0lEIHRvIHNwYXduIHRoZSBhZGQgcm93IFVJIGZvciwgb3IgbnVsbCB0byBzcGF3biBpdCBhcyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXdcbiAgICAgKiBAcGFyYW0gYXNDaGlsZCAtIFdoZXRoZXIgdGhlIHJlY29yZCBzaG91bGQgYmUgYWRkZWQgYXMgYSBjaGlsZC4gT25seSBhcHBsaWNhYmxlIHRvIGlneFRyZWVHcmlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBiZWdpbkFkZFJvd0J5SWQocm93SUQ6IGFueSwgYXNDaGlsZD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgbGV0IGluZGV4ID0gcm93SUQ7XG4gICAgICAgIGlmIChyb3dJRCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoYXNDaGlsZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIHJlY29yZCBjYW5ub3QgYmUgYWRkZWQgYXMgYSBjaGlsZCB0byBhbiB1bnNwZWNpZmllZCByZWNvcmQuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXggPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIHJlY29yZCB3aXRoIHRoYXQgUEtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5ncmlkQVBJLmdldF9yZWNfaW5kZXhfYnlfaWQocm93SUQsIHRoaXMuZGF0YVZpZXcpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcm93IHdpdGggdGhlIHNwZWNpZmllZCBJRCB3YXMgZm91bmQuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWRkUm93Rm9ySW5kZXgoaW5kZXgsIGFzQ2hpbGQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfYWRkUm93Rm9ySW5kZXgoaW5kZXg6IG51bWJlciwgYXNDaGlsZD86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5iZWdpbkFkZFJvd0ZvckluZGV4KGluZGV4LCBhc0NoaWxkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgaW5kZXggaXMgdmFsaWQgLSB3b24ndCBzdXBwb3J0IGFueXRoaW5nIG91dHNpZGUgdGhlIGRhdGEgdmlld1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuZGF0YVZpZXcubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgaW5kZXggaXMgaW4gdGhlIHZpZXcgcG9ydFxuICAgICAgICAgICAgaWYgKChpbmRleCA8IHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4IHx8XG4gICAgICAgICAgICAgICAgaW5kZXggPj0gdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXggKyB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuY2h1bmtTaXplKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmlzUmVjb3JkUGlubmVkQnlWaWV3SW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jaHVua0xvYWRcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5BZGRSb3dGb3JJbmRleChpbmRleCwgYXNDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyhpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmVnaW5BZGRSb3dGb3JJbmRleChpbmRleCwgYXNDaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSByb3cgd2l0aCB0aGUgc3BlY2lmaWVkIFBLIG9yIGluZGV4IGlzIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgZGF0YSB2aWV3LicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW50ZXJzIGFkZCBtb2RlIGJ5IHNwYXduaW5nIHRoZSBVSSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBY2NlcHRlZCB2YWx1ZXMgZm9yIGluZGV4IGFyZSBpbnRlZ2VycyBmcm9tIDAgdG8gdGhpcy5ncmlkLmRhdGFWaWV3Lmxlbmd0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SW5kZXgoMCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IHRvIHNwYXduIHRoZSBVSSBhdC4gQWNjZXB0cyBpbnRlZ2VycyBmcm9tIDAgdG8gdGhpcy5ncmlkLmRhdGFWaWV3Lmxlbmd0aFxuICAgICAqL1xuICAgIHB1YmxpYyBiZWdpbkFkZFJvd0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJlZ2luQWRkUm93QnlJZChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkUm93Rm9ySW5kZXgoaW5kZXggLSAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHByZXZlbnRIZWFkZXJTY3JvbGwoYXJncykge1xuICAgICAgICBpZiAoYXJncy50YXJnZXQuc2Nyb2xsTGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgKHRoaXMubmF2aWdhdGlvbiBhcyBhbnkpLmZvck9mRGlyKCkuZ2V0U2Nyb2xsKCkuc2Nyb2xsTGVmdCA9IGFyZ3MudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICBhcmdzLnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBiZWdpbkFkZFJvd0ZvckluZGV4KGluZGV4OiBudW1iZXIsIGFzQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICAvLyBUT0RPIGlzIHJvdyBmcm9tIHJvd0xpc3Qgc3VpdGFibGUgZm9yIGVudGVyQWRkUm93TW9kZVxuICAgICAgICBjb25zdCByb3cgPSBpbmRleCA9PSBudWxsID9cbiAgICAgICAgICAgIG51bGwgOiB0aGlzLnJvd0xpc3QuZmluZChyID0+IHIuaW5kZXggPT09IGluZGV4KTtcbiAgICAgICAgaWYgKHJvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVudGVyQWRkUm93TW9kZShyb3csIGFzQ2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyByb3cgd2l0aCB0aGUgc3BlY2lmaWVkIFBLIG9yIGluZGV4IHdhcyBmb3VuZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzd2l0Y2hUcmFuc2FjdGlvblNlcnZpY2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25GYWN0b3J5LmNyZWF0ZShUUkFOU0FDVElPTl9UWVBFLkJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuTm9uZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhQ2xvbmVTdHJhdGVneSkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zLmNsb25lU3RyYXRlZ3kgPSB0aGlzLmRhdGFDbG9uZVN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJC5uZXh0KCk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLm9uU3RhdGVVcGRhdGUucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5kZXN0cm95JCwgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy50cmFuc2FjdGlvblN0YXR1c1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25TdGF0dXNVcGRhdGUoZXZlbnQ6IFN0YXRlVXBkYXRlRXZlbnQpIHtcbiAgICAgICAgbGV0IGFjdGlvbnM6IEFjdGlvbjxUcmFuc2FjdGlvbj5bXSA9IFtdO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlJFRE8pIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBldmVudC5hY3Rpb25zID8gZXZlbnQuYWN0aW9ucy5maWx0ZXIoeCA9PiB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUpIDogW107XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlVORE8pIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBldmVudC5hY3Rpb25zID8gZXZlbnQuYWN0aW9ucy5maWx0ZXIoeCA9PiB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpIDogW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNSb3dTZWxlY3RlZChhY3Rpb24udHJhbnNhY3Rpb24uaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdFJvdyhhY3Rpb24udHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlJFRE8gfHwgZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlVORE8pIHtcbiAgICAgICAgICAgIGV2ZW50LmFjdGlvbnMuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoeC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuVVBEQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHgudHJhbnNhY3Rpb24uaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24udXBkYXRlKHgudHJhbnNhY3Rpb24uaWQsIHZhbHVlID8/IHgucmVjb3JkUmVmKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkRFTEVURSB8fCB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYW5zYWN0aW9ucy5nZXRBZ2dyZWdhdGVkVmFsdWUoeC50cmFuc2FjdGlvbi5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uLmNyZWF0ZSh4LnRyYW5zYWN0aW9uLmlkLCB2YWx1ZSA/PyB4LnJlY29yZFJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24udXBkYXRlKHgudHJhbnNhY3Rpb24uaWQsIHZhbHVlID8/IHgucmVjb3JkUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi5tYXJrQXNUb3VjaGVkKHgudHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uLmNsZWFyKHgudHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgd3JpdGVUb0RhdGEocm93SW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSkge1xuICAgICAgICBtZXJnZU9iamVjdHModGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSgpW3Jvd0luZGV4XSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcmVzdG9yZVZpcnRTdGF0ZShyb3cpIHtcbiAgICAgICAgLy8gY2hlY2sgdmlydHVhbGl6YXRpb24gc3RhdGUgb2YgZGF0YSByZWNvcmQgYWRkZWQgZnJvbSBjYWNoZVxuICAgICAgICAvLyBpbiBjYXNlIHN0YXRlIGlzIG5vIGxvbmdlciB2YWxpZCAtIHVwZGF0ZSBpdC5cbiAgICAgICAgY29uc3Qgcm93Rm9yT2YgPSByb3cudmlydERpclJvdztcbiAgICAgICAgY29uc3QgZ3JpZFNjckxlZnQgPSByb3dGb3JPZi5nZXRTY3JvbGwoKS5zY3JvbGxMZWZ0O1xuICAgICAgICBjb25zdCBsZWZ0ID0gLXBhcnNlSW50KHJvd0Zvck9mLmRjLmluc3RhbmNlLl92aWV3Q29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0LCAxMCk7XG4gICAgICAgIGNvbnN0IGFjdHVhbFNjcm9sbExlZnQgPSBsZWZ0ICsgcm93Rm9yT2YuZ2V0Q29sdW1uU2Nyb2xsTGVmdChyb3dGb3JPZi5zdGF0ZS5zdGFydEluZGV4KTtcbiAgICAgICAgaWYgKGdyaWRTY3JMZWZ0ICE9PSBhY3R1YWxTY3JvbGxMZWZ0KSB7XG4gICAgICAgICAgICByb3dGb3JPZi5vbkhTY3JvbGwoZ3JpZFNjckxlZnQpO1xuICAgICAgICAgICAgcm93Rm9yT2YuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGFuZ2VSb3dFZGl0aW5nT3ZlcmxheVN0YXRlT25TY3JvbGwocm93OiBSb3dUeXBlKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3dFZGl0YWJsZSB8fCAhdGhpcy5yb3dFZGl0aW5nT3ZlcmxheSB8fCB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVJvd0VkaXRpbmdPdmVybGF5KGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdGlvblJvd0VkaXRpbmdPdmVybGF5KHJvdyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gZGF0YSBhbmQvb3IgaXNMb2FkaW5nIGlucHV0IGNoYW5nZXMgc28gdGhhdCB0aGUgb3ZlcmxheSBjYW4gYmVcbiAgICAgKiBoaWRkZW4vc2hvd24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc2hvdWxkT3ZlcmxheUxvYWRpbmdcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZXZhbHVhdGVMb2FkaW5nU3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZE92ZXJsYXlMb2FkaW5nKSB7XG4gICAgICAgICAgICAvLyBhIG5ldyBvdmVybGF5IHNob3VsZCBiZSBzaG93blxuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSB7XG4gICAgICAgICAgICAgICAgb3V0bGV0OiB0aGlzLmxvYWRpbmdPdXRsZXQsXG4gICAgICAgICAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbnRhaW5lclBvc2l0aW9uU3RyYXRlZ3koKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ092ZXJsYXkub3BlbihvdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nT3ZlcmxheS5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNldHMgZ3JpZCB3aWR0aCBpLmUuIHRoaXMuY2FsY1dpZHRoXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUdyaWRXaWR0aCgpIHtcbiAgICAgICAgbGV0IHdpZHRoO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUGVyY2VudFdpZHRoKSB7XG4gICAgICAgICAgICAvKiB3aWR0aCBpbiAlKi9cbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKTtcbiAgICAgICAgICAgIHdpZHRoID0gY29tcHV0ZWQuaW5kZXhPZignJScpID09PSAtMSA/IHBhcnNlSW50KGNvbXB1dGVkLCAxMCkgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2lkdGggPSBwYXJzZUludCh0aGlzLndpZHRoLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXdpZHRoICYmIHRoaXMubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsIHx8ICF3aWR0aCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoU3VtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpICYmIHRoaXMud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKE51bWJlci5pc0Zpbml0ZSh3aWR0aCkgfHwgd2lkdGggPT09IG51bGwpICYmIHdpZHRoICE9PSB0aGlzLmNhbGNXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjV2lkdGggPSB3aWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZXJpdmVQb3NzaWJsZVdpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNldHMgY29sdW1ucyBkZWZhdWx0V2lkdGggcHJvcGVydHlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Rlcml2ZVBvc3NpYmxlV2lkdGgoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlcikge1xuICAgICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGggPSB0aGlzLndpZHRoICE9PSBudWxsID8gdGhpcy5nZXRQb3NzaWJsZUNvbHVtbldpZHRoKCkgOiB0aGlzLm1pbkNvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzICYmIHBhcnNlSW50KHRoaXMuX2NvbHVtbldpZHRoLCAxMCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5XaWR0aENvbWJpbmVkID0gcGFyc2VJbnQodGhpcy5fY29sdW1uV2lkdGgsIDEwKSAqIChjb2x1bW4uY29sRW5kID8gY29sdW1uLmNvbEVuZCAtIGNvbHVtbi5jb2xTdGFydCA6IDEpO1xuICAgICAgICAgICAgICAgIGNvbHVtbi5kZWZhdWx0V2lkdGggPSBjb2x1bW5XaWR0aENvbWJpbmVkICsgJ3B4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRC5LLiBNYXJjaCAyOXRoLCAyMDIxICM5MTQ1IENvbnNpZGVyIG1pbi9tYXggd2lkdGggd2hlbiBzZXR0aW5nIGRlZmF1bHRXaWR0aCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGNvbHVtbi5kZWZhdWx0V2lkdGggPSB0aGlzLmdldEV4dHJlbXVtQmFzZWRDb2xXaWR0aChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGNvbHVtbi5yZXNldENhY2hlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlZFdpZHRocygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RXh0cmVtdW1CYXNlZENvbFdpZHRoKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5fY29sdW1uV2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCAmJiB0eXBlb2Ygd2lkdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB3aWR0aCA9IFN0cmluZyh3aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWluV2lkdGggPSB3aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gY29sdW1uLm1pbldpZHRoUHggOiBjb2x1bW4ubWluV2lkdGhQZXJjZW50O1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBjb2x1bW4ubWF4V2lkdGhQeCA6IGNvbHVtbi5tYXhXaWR0aFBlcmNlbnQ7XG4gICAgICAgIGlmIChjb2x1bW4uaGlkZGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWluV2lkdGggPiBwYXJzZUZsb2F0KHdpZHRoKSkge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcoY29sdW1uLm1pbldpZHRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXhXaWR0aCA8IHBhcnNlRmxvYXQod2lkdGgpKSB7XG4gICAgICAgICAgICB3aWR0aCA9IFN0cmluZyhjb2x1bW4ubWF4V2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm8gcHggb3IgJSBhcmUgZGVmaW5lZCBpbiBtYXhXaWR0aC9taW5XaWR0aCBjb25zaWRlciBpdCBweFxuICAgICAgICBpZiAod2lkdGguaW5kZXhPZignJScpID09PSAtMSAmJiB3aWR0aC5pbmRleE9mKCdweCcpID09PSAtMSkge1xuICAgICAgICAgICAgd2lkdGggKz0gJ3B4JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2V0Tm90aWZ5Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdHMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZU91dGxldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgPyB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlIDogdGhpcy5fb3V0bGV0RGlyZWN0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgY29sdW1ucyBpbiB0aGUgbWFpbiBjb2x1bW5MaXN0IGFuZCBfY29sdW1ucyBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX21vdmVDb2x1bW5zKGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zOiBEcm9wUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZExpc3QgPSB0aGlzLl9waW5uZWRDb2x1bW5zLmNvbmNhdCh0aGlzLl91bnBpbm5lZENvbHVtbnMpO1xuICAgICAgICBjb25zdCBsaXN0ID0gb3JkZXJlZExpc3Q7XG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGZyb20sIHRvLCBwb3MsIGxpc3QpO1xuICAgICAgICBjb25zdCBuZXdMaXN0ID0gdGhpcy5fcmVzZXRDb2x1bW5MaXN0KGxpc3QpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMobmV3TGlzdCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgaW50ZXJuYWwgY29sdW1uJ3MgY29sbGVjdGlvbi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUNvbHVtbnMobmV3Q29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10pIHtcbiAgICAgICAgLy8gdXBkYXRlIGludGVybmFsIGNvbGxlY3Rpb25zIHRvIHJldGFpbiBvcmRlci5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucyA9IG5ld0NvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMucGlubmVkKTtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gbmV3Q29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZCk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSBuZXdDb2x1bW5zO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcmVzZXRDb2x1bW5MaXN0KGxpc3Q/KSB7XG4gICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgbGlzdCA9IHRoaXMuX2NvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld0xpc3QgPSBbXTtcbiAgICAgICAgbGlzdC5maWx0ZXIoYyA9PiBjLmxldmVsID09PSAwKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgbmV3TGlzdC5wdXNoKHApO1xuICAgICAgICAgICAgaWYgKHAuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuZXdMaXN0ID0gbmV3TGlzdC5jb25jYXQocC5hbGxDaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3TGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVycyBjb2x1bW5zIGluc2lkZSB0aGUgcGFzc2VkIGNvbHVtbiBjb2xsZWN0aW9uLlxuICAgICAqIFdoZW4gcmVvcmRlcmluZyBjb2x1bW4gZ3JvdXAgY29sbGVjdGlvbiwgdGhlIGNvbGxlY3Rpb24gaXMgbm90IGZsYXR0ZW5lZC5cbiAgICAgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBjb2x1bW5zIGNvbGxlY3Rpb24gaXMgZmxhdHRlbmVkLCB0aGlzIGlzIHdoeSBhZGl0dGlvbmFsIGNhbGN1bGF0aW9ucyBvbiB0aGUgZHJvcEluZGV4IGFyZSBkb25lLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcmVvcmRlckNvbHVtbnMoZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3NpdGlvbjogRHJvcFBvc2l0aW9uLCBjb2x1bW5Db2xsZWN0aW9uOiBhbnlbXSxcbiAgICAgICAgaW5Hcm91cCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZyb21JbmRleCA9IGNvbHVtbkNvbGxlY3Rpb24uaW5kZXhPZihmcm9tKTtcbiAgICAgICAgY29uc3QgY2hpbGRDb2x1bW5zQ291bnQgPSBpbkdyb3VwID8gMSA6IGZyb20uYWxsQ2hpbGRyZW4ubGVuZ3RoICsgMTtcbiAgICAgICAgY29sdW1uQ29sbGVjdGlvbi5zcGxpY2UoZnJvbUluZGV4LCBjaGlsZENvbHVtbnNDb3VudCk7XG4gICAgICAgIGxldCBkcm9wSW5kZXggPSBjb2x1bW5Db2xsZWN0aW9uLmluZGV4T2YodG8pO1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQpIHtcbiAgICAgICAgICAgIGRyb3BJbmRleCsrO1xuICAgICAgICAgICAgaWYgKCFpbkdyb3VwICYmIHRvLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZHJvcEluZGV4ICs9IHRvLmFsbENoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5Db2xsZWN0aW9uLnNwbGljZShkcm9wSW5kZXgsIDAsIGZyb20pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgY29sdW1uIGdyb3VwIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tb3ZlQ2hpbGRDb2x1bW5zKHBhcmVudDogSWd4Q29sdW1uQ29tcG9uZW50LCBmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHBhcmVudC5jaGlsZHJlbi50b0FycmF5KCk7XG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGZyb20sIHRvLCBwb3MsIGJ1ZmZlciwgdHJ1ZSk7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5yZXNldChidWZmZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNldHVwQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0dlbmVyYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLmdldENvbHVtbkxpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnModGhpcy5fY29sdW1ucywgKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB0aGlzLmNvbHVtbkluaXQuZW1pdChjb2wpKTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0RGlmZmVyLmRpZmYodGhpcy5jb2x1bW5MaXN0KTtcblxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlZChjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENvbHVtbkxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVsZXRlUm93RnJvbURhdGEocm93SUQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgYSByb3cgKGluZGV4ICE9PSAwKSBkZWxldGUgaXRcbiAgICAgICAgLy8gIGlmIHRoZXJlIGlzIGEgcm93IGluIEFERCBvciBVUERBVEUgc3RhdGUgY2hhbmdlIGl0J3Mgc3RhdGUgdG8gREVMRVRFXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0geyBpZDogcm93SUQsIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUsIG5ld1ZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuYWRkKHRyYW5zYWN0aW9uLCB0aGlzLmRhdGFbaW5kZXhdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZTogU3RhdGUgPSB0aGlzLnRyYW5zYWN0aW9ucy5nZXRTdGF0ZShyb3dJRCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5hZGQoeyBpZDogcm93SUQsIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUsIG5ld1ZhbHVlOiBudWxsIH0sIHN0YXRlICYmIHN0YXRlLnJlY29yZFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldERhdGFCYXNlZEJvZHlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgKHRoaXMuZGF0YS5sZW5ndGggPCB0aGlzLl9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyKSA/XG4gICAgICAgICAgICAwIDogdGhpcy5kZWZhdWx0VGFyZ2V0Qm9keUhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvblBpbm5lZFJvd3NDaGFuZ2VkKGNoYW5nZTogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+KSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnJvd0xpc3REaWZmZXIuZGlmZihjaGFuZ2UpO1xuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKGNoYW5nZTogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuY29sdW1uTGlzdERpZmZlci5kaWZmKGNoYW5nZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b0dlbmVyYXRlICYmIHRoaXMuX2NvbHVtbnMubGVuZ3RoID09PSAwICYmIHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEluIEl2eSBpZiB0aGVyZSBhcmUgbmVzdGVkIGNvbmRpdGlvbmFsIHRlbXBsYXRlcyB0aGUgY29udGVudCBjaGlsZHJlbiBhcmUgcmUtZXZhbHVhdGVkXG4gICAgICAgICAgICAvLyBoZW5jZSBhdXRvZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIGNsZWFyZWQgYW5kIG5lZWQgdG8gYmUgcmVzZXQuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnModGhpcy5fYXV0b0dlbmVyYXRlZENvbHMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgICAgICAgICBkaWZmLmZvckVhY2hBZGRlZEl0ZW0oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8SWd4Q29sdW1uQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLml0ZW0ucGlubmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMucHVzaChyZWNvcmQuaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zLnB1c2gocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmluaXRDb2x1bW5zKHRoaXMuY29sdW1uTGlzdC50b0FycmF5KCksIChjb2w6IElneENvbHVtbkNvbXBvbmVudCkgPT4gdGhpcy5jb2x1bW5Jbml0LmVtaXQoY29sKSk7XG5cbiAgICAgICAgICAgIGRpZmYuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneENvbHVtbkNvbXBvbmVudCB8IElneENvbHVtbkdyb3VwQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29sdW1uR3JvdXAgPSByZWNvcmQuaXRlbSBpbnN0YW5jZW9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmICghaXNDb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBHcm91cGluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfZ3JvdXBieShyZWNvcmQuaXRlbS5maWVsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgRmlsdGVyaW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5jbGVhcl9maWx0ZXIocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIGZpbHRlciByb3dcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uLmZpZWxkID09PSByZWNvcmQuaXRlbS5maWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdSb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIFNvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX3NvcnQocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBjb2x1bW4gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChbcmVjb3JkLml0ZW0uZmllbGRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuXG4gICAgICAgICAgICBpZiAoYWRkZWQgfHwgcmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYG9uQ29sdW1uc0NoYW5nZWRgIGNhbiBiZSBleGVjdXRlZCBtaWR3YXkgYSBjdXJyZW50IGRldGVjdENoYW5nZSBjeWNsZSBhbmQgbWFya0ZvckNoZWNrIHdpbGwgYmUgaWdub3JlZCB0aGVuLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3aWxsIHdhaXQgZm9yIHRoZSBjdXJyZW50IGN5Y2xlIHRvIGVuZCBzbyB3ZSBjYW4gdHJpZ2dlciBhIG5ldyBvbmUgYW5kIG5nRG9DaGVjayB0byBmaXJlLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUdyaWRTaXplcyhyZWNhbGNGZWF0dXJlV2lkdGggPSB0cnVlKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPOiAoUi5LLikgVGhpcyBsYXllcmVkIGxhc2FnbmUgc2hvdWxkIGJlIHJlZmFjdG9yZWRcbiAgICAgICAgICAgIEFTQVAuIFRoZSByZWFzb24gSSBoYXZlIHRvIHJlc2V0IHRoZSBjYWNoZXMgc28gbWFueSB0aW1lcyBpcyBiZWNhdXNlXG4gICAgICAgICAgICBhZnRlciB0ZWFjaCBgZGV0ZWN0Q2hhbmdlc2AgY2FsbCB0aGV5IGFyZSBmaWxsZWQgd2l0aCBpbnZhbGlkXG4gICAgICAgICAgICBzdGF0ZS4gT2YgY291cnNlIGFsbCBvZiB0aGlzIGhhcHBlbnMgbWlkd2F5IHRocm91Z2ggdGhlIGdyaWRcbiAgICAgICAgICAgIHNpemluZyBwcm9jZXNzIHdoaWNoIG9mIGNvdXJzZSwgdXNlcyB2YWx1ZXMgZnJvbSB0aGUgY2FjaGVzLCB0aHVzIHJlc3VsdGluZ1xuICAgICAgICAgICAgaW4gYSBicm9rZW4gbGF5b3V0LlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgY29uc3QgaGFzU2Nyb2xsID0gdGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRXaWR0aCgpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkSGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMucm93RWRpdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3NpdGlvblJvd0VkaXRpbmdPdmVybGF5KHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdSb3cucmVzZXRDaGlwc0FyZWEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgLy8gaW4gY2FzZSBzY3JvbGxiYXIgaGFzIGFwcGVhcmVkIHJlY2FsYyB0byBzaXplIGNvcnJlY3RseS5cbiAgICAgICAgaWYgKGhhc1Njcm9sbCAhPT0gdGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRXaWR0aCgpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnpvbmUuaXNTdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlXaWR0aEhvc3RCaW5kaW5nKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1NpemVDb2x1bW5zSW5WaWV3KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY0dyaWRIZWFkUm93KCkge1xuICAgICAgICBpZiAodGhpcy5tYXhMZXZlbEhlYWRlckRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0ZpbHRlclJvdyA9IHRoaXMuX2FsbG93RmlsdGVyaW5nICYmIHRoaXMuX2ZpbHRlck1vZGUgPT09IEZpbHRlck1vZGUucXVpY2tGaWx0ZXI7XG4gICAgICAgICAgICBjb25zdCBtaW5TaXplID0gKHRoaXMubWF4TGV2ZWxIZWFkZXJEZXB0aCArIDEgKyAoaGFzRmlsdGVyUm93ID8gMSA6IDApKSAqIHRoaXMuZGVmYXVsdFJvd0hlaWdodCAvIHRoaXMuX2Jhc2VGb250U2l6ZTtcbiAgICAgICAgICAgIHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudC5zdHlsZS5taW5IZWlnaHQgPSBgJHttaW5TaXplfXJlbWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2V0cyBUQk9EWSBoZWlnaHQgaS5lLiB0aGlzLmNhbGNIZWlnaHRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlR3JpZEhlaWdodCgpIHtcbiAgICAgICAgdGhpcy5jYWxjR3JpZEhlYWRSb3coKTtcblxuICAgICAgICB0aGlzLmNhbGNIZWlnaHQgPSB0aGlzLl9jYWxjdWxhdGVHcmlkQm9keUhlaWdodCgpO1xuICAgICAgICBpZiAodGhpcy5waW5uZWRSb3dIZWlnaHQgJiYgdGhpcy5jYWxjSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNhbGNIZWlnaHQgLT0gdGhpcy5waW5uZWRSb3dIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEdyb3VwQXJlYUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldENvbXB1dGVkSGVpZ2h0KGVsZW0pIHtcbiAgICAgICAgcmV0dXJuIGVsZW0ub2Zmc2V0SGVpZ2h0ID8gcGFyc2VGbG9hdCh0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeVJvd0hlaWdodCB8fCB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudGZvb3QubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VGhlYWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gKCF0aGlzLmFsbG93RmlsdGVyaW5nIHx8ICh0aGlzLmFsbG93RmlsdGVyaW5nICYmIHRoaXMuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcikpID9cbiAgICAgICAgICAgIGhlaWdodCAtIHRoaXMuZ2V0RmlsdGVyQ2VsbEhlaWdodCgpIDpcbiAgICAgICAgICAgIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRvb2xiYXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHRvb2xiYXJIZWlnaHQgPSAwO1xuICAgICAgICBpZiAodGhpcy50b29sYmFyLmZpcnN0KSB7XG4gICAgICAgICAgICB0b29sYmFySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRvb2xiYXIuZmlyc3QubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xiYXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYWdpbmdGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhZ2luZ0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmZvb3Rlcikge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLmZvb3Rlci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIHBhZ2luZ0hlaWdodCA9IHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgP1xuICAgICAgICAgICAgICAgIGhlaWdodCA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2luZ0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlckNlbGxIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVhZGVyR3JvdXBOYXRpdmVFbCA9ICh0aGlzLmhlYWRlckdyb3Vwc0xpc3QubGVuZ3RoICE9PSAwKSA/XG4gICAgICAgICAgICB0aGlzLmhlYWRlckdyb3Vwc0xpc3RbMF0ubmF0aXZlRWxlbWVudCA6IG51bGw7XG4gICAgICAgIGNvbnN0IGZpbHRlckNlbGxOYXRpdmVFbCA9IChoZWFkZXJHcm91cE5hdGl2ZUVsKSA/XG4gICAgICAgICAgICBoZWFkZXJHcm91cE5hdGl2ZUVsLnF1ZXJ5U2VsZWN0b3IoJ2lneC1ncmlkLWZpbHRlcmluZy1jZWxsJykgYXMgSFRNTEVsZW1lbnQgOiBudWxsO1xuICAgICAgICByZXR1cm4gKGZpbHRlckNlbGxOYXRpdmVFbCkgPyBmaWx0ZXJDZWxsTmF0aXZlRWwub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jYWxjdWxhdGVHcmlkQm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuX2hlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0dWFsVGhlYWRSb3cgPSB0aGlzLmdldFRoZWFkUm93SGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IGZvb3RlckhlaWdodCA9IHRoaXMuZ2V0Rm9vdGVySGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJIZWlnaHQgPSB0aGlzLmdldFRvb2xiYXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgcGFnaW5nSGVpZ2h0ID0gdGhpcy5nZXRQYWdpbmdGb290ZXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZ3JvdXBBcmVhSGVpZ2h0ID0gdGhpcy5nZXRHcm91cEFyZWFIZWlnaHQoKTtcbiAgICAgICAgY29uc3Qgc2NySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnNjci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWRIZWlnaHQgPSB0b29sYmFySGVpZ2h0ICsgYWN0dWFsVGhlYWRSb3cgK1xuICAgICAgICAgICAgZm9vdGVySGVpZ2h0ICsgcGFnaW5nSGVpZ2h0ICsgZ3JvdXBBcmVhSGVpZ2h0ICtcbiAgICAgICAgICAgIHNjckhlaWdodDtcblxuICAgICAgICBsZXQgZ3JpZEhlaWdodCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQZXJjZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpO1xuICAgICAgICAgICAgY29uc3QgYXV0b1NpemUgPSB0aGlzLl9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCk7XG4gICAgICAgICAgICBpZiAoYXV0b1NpemUgfHwgY29tcHV0ZWQuaW5kZXhPZignJScpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlIZWlnaHQgPSB0aGlzLmdldERhdGFCYXNlZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm9keUhlaWdodCA+IDAgPyBib2R5SGVpZ2h0IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyaWRIZWlnaHQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdyaWRIZWlnaHQgPSBwYXJzZUludCh0aGlzLl9oZWlnaHQsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyhncmlkSGVpZ2h0IC0gcmVuZGVyZWRIZWlnaHQpO1xuXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKGhlaWdodCkgPT09IDAgfHwgaXNOYU4oZ3JpZEhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlIZWlnaHQgPSB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHlIZWlnaHQgPiAwID8gYm9keUhlaWdodCA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tDb250YWluZXJTaXplQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgfHwgKHRoaXMubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGFzIGFueSkuaG9zdDtcbiAgICAgICAgY29uc3Qgb3JpZ0hlaWdodCA9IHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiBvcmlnSGVpZ2h0ICE9PSBoZWlnaHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCkge1xuICAgICAgICB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50IHx8ICh0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBhcyBhbnkpLmhvc3Q7XG4gICAgICAgIGxldCByZXMgPSAhcGFyZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPT09IDAgfHxcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ID09PSByZW5kZXJlZEhlaWdodDtcbiAgICAgICAgaWYgKCghdGhpcy5wbGF0Zm9ybS5pc0Nocm9taXVtICYmICF0aGlzLnBsYXRmb3JtLmlzRmlyZWZveCkgfHwgdGhpcy5fYXV0b1NpemUpIHtcbiAgICAgICAgICAgIC8vIElmIGdyaWQgY2F1c2VzIHRoZSBwYXJlbnQgY29udGFpbmVyIHRvIGV4dGVuZCAoZm9yIGV4YW1wbGUgd2hlbiBjb250YWluZXIgaXMgZmxleClcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgYXV0by1zaXplIHNpbmNlIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29udGFpbmVyIHdpbGwgY29udGludW91c2x5IGNoYW5nZSBhcyB0aGUgZ3JpZCByZW5kZXJzIGVsZW1lbnRzLlxuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlcyA9IHRoaXMuY2hlY2tDb250YWluZXJTaXplQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0cyBjYWxjdWxhdGVkIHdpZHRoIG9mIHRoZSB1bnBpbm5lZCBhcmVhXG4gICAgICogQHBhcmFtIHRha2VIaWRkZW4gSWYgd2Ugc2hvdWxkIHRha2UgaW50byBhY2NvdW50IHRoZSBoaWRkZW4gY29sdW1ucyBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFVucGlubmVkV2lkdGgodGFrZUhpZGRlbiA9IGZhbHNlKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuaXNQZXJjZW50V2lkdGggP1xuICAgICAgICAgICAgdGhpcy5jYWxjV2lkdGggOlxuICAgICAgICAgICAgcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIHx8IHBhcnNlSW50KHRoaXMuaG9zdFdpZHRoLCAxMCkgfHwgdGhpcy5jYWxjV2lkdGg7XG4gICAgICAgIGlmICh0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgJiYgIXRoaXMuaXNQZXJjZW50V2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNQaW5uaW5nVG9TdGFydCkge1xuICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2lkdGggLSB0aGlzLmdldFBpbm5lZFdpZHRoKHRha2VIaWRkZW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3N1bW1hcmllcyhmaWVsZE5hbWU6IHN0cmluZywgaGFzU3VtbWFyeTogYm9vbGVhbiwgc3VtbWFyeU9wZXJhbmQ/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkQVBJLmdldF9jb2x1bW5fYnlfbmFtZShmaWVsZE5hbWUpO1xuICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICBjb2x1bW4uaGFzU3VtbWFyeSA9IGhhc1N1bW1hcnk7XG4gICAgICAgICAgICBpZiAoc3VtbWFyeU9wZXJhbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290U3VtbWFyaWVzRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnJldHJpZ2dlclJvb3RQaXBlKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbHVtbi5zdW1tYXJpZXMgPSBzdW1tYXJ5T3BlcmFuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX211bHRpcGxlU3VtbWFyaWVzKGV4cHJlc3Npb25zOiBJU3VtbWFyeUV4cHJlc3Npb25bXSwgaGFzU3VtbWFyeTogYm9vbGVhbikge1xuICAgICAgICBleHByZXNzaW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMoZWxlbWVudC5maWVsZE5hbWUsIGhhc1N1bW1hcnksIGVsZW1lbnQuY3VzdG9tU3VtbWFyeSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMoZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gY29sdW1uICYmIGNvbHVtbi5maWVsZE5hbWUgPyBjb2x1bW4uZmllbGROYW1lIDogY29sdW1uO1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKGNvbHVtbk5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlRGF0YVR5cGVzKHJlYykge1xuICAgICAgICBpZiAodHlwZW9mIHJlYyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdvYmplY3QnICYmIHJlYyBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVjID09PSAnc3RyaW5nJyAmJiAoL1xcLihnaWZ8anBlP2d8dGlmZj98cG5nfHdlYnB8Ym1wKSQvaSkudGVzdChyZWMpKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLkltYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXV0b2dlbmVyYXRlQ29sdW1ucygpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZEFQSS5nZXRfZGF0YSgpO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmdlbmVyYXRlRGF0YUZpZWxkcyhkYXRhKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IFtdO1xuXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gY3JlYXRlQ29tcG9uZW50KElneENvbHVtbkNvbXBvbmVudCwgeyBlbnZpcm9ubWVudEluamVjdG9yOiAgdGhpcy5lbnZJbmplY3RvciwgZWxlbWVudEluamVjdG9yOiB0aGlzLmluamVjdG9yfSk7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5kYXRhVHlwZSA9IHRoaXMucmVzb2x2ZURhdGFUeXBlcyhkYXRhWzBdW2ZpZWxkXSk7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyA9IGNvbHVtbnM7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKGNvbHVtbnMpO1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURhdGFGaWVsZHMoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkYXRhICYmIGRhdGEubGVuZ3RoICE9PSAwID8gZGF0YVswXSA6IFtdKVxuICAgICAgICAgICAgLmZpbHRlcihrZXkgPT4gIXRoaXMuYXV0b0dlbmVyYXRlRXhjbHVkZS5pbmNsdWRlcyhrZXkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRDb2x1bW5zKGNvbGxlY3Rpb246IElneENvbHVtbkNvbXBvbmVudFtdLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gY29sbGVjdGlvbi5zb21lKGNvbCA9PiBjb2wuY29sdW1uR3JvdXApO1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICAvLyBTZXQgb3ZlcmFsbCByb3cgbGF5b3V0IHNpemVcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5MYXlvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0U2l6ZSA9IGNvbC5jaGlsZHJlbiA/XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuY2hpbGRyZW4ucmVkdWNlKChhY2MsIHZhbCkgPT4gTWF0aC5tYXgodmFsLnJvd1N0YXJ0ICsgdmFsLmdyaWRSb3dTcGFuIC0gMSwgYWNjKSwgMSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplID0gTWF0aC5tYXgobGF5b3V0U2l6ZSwgdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzICYmIHRoaXMuaGFzQ29sdW1uR3JvdXBzKSB7XG4gICAgICAgICAgICAvLyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gLSBtdWx0aS1yb3cgYW5kIGNvbHVtbiBncm91cHNcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5MYXlvdXRDb2x1bW5zID0gY29sbGVjdGlvbi5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkxheW91dCB8fCBjb2wuY29sdW1uTGF5b3V0Q2hpbGQpO1xuICAgICAgICAgICAgY29sbGVjdGlvbiA9IGNvbHVtbkxheW91dENvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IG51bGw7XG4gICAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbi5kZWZhdWx0V2lkdGggPSB0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyID8gdGhpcy5fY29sdW1uV2lkdGggOiBjb2x1bW4uZGVmYXVsdFdpZHRoID8gY29sdW1uLmRlZmF1bHRXaWR0aCA6ICcnO1xuXG4gICAgICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgICAgICBjYihjb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoY29sbGVjdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbHVtbi5wb3B1bGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVpbml0UGluU3RhdGVzKCkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gdGhpcy5fY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gYy5waW5uZWQpLnNvcnQoKGEsIGIpID0+IHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZihhKSAtIHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZihiKSk7XG4gICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucyA9IHRoaXMuaGFzQ29sdW1uR3JvdXBzID8gdGhpcy5fY29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZCkgOlxuICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YoYSkgLSB0aGlzLl91bnBpbm5lZENvbHVtbnMuaW5kZXhPZihiKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2U6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSwgY29sdW1uRGF0YT86IGFueVtdKTogYW55W10ge1xuICAgICAgICBsZXQgY29sdW1uc0FycmF5OiBJZ3hDb2x1bW5Db21wb25lbnRbXTtcbiAgICAgICAgbGV0IHJlY29yZCA9IHt9O1xuICAgICAgICBsZXQgc2VsZWN0ZWREYXRhID0gW107XG4gICAgICAgIGxldCBrZXlzID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbGxlY3Rpb24gPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGtleXNBbmREYXRhID0gW107XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpZ3gtaGllcmFyY2hpY2FsLWdyaWQnKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbnNpb25Sb3dJbmRleGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmV4cGFuc2lvblN0YXRlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19pbmRleF9ieV9pZChrZXksIHRoaXMuZGF0YVZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLnB1c2gocm93SW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvblJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRLZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VidHJhY3QgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uUm93SW5kZXhlcy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZEtleSA+IE51bWJlcihyb3cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyYWN0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Db2xsZWN0aW9uLnNldCh1cGRhdGVkS2V5IC0gc3VidHJhY3QsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlRWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3VidHJhY3QgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChleHBhbnNpb25Sb3dJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uUm93SW5kZXhlcy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWwucm93ID4gTnVtYmVyKHJvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmFjdCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWwucm93IC09IHN1YnRyYWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSAodGhpcyBhcyBhbnkpLnRvdGFsSXRlbUNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IGlzUmVtb3RlID0gdG90YWxJdGVtcyAmJiB0b3RhbEl0ZW1zID4gdGhpcy5kYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIGxldCBzZWxlY3Rpb25NYXA7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWd4LWhpZXJhcmNoaWNhbC1ncmlkJyAmJiBzZWxlY3Rpb25Db2xsZWN0aW9uLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAgPSBpc1JlbW90ZSA/IEFycmF5LmZyb20oc2VsZWN0aW9uQ29sbGVjdGlvbikgOlxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20oc2VsZWN0aW9uQ29sbGVjdGlvbikuZmlsdGVyKCh0dXBsZSkgPT4gdHVwbGVbMF0gPCBzb3VyY2UubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcCA9IGlzUmVtb3RlID8gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uKSA6XG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uKS5maWx0ZXIoKHR1cGxlKSA9PiB0dXBsZVswXSA8IHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VsbFNlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUuc2luZ2xlICYmIGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAucHVzaChbYWN0aXZlRWwucm93LCBuZXcgU2V0PG51bWJlcj4oKS5hZGQoYWN0aXZlRWwuY29sdW1uKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VsbFNlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZSAmJiBhY3RpdmVFbCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwLnB1c2goW2FjdGl2ZUVsLnJvdywgbmV3IFNldDxudW1iZXI+KCkuYWRkKGFjdGl2ZUVsLmNvbHVtbildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICBzZWxlY3RlZERhdGEgPSBjb2x1bW5EYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgICBmb3IgKGxldCBbcm93LCBzZXRdIG9mIHNlbGVjdGlvbk1hcCkge1xuICAgICAgICAgICAgcm93ID0gdGhpcy5wYWdpbmF0b3IgJiYgKHRoaXMucGFnaW5nTW9kZSA9PT0gR3JpZFBhZ2luZ01vZGUuTG9jYWwgJiYgc291cmNlID09PSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSkgPyByb3cgKyAodGhpcy5wYWdpbmF0b3IucGVyUGFnZSAqIHRoaXMucGFnaW5hdG9yLnBhZ2UpIDogcm93O1xuICAgICAgICAgICAgcm93ID0gaXNSZW1vdGUgPyByb3cgLSB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleCA6IHJvdztcbiAgICAgICAgICAgIGlmICghc291cmNlW3Jvd10gfHwgc291cmNlW3Jvd10uZGV0YWlsc0RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGVtcCA9IEFycmF5LmZyb20oc2V0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWFjaCBvZiB0ZW1wKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uc0FycmF5ID0gdGhpcy5nZXRTZWxlY3RhYmxlQ29sdW1uc0F0KGVhY2gpO1xuICAgICAgICAgICAgICAgIGNvbHVtbnNBcnJheS5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gIXRoaXMuaXNQaXZvdCAmJiBoZWFkZXJzID8gY29sLmhlYWRlciB8fCBjb2wuZmllbGQgOiBjb2wuZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dEYXRhID0gc291cmNlW3Jvd10uZ2hvc3RSZWNvcmQgPyBzb3VyY2Vbcm93XS5yZWNvcmRSZWYgOiBzb3VyY2Vbcm93XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc1Bpdm90ID8gcm93RGF0YS5hZ2dyZWdhdGlvblZhbHVlcy5nZXQoY29sLmZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiByZXNvbHZlTmVzdGVkUGF0aChyb3dEYXRhLCBjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBmb3JtYXR0ZXJzICYmIGNvbC5mb3JtYXR0ZXIgPyBjb2wuZm9ybWF0dGVyKHZhbHVlLCByb3dEYXRhKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gcmVjb3JkW2tleV0udG9TdHJpbmcoKS5jb25jYXQoJ3JlY29yZFJvdy0nICsgcm93KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlY29yZCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGNvbHVtbkRhdGFbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYzogYW55ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dOdW1iZXIgPSArYy5zcGxpdCgncmVjb3JkUm93LScpWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMuc3BsaXQoJ3JlY29yZFJvdy0nKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZE9iaiA9IE9iamVjdC5hc3NpZ24oc2VsZWN0ZWREYXRhW3Jvd051bWJlcl0sIHJlY29yZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFbcm93TnVtYmVyXSA9IG1lcmdlZE9iajtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YS5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb3JkID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGtleXNBbmREYXRhLnB1c2goc2VsZWN0ZWREYXRhKTtcbiAgICAgICAgICAgIGtleXNBbmREYXRhLnB1c2goa2V5cyk7XG4gICAgICAgICAgICByZXR1cm4ga2V5c0FuZERhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFNlbGVjdGFibGVDb2x1bW5zQXQoaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUxheW91dENvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjb2wgPT4gY29sLmNvbHVtbkxheW91dClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBjb2xMYXlvdXQgPSB2aXNpYmxlTGF5b3V0Q29sdW1uc1tpbmRleF07XG4gICAgICAgICAgICByZXR1cm4gY29sTGF5b3V0ID8gY29sTGF5b3V0LmNoaWxkcmVuLnRvQXJyYXkoKSA6IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS52aXNpYmxlSW5kZXggLSBiLnZpc2libGVJbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gW3Zpc2libGVDb2x1bW5zW2luZGV4XV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXV0b1NpemVDb2x1bW5zSW5WaWV3KCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uc1RvQXV0b3NpemUpIHJldHVybjtcbiAgICAgICAgY29uc3QgdlN0YXRlID0gdGhpcy5oZWFkZXJDb250YWluZXIuc3RhdGU7XG4gICAgICAgIGxldCBjb2xSZXNpemVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHVucGlubmVkSW5WaWV3ID0gdGhpcy5oZWFkZXJDb250YWluZXIuaWd4R3JpZEZvck9mLnNsaWNlKHZTdGF0ZS5zdGFydEluZGV4LCB2U3RhdGUuc3RhcnRJbmRleCArIHZTdGF0ZS5jaHVua1NpemUpLmZsYXRNYXAoeCA9PiB4LmNvbHVtbkdyb3VwID8geC5hbGxDaGlsZHJlbiA6IHgpO1xuICAgICAgICBjb25zdCBjb2x1bW5zSW5WaWV3ID0gdGhpcy5waW5uZWRDb2x1bW5zLmNvbmNhdCh1bnBpbm5lZEluVmlldyk7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnNJblZpZXcpIHtcbiAgICAgICAgICAgIGlmICghY29sLmF1dG9TaXplICYmIGNvbC5oZWFkZXJDZWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbHNDb250ZW50V2lkdGhzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5fY2VsbHMubGVuZ3RoICE9PSB0aGlzLnJvd0xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93TGlzdC5mb3JFYWNoKHggPT4geC5jZHIuZGV0ZWN0Q2hhbmdlcygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLl9kYXRhUm93TGlzdC5tYXAoeCA9PiB4LmNlbGxzLmZpbmQoYyA9PiBjLmNvbHVtbiA9PT0gY29sKSk7XG4gICAgICAgICAgICAgICAgY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4gY2VsbHNDb250ZW50V2lkdGhzLnB1c2goY2VsbD8ubmF0aXZlRWxlbWVudD8ub2Zmc2V0V2lkdGggfHwgMCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KC4uLmNlbGxzQ29udGVudFdpZHRocyk7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjZWxscyBub3QgaW4gRE9NIHlldC4uLlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5oZWFkZXJDZWxsTGlzdC5maW5kKHggPT4geC5jb2x1bW4gPT09IGNvbCk7XG4gICAgICAgICAgICAgICAgY2VsbHNDb250ZW50V2lkdGhzLnB1c2goaGVhZGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgICAgICAgICAgIGxldCBtYXhTaXplID0gTWF0aC5jZWlsKE1hdGgubWF4KC4uLmNlbGxzQ29udGVudFdpZHRocykpICsgMTtcbiAgICAgICAgICAgICAgICBpZiAoY29sLm1heFdpZHRoICYmIG1heFNpemUgPiBjb2wubWF4V2lkdGhQeCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhTaXplID0gY29sLm1heFdpZHRoUHg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhTaXplIDwgY29sLm1pbldpZHRoUHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IGNvbC5taW5XaWR0aFB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2wuYXV0b1NpemUgPSBtYXhTaXplO1xuICAgICAgICAgICAgICAgIGNvbC5yZXNldENhY2hlcygpO1xuICAgICAgICAgICAgICAgIGNvbFJlc2l6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xSZXNpemVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Q2FjaGVkV2lkdGhzKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZXh0cmFjdERhdGFGcm9tQ29sdW1uc1NlbGVjdGlvbihzb3VyY2U6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSk6IGFueVtdIHtcbiAgICAgICAgbGV0IHJlY29yZCA9IHt9O1xuICAgICAgICBjb25zdCBzZWxlY3RlZERhdGEgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5zZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBzb3VyY2UpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBoZWFkZXJzID8gY29sLmhlYWRlciB8fCBjb2wuZmllbGQgOiBjb2wuZmllbGQ7XG4gICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBmb3JtYXR0ZXJzICYmIGNvbC5mb3JtYXR0ZXIgPyBjb2wuZm9ybWF0dGVyKGRhdGFbY29sLmZpZWxkXSwgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgOiBkYXRhW2NvbC5maWVsZF07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlY29yZCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhLnB1c2gocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxlY3RlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0UGlubmluZygpIHtcbiAgICAgICAgY29uc3QgcGlubmVkQ29sdW1ucyA9IFtdO1xuICAgICAgICBjb25zdCB1bnBpbm5lZENvbHVtbnMgPSBbXTtcblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRXaWR0aCgpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIC8vIFdoZW4gYSBjb2x1bW4gaXMgYSBncm91cCBvciBpcyBpbnNpZGUgYSBncm91cCwgcGluIGFsbCByZWxhdGVkLlxuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgY29sLnBhcmVudC5waW5uZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIGNvbC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnBpbm5lZCA9IHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgZXhjZWVkIHVucGlubmVkIGFyZWEgbWluIHdpZHRoIGFuZCBnZXQgcGlubmVkIGFuZCB1bnBpbm5lZCBjb2wgY29sbGVjdGlvbnMuXG4gICAgICAgIC8vIFdlIHRha2UgaW50byBhY2NvdW50IHRvcCBsZXZlbCBjb2x1bW5zICh0b3AgbGV2ZWwgZ3JvdXBzIGFuZCBub24gZ3JvdXBzKS5cbiAgICAgICAgLy8gSWYgdG9wIGxldmVsIGlzIHVucGlubmVkIHRoZSBwaW5uaW5nIGhhbmRsZXMgYWxsIGNoaWxkcmVuIHRvIGJlIHVucGlubmVkIGFzIHdlbGwuXG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuX2NvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4ucGlubmVkICYmICFjb2x1bW4ucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5waW5uZWQgJiYgY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4udG9wTGV2ZWxQYXJlbnQucGlubmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5waW5uZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdW5waW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVucGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBc3NpZ24gdGhlIGFwcGxpY2FibGUgY29sbGVjdGlvbnMuXG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMgPSBwaW5uZWRDb2x1bW5zO1xuICAgICAgICB0aGlzLl91bnBpbm5lZENvbHVtbnMgPSB1bnBpbm5lZENvbHVtbnM7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsVG8ocm93OiBhbnkgfCBudW1iZXIsIGNvbHVtbjogYW55IHwgbnVtYmVyLCBpbkNvbGxlY3Rpb24gPSB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSk6IHZvaWQge1xuICAgICAgICBsZXQgZGVsYXlTY3JvbGxpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgdHlwZW9mIChyb3cpICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBpbkNvbGxlY3Rpb24uaW5kZXhPZihyb3cpO1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iocm93SW5kZXggLyB0aGlzLnBhZ2luYXRvci5wZXJQYWdlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yLnBhZ2UgIT09IHBhZ2UpIHtcbiAgICAgICAgICAgICAgICBkZWxheVNjcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsYXlTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5nZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiAocm93KSA9PT0gJ251bWJlcicgPyByb3cgOiB0aGlzLnVucGlubmVkRGF0YVZpZXcuaW5kZXhPZihyb3cpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICB0eXBlb2YgKHJvdykgPT09ICdudW1iZXInID8gcm93IDogdGhpcy51bnBpbm5lZERhdGFWaWV3LmluZGV4T2Yocm93KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjcm9sbFRvSG9yaXpvbnRhbGx5KGNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxUb0hvcml6b250YWxseShjb2x1bW46IGFueSB8IG51bWJlcikge1xuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSB0eXBlb2YgY29sdW1uID09PSAnbnVtYmVyJyA/IGNvbHVtbiA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbikudmlzaWJsZUluZGV4O1xuICAgICAgICBjb25zdCBzY3JvbGxSb3cgPSB0aGlzLnJvd0xpc3QuZmluZChyID0+ICEhci52aXJ0RGlyUm93KTtcbiAgICAgICAgY29uc3QgdmlydERpciA9IHNjcm9sbFJvdyA/IHNjcm9sbFJvdy52aXJ0RGlyUm93IDogbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNQaW5uaW5nVG9TdGFydCAmJiB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPj0gdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4IC09IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodmlydERpciwgY29sdW1uSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodmlydERpciwgY29sdW1uSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxEaXJlY3RpdmUoZGlyZWN0aXZlOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55PiwgZ29hbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGlyZWN0aXZlLnNjcm9sbFRvKGdvYWwpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRDb2x1bW5XaWR0aFN1bSgpOiBudW1iZXIge1xuICAgICAgICBsZXQgY29sU3VtID0gMDtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcih4ID0+IHguY29sdW1uTGF5b3V0KSA6IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKHggPT4gIXguY29sdW1uR3JvdXApO1xuICAgICAgICBjb2xzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbFN1bSArPSBwYXJzZUludCgoaXRlbS5jYWxjV2lkdGggfHwgaXRlbS5kZWZhdWx0V2lkdGgpLCAxMCkgfHwgdGhpcy5taW5Db2x1bW5XaWR0aDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY29sU3VtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIGNvbFN1bSArPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgcmV0dXJuIGNvbFN1bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RpZnkgY2hhbmdlcywgcmVzZXQgY2FjaGUgYW5kIHBvcHVsYXRlVmlzaWJsZUluZGV4ZXMuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY29sdW1uc1Jlb3JkZXJlZChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5maWx0ZXIoeCA9PiB4LmNvbHVtbkxheW91dCkuZm9yRWFjaCh4ID0+IHgucG9wdWxhdGVWaXNpYmxlSW5kZXhlcygpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZnRlciByZW9yZGVyaW5nIGlzIGRvbmUgcmVzZXQgY2FjaGVkIGNvbHVtbiBjb2xsZWN0aW9ucy5cbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIGNvbHVtbi5yZXNldENhY2hlcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZERhdGFWaWV3KF9kYXRhOiBhbnlbXSkge1xuICAgICAgICB0aGlzLl9kYXRhVmlldyA9IHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgP1xuICAgICAgICAgICAgWy4uLnRoaXMucGlubmVkRGF0YVZpZXcsIC4uLnRoaXMudW5waW5uZWREYXRhVmlld10gOlxuICAgICAgICAgICAgWy4uLnRoaXMudW5waW5uZWREYXRhVmlldywgLi4udGhpcy5waW5uZWREYXRhVmlld107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwbHlXaWR0aEhvc3RCaW5kaW5nKCkge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLl93aWR0aDtcbiAgICAgICAgaWYgKHdpZHRoID09PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFdpZHRoID0gdGhpcy5jYWxjV2lkdGg7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFdpZHRoICs9IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpZHRoID0gY3VycmVudFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ob3N0V2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZlcnRpY2FsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uU2Nyb2xsKGV2ZW50KTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbnMgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmNodW5rTG9hZC5lbWl0KHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc3RhdGUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlUm93RWRpdGluZ092ZXJsYXlTdGF0ZU9uU2Nyb2xsKHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uU3RyaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uU3RyaXAuY29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJnczogSUdyaWRTY3JvbGxFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBkaXJlY3Rpb246ICd2ZXJ0aWNhbCcsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFBvc2l0aW9uXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ3JpZFNjcm9sbC5lbWl0KGFyZ3MpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBob3Jpem9udGFsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLm9uSFNjcm9sbChzY3JvbGxMZWZ0KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcy5mb3JFYWNoKHZmb3IgPT4gdmZvci5vbkhTY3JvbGwoc2Nyb2xsTGVmdCkpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRWaXJ0RGlyLmNodW5rTG9hZC5lbWl0KHRoaXMuaGVhZGVyQ29udGFpbmVyLnN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZighdGhpcy5uYXZpZ2F0aW9uLmlzQ29sdW1uRnVsbHlWaXNpYmxlKHRoaXMubmF2aWdhdGlvbi5sYXN0Q29sdW1uSW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVPdmVybGF5cygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0geyBkaXJlY3Rpb246ICdob3Jpem9udGFsJywgZXZlbnQsIHNjcm9sbFBvc2l0aW9uOiB0aGlzLmhlYWRlckNvbnRhaW5lci5zY3JvbGxQb3NpdGlvbiB9O1xuICAgICAgICB0aGlzLmdyaWRTY3JvbGwuZW1pdChhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4ID0gLTEsIGNiOiAoYXJnczogYW55KSA9PiB2b2lkID0gbnVsbCkge1xuICAgICAgICBpZiAoIWNiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvdyA9IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maWx0ZXIocyA9PiBzLmluZGV4ICE9PSAwKS5jb25jYXQodGhpcy5yb3dMaXN0LnRvQXJyYXkoKSkuZmluZChyID0+IHIuaW5kZXggPT09IHJvd0luZGV4KTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpLnRvdGFsSXRlbUNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kYXRhQ2hhbmdlZC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5maW5kKHIgPT4gci5pbmRleCA9PT0gcm93SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYkFyZ3MgPSB0aGlzLmdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjYihjYkFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXdJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgocm93SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXdbZGF0YVZpZXdJbmRleF0uZGV0YWlsc0RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uc2V0QWN0aXZlTm9kZSh7IHJvdzogcm93SW5kZXggfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGNiKGFyZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCkge1xuICAgICAgICBsZXQgdGFyZ2V0VHlwZTogR3JpZEtleWRvd25UYXJnZXRUeXBlOyBsZXQgdGFyZ2V0O1xuICAgICAgICBzd2l0Y2ggKHJvdy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAnaWd4LWdyaWQtZ3JvdXBieS1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnZ3JvdXBSb3cnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvdztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lneC1ncmlkLXN1bW1hcnktcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ3N1bW1hcnlDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgcm93LnN1bW1hcnlDZWxscy5maW5kKGMgPT4gYy52aXNpYmxlQ29sdW1uSW5kZXggPT09IHZpc2libGVDb2xJbmRleCkgOiByb3cuc3VtbWFyeUNlbGxzLmZpcnN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaWd4LWNoaWxkLWdyaWQtcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2hpZXJhcmNoaWNhbFJvdyc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm93O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2RhdGFDZWxsJztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB2aXNpYmxlQ29sSW5kZXggIT09IC0xID8gcm93LmNlbGxzLmZpbmQoYyA9PiBjLnZpc2libGVDb2x1bW5JbmRleCA9PT0gdmlzaWJsZUNvbEluZGV4KSA6IHJvdy5jZWxscy5maXJzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0YXJnZXRUeXBlLCB0YXJnZXQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5leHREYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4LCBwcmV2aW91cyA9IGZhbHNlKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoY3VycmVudFJvd0luZGV4KTtcbiAgICAgICAgaWYgKGN1cnJlbnRSb3dJbmRleCA8IDAgfHwgKGN1cnJlbnRSb3dJbmRleCA9PT0gMCAmJiBwcmV2aW91cykgfHwgKHJlc29sdmVkSW5kZXggPj0gdGhpcy5kYXRhVmlldy5sZW5ndGggLSAxICYmICFwcmV2aW91cykpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50Um93SW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmluZCBuZXh0L3ByZXYgcmVjb3JkIHRoYXQgaXMgZWRpdGFibGUuXG4gICAgICAgIGNvbnN0IG5leHRSb3dJbmRleCA9IHByZXZpb3VzID8gdGhpcy5maW5kUHJldkVkaXRhYmxlRGF0YVJvd0luZGV4KGN1cnJlbnRSb3dJbmRleCkgOlxuICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5maW5kSW5kZXgoKHJlYywgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgaW5kZXggPiByZXNvbHZlZEluZGV4ICYmIHRoaXMuaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGluZGV4KSk7XG4gICAgICAgIGNvbnN0IG5leHREYXRhSW5kZXggPSB0aGlzLmdldERhdGFJbmRleChuZXh0Um93SW5kZXgpO1xuICAgICAgICByZXR1cm4gbmV4dERhdGFJbmRleCAhPT0gLTEgPyBuZXh0RGF0YUluZGV4IDogY3VycmVudFJvd0luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByZXZpb3VzIGVkaXRhYmxlIHJvdyBpbmRleCBvciAtMSBpZiBubyBzdWNoIHJvdyBpcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjdXJyZW50SW5kZXggVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVkaXRhYmxlIHJlY29yZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRQcmV2RWRpdGFibGVEYXRhUm93SW5kZXgoY3VycmVudEluZGV4KTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLmRhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoY3VycmVudEluZGV4KTtcbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgaWYgKGkgPCByZXNvbHZlZEluZGV4ICYmIHRoaXMuaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgZGF0YSB2aWV3IGluZGV4IGlzIGEgYW4gZWRpdGFibGUgZGF0YSByZWNvcmQuXG4gICAgICogSWYgcmVjb3JkIGlzIGdyb3VwIHJlYywgc3VtbWFyeSByZWMsIGNoaWxkIHJlYywgZ2hvc3QgcmVjLiBldGMuIGl0IGlzIG5vdCBlZGl0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhVmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGF0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3LlxuICAgICAqXG4gICAgICovXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIGl0IGludG8gQ1JVRFxuICAgIHByaXZhdGUgaXNFZGl0YWJsZURhdGFSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpIHtcbiAgICAgICAgY29uc3QgcmVjID0gdGhpcy5kYXRhVmlld1tkYXRhVmlld0luZGV4XTtcbiAgICAgICAgcmV0dXJuICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEgJiZcbiAgICAgICAgICAgICF0aGlzLmlzR2hvc3RSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHJlY29yZCBhdCB0aGUgc3BlY2lmaWVkIGRhdGEgdmlldyBpbmRleCBpcyBhIGdob3N0LlxuICAgICAqIElmIHJlY29yZCBpcyBwaW5uZWQgYnV0IGlzIG5vdCBpbiBwaW5uZWQgYXJlYSB0aGVuIGl0IGlzIGEgZ2hvc3QgcmVjb3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFWaWV3SW5kZXggVGhlIGluZGV4IG9mIHRoYXQgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0dob3N0UmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KSB7XG4gICAgICAgIGNvbnN0IGlzUGlubmVkID0gdGhpcy5pc1JlY29yZFBpbm5lZCh0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdKTtcbiAgICAgICAgY29uc3QgaXNJblBpbm5lZEFyZWEgPSB0aGlzLmlzUmVjb3JkUGlubmVkQnlWaWV3SW5kZXgoZGF0YVZpZXdJbmRleCk7XG4gICAgICAgIHJldHVybiBpc1Bpbm5lZCAmJiAhaXNJblBpbm5lZEFyZWE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkUG9zaXRpb24ocm93SW5kZXgsIGNvbEluZGV4KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwICYmIGNvbC52aXNpYmxlSW5kZXggPj0gMCAmJiAhY29sLmhpZGRlbikubGVuZ3RoO1xuICAgICAgICBpZiAocm93cyA8IDEgfHwgY29scyA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93SW5kZXggPiAtMSAmJiByb3dJbmRleCA8IHRoaXMuZGF0YVZpZXcubGVuZ3RoICYmXG4gICAgICAgICAgICBjb2xJbmRleCA+IC0gMSAmJiBjb2xJbmRleCA8PSBNYXRoLm1heCguLi50aGlzLnZpc2libGVDb2x1bW5zLm1hcChjID0+IGMudmlzaWJsZUluZGV4KSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmQodGV4dDogc3RyaW5nLCBpbmNyZW1lbnQ6IG51bWJlciwgY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIGV4YWN0TWF0Y2g/OiBib29sZWFuLCBzY3JvbGw/OiBib29sZWFuLCBlbmRFZGl0ID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMucm93TGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kRWRpdCkge1xuICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclNlYXJjaCgpO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQgPSBjYXNlU2Vuc2l0aXZlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBleGFjdE1hdGNoUmVzb2x2ZWQgPSBleGFjdE1hdGNoID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBsZXQgcmVidWlsZENhY2hlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dCAhPT0gdGV4dCB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlICE9PSBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQgfHxcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaCAhPT0gZXhhY3RNYXRjaFJlc29sdmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvID0ge1xuICAgICAgICAgICAgICAgIHNlYXJjaFRleHQ6IHRleHQsXG4gICAgICAgICAgICAgICAgYWN0aXZlTWF0Y2hJbmRleDogMCxcbiAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgZXhhY3RNYXRjaDogZXhhY3RNYXRjaFJlc29sdmVkLFxuICAgICAgICAgICAgICAgIG1hdGNoSW5mb0NhY2hlOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVidWlsZENhY2hlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCArPSBpbmNyZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVidWlsZENhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJvdy5jZWxscykge1xuICAgICAgICAgICAgICAgICAgICByb3cuY2VsbHMuZm9yRWFjaCgoYzogSWd4R3JpZENlbGxDb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuaGlnaGxpZ2h0VGV4dCh0ZXh0LCBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQsIGV4YWN0TWF0Y2hSZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRNYXRjaENhY2hlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID49IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA9IHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hJbmZvID0gdGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZVt0aGlzLmxhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mbyA9IHsgLi4udGhpcy5sYXN0U2VhcmNoSW5mbyB9O1xuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8obWF0Y2hJbmZvLnJvdywgbWF0Y2hJbmZvLmNvbHVtbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElneFRleHRIaWdobGlnaHREaXJlY3RpdmUuc2V0QWN0aXZlSGlnaGxpZ2h0KHRoaXMuaWQsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IG1hdGNoSW5mby5jb2x1bW4sXG4gICAgICAgICAgICAgICAgcm93OiBtYXRjaEluZm8ucm93LFxuICAgICAgICAgICAgICAgIGluZGV4OiBtYXRjaEluZm8uaW5kZXgsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1hdGNoSW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBJZ3hUZXh0SGlnaGxpZ2h0RGlyZWN0aXZlLmNsZWFyQWN0aXZlSGlnaGxpZ2h0KHRoaXMuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUubGVuZ3RoO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVidWlsZE1hdGNoQ2FjaGUoKSB7XG4gICAgICAgIHRoaXMubGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUgPSBbXTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gdGhpcy5sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlO1xuICAgICAgICBjb25zdCBleGFjdE1hdGNoID0gdGhpcy5sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoO1xuICAgICAgICBjb25zdCBzZWFyY2hUZXh0ID0gY2FzZVNlbnNpdGl2ZSA/IHRoaXMubGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dCA6IHRoaXMubGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIGNvbnN0IGNvbHVtbkl0ZW1zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLmNvbHVtbkdyb3VwKS5zb3J0KChjMSwgYzIpID0+IGMxLnZpc2libGVJbmRleCAtIGMyLnZpc2libGVJbmRleCk7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoZGF0YVJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbkl0ZW1zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwaXBlQXJncyA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGMuZmllbGQpLnBpcGVBcmdzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYy5mb3JtYXR0ZXIgPyBjLmZvcm1hdHRlcihyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSwgZGF0YVJvdykgOlxuICAgICAgICAgICAgICAgICAgICBjLmRhdGFUeXBlID09PSAnbnVtYmVyJyA/IGZvcm1hdE51bWJlcihyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSwgdGhpcy5sb2NhbGUsIHBpcGVBcmdzLmRpZ2l0c0luZm8pIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuZGF0YVR5cGUgPT09ICdkYXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybWF0RGF0ZShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSwgcGlwZUFyZ3MuZm9ybWF0LCB0aGlzLmxvY2FsZSwgcGlwZUFyZ3MudGltZXpvbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBjLnNlYXJjaGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaFZhbHVlID0gY2FzZVNlbnNpdGl2ZSA/IFN0cmluZyh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hWYWx1ZSA9PT0gc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoJ3Bpbm5lZCcsIHRoaXMuaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBkYXRhUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGMuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvY2N1cmVuY2VJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoSW5kZXggPSBzZWFyY2hWYWx1ZS5pbmRleE9mKHNlYXJjaFRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2VhcmNoSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnNldCgncGlubmVkJywgdGhpcy5pc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IGRhdGFSb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG9jY3VyZW5jZUluZGV4KyssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsdWUgPSBzZWFyY2hWYWx1ZS5zdWJzdHJpbmcoc2VhcmNoSW5kZXggKyBzZWFyY2hUZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5kZXggPSBzZWFyY2hWYWx1ZS5pbmRleE9mKHNlYXJjaFRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEFib3V0IHRvIE1vdmUgdG8gQ1JVRFxuICAgIHByaXZhdGUgY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkocm93SUQ6IGFueSwgdXNlT3V0ZXIgPSBmYWxzZSkge1xuICAgICAgICBsZXQgc2V0dGluZ3MgPSB0aGlzLnJvd0VkaXRTZXR0aW5ncztcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQodGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5vdmVybGF5SWQpO1xuICAgICAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICAgICAgc2V0dGluZ3MgPSBvdmVybGF5LnNldHRpbmdzO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLm91dGxldCA9IHVzZU91dGVyID8gdGhpcy5wYXJlbnRSb3dPdXRsZXREaXJlY3RpdmUgOiB0aGlzLnJvd091dGxldERpcmVjdGl2ZTtcbiAgICAgICAgdGhpcy5yb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneS5zZXR0aW5ncy5jb250YWluZXIgPSB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHBpbm5lZCA9IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKHJvd0lEKSAhPT0gLTE7XG4gICAgICAgIGNvbnN0IHRhcmdldFJvdyA9ICFwaW5uZWQgP1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmdldF9yb3dfYnlfa2V5KHJvd0lEKSBhcyBJZ3hSb3dEaXJlY3RpdmVcbiAgICAgICAgICAgIDogdGhpcy5waW5uZWRSb3dzLmZpbmQoeCA9PiB4LmtleSA9PT0gcm93SUQpIGFzIElneFJvd0RpcmVjdGl2ZTtcbiAgICAgICAgaWYgKCF0YXJnZXRSb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy50YXJnZXQgPSB0YXJnZXRSb3cuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnRvZ2dsZVJvd0VkaXRpbmdPdmVybGF5KHRydWUpO1xuICAgIH1cbn1cbiJdfQ==